[Vm-dev] VM Maker: VMMaker.oscog-akg.2340.mcz
Levente Uzonyi
leves at caesar.elte.hu
Sat Mar 3 14:54:57 UTC 2018
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?
Why is it Pharo only?
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