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! |
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, [hidden email] 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! > |
Free forum by Nabble | Edit this page |