[Vm-dev] VM Maker: VMMaker-dtl.354.mcz
David T. Lewis
lewis at mail.msen.com
Fri Oct 24 14:56:03 UTC 2014
@Eliot,
This fix will not be relevant to Spur, so you may safely ignore it except
as an FYI.
Dave
>
> David T. Lewis uploaded a new version of VMMaker to project VM Maker:
> http://source.squeak.org/VMMaker/VMMaker-dtl.354.mcz
>
> ==================== Summary ====================
>
> Name: VMMaker-dtl.354
> Author: dtl
> Time: 24 October 2014, 8:35:45.512 am
> UUID: a38a877b-1f44-40b9-9ee8-c812a471808c
> Ancestors: VMMaker-bf.353
>
> VMMaker 4.13.7
>
> Fix bug in primitiveChangeClass exposed in the 64 bit 68002 image format.
> Corrects failure in evaluating:
>
> Inspector new primitiveChangeClassTo: CompiledMethodInspector new
>
> =============== Diff against VMMaker-bf.353 ===============
>
> Item was changed:
> ----- Method: Interpreter>>changeClassOf:to: (in category 'object access
> primitives') -----
> changeClassOf: rcvr to: argClass
> "Change the class of the receiver into the class specified by the
> argument given that the format of the receiver matches the format of
> the argument. Fail if receiver or argument are SmallIntegers, or the
> receiver is an instance of a compact class and the argument isn't, or
> when the argument's class is compact and the receiver isn't, or when
> the format of the receiver is different from the format of the
> argument's class, or when the arguments class is fixed and the
> receiver's size differs from the size that an instance of the
> argument's class should have."
> | classHdr sizeHiBits byteSize argFormat rcvrFormat ccIndex |
> "Check what the format of the class says"
> classHdr := objectMemory formatOfClass: argClass. "Low 2 bits are 0"
>
> "Compute the size of instances of the class (used for fixed field
> classes only)"
> sizeHiBits := (classHdr bitAnd: 16r60000) >> 9.
> classHdr := classHdr bitAnd: 16r1FFFF.
> byteSize := (classHdr bitAnd: objectMemory sizeMask) + sizeHiBits.
> "size in bytes -- low 2 bits are 0"
>
> "Check the receiver's format against that of the class"
> argFormat := (classHdr >> 8) bitAnd: 16rF.
> rcvrFormat := objectMemory formatOf: rcvr.
> argFormat = rcvrFormat ifFalse:[^self primitiveFail]. "no way"
>
> "For fixed field classes, the sizes must match.
> Note: byteSize-4 because base header is included in class size."
> + argFormat < 2 ifTrue:[(byteSize - 4) = (objectMemory byteSizeOf: rcvr)
> ifFalse:[^self primitiveFail]].
> - argFormat < 2 ifTrue:[(byteSize - objectMemory baseHeaderSize) =
> (objectMemory byteSizeOf: rcvr) ifFalse:[^self primitiveFail]].
>
> (objectMemory headerType: rcvr) = HeaderTypeShort
> ifTrue:[ "Compact classes. Check if the arg's class is compact and
> exchange ccIndex"
> ccIndex := classHdr bitAnd: CompactClassMask.
> ccIndex = 0 ifTrue:[^self primitiveFail]. "class is not compact"
> objectMemory longAt: rcvr put:
> (((objectMemory longAt: rcvr) bitAnd: CompactClassMask bitInvert32)
> bitOr: ccIndex)]
> ifFalse:["Exchange the class pointer, which could make rcvr a root for
> argClass"
> objectMemory longAt: rcvr - objectMemory baseHeaderSize put:
> (argClass bitOr: (objectMemory headerType: rcvr)).
> (objectMemory oop: rcvr isLessThan: objectMemory getYoungStart)
> ifTrue: [objectMemory possibleRootStoreInto: rcvr value: argClass]]!
>
> Item was changed:
> ----- Method: VMMaker class>>versionString (in category 'version
> testing') -----
> versionString
>
> "VMMaker versionString"
>
> + ^'4.13.7'!
> - ^'4.13.6'!
>
More information about the Vm-dev
mailing list