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

commits at source.squeak.org commits at source.squeak.org
Sat Sep 14 16:18:00 UTC 2013

Eliot Miranda uploaded a new version of Cog to project VM Maker:

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

Name: Cog-eem.86
Author: eem
Time: 14 September 2013, 9:17:48.605 am
UUID: 9eadd281-17e1-4bca-a739-e20458516353
Ancestors: Cog-eem.85

Change the Spur bootstrap to not rehash 0-sized objects.  This
keeps large collections unchanged (e.g. the handle registry).
Count rehashes for debugging.

=============== Diff against Cog-eem.85 ===============

Item was changed:
  Object subclass: #SpurBootstrap
+ 	instanceVariableNames: 'oldHeap newHeap map reverseMap classToIndex oldInterpreter lastClassTablePage symbolMap methodClasses installedPrototypes sizeSym rehashSym'
- 	instanceVariableNames: 'oldHeap newHeap map reverseMap classToIndex oldInterpreter lastClassTablePage symbolMap methodClasses installedPrototypes rehashSym'
  	classVariableNames: 'TransformedImage'
  	poolDictionaries: 'VMObjectIndices'
  	category: 'Cog-Bootstrapping'!
  !SpurBootstrap commentStamp: 'eem 9/11/2013 05:45' prior: 0!
  SpurBootstrap bootstraps an image in SpurMemoryManager format from a Squeak V3 + closures format.
  	(SpurBootstrap32 new on: '/Users/eliot/Cog/startreader.image')
  Bootstrap issues:
  - should it implement a deterministic Symbol identityHash? This means set a Symbol's identityHash at instance creation time
    based on its string hash so that e.g. MethodDIctionary instances have a deterministic order and don't need to be rehashed on load.
  - should it collapse ContextPart and MethodContext down onto Context (and perhaps eliminate BlockContext)?
  Instance Variables
  	classToIndex:			<Dictionary>
  	lastClassTablePage:	<Integer>
  	map:					<Dictionary>
  	methodClasses:		<Set>
  	newHeap:				<SpurMemoryManager>
  	oldHeap:				<NewObjectMemory>
  	oldInterpreter:			<StackInterpreterSimulator>
  	reverseMap:			<Dictionary>
  	symbolMap:				<Dictionary>
  	- oldClass to new classIndex map
  	- oop in newHeap of last classTable page.  U<sed in validation to filter-out class table.
  	- cache of methodClassAssociations for classes in which modified methods are installed
  	- oldObject to newObject map
  	- the output, bootstrapped image
  	- the input, image
  	- the interpreter associated with oldHeap, needed for a hack to grab WeakArray
  	- newObject to oldObject map
  	- symbol toi symbol oop in oldHeap, used to map prototype methdos to methods in oldHeap!

Item was changed:
  ----- Method: SpurBootstrap>>interpreter:object:perform:withArguments: (in category 'bootstrap methods') -----
  interpreter: sim object: receiver perform: selector withArguments: arguments
  	"Interpret an expression in oldHeap using oldInterpreter.
  	 Answer the result."
  	| fp savedpc result |
  	savedpc := sim localIP.
  	sim internalPush: receiver.
  	arguments do: [:arg| sim internalPush: arg].
  		argumentCount: arguments size;
  		messageSelector: selector.
  	fp := sim localFP.
  	sim normalSend.
  	[fp = sim localFP] whileFalse:
+ 		[sim singleStep].
- 		[sim byteCount = 3976273 ifTrue: [self halt].
- 		 sim singleStep].
  	result := sim internalPopStack.
  	self assert: sim localIP - 1 = savedpc.
  	sim localIP: savedpc.

Item was changed:
  ----- Method: SpurBootstrap>>rehashImage (in category 'bootstrap image') -----
  	"Rehash all collections in newHeap.
  	 Find out which classes implement rehash, entering a 1 against their classIndex in rehashFlags.
  	 Enumerate all objects, rehashing those whose class has a bit set in rehashFlags."
  	| n sim rehashFlags |
  	sim := StackInterpreterSimulator onObjectMemory: newHeap.
  	newHeap coInterpreter: sim.
  	sim initializeInterpreter: 0.
  	sim instVarNamed: 'methodDictLinearSearchLimit' put: SmallInteger maxVal.
  		setHashBitsOf: newHeap nilObject to: 1;
  		setHashBitsOf: newHeap falseObject to: 2;
  		setHashBitsOf: newHeap trueObject to: 3.
  	rehashFlags := ByteArray new: newHeap classTableIndex + 7 // 8.
  	n := 0.
  	newHeap classTableObjectsDo:
  		[:class| | classIndex |
  		sim messageSelector: (map at: rehashSym).
  		"Lookup rehash but don't be fooled by ProtoObject>>rehash, which is just ^self."
  		((sim lookupMethodNoMNUEtcInClass: class) = 0
  		 and: [(sim isQuickPrimitiveIndex: (sim primitiveIndexOf: (sim instVarNamed: 'newMethod'))) not]) ifTrue:
  			[n := n + 1.
  			 classIndex := newHeap rawHashBitsOf: class.
  				at: classIndex >> 3 + 1
  				put: ((rehashFlags at: classIndex >> 3 + 1)
  						bitOr: (1 << (classIndex bitAnd: 7)))]].
  	Transcript cr; print: n; nextPutAll: ' classes understand rehash. rehashing instances...'; flush.
+ 	n := 0.
  	self withExecutableInterpreter: sim
  		do: "don't rehash twice (actually without limit), so don't rehash any new objects created."
  			[newHeap allExistingObjectsDo:
  				[:o| | classIndex |
  				classIndex := newHeap classIndexOf: o.
  				((rehashFlags at: classIndex >> 3 + 1) anyMask: 1 << (classIndex bitAnd: 7)) ifTrue:
+ 					[n := n + 1.
+ 					 Transcript nextPut: $.; flush.
+ 					 (self interpreter: sim
+ 							object: o
+ 							perform: (map at: sizeSym)
+ 							withArguments: #()) ~= (newHeap integerObjectOf: 0) ifTrue:
+ 						[self interpreter: sim
+ 							object: o
+ 							perform: (map at: rehashSym)
+ 							withArguments: #()]]]]!
- 					[Transcript nextPut: $.; flush.
- 					 self interpreter: sim
- 						object: o
- 						perform: (map at: rehashSym)
- 						withArguments: #()]]]!

Item was changed:
  ----- Method: SpurBootstrap>>rememberRehashSymbol (in category 'bootstrap image') -----
+ 	rehashSym := self findSymbol: #rehash.
+ 	sizeSym := self findSymbol: #size!
- 	rehashSym := self findSymbol: #rehash!

More information about the Vm-dev mailing list