Eliot Miranda uploaded a new version of Cog to project VM Maker: http://source.squeak.org/VMMaker/Cog-eem.231.mcz
==================== Summary ====================
Name: Cog-eem.231 Author: eem Time: 25 December 2014, 3:24:27.566 pm UUID: 05230b26-8846-4550-8343-40baaf79bffd Ancestors: Cog-eem.230
Fix bug in 32-bit to 64-bit bootstrap that pinned all objects. Add pinning methods.
=============== Diff against Cog-eem.230 ===============
Item was changed: ----- Method: Spur32to64BitBootstrap>>clone: (in category 'bootstrap image') ----- clone: obj32 | obj64 format numSlots numBytes hash | format := heap32 formatOf: obj32. numSlots := heap32 numSlotsOf: obj32. format > heap32 lastPointerFormat ifTrue: [format < heap32 firstByteFormat ifTrue: [format = heap32 firstLongFormat ifTrue: [numSlots := heap32 numSlotsOf: obj32. numSlots odd ifTrue: [format := format + 1]. numSlots := numSlots + 1 // 2] ifFalse: [self error: 'bad format']] ifFalse: [numBytes := heap32 numBytesOf: obj32. format < heap32 firstCompiledMethodFormat ifTrue: [format := heap64 byteFormatForNumBytes: numBytes. numSlots := numSlots + 1 // 2] ifFalse: [numSlots := heap32 numPointerSlotsOf: obj32. numBytes := numBytes - (numSlots * heap32 bytesPerOop). format := (heap64 byteFormatForNumBytes: numBytes) + heap32 firstCompiledMethodFormat - heap32 firstByteFormat. numSlots := numSlots + (heap64 numSlotsForBytes: numBytes)]]]. obj64 := heap64 allocateSlots: numSlots format: format classIndex: (heap32 classIndexOf: obj32). (hash := heap32 rawHashBitsOf: obj32) ~= 0 ifTrue: [heap64 setHashBitsOf: obj64 to: hash]. + (heap32 isImmutable: obj32) ifTrue: - (heap32 isImmutable: obj32) ~= 0 ifTrue: [heap64 setIsImmutableOf: obj64 to: true]. + (heap32 isPinned: obj32) ifTrue: - (heap32 isPinned: obj32) ~= 0 ifTrue: [heap64 setIsPinnedOf: obj64 to: true]. self deny: (heap32 isRemembered: obj32). self deny: (heap32 isMarked: obj32). self deny: (heap32 isGrey: obj32). reverseMap at: obj64 put: obj32. ^map at: obj32 put: obj64!
Item was changed: ----- Method: SpurBootstrap class>>categoryForClass:meta:selector: (in category 'method prototype categorization') ----- categoryForClass: className meta: isMeta selector: selector ^(isMeta ifTrue: [{ className. #class. selector }] ifFalse: [{ className. selector }]) caseOf: { [#(Behavior allInstancesOrNil)] -> [#enumerating]. [#(Behavior byteSizeOfInstance)] -> [#'accessing instances and variables']. [#(Behavior byteSizeOfInstanceOfSize:)] -> [#'accessing instances and variables']. [#(Behavior elementSize)] -> [#'accessing instances and variables']. [#(Behavior handleFailingBasicNew)] -> [#private]. [#(Behavior handleFailingBasicNew:)] -> [#private]. [#(Behavior handleFailingFailingBasicNew)] -> [#private]. [#(Behavior handleFailingFailingBasicNew:)] -> [#private]. [#(Behavior identityHash)] -> [#comparing]. [#(Behavior isCompiledMethodClass)] -> [#testing]. [#(Behavior isEphemeronClass)] -> [#testing]. [#(Behavior isImmediateClass)] -> [#testing]. [#(BoxedFloat64 class basicNew)] -> [#'instance creation']. [#(BoxedFloat64 class basicNew:)] -> [#'instance creation']. [#(Character identityHash)] -> [#comparing]. [#(Character setValue:)] -> [#accessing]. [#(Class immediateSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category:)] -> [#'subclass creation']. [#(ClassBuilder superclass:immediateSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category:)] -> [#public]. [#(CompiledMethod bytecodeSetName)] -> [#accessing]. [#(CompiledMethod class handleFailingFailingNewMethod:header:)] -> [#private]. [#(CompiledMethod class handleFailingNewMethod:header:)] -> [#private]. [#(CompiledMethod class headerFlagForEncoder:)] -> [#'method encoding']. [#(CompiledMethod class installPrimaryBytecodeSet:)] -> [#'class initialization']. [#(CompiledMethod class installSecondaryBytecodeSet:)] -> [#'class initialization']. [#(Context class allInstances)] -> [#enumerating]. [#(Context class allInstancesDo:)] -> [#enumerating]. [#(Context failPrimitiveWith:)] -> [#'system simulation']. [#(Context isPrimFailToken:)] -> [#private]. [#(Context send:to:with:lookupIn:)] -> [#controlling]. [#(ContextPart isPrimFailToken:)] -> [#private]. [#(ContextPart send:to:with:lookupIn:)] -> [#controlling]. [#(EncoderForV3 computeMethodHeaderForNumArgs:numTemps:numLits:primitive:)] -> [#'method encoding']. [#(EncoderForV3PlusClosures genCallPrimitive:)] -> [#'bytecode generation']. [#(EncoderForV3PlusClosures class callPrimitiveCode)] -> [#'bytecode decoding']. [#(MethodContext failPrimitiveWith:)] -> [#'system simulation']. [#(MethodContext class allInstances)] -> [#enumerating]. [#(MethodContext class allInstancesDo:)] -> [#enumerating]. + [#(Object isPinned)] -> [#'system primitives']. + [#(Object pin)] -> [#'system primitives']. + [#(Object setPinned:)] -> [#'system primitives']. + [#(Object unpin)] -> [#'system primitives']. [#(SmallFloat64 class basicNew)] -> [#'instance creation']. [#(SmallFloat64 class basicNew:)] -> [#'instance creation']. [#(SmallFloat64 clone)] -> [#copying]. [#(SmallFloat64 copy)] -> [#copying]. [#(SmallFloat64 deepCopy)] -> [#copying]. + [#(SmallFloat64 identityHash)] -> [#comparing]. [#(SmallFloat64 shallowCopy)] -> [#copying]. [#(SmallFloat64 veryDeepCopyWith:)] -> [#copying]. [#(SmallInteger asCharacter)] -> [#converting]. [#(SmalltalkImage growMemoryByAtLeast:)] -> [#'memory space']. [#(SmalltalkImage maxIdentityHash)] -> [#'system attributes']. [#(SystemDictionary growMemoryByAtLeast:)] -> [#'memory space']. [#(SystemDictionary maxIdentityHash)] -> [#'system attributes']. [#(SystemDictionary setGCParameters)] -> [#'snapshot and quit']. [#(SystemNavigation allObjects)] -> [#query]. [#(SystemNavigation allObjectsOrNil)] -> [#query]. } otherwise: [Transcript nextPutAll: className. isMeta ifTrue: [Transcript nextPutAll: ' class']. Transcript nextPutAll: '>>'; store: selector; nextPutAll: ' is unclassified'; cr; flush. ^Categorizer default]!
Item was added: + ----- Method: SpurBootstrapPrototypes>>ObjectPROTOTYPEisPinned (in category 'method prototypes') ----- + ObjectPROTOTYPEisPinned + "Answer if the receiver is pinned. The VM's garbage collector routinely moves + objects as it reclaims and compacts memory. But it can also pin an object so + that it will not be moved, which can make it easier to pass objects out through + the FFI." + <primitive: 183 error: ec> + ^self primitiveFailed!
Item was added: + ----- Method: SpurBootstrapPrototypes>>ObjectPROTOTYPEpin (in category 'method prototypes') ----- + ObjectPROTOTYPEpin + "The VM's garbage collector routinely moves objects as it reclaims and compacts + memory. But it can also pin an object so that it will not be moved, which can make + it easier to pass objects out through the FFI. Objects are unpinnned when created. + This method ensures an object is pinned, and answers whether it was already pinned." + ^self setPinned: true!
Item was added: + ----- Method: SpurBootstrapPrototypes>>ObjectPROTOTYPEsetPinned: (in category 'method prototypes') ----- + ObjectPROTOTYPEsetPinned: aBoolean + "The VM's garbage collector routinely moves objects as it reclaims and compacts + memory. But it can also pin an object so that it will not be moved, which can make + it easier to pass objects out through the FFI. Objects are unpinnned when created. + This primitive either pins or unpins an object, and answers if it was already pinned." + <primitive: 184 error: ec> + ^self primitiveFailed!
Item was added: + ----- Method: SpurBootstrapPrototypes>>ObjectPROTOTYPEunpin (in category 'method prototypes') ----- + ObjectPROTOTYPEunpin + "The VM's garbage collector routinely moves objects as it reclaims and compacts + memory. But it can also pin an object so that it will not be moved, which can make + it easier to pass objects out through the FFI. Objects are unpinnned when created. + This method ensures an object is unpinned, and answers whether it was pinned." + ^self setPinned: false!
vm-dev@lists.squeakfoundation.org