VM Maker: VMMaker.oscog-eem.1868.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-eem.1868.mcz

commits-2
 
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!

Reply | Threaded
Open this post in threaded view
|

Re: VM Maker: VMMaker.oscog-eem.1868.mcz

EstebanLM

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!
>