Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.917.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.917 Author: eem Time: 2 November 2014, 7:38:07.226 pm UUID: 01a47aaa-5fab-45fc-ada3-3c26b0d51edd Ancestors: VMMaker.oscog-eem.916
Fix bad bug in callPrimitiveBytecode. Old code skipped past next bytecode. This broke code depending on ContextPart>>restart, such as Exception>>retry.
=============== Diff against VMMaker.oscog-eem.916 ===============
Item was changed: ----- Method: StackInterpreter>>callPrimitiveBytecode (in category 'miscellaneous bytecodes') ----- callPrimitiveBytecode "V4: 249 11111001 i i i i i i i i jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256) SistaV1: 248 11111000 iiiiiiii mjjjjjjj Call Primitive #iiiiiiii + (jjjjjjj * 256) m=1 means inlined primitive, no hard return after execution. V3/Spur: 139 10001011 i i i i i i i i jjjjjjjj Call Primitive #iiiiiiii + (jjjjjjjj * 256)" "Note that we simply skip a callPrimitiveBytecode at the start of a method that contains a primitive. This because methods like Context(Part)>>reset have to be updated to skip the callPrimtiive bytecode otherwise." self cppIf: SistaVM ifTrue: [| byte1 byte2 prim header | byte1 := self fetchByte. byte2 := self fetchByte. self fetchNextBytecode. byte2 < 128 ifTrue: + [header := objectMemory methodHeaderOf: method. - [header := self methodHeaderOf: method. ((self methodHeaderHasPrimitive: header) and: [localIP = (self initialPCForHeader: header method: method) + (self sizeOfCallPrimitiveBytecode: header)]) ifTrue: [^self]. localIP := localIP - 3. ^self respondToUnknownBytecode]. prim := byte2 - 128 << 8 + byte1. prim < 1000 ifTrue: [^self nullaryInlinePrimitive: prim].
prim < 2000 ifTrue: [^self unaryInlinePrimitive: prim - 1000]. prim < 3000 ifTrue: [^self binaryInlinePrimitive: prim - 2000].
prim < 4000 ifTrue: [^self trinaryInlinePrimitive: prim - 3000].
localIP := localIP - 3. ^self respondToUnknownBytecode] ifFalse: [| header | + header := objectMemory methodHeaderOf: method. - header := self methodHeaderOf: method. ((self methodHeaderHasPrimitive: header) and: [localIP asInteger = (self initialPCForHeader: header method: method)]) ifTrue: + [localIP := localIP + (self sizeOfCallPrimitiveBytecode: header) - 1. - [localIP := localIP + (self sizeOfCallPrimitiveBytecode: header). ^self fetchNextBytecode] ifFalse: [^self respondToUnknownBytecode]]!
vm-dev@lists.squeakfoundation.org