[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