[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