Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.889.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.889 Author: eem Time: 30 September 2014, 3:29:12.712 pm UUID: f7ca0f83-4116-4c07-8307-3c23f8f5600a Ancestors: VMMaker.oscog-eem.888
Fix the assert fail caused by a frameless method with an unaccessed temp. Move the assert check to genPushTemporaryVariable:.
=============== Diff against VMMaker.oscog-eem.888 ===============
Item was changed: ----- Method: StackToRegisterMappingCogit>>genPushTemporaryVariable: (in category 'bytecode generators') ----- genPushTemporaryVariable: index + "If a frameless method (not a block), only argument temps can be accessed. + This is assured by the use of needsFrameIfMod16GENumArgs: in pushTemp." + self assert: (inBlock or: [needsFrame or: [index < methodOrBlockNumArgs]]). ^self ssPushDesc: (simStack at: index)!
Item was changed: ----- Method: StackToRegisterMappingCogit>>initSimStackForFramelessBlock: (in category 'simulation stack') ----- initSimStackForFramelessBlock: startpc + "The register receiver (the closure itself) and args are pushed by the closure value primitive(s) - "The register receiver (he closure itself) and args are pushed by the closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, the method receiver (self) is put in the ReceiverResultRegister by the block entry." | desc | <var: #desc type: #'CogSimStackEntry *'> simSelf type: SSRegister; spilled: false; annotateUse: false; register: ReceiverResultReg. optStatus isReceiverResultRegLive: true; ssEntry: (self addressOf: simSelf). self assert: methodOrBlockNumTemps >= methodOrBlockNumArgs. - self assert: self numRegArgs <= 2. 0 to: methodOrBlockNumTemps - 1 do: [:i| desc := self simStackAt: i. desc type: SSBaseOffset; spilled: true; annotateUse: false; register: SPReg; offset: ((methodOrBlockNumTemps - i) * BytesPerWord); bcptr: startpc]. simSpillBase := simStackPtr := methodOrBlockNumTemps - 1!
Item was changed: ----- Method: StackToRegisterMappingCogit>>initSimStackForFramelessMethod: (in category 'simulation stack') ----- initSimStackForFramelessMethod: startpc | desc | <var: #desc type: #'CogSimStackEntry *'> simSelf type: SSRegister; spilled: false; annotateUse: false; register: ReceiverResultReg. optStatus isReceiverResultRegLive: true; ssEntry: (self addressOf: simSelf). + self assert: methodOrBlockNumTemps >= methodOrBlockNumArgs. - self assert: (methodOrBlockNumTemps = methodOrBlockNumArgs - or: [coInterpreter isQuickPrimitiveIndex: primitiveIndex]). self assert: self numRegArgs <= 2. (methodOrBlockNumArgs between: 1 and: self numRegArgs) ifTrue: [desc := self simStackAt: 0. desc type: SSRegister; spilled: false; annotateUse: false; register: Arg0Reg; bcptr: startpc. methodOrBlockNumArgs > 1 ifTrue: [desc := self simStackAt: 1. desc type: SSRegister; spilled: false; annotateUse: false; register: Arg1Reg; bcptr: startpc]] ifFalse: [0 to: methodOrBlockNumArgs - 1 do: [:i| desc := self simStackAt: i. desc type: SSBaseOffset; register: SPReg; spilled: true; annotateUse: false; offset: ((methodOrBlockNumArgs - i) * BytesPerWord); bcptr: startpc]]. simSpillBase := simStackPtr := methodOrBlockNumArgs - 1!