Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.610.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.610 Author: eem Time: 5 February 2014, 7:21:23.697 pm UUID: 1f5ba92f-b8cd-4144-8ebf-5cff693870ac Ancestors: VMMaker.oscog-eem.609
Make StackInterpreterPrimitives>>primitiveObjectPointsTo correct for both Spur and SqueakV3.
=============== Diff against VMMaker.oscog-eem.609 ===============
Item was changed: ----- Method: StackInterpreterPrimitives>>primitiveObjectPointsTo (in category 'object access primitives') ----- primitiveObjectPointsTo "This primitive is assumed to be fast (see e.g. MethodDictionary>>includesKey:) so make it so. N.B. Written to use literalHeaderOf: so that in Cog subclasses cogged methods (whose headers point to the machine code method) are still correctly scanned, for the header as well as literals." + | rcvr thang header fmt numSlots methodHeader | - | rcvr thang header fmt lastField methodHeader | thang := self stackTop. rcvr := self stackValue: 1. (objectMemory isImmediate: rcvr) ifTrue: [^self pop: 2 thenPushBool: false].
"Inlined version of lastPointerOf: for speed in determining if rcvr is a context." header := objectMemory baseHeader: rcvr. fmt := objectMemory formatOfHeader: header. (objectMemory isPointersFormat: fmt) ifTrue: [(fmt = objectMemory indexablePointersFormat and: [objectMemory isContextHeader: header]) ifTrue: [(self isMarriedOrWidowedContext: rcvr) ifTrue: [self externalWriteBackHeadFramePointers. (self isStillMarriedContext: rcvr) ifTrue: [^self pop: 2 thenPushBool: (self marriedContext: rcvr pointsTo: thang stackDeltaForCurrentFrame: 2)]]. "contexts end at the stack pointer" + numSlots := CtxtTempFrameStart + (self fetchStackPointerOf: rcvr)] - lastField := CtxtTempFrameStart + (self fetchStackPointerOf: rcvr) * BytesPerOop] ifFalse: + [numSlots := objectMemory numSlotsOf: rcvr]] - [lastField := (objectMemory sizeBitsOfSafe: rcvr) - objectMemory baseHeaderSize]] ifFalse: [fmt < objectMemory firstCompiledMethodFormat "no pointers" ifTrue: [^self pop: 2 thenPushBool: false]. "CompiledMethod: contains both pointers and bytes:" methodHeader := self headerOf: rcvr. methodHeader = thang ifTrue: [^self pop: 2 thenPushBool: true]. + numSlots := (self literalCountOfHeader: methodHeader) + 1]. - lastField := ((self literalCountOfHeader: methodHeader) + 1) * BytesPerOop].
+ self assert: numSlots - 1 * BytesPerOop + objectMemory baseHeaderSize = (objectMemory lastPointerOf: rcvr). + objectMemory baseHeaderSize + to: numSlots - 1 * BytesPerOop + objectMemory baseHeaderSize + by: BytesPerOop + do: [:i| + (self longAt: rcvr + i) = thang ifTrue: + [^self pop: 2 thenPushBool: true]]. - objectMemory baseHeaderSize to: lastField by: objectMemory bytesPerOop do: - [:i | - (self longAt: rcvr + i) = thang ifTrue: - [^self pop: 2 thenPushBool: true]]. self pop: 2 thenPushBool: false!
Item was added: + ----- Method: StackInterpreterSimulator>>primitiveObjectPointsTo (in category 'object access primitives') ----- + primitiveObjectPointsTo + "self halt." + ^super primitiveObjectPointsTo!
vm-dev@lists.squeakfoundation.org