[Vm-dev] VM Maker: VMMaker.oscog-akg.2340.mcz

Alistair Grant akgrant0710 at gmail.com
Sat Mar 3 15:10:21 UTC 2018


Hi Levente,

On 3 March 2018 at 15:54, Levente Uzonyi <leves at caesar.elte.hu> wrote:
>
> On Sat, 3 Mar 2018, commits at source.squeak.org wrote:
>
>>
>> Alistair Grant uploaded a new version of VMMaker to project VM Maker:
>> http://source.squeak.org/VMMaker/VMMaker.oscog-akg.2340.mcz
>>
>> ==================== Summary ====================
>>
>> Name: VMMaker.oscog-akg.2340
>> Author: akg
>> Time: 3 March 2018, 3:37:32.917843 pm
>> UUID: 27e21eb5-be74-4672-a779-32c073498b95
>> Ancestors: VMMaker.oscog-eem.2339
>>
>> Extend FilePlugin to allow a file to be opened using either the file
>> descriptor (fd) or FILE* in Pharo.
>>
>> Original PR: pharo-project/pharo-vm#108
>> Updated PR: pharo-project/pharo-vm#142
>>
>> (both superseeded)
>>
>> Many thanks to @zecke (Holger Freyther) for the original code.
>>
>> As a (redundant) example of how this can be used, to open stderr (fd=2)
>> for writing:
>>
>> | stderr |
>>
>> stderr := BinaryFileStream handle: (FilePluginPrims new
>>    openFileDescriptor: 2 writable: true)
>>        file: (File named: 'fd2')
>>        forWrite: true.
>
>
> Will it not interfere with the VM's existing mechanism to access stdin,
> stdout and stderr?

It shouldn't.  It adds two new primitives, which call a couple of
support methods / procedures.  No existing code is changed.

The example I gave wasn't meant to be used as a mechanism to access
stderr, it's just a well known file descriptor.



> Why is it Pharo only?

I'm happy for it to be included with squeak (or any of the other VMs).

Cheers,
Alistair



> Levente
>
>
>>
>> stderr nextPutAll: 'Hello World'; lf.
>>
>> =============== Diff against VMMaker.oscog-eem.2339 ===============
>>
>> Item was added:
>> + ----- Method: FilePlugin>>cfileRecordSize (in category 'pharo
>> primitives') -----
>> + cfileRecordSize
>> +       "Return the size of a stdio FILE* handle"
>> +       <inline: #always>
>> +       ^self sizeof: #'FILE*'!
>>
>> Item was added:
>> + ----- Method: FilePlugin>>fileOpenFd:write: (in category 'private -
>> pharo') -----
>> + fileOpenFd: fd write: writeFlag
>> +       "Open the fd as file. Answer the file oop."
>> +       | file fileOop |
>> +       <option: #PharoVM>
>> +       <var: #file type: 'SQFile *'>
>> +       <var: 'fd' type: 'int'>
>> +       <export: true>
>> +       fileOop := interpreterProxy instantiateClass: interpreterProxy
>> classByteArray indexableSize: self fileRecordSize.
>> +       file := self fileValueOf: fileOop.
>> +       interpreterProxy failed
>> +               ifFalse: [self cCode: 'sqFileFdOpen(file, fd, writeFlag)'
>> inSmalltalk: [file]].
>> +       ^ fileOop!
>>
>> Item was added:
>> + ----- Method: FilePlugin>>fileOpenFile:write: (in category 'private -
>> pharo') -----
>> + fileOpenFile: cfile write: writeFlag
>> +       "Open the FILE* as file. Answer the file oop."
>> +       | file fileOop |
>> +       <option: #PharoVM>
>> +       <var: #file type: 'SQFile *'>
>> +       <var: 'cfile' type: 'FILE *'>
>> +       <export: true>
>> +       fileOop := interpreterProxy instantiateClass: interpreterProxy
>> classByteArray indexableSize: self fileRecordSize.
>> +       file := self fileValueOf: fileOop.
>> +       interpreterProxy failed
>> +               ifFalse: [self cCode: 'sqFileFileOpen(file, cfile,
>> writeFlag)' inSmalltalk: [file]].
>> +       ^ fileOop!
>>
>> Item was added:
>> + ----- Method: FilePlugin>>primitiveFileOpenUseFile (in category 'pharo
>> primitives') -----
>> + primitiveFileOpenUseFile
>> +       | writeFlag cfileOop cfile filePointer |
>> +       <option: #PharoVM>
>> +       <var: 'cfile' type: 'FILE* '>
>> +       <export: true>
>> +       writeFlag := interpreterProxy
>> +                               booleanValueOf: (interpreterProxy
>> stackValue: 0).
>> +       cfileOop := interpreterProxy stackValue: 1.
>> +       (((interpreterProxy isBytes: cfileOop) and:
>> +                [(interpreterProxy byteSizeOf: cfileOop) = self
>> cfileRecordSize]))
>> +                       ifFalse: [^interpreterProxy primitiveFailFor:
>> PrimErrBadArgument].
>> +       cfile := interpreterProxy firstIndexableField: cfileOop.
>> +       interpreterProxy failed ifFalse: +              [filePointer :=
>> self fileOpenFile: cfile write: writeFlag].
>> +       interpreterProxy failed ifFalse: +              [^interpreterProxy
>> pop: 3 "rcvr, name, writeFlag"
>> +                                                       thenPush:
>> filePointer].
>> +       ^interpreterProxy primitiveFail.!
>>
>> Item was added:
>> + ----- Method: FilePlugin>>primitiveFileOpenUseFileDescriptor (in
>> category 'pharo primitives') -----
>> + primitiveFileOpenUseFileDescriptor
>> +       | writeFlag fdPointer fd filePointer |
>> +       <option: #PharoVM>
>> +       <var: 'fd' type: 'int'>
>> +       <export: true>
>> +       writeFlag := interpreterProxy
>> +                               booleanValueOf: (interpreterProxy
>> stackValue: 0).
>> +       fdPointer := interpreterProxy stackValue: 1.
>> +       (interpreterProxy isIntegerObject: fdPointer)
>> +               ifFalse: [^ interpreterProxy primitiveFailFor:
>> PrimErrBadArgument].
>> +       fd := interpreterProxy integerValueOf: fdPointer.
>> +       filePointer := self fileOpenFd: fd write: writeFlag.
>> +       interpreterProxy failed
>> +               ifFalse: [^interpreterProxy pop: 3 "rcvr, name, writeFlag"
>> +                       thenPush: filePointer].
>> +       ^interpreterProxy primitiveFail.!


More information about the Vm-dev mailing list