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