[squeak-dev] The Trunk: Compiler-eem.333.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Mar 30 23:06:58 UTC 2017
Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.333.mcz
==================== Summary ====================
Name: Compiler-eem.333
Author: eem
Time: 30 March 2017, 4:06:49.311904 pm
UUID: 89658511-31df-4a48-8b8f-ea3a070871fd
Ancestors: Compiler-ul.332
Nuke obsolete bytecodeless closure implementation support.
Nuke not trearting special selector 200 aas a real send (was #blockCopy: now #~~).
=============== Diff against Compiler-ul.332 ===============
Item was removed:
- ----- Method: Decompiler>>checkForBlock:selector:arguments: (in category 'control') -----
- checkForBlock: receiver selector: selector arguments: arguments
- selector == #blockCopy: ifTrue:
- [^self checkForBlockCopy: receiver].
- self assert: selector == #closureCopy:copiedValues:.
- ^self checkForClosureCopy: receiver arguments: arguments!
Item was changed:
----- Method: Decompiler>>send:super:numArgs: (in category 'instruction decoding') -----
send: selector super: superFlag numArgs: numArgs
+ | args rcvr |
-
- | args rcvr selNode msgNode messages |
args := Array new: numArgs.
(numArgs to: 1 by: -1) do:
[:i | args at: i put: stack removeLast].
rcvr := stack removeLast.
+ superFlag ifTrue: [rcvr := constructor codeSuper]!
- superFlag ifTrue: [rcvr := constructor codeSuper].
- ((#(blockCopy: closureCopy:copiedValues:) includes: selector)
- and: [self checkForBlock: rcvr selector: selector arguments: args]) ifFalse:
- [selNode := constructor codeAnySelector: selector.
- rcvr == CascadeFlag
- ifTrue:
- ["May actually be a cascade or an ifNil: for value."
- self willJumpIfFalse
- ifTrue: "= generated by a case macro"
- [selector == #= ifTrue:
- [" = signals a case statement..."
- statements addLast: args first.
- stack addLast: rcvr. "restore CascadeFlag"
- ^ self].
- selector == #== ifTrue:
- [" == signals an ifNil: for value..."
- stack removeLast; removeLast.
- rcvr := stack removeLast.
- stack addLast: IfNilFlag;
- addLast: (constructor
- codeMessage: rcvr
- selector: selNode
- arguments: args).
- ^ self]]
- ifFalse:
- [(self willJumpIfTrue and: [selector == #==]) ifTrue:
- [" == signals an ifNotNil: for value..."
- stack removeLast; removeLast.
- rcvr := stack removeLast.
- stack addLast: IfNilFlag;
- addLast: (constructor
- codeMessage: rcvr
- selector: selNode
- arguments: args).
- ^ self]].
- msgNode := constructor
- codeCascadedMessage: selNode
- arguments: args.
- stack last == CascadeFlag ifFalse:
- ["Last message of a cascade"
- statements addLast: msgNode.
- messages := self popTo: stack removeLast. "Depth saved by first dup"
- msgNode := constructor
- codeCascade: stack removeLast
- messages: messages]]
- ifFalse:
- [msgNode := constructor
- codeMessage: rcvr
- selector: selNode
- arguments: args].
- stack addLast: msgNode]!
Item was changed:
----- Method: EncoderForV3 class>>isRealSendAt:in: (in category 'instruction stream support') -----
isRealSendAt: pc in: method
"Answer whether the bytecode at pc is a real message-send, not blockCopy:."
| byte |
byte := method at: pc.
+ ^byte >= 176 "special send or short send"
+ or: [byte >= 131
- ^(byte >= 176 "special send or short send"
- and: [byte ~= 200 "special selector blockCopy:"
- or: [(Smalltalk specialSelectorAt: 200 - 175) ~~ #blockCopy:]])
- or: [byte >= 131
and: [byte <= 134 "long sends"
and: [byte ~= 132 "double extended do anything"
or: [(method at: pc + 1) // 32 <= 1]]]]!
More information about the Squeak-dev
mailing list
|