[Vm-dev] VM Maker: Cog-eem.453.mcz

commits at source.squeak.org commits at source.squeak.org
Sat Mar 25 02:20:24 UTC 2023


Eliot Miranda uploaded a new version of Cog to project VM Maker:
http://source.squeak.org/VMMaker/Cog-eem.453.mcz

==================== Summary ====================

Name: Cog-eem.453
Author: eem
Time: 24 March 2023, 7:20:21.662521 pm
UUID: a5d43c7e-753d-42cc-9db1-911f3865c4a6
Ancestors: Cog-eem.452

Add some validation to SpurImagePreener and don't use isValidObjStackPage: to decide ifg an object is to be cloned; it could exclude objStack pages if it were too picky.

Nuke an obsolete script.

=============== Diff against Cog-eem.452 ===============

Item was removed:
- ----- Method: CogScripts class>>defineSpurPigCompactor (in category 'separate vm scripts') -----
- defineSpurPigCompactor
- 	"Define SpurPigCompactor"
- 	"self defineSpurPigCompactor"
- 	| changes pigCompactor |
- 	pigCompactor := SpurMemoryManager superclass
- 						subclass: #SpurPigCompactor
- 						instanceVariableNames: 'manager scavenger coInterpreter firstFreeChunk lastFreeChunk numCompactionPasses'
- 						classVariableNames: 'CompactionPassesForGC CompactionPassesForSnapshot'
- 						poolDictionaries: 'SpurMemoryManagementConstants VMBasicConstants VMSpurObjectRepresentationConstants'
- 						category: SpurMemoryManager category.
- 	changes := CogScripts changedSpurCompactorMethods.
- 	changes do:
- 		[:mr|
- 		pigCompactor compile: mr source classified: (SpurMemoryManager whichCategoryIncludesSelector: mr selector)].
- 	changes do:
- 		[:mr|
- 		SpurMemoryManager removeSelector: mr selector].
- 	SpurMemoryManager organization removeEmptyCategories!

Item was changed:
  ----- Method: SpurImagePreener>>cloneObject: (in category 'bootstrap image') -----
  cloneObject: oldObj
  	| newObj hash |
+ 	self deny: (sourceHeap isSegmentBridge: oldObj).
  	newObj := targetHeap
  				allocateSlots: (sourceHeap numSlotsOf: oldObj)
  				format: (sourceHeap formatOf: oldObj)
  				classIndex: (sourceHeap classIndexOf: oldObj).
  	(hash := sourceHeap rawHashBitsOf: oldObj) ~= 0 ifTrue:
  		[targetHeap setHashBitsOf: newObj to: hash].
  	(sourceHeap isImmutable: oldObj) ifTrue:
  		[targetHeap setIsImmutableOf: newObj to: true].
  	(sourceHeap isPinned: oldObj) ifTrue:
  		[targetHeap setIsPinnedOf: newObj to: true].
  	self deny: (sourceHeap isRemembered: oldObj).
  	self deny: (sourceHeap isMarked: oldObj).
  	self deny: (sourceHeap isGrey: oldObj).
  	reverseMap at: newObj put: oldObj.
  	^map at: oldObj put: newObj!

Item was changed:
  ----- Method: SpurImagePreener>>fillInObjects (in category 'bootstrap image') -----
  fillInObjects
  	"oldInterpreter printOop: oldObj"
  	| i |
  	{sourceHeap markStack. sourceHeap weaklingStack. sourceHeap mournQueue} do:
  		[:obj|
  		obj ~= sourceHeap nilObject ifTrue:
  			[map at: obj put: (map at: sourceHeap nilObject)]].
  	i := 0.
  	sourceHeap allObjectsDo:
  		[:oldObj|
  		(i := i + 1) >= 10000 ifTrue:
  			[Transcript nextPut: $.; flush. i := 0].
  		(map at: oldObj ifAbsent: nil)
  			ifNotNil:
  				[:newObj| | format |
  				(targetHeap numSlotsOf: newObj) > 0 ifTrue: "filter-out filtered objStack pages"
  					[format := sourceHeap formatOf: oldObj.
  					 (targetHeap isPointersFormat: format)
  						ifTrue:
  							[self fillInPointerObject: newObj from: oldObj]
  						ifFalse:
  							[(targetHeap isCompiledMethodFormat: format)
  								ifTrue: [self fillInCompiledMethod: newObj from: oldObj]
+ 								ifFalse:
+ 									[(targetHeap classIndexOf: newObj) <= targetHeap lastClassIndexPun
+ 										ifTrue: [self assert: (oldObj = sourceHeap freeListsObject
+ 															or: [oldObj = sourceHeap rememberedSetObj])]
+ 										ifFalse: [self fillInBitsObject: newObj from: oldObj]]]]]
- 								ifFalse: [self fillInBitsObject: newObj from: oldObj]]]]
  			ifNil: [self assert: (self isUnmappedObject: oldObj)]]!

Item was added:
+ ----- Method: SpurImagePreener>>isObjStackPage:inHeap: (in category 'bootstrap image') -----
+ isObjStackPage: obj inHeap: theHeap "<SpurMemoryManager>"
+ 	^(theHeap classIndexOf: obj) = theHeap wordSizeClassIndexPun
+ 	and: [(theHeap numSlotsOfAny: obj) = theHeap objStackPageSlots]!

Item was changed:
  ----- Method: SpurImagePreener>>preenImage (in category 'public access') -----
  preenImage
  	self cloneObjects.
  	self fillInObjects.
  	self fillInClassTable.
  	self fillInHeap.
+ 	self validateTargetHeap.
  	self reportSizes!

Item was changed:
  ----- Method: SpurImagePreener>>shouldClone: (in category 'bootstrap image') -----
  shouldClone: obj
+ 	^(self isObjStackPage: obj inHeap: sourceHeap) not!
- 	^(sourceHeap isValidObjStackPage: obj) not!

Item was added:
+ ----- Method: SpurImagePreener>>validateTargetHeap (in category 'bootstrap image') -----
+ validateTargetHeap
+ 	"check that the result contains only objects that should be there.
+ 	 Further check that certain objects are all zero."
+ 
+ 	{targetHeap freeListsObject. targetHeap rememberedSetObj} do:
+ 		[:sbzObj| "shouldBeZeroObj"
+ 		0 to: (targetHeap numSlotsOfAny: sbzObj) - 1 do:
+ 			[:i| self assert: (targetHeap fetchPointer: i ofMaybeForwardedObject: sbzObj) isZero]].
+ 	targetHeap allOldSpaceEntitiesDo:
+ 		[:obj| | classIndex |
+ 		classIndex := targetHeap classIndexOf: obj.
+ 		classIndex <= targetHeap lastClassIndexPun ifTrue:
+ 			[self deny: (targetHeap isFreeObject: obj).
+ 			 classIndex = targetHeap segmentBridgePun
+ 				ifTrue: "If it is a bridge it must be the one at the end of memory..."
+ 					[self assert: obj + targetHeap baseHeaderSize = targetHeap endOfMemory]
+ 				ifFalse: "If its not a bridge it must be the hidden roots, the free lists, or a class atble page (& temporariy, or the remembered set)"
+ 					[self assert: (obj = targetHeap hiddenRootsObject
+ 								or: [obj = targetHeap freeListsObject
+ 								or: [obj = targetHeap rememberedSetObj
+ 								or: [classIndex = targetHeap arrayClassIndexPun
+ 									and: [(targetHeap numSlotsOfAny: obj) = targetHeap classTablePageSize]]]])]]]!



More information about the Vm-dev mailing list