[Vm-dev] VM Maker: Cog-eem.443.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Oct 13 00:06:27 UTC 2021
Eliot Miranda uploaded a new version of Cog to project VM Maker:
http://source.squeak.org/VMMaker/Cog-eem.443.mcz
==================== Summary ====================
Name: Cog-eem.443
Author: eem
Time: 12 October 2021, 5:06:25.327116 pm
UUID: a2a61f70-7cad-4dcb-9939-a2a46b71d13a
Ancestors: Cog-eem.442
Make Spur32BitPreen image size agnostic, and hence also rename it to SpurImagePreener
=============== Diff against Cog-eem.442 ===============
Item was removed:
- SimulatorHarness subclass: #Spur32BitPreen
- instanceVariableNames: 'oldHeap newHeap map reverseMap oldInterpreter newInterpreter imageHeaderFlags savedWindowSize writeDefaultHeader'
- classVariableNames: ''
- poolDictionaries: 'VMObjectIndices'
- category: 'Cog-Bootstrapping'!
-
- !Spur32BitPreen commentStamp: 'eem 2/6/2020 18:44' prior: 0!
- A Spur32BitPreen is a simple image rewriter for 32-bit Spur images that eliminates free space and hence shrinks the preened image. Use via
- Spur32BitPreen new preenImage: 'spur'
- which will produce spur-preen.image and spur-preen.changes from spur.image and spur.changes.
-
- Instance Variables
- imageHeaderFlags: <Integer>
- map: <Dictionary>
- newHeap: <Spur32BitMMLESimulator>
- newInterpreter: <StackInterpreterSimulatorLSB>
- oldHeap: <Spur32BitMMLESimulator>
- oldInterpreter: <StackInterpreterSimulatorLSB>
- reverseMap: <Dictionary>
- savedWindowSize: <Integer>
-
- imageHeaderFlags
- - flags word in image header
-
- map
- - map from oops in old image to oops in new image
-
- newHeap
- - the preened heap
-
- newInterpreter
- - the interpreter wrapping the preened heap
-
- oldHeap
- - the heap to be preened
-
- oldInterpreter
- - the interpreter wrapping the heap to be preened
-
- reverseMap
- - map from oops in new image to oops in old image
-
- savedWindowSize
- - screen size word in mage header
- !
Item was removed:
- ----- Method: Spur32BitPreen>>cloneFreeLists: (in category 'bootstrap image') -----
- cloneFreeLists: oldObj
- | newObj |
- newObj := newHeap
- allocateSlots: newHeap numFreeLists
- format: newHeap wordIndexableFormat
- classIndex: newHeap wordSizeClassIndexPun.
- reverseMap at: newObj put: oldObj.
- ^map at: oldObj put: newObj!
Item was removed:
- ----- Method: Spur32BitPreen>>cloneObject: (in category 'bootstrap image') -----
- cloneObject: oldObj
- | newObj hash |
- newObj := newHeap
- allocateSlots: (oldHeap numSlotsOf: oldObj)
- format: (oldHeap formatOf: oldObj)
- classIndex: (oldHeap classIndexOf: oldObj).
- (hash := oldHeap rawHashBitsOf: oldObj) ~= 0 ifTrue:
- [newHeap setHashBitsOf: newObj to: hash].
- (oldHeap isImmutable: oldObj) ifTrue:
- [newHeap setIsImmutableOf: newObj to: true].
- (oldHeap isPinned: oldObj) ifTrue:
- [newHeap setIsPinnedOf: newObj to: true].
- self deny: (oldHeap isRemembered: oldObj).
- self deny: (oldHeap isMarked: oldObj).
- self deny: (oldHeap isGrey: oldObj).
- reverseMap at: newObj put: oldObj.
- ^map at: oldObj put: newObj!
Item was removed:
- ----- Method: Spur32BitPreen>>cloneObjects (in category 'bootstrap image') -----
- cloneObjects
- "Clone all normal objects. Of hidden objects only clone the freeLists object and
- the classTableRoot and class table pages. In particular, dont clone objStacks.
- The refs to the objStacks are nilled out in fillInHeap."
- | i freeListsObject |
- i := 0.
- freeListsObject := oldHeap freeListsObject.
- oldHeap allOldSpaceObjectsDo:
- [:obj32|
- (i := i + 1) >= 100000 ifTrue:
- [Transcript nextPut: $:; flush. i := 0].
- obj32 = freeListsObject
- ifTrue:
- [self cloneFreeLists: obj32]
- ifFalse:
- [(self shouldClone: obj32) ifTrue:
- [self cloneObject: obj32]]]!
Item was removed:
- ----- Method: Spur32BitPreen>>fillInBitsObject:from: (in category 'bootstrap image') -----
- fillInBitsObject: obj64 from: obj32
- 0 to: (oldHeap numBytesOf: obj32) - 1 do:
- [:i|
- newHeap
- storeByte: i
- ofObject: obj64
- withValue: (oldHeap fetchByte: i ofObject: obj32)]!
Item was removed:
- ----- Method: Spur32BitPreen>>fillInClassTable (in category 'bootstrap image') -----
- fillInClassTable
- self fillInPointerObject: (map at: oldHeap classTableRootObj) from: oldHeap classTableRootObj!
Item was removed:
- ----- Method: Spur32BitPreen>>fillInCompiledMethod:from: (in category 'bootstrap image') -----
- fillInCompiledMethod: newObj from: oldObj
- "oldInterpreter printOop: oldObj"
- "newInterpreter printOop: newObj"
- 0 to: (oldHeap numPointerSlotsOf: oldObj) - 1 do:
- [:i| | oldOop newOop |
- oldOop := oldHeap fetchPointer: i ofObject: oldObj.
- newOop := self map32BitOop: oldOop.
- newHeap
- storePointerUnchecked: i
- ofObject: newObj
- withValue: newOop].
- (oldInterpreter startPCOfMethod: oldObj)
- to: (oldHeap numBytesOf: oldObj) - 1
- do: [:j|
- newHeap
- storeByte: j
- ofObject: newObj
- withValue: (oldHeap fetchByte: j ofObject: oldObj)]!
Item was removed:
- ----- Method: Spur32BitPreen>>fillInHeap (in category 'bootstrap image') -----
- fillInHeap
- | heapEnd freeListsObj |
- heapEnd := newHeap freeStart.
- newHeap
- nilObject: (map at: oldHeap nilObject);
- falseObject: (map at: oldHeap falseObject);
- trueObject: (map at: oldHeap trueObject);
- specialObjectsOop: (map at: oldHeap specialObjectsOop);
- lastHash: oldHeap lastHash;
- setHiddenRootsObj: (map at: oldHeap classTableRootObj).
- newHeap segmentManager
- initSegmentForInImageCompilationFrom: newHeap nilObject
- to: heapEnd + newHeap bridgeSize.
- freeListsObj := newHeap objectAfter: newHeap trueObject.
- "Nil-out the free lists."
- newHeap
- fillObj: freeListsObj numSlots: (newHeap numSlotsOf: freeListsObj) with: 0;
- initializeFreeSpacePostLoad: freeListsObj;
- initializePostBootstrap;
- setEndOfMemory: (newHeap segmentManager bridgeAt: 0) + newHeap baseHeaderSize!
Item was removed:
- ----- Method: Spur32BitPreen>>fillInObjects (in category 'bootstrap image') -----
- fillInObjects
- "interpreter32 printOop: oldObj"
- | i |
- {oldHeap markStack. oldHeap weaklingStack. oldHeap mournQueue} do:
- [:obj|
- obj ~= oldHeap nilObject ifTrue:
- [map at: obj put: (map at: oldHeap nilObject)]].
- i := 0.
- oldHeap allObjectsDo:
- [:oldObj|
- (i := i + 1) >= 10000 ifTrue:
- [Transcript nextPut: $.; flush. i := 0].
- (map at: oldObj ifAbsent: nil)
- ifNotNil:
- [:newObj| | format |
- (newHeap numSlotsOf: newObj) > 0 ifTrue: "filter-out filtered objStack pages"
- [format := oldHeap formatOf: oldObj.
- (newHeap isPointersFormat: format)
- ifTrue:
- [self fillInPointerObject: newObj from: oldObj]
- ifFalse:
- [(newHeap isCompiledMethodFormat: format)
- ifTrue: [self fillInCompiledMethod: newObj from: oldObj]
- ifFalse: [self fillInBitsObject: newObj from: oldObj]]]]
- ifNil: [self assert: (self isUnmappedObject: oldObj)]]!
Item was removed:
- ----- Method: Spur32BitPreen>>fillInPointerObject:from: (in category 'bootstrap image') -----
- fillInPointerObject: newObj from: oldObj
- 0 to: (oldHeap numSlotsOf: oldObj) - 1 do:
- [:i|
- newHeap
- storePointerUnchecked: i
- ofObject: newObj
- withValue: (self map32BitOop: (oldHeap fetchPointer: i ofObject: oldObj))]!
Item was removed:
- ----- Method: Spur32BitPreen>>incrementPCField:ofObject:for: (in category 'bootstrap image') -----
- incrementPCField: fieldIndex ofObject: obj64 for: method32
- | value nLits |
- value := newHeap fetchPointer: fieldIndex ofObject: obj64.
- (newHeap isIntegerObject: value)
- ifTrue:
- [nLits := oldHeap literalCountOf: method32.
- newHeap
- storePointerUnchecked: fieldIndex
- ofObject: obj64
- withValue: (newHeap integerObjectOf: nLits + LiteralStart * 4 + (newHeap integerValueOf: value))]
- ifFalse:
- [self assert: (reverseMap at: value) = oldHeap nilObject]!
Item was removed:
- ----- Method: Spur32BitPreen>>initMaps (in category 'initialize-release') -----
- initMaps
- map := Dictionary new: oldHeap memory size // 32.
- reverseMap := Dictionary new: oldHeap memory size // 32!
Item was removed:
- ----- Method: Spur32BitPreen>>isUnmappedObject: (in category 'bootstrap image') -----
- isUnmappedObject: obj32
- "Answer if obj32 is an object that is not cloned by the bootstrap."
- ^obj32 = oldHeap freeListsObject
- or: [(oldHeap isValidObjStackPage: obj32)]!
Item was removed:
- ----- Method: Spur32BitPreen>>map32BitOop: (in category 'bootstrap image') -----
- map32BitOop: obj32
- "oldInterpreter printOop: obj32"
- ^map
- at: obj32
- ifAbsent:
- [(oldHeap isImmediateCharacter: obj32)
- ifTrue: [newHeap characterObjectOf: (oldHeap characterValueOf: obj32)]
- ifFalse: [newHeap integerObjectOf: (oldHeap integerValueOf: obj32)]]!
Item was removed:
- ----- Method: Spur32BitPreen>>on: (in category 'public access') -----
- on: imageName
- (oldInterpreter := StackInterpreterSimulator newWithOptions: #(ObjectMemory Spur32BitMemoryManager))
- openOn: imageName extraMemory: 0.
- oldHeap := oldInterpreter objectMemory.
- imageHeaderFlags := oldInterpreter getImageHeaderFlags.
- savedWindowSize ifNil: [savedWindowSize := oldInterpreter savedWindowSize].
- newInterpreter := StackInterpreterSimulator newWithOptions: #(ObjectMemory Spur32BitMemoryManager).
- newHeap := newInterpreter objectMemory.
- newHeap
- allocateMemoryOfSize: oldHeap oldSpaceSize
- newSpaceSize: 8 * 1024 * 1024
- stackSize: 16 * 1024
- codeSize: 0.
- newHeap bootstrapping: true.
- self initMaps!
Item was removed:
- ----- Method: Spur32BitPreen>>preenImage (in category 'public access') -----
- preenImage
- self cloneObjects.
- self fillInObjects.
- self fillInClassTable.
- self fillInHeap.
- self reportSizes!
Item was removed:
- ----- Method: Spur32BitPreen>>preenImage: (in category 'public access') -----
- preenImage: imageName
- (Smalltalk classNamed: #FileReference) ifNotNil:
- [^self preenImageUsingFileReference: imageName].
- (Smalltalk classNamed: #FileDirectory) ifNotNil:
- [^self preenImageUsingFileDirectory: imageName].
- self error: 'at a loss as to what file system support to use'!
Item was removed:
- ----- Method: Spur32BitPreen>>preenImageUsingFileDirectory: (in category 'public access') -----
- preenImageUsingFileDirectory: imageName
- | dirName baseName dir |
- dirName := FileDirectory dirPathFor: imageName.
- baseName := (imageName endsWith: '.image')
- ifTrue: [FileDirectory baseNameFor: imageName]
- ifFalse: [FileDirectory localNameFor: imageName].
- dir := dirName isEmpty ifTrue: [FileDirectory default] ifFalse: [FileDirectory default on: dirName].
- self on: (dir fullNameFor: baseName, '.image').
- [self preenImage]
- on: Halt
- do: [:ex|
- "suppress halts from the usual suspects (development time halts)"
- (#(fullGC compactImage) includes: ex signalerContext sender selector)
- ifTrue: [ex resume]
- ifFalse: [ex pass]].
- self writeSnapshot: (dir fullNameFor: baseName, '-preen.image')
- headerFlags: imageHeaderFlags
- screenSize: savedWindowSize.
- (dir fileExists: baseName, '.changes')
- ifTrue:
- [dir deleteFileNamed: baseName, '-preen.changes';
- copyFileNamed: baseName, '.changes' toFileNamed: baseName, '-preen.changes']
- ifFalse:
- [Transcript cr; show: 'could not find ', baseName, '.changes']!
Item was removed:
- ----- Method: Spur32BitPreen>>reportSizes (in category 'bootstrap image') -----
- reportSizes
- | change oldHeapSize newHeapSize |
- oldHeapSize := oldHeap oldSpaceSize.
- newHeap segmentManager computeTotalHeapSizeIncludingBridges. "To avoid assert fail"
- newHeapSize := newHeap oldSpaceSize.
- change := newHeapSize - oldHeapSize / oldHeapSize.
- Transcript
- nextPutAll: 'done.'; cr;
- nextPutAll: 'old heap size: '; nextPutAll: oldHeapSize asStringWithCommas; tab;
- nextPutAll: 'initial new heap size: '; nextPutAll: newHeapSize asStringWithCommas; cr;
- nextPutAll: 'change: '; print: change * 100.0 maxDecimalPlaces: 2; nextPut: $%; cr;
- flush.
- newHeapSize := newHeap endOfMemory
- - newHeap scavenger eden limit
- - newHeap totalFreeListBytes.
- change := newHeapSize - oldHeapSize / oldHeapSize.
- Transcript
- nextPutAll: 'final new heap size: '; nextPutAll: newHeapSize asStringWithCommas; tab;
- nextPutAll: 'change: '; print: change * 100.0 maxDecimalPlaces: 2; nextPut: $%; cr;
- flush!
Item was removed:
- ----- Method: Spur32BitPreen>>savedWindowSize: (in category 'public access') -----
- savedWindowSize: aPointOrInteger
- savedWindowSize := aPointOrInteger isInteger
- ifTrue: [aPointOrInteger]
- ifFalse: [(aPointOrInteger x min: 65535) << 16 + (aPointOrInteger y min: 65535)]!
Item was removed:
- ----- Method: Spur32BitPreen>>shouldClone: (in category 'bootstrap image') -----
- shouldClone: obj32
- ^(oldHeap isValidObjStackPage: obj32) not!
Item was removed:
- ----- Method: Spur32BitPreen>>writeDefaultHeader: (in category 'public access') -----
- writeDefaultHeader: aBoolean
- writeDefaultHeader := aBoolean!
Item was removed:
- ----- Method: Spur32BitPreen>>writeSnapshot:headerFlags:screenSize: (in category 'snapshot') -----
- writeSnapshot: imageFileName headerFlags: headerFlags screenSize: screenSizeInteger
- newHeap
- checkFreeSpace;
- runLeakCheckerForFullGC.
- writeDefaultHeader == true ifTrue:
- [newInterpreter
- desiredEdenBytes: 0;
- desiredNumStackPages: 0;
- setDesiredCogCodeSize: 0;
- setMaxExtSemSizeTo: 0].
- newInterpreter
- setImageHeaderFlagsFrom: headerFlags;
- setDisplayForm: nil;
- setSavedWindowSize: savedWindowSize;
- imageName: imageFileName;
- writeImageFileIO.
- Transcript cr; show: 'Done!!'!
Item was added:
+ SimulatorHarness subclass: #SpurImagePreener
+ instanceVariableNames: 'oldHeap newHeap map reverseMap oldInterpreter newInterpreter imageHeaderFlags savedWindowSize writeDefaultHeader wordSize'
+ classVariableNames: ''
+ poolDictionaries: 'VMObjectIndices'
+ category: 'Cog-Bootstrapping'!
+
+ !SpurImagePreener commentStamp: 'eem 10/12/2021 16:58' prior: 0!
+ A SpurImagePreener is a simple image rewriter for Spur images that eliminates free space and hence shrinks the preened image. Use via e.g.
+ SpurImagePreener new preenImage: 'spur'
+ which will produce spur-preen.image and spur-preen.changes from spur.image and spur.changes, etc.
+
+ Instance Variables
+ imageHeaderFlags: <Integer>
+ map: <Dictionary>
+ newHeap: <Spur[32|64]BitMMLESimulator>
+ newInterpreter: <StackInterpreterSimulatorLSB>
+ oldHeap: <Spur[32|64]BitMMLESimulator>
+ oldInterpreter: <StackInterpreterSimulatorLSB>
+ reverseMap: <Dictionary>
+ savedWindowSize: <Integer>
+
+ imageHeaderFlags
+ - flags word in image header
+
+ map
+ - map from oops in old image to oops in new image
+
+ newHeap
+ - the preened heap
+
+ newInterpreter
+ - the interpreter wrapping the preened heap
+
+ oldHeap
+ - the heap to be preened
+
+ oldInterpreter
+ - the interpreter wrapping the heap to be preened
+
+ reverseMap
+ - map from oops in new image to oops in old image
+
+ savedWindowSize
+ - screen size word in mage header
+ !
Item was added:
+ ----- Method: SpurImagePreener>>cloneFreeLists: (in category 'bootstrap image') -----
+ cloneFreeLists: oldObj
+ | newObj |
+ newObj := newHeap
+ allocateSlots: newHeap numFreeLists
+ format: newHeap wordIndexableFormat
+ classIndex: newHeap wordSizeClassIndexPun.
+ reverseMap at: newObj put: oldObj.
+ ^map at: oldObj put: newObj!
Item was added:
+ ----- Method: SpurImagePreener>>cloneObject: (in category 'bootstrap image') -----
+ cloneObject: oldObj
+ | newObj hash |
+ newObj := newHeap
+ allocateSlots: (oldHeap numSlotsOf: oldObj)
+ format: (oldHeap formatOf: oldObj)
+ classIndex: (oldHeap classIndexOf: oldObj).
+ (hash := oldHeap rawHashBitsOf: oldObj) ~= 0 ifTrue:
+ [newHeap setHashBitsOf: newObj to: hash].
+ (oldHeap isImmutable: oldObj) ifTrue:
+ [newHeap setIsImmutableOf: newObj to: true].
+ (oldHeap isPinned: oldObj) ifTrue:
+ [newHeap setIsPinnedOf: newObj to: true].
+ self deny: (oldHeap isRemembered: oldObj).
+ self deny: (oldHeap isMarked: oldObj).
+ self deny: (oldHeap isGrey: oldObj).
+ reverseMap at: newObj put: oldObj.
+ ^map at: oldObj put: newObj!
Item was added:
+ ----- Method: SpurImagePreener>>cloneObjects (in category 'bootstrap image') -----
+ cloneObjects
+ "Clone all normal objects. Of hidden objects only clone the freeLists object and
+ the classTableRoot and class table pages. In particular, dont clone objStacks.
+ The refs to the objStacks are nilled out in fillInHeap."
+ | i freeListsObject |
+ i := 0.
+ freeListsObject := oldHeap freeListsObject.
+ oldHeap allOldSpaceObjectsDo:
+ [:obj|
+ (i := i + 1) >= 100000 ifTrue:
+ [Transcript nextPut: $:; flush. i := 0].
+ obj = freeListsObject
+ ifTrue:
+ [self cloneFreeLists: obj]
+ ifFalse:
+ [(self shouldClone: obj) ifTrue:
+ [self cloneObject: obj]]]!
Item was added:
+ ----- Method: SpurImagePreener>>determineWordSizeFrom: (in category 'initialize-release') -----
+ determineWordSizeFrom: fileName
+ ^(ImageFormat fromFile: fileName) wordSize!
Item was added:
+ ----- Method: SpurImagePreener>>fillInBitsObject:from: (in category 'bootstrap image') -----
+ fillInBitsObject: newObj from: oldObj
+ 0 to: (oldHeap numSlotsOf: oldObj) - 1 do:
+ [:i|
+ newHeap
+ storePointerUnchecked: i
+ ofObject: newObj
+ withValue: (oldHeap fetchPointer: i ofObject: oldObj)]!
Item was added:
+ ----- Method: SpurImagePreener>>fillInClassTable (in category 'bootstrap image') -----
+ fillInClassTable
+ self fillInPointerObject: (map at: oldHeap classTableRootObj) from: oldHeap classTableRootObj!
Item was added:
+ ----- Method: SpurImagePreener>>fillInCompiledMethod:from: (in category 'bootstrap image') -----
+ fillInCompiledMethod: newObj from: oldObj
+ "oldInterpreter printOop: oldObj"
+ "newInterpreter printOop: newObj"
+ 0 to: (oldHeap numPointerSlotsOf: oldObj) - 1 do:
+ [:i| | oldOop newOop |
+ oldOop := oldHeap fetchPointer: i ofObject: oldObj.
+ newOop := self mapOop: oldOop.
+ newHeap
+ storePointerUnchecked: i
+ ofObject: newObj
+ withValue: newOop].
+ (oldInterpreter startPCOfMethod: oldObj)
+ to: (oldHeap numBytesOf: oldObj) - 1
+ do: [:j|
+ newHeap
+ storeByte: j
+ ofObject: newObj
+ withValue: (oldHeap fetchByte: j ofObject: oldObj)]!
Item was added:
+ ----- Method: SpurImagePreener>>fillInHeap (in category 'bootstrap image') -----
+ fillInHeap
+ | heapEnd freeListsObj |
+ heapEnd := newHeap freeStart.
+ newHeap
+ nilObject: (map at: oldHeap nilObject);
+ falseObject: (map at: oldHeap falseObject);
+ trueObject: (map at: oldHeap trueObject);
+ specialObjectsOop: (map at: oldHeap specialObjectsOop);
+ lastHash: oldHeap lastHash;
+ setHiddenRootsObj: (map at: oldHeap classTableRootObj).
+ newHeap segmentManager
+ initSegmentForInImageCompilationFrom: newHeap nilObject
+ to: heapEnd + newHeap bridgeSize.
+ freeListsObj := newHeap objectAfter: newHeap trueObject.
+ "Nil-out the free lists."
+ newHeap
+ fillObj: freeListsObj numSlots: (newHeap numSlotsOf: freeListsObj) with: 0;
+ initializeFreeSpacePostLoad: freeListsObj;
+ initializePostBootstrap;
+ setEndOfMemory: (newHeap segmentManager bridgeAt: 0) + newHeap baseHeaderSize!
Item was added:
+ ----- Method: SpurImagePreener>>fillInObjects (in category 'bootstrap image') -----
+ fillInObjects
+ "oldInterpreter printOop: oldObj"
+ | i |
+ {oldHeap markStack. oldHeap weaklingStack. oldHeap mournQueue} do:
+ [:obj|
+ obj ~= oldHeap nilObject ifTrue:
+ [map at: obj put: (map at: oldHeap nilObject)]].
+ i := 0.
+ oldHeap allObjectsDo:
+ [:oldObj|
+ (i := i + 1) >= 10000 ifTrue:
+ [Transcript nextPut: $.; flush. i := 0].
+ (map at: oldObj ifAbsent: nil)
+ ifNotNil:
+ [:newObj| | format |
+ (newHeap numSlotsOf: newObj) > 0 ifTrue: "filter-out filtered objStack pages"
+ [format := oldHeap formatOf: oldObj.
+ (newHeap isPointersFormat: format)
+ ifTrue:
+ [self fillInPointerObject: newObj from: oldObj]
+ ifFalse:
+ [(newHeap isCompiledMethodFormat: format)
+ ifTrue: [self fillInCompiledMethod: newObj from: oldObj]
+ ifFalse: [self fillInBitsObject: newObj from: oldObj]]]]
+ ifNil: [self assert: (self isUnmappedObject: oldObj)]]!
Item was added:
+ ----- Method: SpurImagePreener>>fillInPointerObject:from: (in category 'bootstrap image') -----
+ fillInPointerObject: newObj from: oldObj
+ 0 to: (oldHeap numSlotsOf: oldObj) - 1 do:
+ [:i|
+ newHeap
+ storePointerUnchecked: i
+ ofObject: newObj
+ withValue: (self mapOop: (oldHeap fetchPointer: i ofObject: oldObj))]!
Item was added:
+ ----- Method: SpurImagePreener>>initMaps (in category 'initialize-release') -----
+ initMaps
+ map := Dictionary new: oldHeap memory size // 32.
+ reverseMap := Dictionary new: oldHeap memory size // 32!
Item was added:
+ ----- Method: SpurImagePreener>>isUnmappedObject: (in category 'bootstrap image') -----
+ isUnmappedObject: obj
+ "Answer if obj is an object that is not cloned by the bootstrap."
+ ^obj = oldHeap freeListsObject
+ or: [(oldHeap isValidObjStackPage: obj)]!
Item was added:
+ ----- Method: SpurImagePreener>>mapOop: (in category 'bootstrap image') -----
+ mapOop: obj
+ "oldInterpreter printOop: obj"
+ ^map
+ at: obj
+ ifAbsent:
+ [(oldHeap isImmediate: obj)
+ ifTrue: [obj]
+ ifFalse: [self error: 'cannot map']]!
Item was added:
+ ----- Method: SpurImagePreener>>newInterpreter (in category 'initialize-release') -----
+ newInterpreter
+ ^StackInterpreterSimulator newWithOptions: (wordSize = 4
+ ifTrue: [#(ObjectMemory Spur32BitMemoryManager)]
+ ifFalse: [#(ObjectMemory Spur64BitMemoryManager)])!
Item was added:
+ ----- Method: SpurImagePreener>>newSpaceSize (in category 'initialize-release') -----
+ newSpaceSize
+ ^16 * 1024 * 1024!
Item was added:
+ ----- Method: SpurImagePreener>>on: (in category 'public access') -----
+ on: imageName
+ wordSize ifNil: [wordSize := self determineWordSizeFrom: imageName].
+ (oldInterpreter := self newInterpreter) openOn: imageName extraMemory: 0.
+ oldHeap := oldInterpreter objectMemory.
+ imageHeaderFlags := oldInterpreter getImageHeaderFlags.
+ savedWindowSize ifNil: [savedWindowSize := oldInterpreter savedWindowSize].
+ newInterpreter := self newInterpreter.
+ newHeap := newInterpreter objectMemory.
+ newHeap
+ allocateMemoryOfSize: oldHeap oldSpaceSize
+ newSpaceSize: self newSpaceSize
+ stackSize: 16 * 1024
+ codeSize: 0.
+ newHeap bootstrapping: true.
+ self initMaps!
Item was added:
+ ----- Method: SpurImagePreener>>preenImage (in category 'public access') -----
+ preenImage
+ self cloneObjects.
+ self fillInObjects.
+ self fillInClassTable.
+ self fillInHeap.
+ self reportSizes!
Item was added:
+ ----- Method: SpurImagePreener>>preenImage: (in category 'public access') -----
+ preenImage: imageName
+ (Smalltalk classNamed: #FileReference) ifNotNil:
+ [^self preenImageUsingFileReference: imageName].
+ (Smalltalk classNamed: #FileDirectory) ifNotNil:
+ [^self preenImageUsingFileDirectory: imageName].
+ self error: 'at a loss as to what file system support to use'!
Item was added:
+ ----- Method: SpurImagePreener>>preenImageUsingFileDirectory: (in category 'public access') -----
+ preenImageUsingFileDirectory: imageName
+ | dirName baseName dir |
+ dirName := FileDirectory dirPathFor: imageName.
+ baseName := (imageName endsWith: '.image')
+ ifTrue: [FileDirectory baseNameFor: imageName]
+ ifFalse: [FileDirectory localNameFor: imageName].
+ dir := dirName isEmpty ifTrue: [FileDirectory default] ifFalse: [FileDirectory default on: dirName].
+ self on: (dir fullNameFor: baseName, '.image').
+ [self preenImage]
+ on: Halt
+ do: [:ex|
+ "suppress halts from the usual suspects (development time halts)"
+ (#(fullGC compactImage) includes: ex signalerContext sender selector)
+ ifTrue: [ex resume]
+ ifFalse: [ex pass]].
+ self writeSnapshot: (dir fullNameFor: baseName, '-preen.image')
+ headerFlags: imageHeaderFlags
+ screenSize: savedWindowSize.
+ (dir fileExists: baseName, '.changes')
+ ifTrue:
+ [dir deleteFileNamed: baseName, '-preen.changes';
+ copyFileNamed: baseName, '.changes' toFileNamed: baseName, '-preen.changes']
+ ifFalse:
+ [Transcript cr; show: 'could not find ', baseName, '.changes']!
Item was added:
+ ----- Method: SpurImagePreener>>reportSizes (in category 'bootstrap image') -----
+ reportSizes
+ | change oldHeapSize newHeapSize |
+ oldHeapSize := oldHeap oldSpaceSize.
+ newHeap segmentManager computeTotalHeapSizeIncludingBridges. "To avoid assert fail"
+ newHeapSize := newHeap oldSpaceSize.
+ change := newHeapSize - oldHeapSize / oldHeapSize.
+ Transcript
+ nextPutAll: 'done.'; cr;
+ nextPutAll: 'old heap size: '; nextPutAll: oldHeapSize asStringWithCommas; tab;
+ nextPutAll: 'initial new heap size: '; nextPutAll: newHeapSize asStringWithCommas; cr;
+ nextPutAll: 'change: '; print: change * 100.0 maxDecimalPlaces: 2; nextPut: $%; cr;
+ flush.
+ newHeapSize := newHeap endOfMemory
+ - newHeap scavenger eden limit
+ - newHeap totalFreeListBytes.
+ change := newHeapSize - oldHeapSize / oldHeapSize.
+ Transcript
+ nextPutAll: 'final new heap size: '; nextPutAll: newHeapSize asStringWithCommas; tab;
+ nextPutAll: 'change: '; print: change * 100.0 maxDecimalPlaces: 2; nextPut: $%; cr;
+ flush!
Item was added:
+ ----- Method: SpurImagePreener>>savedWindowSize: (in category 'public access') -----
+ savedWindowSize: aPointOrInteger
+ savedWindowSize := aPointOrInteger isInteger
+ ifTrue: [aPointOrInteger]
+ ifFalse: [(aPointOrInteger x min: 65535) << 16 + (aPointOrInteger y min: 65535)]!
Item was added:
+ ----- Method: SpurImagePreener>>shouldClone: (in category 'bootstrap image') -----
+ shouldClone: obj
+ ^(oldHeap isValidObjStackPage: obj) not!
Item was added:
+ ----- Method: SpurImagePreener>>writeDefaultHeader: (in category 'public access') -----
+ writeDefaultHeader: aBoolean
+ writeDefaultHeader := aBoolean!
Item was added:
+ ----- Method: SpurImagePreener>>writeSnapshot:headerFlags:screenSize: (in category 'snapshot') -----
+ writeSnapshot: imageFileName headerFlags: headerFlags screenSize: screenSizeInteger
+ newHeap
+ checkFreeSpace;
+ runLeakCheckerForFullGC.
+ writeDefaultHeader == true ifTrue:
+ [newInterpreter
+ desiredEdenBytes: 0;
+ desiredNumStackPages: 0;
+ setDesiredCogCodeSize: 0;
+ setMaxExtSemSizeTo: 0].
+ newInterpreter
+ setImageHeaderFlagsFrom: headerFlags;
+ setDisplayForm: nil;
+ setSavedWindowSize: savedWindowSize;
+ imageName: imageFileName;
+ writeImageFileIO.
+ Transcript cr; show: 'Done!!'!
More information about the Vm-dev
mailing list