Eliot Miranda uploaded a new version of Cog to project VM Maker: http://source.squeak.org/VMMaker/Cog-eem.230.mcz ==================== Summary ==================== Name: Cog-eem.230 Author: eem Time: 22 December 2014, 1:48:33.304 pm UUID: 24969f5e-e5a9-49a3-927e-28f5610df9f0 Ancestors: Cog-eem.229 Spur bootstrap: Add SmallFLoat64>>identityHash. Needs VMMaker.oscog-eem.997. Change ClassDescription>>updateInstancesFrom:... to use forwarding become. This is necessary if the GC in ClassBuilder>>#update:to: is to be avoided. =============== Diff against Cog-eem.229 =============== Item was added: + ----- Method: SpurBootstrapPrototypes>>ClassDescriptionPROTOTYPEupdateInstances:from:isMeta: (in category 'method prototypes') ----- + ClassDescriptionPROTOTYPEupdateInstances: oldInstances from: oldClass isMeta: isMeta + "Recreate any existing instances of the argument, oldClass, as instances of the receiver, + which is a newly changed class. Permute variables as necessary, and forward old instances + to new instances. Answer nil to defeat old clients that expect an array of old instances. + The old behaviour, which necessitated a global GC, exchanged identities and answered + the old instances. But no clients used the result. This way we avoid the unnecessary GC," + | map variable instSize newInstances | + + oldInstances isEmpty ifTrue: + [^nil]. "no instances to convert" + isMeta ifTrue: + [(oldInstances size = 1 + and: [self soleInstance class == self]) ifFalse: + [^self error:'Metaclasses can only have one instance']]. + map := self instVarMappingFrom: oldClass. + variable := self isVariable. + instSize := self instSize. + newInstances := Array new: oldInstances size. + 1 to: oldInstances size do: + [:i| + newInstances + at: i + put: (self newInstanceFrom: (oldInstances at: i) variable: variable size: instSize map: map)]. + "Now perform a bulk mutation of old instances into new ones" + oldInstances elementsForwardIdentityTo: newInstances. + ^nil! Item was added: + ----- Method: SpurBootstrapPrototypes>>ClassDescriptionPROTOTYPEupdateInstancesFrom: (in category 'method prototypes') ----- + ClassDescriptionPROTOTYPEupdateInstancesFrom: oldClass + "Recreate any existing instances of the argument, oldClass, as instances of + the receiver, which is a newly changed class. Permute variables as necessary, + and forward old instances to new instances.. Answer nil to defeat any clients + that expected the old behaviour of answering the array of old instances." + "ar 7/15/1999: The updating below is possibly dangerous. If there are any + contexts having an old instance as receiver it might crash the system if + the new receiver in which the context is executed has a different layout. + See bottom below for a simple example:" + self updateInstances: oldClass allInstances asArray from: oldClass isMeta: self isMeta. + "Now fix up instances in segments that are out on the disk." + ImageSegment allSubInstancesDo: + [:seg | + seg segUpdateInstancesOf: oldClass toBe: self isMeta: self isMeta]. + ^nil + + "This attempts to crash the VM by stepping off the end of an instance. + As the doctor says, do not do this." + " | crashingBlock class | + class := Object subclass: #CrashTestDummy + instanceVariableNames: 'instVar' + classVariableNames: '' + poolDictionaries: '' + category: 'Crash-Test'. + class compile:'instVar: value instVar := value'. + class compile:'crashingBlock ^[instVar]'. + crashingBlock := (class new) instVar: 42; crashingBlock. + Object subclass: #CrashTestDummy + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Crash-Test'. + crashingBlock value"! Item was added: + ----- Method: SpurBootstrapPrototypes>>SmallFloat64PROTOTYPEidentityHash (in category 'method prototypes') ----- + SmallFloat64PROTOTYPEidentityHash + "Answer an integer unique to the receiver." + <primitive: 171> + ^self primitiveFailed! |
Free forum by Nabble | Edit this page |