Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-eem.362.mcz
==================== Summary ====================
Name: Compiler-eem.362 Author: eem Time: 5 January 2018, 10:30:42.489732 am UUID: 6024b2f1-3e38-4625-a934-dd3f7cb29484 Ancestors: Compiler-eem.361
Implement super sends in full blocks. Since CompiledBlock uses the last literal to refer to the outer CompiledCode, it can't hold the class association used in conventional super sends. Hence within a block a super send must use the directed super send form.
=============== Diff against Compiler-eem.361 ===============
Item was added: + ----- Method: BytecodeEncoder>>generatingFullBlock (in category 'testing') ----- + generatingFullBlock + "Answer if the encoder is currently generating a FullBlock, embedded in some method." + + "When generating a FullBlock a copy of the encoder for the home emthod (rootNode) + is used, and hence the following is true." + ^rootNode encoder ~~ self!
Item was added: + ----- Method: Decompiler>>directedSuperSend:numArgs: (in category 'instruction decoding') ----- + directedSuperSend: selector numArgs: numArgs + stack removeLast. "Discard the pushed class." + ^self send: selector super: true numArgs: numArgs!
Item was changed: ----- Method: SelectorNode>>emitCode:args:encoder:super: (in category 'code generation') ----- emitCode: stack args: nArgs encoder: encoder super: supered stack pop: nArgs. ^supered ifTrue: + [(encoder supportsFullBlocks + and: [encoder generatingFullBlock]) + ifTrue: + [encoder genPushLiteral: (encoder sharableLitIndex: encoder classEncoding). + encoder genSendDirectedSuper: index numArgs: nArgs] + ifFalse: [encoder genSendSuper: index numArgs: nArgs]] - [encoder genSendSuper: index numArgs: nArgs] ifFalse: [encoder genSend: (code < Send ifTrue: [code negated] ifFalse: [index]) numArgs: nArgs]!
Item was changed: ----- Method: SelectorNode>>sizeCode:args:super: (in category 'code generation') ----- sizeCode: encoder args: nArgs super: supered self reserve: encoder. ^supered ifTrue: [code < Send "i.e. its a special selector" ifTrue: [code := self code: (index := encoder sharableLitIndex: key) type: 5]. + (encoder supportsFullBlocks + and: [encoder generatingFullBlock]) + ifTrue: [(encoder sizePushLiteral: (encoder sharableLitIndex: encoder classEncoding)) + + (encoder sizeSendDirectedSuper: index numArgs: nArgs)] + ifFalse: [encoder sizeSendSuper: index numArgs: nArgs]] - encoder sizeSendSuper: index numArgs: nArgs] ifFalse: [self flag: #yuck. "special selector sends cause this problem" encoder sizeSend: (code < Send ifTrue: [code negated] ifFalse: [index]) numArgs: nArgs]!
packages@lists.squeakfoundation.org