[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