Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1449.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1449 Author: eem Time: 14 September 2015, 10:57:17.94 am UUID: d4ac7710-be23-4445-8a3c-1d95713d5f26 Ancestors: VMMaker.oscog-eem.1448
Fix positive32BitValueOf: & signed32BitValueOf: for 64-bit Spur; these must fail for SmallIntegers with digitLength > 4.
Modify secret primtiive 161, primitiveSetIdentityHash so that with 0 args it answers whether an object has an identity hash. This is vacuously true for V3, but is meaningful in Spur.
=============== Diff against VMMaker.oscog-eem.1448 ===============
Item was changed: ----- Method: InterpreterPrimitives>>positive32BitValueOf: (in category 'primitive support') ----- positive32BitValueOf: oop "Convert the given object into an integer value. The object may be either a positive SmallInteger or a four-byte LargePositiveInteger." <returnTypeC: #usqInt> | value ok sz | (objectMemory isIntegerObject: oop) ifTrue: [value := objectMemory integerValueOf: oop. + (value < 0 + or: [objectMemory wordSize > 4 + and: [self cCode: [(self cCoerceSimple: value to: #'unsigned int') ~= value] + inSmalltalk: [value >> 32 ~= 0]]]) ifTrue: + [self primitiveFail. value := 0]. - value < 0 ifTrue: [self primitiveFail. value := 0]. ^value].
(objectMemory isNonIntegerImmediate: oop) ifTrue: [self primitiveFail. ^0].
+ ok := objectMemory + isClassOfNonImm: oop - ok := objectMemory isClassOfNonImm: oop equalTo: (objectMemory splObj: ClassLargePositiveInteger) compactClassIndex: ClassLargePositiveIntegerCompactIndex. ok ifFalse: [self primitiveFail. ^0]. sz := objectMemory numBytesOfBytes: oop. sz > 4 ifTrue: [self primitiveFail. ^0]. ^self cppIf: VMBIGENDIAN ifTrue: [ (objectMemory fetchByte: 0 ofObject: oop) + ((objectMemory fetchByte: 1 ofObject: oop) << 8) + ((objectMemory fetchByte: 2 ofObject: oop) << 16) + ((objectMemory fetchByte: 3 ofObject: oop) << 24)] ifFalse: [objectMemory fetchLong32: 0 ofObject: oop]!
Item was added: + ----- Method: InterpreterPrimitives>>primitiveSetOrHasIdentityHash (in category 'object access primitives') ----- + primitiveSetOrHasIdentityHash + | hash oldHash thisReceiver | + argumentCount = 0 ifTrue: + [| hasHash | + hasHash := (objectMemory isNonImmediate: self stackTop) + and: [objectMemory hasIdentityHash: self stackTop]. + self pop: argumentCount + 1 thenPushBool: hasHash]. + hash := self stackIntegerValue: 0. + thisReceiver := self stackObjectValue: 1. + self successful ifTrue: + [oldHash := objectMemory hashBitsOf: thisReceiver. + objectMemory setHashBitsOf: thisReceiver to: hash. + self pop: argumentCount + 1 thenPushInteger: oldHash]!
Item was changed: ----- Method: InterpreterPrimitives>>signed32BitValueOf: (in category 'primitive support') ----- signed32BitValueOf: oop "Convert the given object into an integer value. The object may be either a positive SmallInteger or a four-byte LargeInteger." | value negative ok | <inline: false> <returnTypeC: #int> <var: #value type: #int> + <var: #value64 type: #long> (objectMemory isIntegerObject: oop) ifTrue: + [objectMemory wordSize = 4 + ifTrue: + [^objectMemory integerValueOf: oop] + ifFalse: "Must fail for SmallIntegers with digitLength > 4" + [| value64 | + value64 := objectMemory integerValueOf: oop. + (self cCode: [(self cCoerceSimple: value64 to: #int) ~= value64] + inSmalltalk: [value64 >> 31 ~= 0 and: [value64 >> 31 ~= -1]]) ifTrue: + [self primitiveFail. value64 := 0]. + ^value64]]. - [^objectMemory integerValueOf: oop].
(objectMemory isNonIntegerImmediate: oop) ifTrue: [self primitiveFail. ^0].
+ ok := objectMemory + isClassOfNonImm: oop + equalTo: (objectMemory splObj: ClassLargePositiveInteger) + compactClassIndex: ClassLargePositiveIntegerCompactIndex. - ok := objectMemory isClassOfNonImm: oop - equalTo: (objectMemory splObj: ClassLargePositiveInteger) - compactClassIndex: ClassLargePositiveIntegerCompactIndex. ok ifTrue: [negative := false] ifFalse: [negative := true. ok := objectMemory isClassOfNonImm: oop equalTo: (objectMemory splObj: ClassLargeNegativeInteger) compactClassIndex: ClassLargeNegativeIntegerCompactIndex. ok ifFalse: [self primitiveFail. ^0]]. (objectMemory numBytesOfBytes: oop) > 4 ifTrue: [^self primitiveFail].
value := self cppIf: VMBIGENDIAN ifTrue: [ (objectMemory fetchByte: 0 ofObject: oop) + ((objectMemory fetchByte: 1 ofObject: oop) << 8) + ((objectMemory fetchByte: 2 ofObject: oop) << 16) + ((objectMemory fetchByte: 3 ofObject: oop) << 24)] ifFalse: [objectMemory fetchLong32: 0 ofObject: oop]. self cCode: [] inSmalltalk: [(value anyMask: 16r80000000) ifTrue: [value := value - 16r100000000]]. "Filter out values out of range for the signed interpretation such as 16rFFFFFFFF (positive w/ bit 32 set) and -16rFFFFFFFF (negative w/ bit 32 set). Since the sign is implicit in the class we require that the high bit of the magnitude is not set which is a simple test here. Note that we have to handle the most negative 32-bit value -2147483648 specially." value < 0 ifTrue: [self assert: (self sizeof: value) == 4. "Don't fail for -16r80000000/-2147483648 Alas the simple (negative and: [value - 1 > 0]) isn't adequate since in C the result of signed integer overflow is undefined and hence under optimization this may fail. The shift, however, is well-defined." (negative and: [0 = (self cCode: [value << 1] inSmalltalk: [value << 1 bitAnd: (1 << 32) - 1])]) ifTrue: [^value]. self primitiveFail. ^0]. ^negative ifTrue: [0 - value] ifFalse: [value]!
Item was added: + ----- Method: ObjectMemory>>hasIdentityHash: (in category 'header access') ----- + hasIdentityHash: objOop + "Objects gain their identityHash on instantiation in V3." + <inline: true> + ^true!
Item was added: + ----- Method: SpurMemoryManager>>hasIdentityHash: (in category 'header access') ----- + hasIdentityHash: objOop + <inline: true> + ^self cCode: [self rawHashBitsOf: objOop] + inSmalltalk: [(self rawHashBitsOf: objOop) ~= 0]!
Item was changed: ----- Method: StackInterpreter class>>initializePrimitiveTable (in category 'initialization') ----- (excessive size, no diff calculated)
vm-dev@lists.squeakfoundation.org