After updating to Squeak 2.3, Squeak would no longer simulate itself using the InterpreterSimulator. I fixed some bugs and it now works for me.
There were two bugs: 1. fetchNextBytecode was added to the bytecode methods in the interpreter. However, it was still present in the testStep method in InterpreterSimulator. This resulted in advancing 2 bytes instead of 1. I moved it from testStep to testStart.
2. primitiveShortAt had been added to the interpreter which used inline (textual) C code to get a short from an address. I copied the same method to InterpreterSimulator, changing the C code to a call to halfWordAt:, and added halfWordAt: and halfWordAt:put: to InterpreterSimulator and InterpreterSimulatorLSB. (InterpreterSimulatorLSB is a new class added by Tim Rowledge to simulate Squeak on little-endian systems. It is available at
http://sumeru.stanford.EDU/tim/pooters/SqFiles/deltas/VMsimulator.6Nov.cs )
File-ins follow.
Greg Gritton gritton@ibm.net
!InterpreterSimulator methodsFor: 'testing' stamp: 'GVG 1/21/1999 18:26'! test
self testStart. [true] whileTrue: [ self testStep]. self testEnd ! !
!InterpreterSimulator methodsFor: 'testing' stamp: 'GVG 1/27/1999 19:57'! testStart
Transcript clear. byteCount _ 0. self internalizeIPandSP. currentBytecode _ self fetchByte. ! !
!InterpreterSimulator methodsFor: 'memory access' stamp: 'GVG 1/27/1999 20:47'! primitiveShortAt "Treat the receiver, which can be indexible by either bytes or words, as an array of signed 16-bit values. Return the contents of the given index. Note that the index specifies the i-th 16-bit entry, not the i-th byte or word."
| index rcvr sz addr value | index _ self stackIntegerValue: 0. rcvr _ self stackValue: 1. self success: ((self isIntegerObject: rcvr) not and: [self isWordsOrBytes: rcvr]). successFlag ifFalse: [ ^ nil ]. sz _ ((self sizeBitsOf: rcvr) - BaseHeaderSize) // 2. "number of 16-bit fields" self success: ((index >= 1) and: [index <= sz]). successFlag ifTrue: [ addr _ rcvr + BaseHeaderSize + (2 * (index - 1)). value _ self halfWordAt: addr. self pop: 2. "pop rcvr, index" self pushInteger: value. "push element value" ]. ! !
!InterpreterSimulator methodsFor: 'memory access' stamp: 'GVG 1/27/1999 20:41'! halfWordAt: byteAddress "Return the half-word at byteAddress which must be even." | lowBits | lowBits _ byteAddress bitAnd: 2. ^((self longAt: byteAddress - lowBits) bitShift: (lowBits - 2) * 8) bitAnd: 16rFFFF ! !
!InterpreterSimulator methodsFor: 'memory access' stamp: 'GVG 1/27/1999 20:43'! halfWordAt: byteAddress put: halfWord | longWord shift lowBits | lowBits _ byteAddress bitAnd: 2. longWord _ self longAt: byteAddress - lowBits. shift _ (2 - lowBits) * 8. longWord _ longWord - (longWord bitAnd: (16rFFFF bitShift: shift)) + (halfWord bitShift: shift). self longAt: byteAddress put: longWord ! !
!InterpreterSimulatorLSB methodsFor: 'memory access' stamp: 'GVG 1/27/1999 20:43'! halfWordAt: byteAddress | lowBits | lowBits _ byteAddress bitAnd: 2. ^((self longAt: byteAddress - lowBits) bitShift: (0 - lowBits) * 8) bitAnd: 16rFFFF! !
!InterpreterSimulatorLSB methodsFor: 'memory access' stamp: 'GVG 1/27/1999 21:30'! halfWordAt: byteAddress put: halfWord | longWord shift lowBits | lowBits _ byteAddress bitAnd: 2. longWord _ self longAt: byteAddress - lowBits. shift _ lowBits * 8. longWord _ longWord - (longWord bitAnd: (16rFFFF bitShift: shift)) + (halfWord bitShift: shift). self longAt: byteAddress - lowBits put: longWord ! !
squeak-dev@lists.squeakfoundation.org