The Trunk: Compiler-nice.194.mcz

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

The Trunk: Compiler-nice.194.mcz

commits-2
Nicolas Cellier uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-nice.194.mcz

==================== Summary ====================

Name: Compiler-nice.194
Author: nice
Time: 4 March 2011, 4:51:51.372 am
UUID: de6fad00-fa6c-4622-9c03-046113d7e4fe
Ancestors: Compiler-ul.193

Fix cascading of special messages.

During inlining of some special messages, the MessageNode selector and/or arguments might be destructively replaced.
(for example #ifFalseifTrue: ifNil:ifNotNil: etc...)

If we later decide to un-optimize, it is necessary to restore the originalSelector and originalArguments.
(for example when these messages are cascaded)

Also fix a bug occuring when decompiling these cascaded specials.

Thanks to Juan for testing/enhancing this useless but beautiful stuff.

TODO: automate some tests.

=============== Diff against Compiler-ul.193 ===============

Item was changed:
  ----- Method: DecompilerConstructor>>decodeIfNilWithReceiver:selector:arguments: (in category 'constructor') -----
  decodeIfNilWithReceiver: receiver selector: selector arguments: arguments
+ receiver ifNil: [ ^nil ]. "For instance, when cascading"
-
  selector == #ifTrue:ifFalse:
  ifFalse: [^ nil].
  (receiver isMessage: #==
  receiver: nil
  arguments: [:argNode | argNode == NodeNil])
  ifFalse: [^ nil].
  ^ (MessageNode new
  receiver: receiver
  selector: (SelectorNode new key: #ifTrue:ifFalse: code: #macro)
  arguments: arguments
  precedence: 3)
  noteSpecialSelector: #ifNil:ifNotNil:!

Item was changed:
  ParseNode subclass: #MessageNode
+ instanceVariableNames: 'receiver selector precedence special arguments sizes equalNode caseErrorNode originalSelector originalArguments'
- instanceVariableNames: 'receiver selector precedence special arguments sizes equalNode caseErrorNode'
  classVariableNames: 'MacroEmitters MacroPrinters MacroSelectors MacroSizers MacroTransformers StdTypers ThenFlag'
  poolDictionaries: ''
  category: 'Compiler-ParseNodes'!
 
  !MessageNode commentStamp: '<historical>' prior: 0!
  I represent a receiver and its message.
 
  Precedence codes:
  1 unary
  2 binary
  3 keyword
  4 other
 
  If special>0, I compile special code in-line instead of sending messages with literal methods as remotely copied contexts.!

Item was changed:
  ----- Method: MessageNode>>ensureCanCascade: (in category 'testing') -----
  ensureCanCascade: encoder
 
  special > 0 ifTrue:
  [special := 0.
+ selector := encoder encodeSelector: originalSelector.
+ arguments := originalArguments.
+ arguments do:
- selector := encoder encodeSelector: selector key.
- arguments do:
  [:each|
  each isBlockNode ifTrue:
  [each deoptimize]]]!

Item was changed:
  ----- Method: MessageNode>>receiver:arguments:precedence: (in category 'private') -----
  receiver: rcvr arguments: args precedence: p
 
  receiver := rcvr.
  arguments := args.
+ originalArguments := arguments copy.
  sizes := Array new: arguments size.
  precedence := p!

Item was changed:
  ----- Method: MessageNode>>receiver:selector:arguments:precedence: (in category 'initialize-release') -----
  receiver: rcvr selector: selNode arguments: args precedence: p
  "Decompile."
 
  self receiver: rcvr
  arguments: args
  precedence: p.
+ originalSelector := selNode key.
  selNode code == #macro
  ifTrue: [self noteSpecialSelector: selNode key]
  ifFalse: [special := 0].
  selector := selNode.
  "self pvtCheckForPvtSelector: encoder"
  "We could test code being decompiled, but the compiler should've checked already. And where to send the complaint?"!

Item was changed:
  ----- Method: MessageNode>>receiver:selector:arguments:precedence:from: (in category 'initialize-release') -----
  receiver: rcvr selector: aSelector arguments: args precedence: p from: encoder
  "Compile."
 
  self receiver: rcvr
  arguments: args
  precedence: p.
+ originalSelector := aSelector.
  self noteSpecialSelector: aSelector.
  (self transform: encoder)
  ifTrue:
  [selector isNil ifTrue:
  [selector := SelectorNode new
  key: (MacroSelectors at: special)
  code: #macro]]
  ifFalse:
  [selector := encoder encodeSelector: aSelector.
  rcvr == NodeSuper ifTrue: [encoder noteSuper]].
  self pvtCheckForPvtSelector: encoder!


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Compiler-nice.194.mcz

Juan Vuletich-4
[hidden email] wrote:

> Nicolas Cellier uploaded a new version of Compiler to project The Trunk:
> http://source.squeak.org/trunk/Compiler-nice.194.mcz
>
> ==================== Summary ====================
>
> Name: Compiler-nice.194
> Author: nice
> Time: 4 March 2011, 4:51:51.372 am
> UUID: de6fad00-fa6c-4622-9c03-046113d7e4fe
> Ancestors: Compiler-ul.193
>
> Fix cascading of special messages.
>
> During inlining of some special messages, the MessageNode selector and/or arguments might be destructively replaced.
> (for example #ifFalseifTrue: ifNil:ifNotNil: etc...)
>
> If we later decide to un-optimize, it is necessary to restore the originalSelector and originalArguments.
> (for example when these messages are cascaded)
>
> Also fix a bug occuring when decompiling these cascaded specials.
>
> Thanks to Juan for testing/enhancing this useless but beautiful stuff.
>  

Not sure if useless. It helps make the language more consistent and has
educational value. Indeed it is beautiful stuff!

Thanks Nicolas.

Cheers,
Juan Vuletich