[Vm-dev] VM Maker: VMMaker.oscog-eem.1868.mcz

Esteban Lorenzano estebanlm at gmail.com
Thu May 26 11:51:25 UTC 2016


Hi Eliot, 

this fix breaks some plugins. Next commit will fix some, but there are things I still don’t know how to model with new way, for example:

self cCode: 'sigchldHandlerAction.sa_sigaction = reapChildProcess'

the part that accessed the structure… no idea how to translate that to smalltalk code inside a block… 

cheers,
Esteban

> On 26 May 2016, at 04:53, commits at source.squeak.org wrote:
> 
> 
> Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
> http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1868.mcz
> 
> ==================== Summary ====================
> 
> Name: VMMaker.oscog-eem.1868
> Author: eem
> Time: 25 May 2016, 9:53:03.519464 pm
> UUID: 5bcb9563-5037-4e58-8aca-fb68a963e028
> Ancestors: VMMaker.oscog-eem.1867
> 
> ...and fix Slang to translate th erevised noCheckPush:onObjStack: (using '' is quicker than [], but Slang needs not to translate the brace node).
> 
> =============== Diff against VMMaker.oscog-eem.1867 ===============
> 
> Item was changed:
>  ----- Method: MessageNode>>asTranslatorNodeIn: (in category '*VMMaker-C translation') -----
>  asTranslatorNodeIn: aTMethod
>  	"make a CCodeGenerator equivalent of me"
>  	"selector is sometimes a Symbol, sometimes a SelectorNode!!
>  	On top of this, numArgs is needed due to the (truly grody) use of
>  	arguments as a place to store the extra expressions needed to generate
>  	code for in-line to:by:do:, etc.  see below, where it is used."
>  	| rcvrOrNil sel args ifNotNilBlock |
>  	rcvrOrNil := receiver ifNotNil: [receiver asTranslatorNodeIn: aTMethod].
>  	(rcvrOrNil notNil
>  	and: [rcvrOrNil isVariable
>  	and: [rcvrOrNil name = 'super']]) ifTrue:
>  		[^aTMethod superExpansionNodeFor: selector key args: arguments].
>  	sel := selector isSymbol ifTrue: [selector] ifFalse: [selector key].
> + 	(sel == #cCode:inSmalltalk: "extracting here rather than in translation allows inlining in the block."
> + 	  or: [sel == #cCode:]) ifTrue:
> + 		[arguments first isBlockNode ifTrue:
> + 			[| block |
> + 			 ^(block := arguments first asTranslatorNodeIn: aTMethod) statements size = 1
> + 				ifTrue: [block statements first]
> + 				ifFalse: [block]].
> + 		 (arguments first isLiteralNode
> + 		 and: [arguments first key isString]) ifTrue:
> + 			[^arguments first asTranslatorNodeIn: aTMethod]].
> - 	((sel == #cCode:inSmalltalk: "extracting here rather than in translation allows inlining in the block."
> - 	  or: [sel == #cCode:])
> - 	 and: [arguments first isBlockNode]) ifTrue:
> - 		[| block |
> - 		 ^(block := arguments first asTranslatorNodeIn: aTMethod) statements size = 1
> - 			ifTrue: [block statements first]
> - 			ifFalse: [block]].
>  	args := arguments
>  				select: [:arg| arg notNil]
>  				thenCollect: [:arg| arg asTranslatorNodeIn: aTMethod].
>  	(sel = #to:by:do: and: [arguments size = 7 and: [(arguments at: 7) notNil]]) ifTrue:
>  		["Restore limit expr that got moved by transformToDo:"
>  		 args := {(arguments at: 7) value asTranslatorNodeIn: aTMethod. 
>  				  args second.
>  				  args third. "add the limit var as a hidden extra argument; we may need it later"
>  				  TVariableNode new setName: arguments first key}].
>  	(sel == #ifTrue:ifFalse: and: [arguments first isJust: NodeNil]) ifTrue:
>  		[sel := #ifFalse:. args := {args last}].
>  	(sel == #ifTrue:ifFalse: and: [arguments last isJust: NodeNil]) ifTrue:
>  		[sel := #ifTrue:. args := {args first}].
>  	(sel == #ifFalse:ifTrue: and: [arguments first isJust: NodeNil]) ifTrue:
>  		[sel := #ifTrue:. args := {args last}].
>  	(sel == #ifFalse:ifTrue: and: [arguments last isJust: NodeNil]) ifTrue:
>  		[sel := #ifTrue:. args := {args first}].
>  	((sel == #ifFalse: or: [sel == #or:])
>  	 and: [arguments size = 2 and: [(arguments at: 2) notNil]]) ifTrue:
>  		["Restore argument block that got moved by transformOr: or transformIfFalse:"
>  		 args := {(arguments at: 2) asTranslatorNodeIn: aTMethod}].
>  	(args size > sel numArgs and: [sel ~~ #to:by:do:]) ifTrue: "to:by:do: has iLimiT hidden in last arg"
>  		["prune the extra blocks left by ifTrue:, ifFalse:, and: & or:"
>  		 self assert: args size - sel numArgs = 1.
>  		 self assert: (args last isStmtList
>  					  and: [args last statements size = 1
>  					  and: [(args last statements first isVariable
>  							or: [args last statements first isConstant])
>  					  and: [#('nil' true false) includes: args last statements first nameOrValue]]]).
>  		 args := args first: sel numArgs].
>  	"For the benefit of later passes, e.g. value: inlining,
>  	 transform e ifNotNil: [:v| ...] into  v := e. v ifNotNil: [...],
>  	 which in fact means transforming (v := e) ifTrue: [:v|...] into v := e. v ifTrue: [...]."
>  	((sel == #ifTrue: or: [sel == #ifFalse: or: [sel == #ifTrue:ifFalse: or: [sel == #ifFalse:ifTrue:]]])
>  	 and: [receiver notNil
>  	 and: [receiver isAssignmentEqualsEqualsNil
>  	 and: [(ifNotNilBlock := args detect: [:arg| arg isStmtList and: [arg args size = 1]] ifNone: []) notNil]]]) ifTrue:
>  		[ifNotNilBlock setArguments: #().
>  		 ^TStmtListNode new
>  			setArguments: #()
>  			statements:
>  				{	receiver receiver asTranslatorNodeIn: aTMethod.
>  					TSendNode new
>  						setSelector: sel
>  						receiver: (TSendNode new
>  									setSelector: #==
>  									receiver: (receiver receiver variable asTranslatorNodeIn: aTMethod)
>  									arguments: {receiver arguments first asTranslatorNodeIn: aTMethod})
>  						arguments: args }].
>  	^TSendNode new
>  		setSelector: sel
>  		receiver: rcvrOrNil
>  		arguments: args!
> 



More information about the Vm-dev mailing list