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

commits at source.squeak.org commits at source.squeak.org
Thu Sep 19 01:21:51 UTC 2013


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

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

Name: Cog-eem.91
Author: eem
Time: 18 September 2013, 6:21:37.61 pm
UUID: b0e94ed6-219d-4e9a-8e04-ab08c6805eeb
Ancestors: Cog-eem.90

Add a prototype for Character>>hash.  Add checks for other
quick methods.

Get scavengeImage to completely flush newSpace at the end of the
bootstrap.  Follow forwarders before flushing new space.

Bootstrasp now completes.

=============== Diff against Cog-eem.90 ===============

Item was added:
+ ----- Method: SpurBootstrap class>>CharacterPROTOTYPEhash (in category 'method prototypes') -----
+ CharacterPROTOTYPEhash
+ 	<primitive: 171>
+ 	^self primitiveFailed!

Item was added:
+ ----- Method: SpurBootstrap>>followForwardingPointers (in category 'bootstrap image') -----
+ followForwardingPointers
+ 	newHeap allObjectsDo:
+ 		[:o|
+ 		(newHeap isForwarded: o) ifFalse:
+ 			[0 to: (newHeap numPointerSlotsOf: o) - 1 do:
+ 				[:i| | field |
+ 				field := newHeap fetchPointer: i ofObject: o.
+ 				(newHeap isOopForwarded: field) ifTrue:
+ 					[newHeap
+ 						storePointer: i
+ 						ofObject: o
+ 						withValue: (newHeap followForwarded: field)]]]]!

Item was changed:
  ----- Method: SpurBootstrap>>rehashImage (in category 'bootstrap image') -----
  rehashImage
  	"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.
  
  	newHeap
  		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.
  			 rehashFlags
  				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: [sim setBreakSelector: 'error:'.
  			 "don't rehash twice (actually without limit), so don't rehash any new objects created."
  			 newHeap allExistingOldSpaceObjectsDo:
  				[:o| | classIndex |
  				classIndex := newHeap classIndexOf: o.
  				((rehashFlags at: classIndex >> 3 + 1) anyMask: 1 << (classIndex bitAnd: 7)) ifTrue:
  					[(n := n + 1) \\ 8 = 0 ifTrue:
  					 	[Transcript nextPut: $.; flush].
  					 "2845 = n ifTrue: [self halt]."
  					 "Rehash an object if its size is > 0.
+ 					  Symbol implements rehash, but let's not waste time rehashing it; in Squeak
+ 					  up to 2013 symbols are kept in a set which will get reashed anyway..
- 					  Symbol implements rehash, but doesn't understand size, so don't send size to classes.
  					  Don't rehash empty collections; they may be large for a reason and rehashing will shrink them."
  					 ((sim addressCouldBeClassObj: o)
  					   or: [(self interpreter: sim
  							object: o
  							perform: (map at: sizeSym)
+ 							withArguments: #()) = (newHeap integerObjectOf: 0)]) ifFalse:
- 							withArguments: #()) ~= (newHeap integerObjectOf: 0)]) ifTrue:
  						[self interpreter: sim
  							object: o
  							perform: (map at: rehashSym)
  							withArguments: #()]]]]!

Item was changed:
  ----- Method: SpurBootstrap>>replacementForCharacterMethod: (in category 'bootstrap methods') -----
  replacementForCharacterMethod: characterMethodOop
  	"Answer a replacement method for the argument if it refers
  	 to Character's old inst var value.  Otherwise answer nil."
  	| proxy asIntegerProxy clone assembly newInsts newMethod |
  	"(oldHeap stringOf: (oldHeap longAt: characterMethodOop + (oldHeap lastPointerOf: characterMethodOop) - 4)) = 'isOctetCharacter' ifTrue:
  		[self halt]."
  	proxy := VMCompiledMethodProxy new
  				for: characterMethodOop
  				coInterpreter: oldInterpreter
  				objectMemory: oldHeap.
  	clone := self cloneMethodProxy: proxy.
+ 	"Quick methods accessing value should have been replaced."
+ 	clone isReturnField ifTrue: [self halt].
  	clone hasInstVarRef ifFalse:
  		[^nil].
  	clone setSourcePointer: 0.
  	asIntegerProxy := VMObjectProxy new
  							for: (symbolMap at: #asInteger)
  							coInterpreter: oldInterpreter
  							objectMemory: oldHeap.
  	assembly := BytecodeDisassembler new disassemble: clone.
  	assembly literals: (assembly literals allButLast: 2), {asIntegerProxy}, (assembly literals last: 2).
  		"Do this by looking for index of pushReceiverVariable: and replacing it by pushSelf, send asInteger"
  	newInsts := (assembly instructions piecesCutWhere:
  					[:msgOrLabelAssoc :nextInst|
  					 msgOrLabelAssoc isVariableBinding not
  					 and: [msgOrLabelAssoc selector == #pushReceiverVariable:]]) fold:
  				[:a :b|
  				 a allButLast,
  				 {	Message selector: #pushReceiver.
  					Message
  						selector: #send:super:numArgs:
  						arguments: {asIntegerProxy. false. 0}},
  				 b].
  	assembly instructions: newInsts.
  	newMethod := assembly assemble.
  	^self
  		installableMethodFor: newMethod
  		selector: clone selector
  		className: #Character
  		isMeta: false!

Item was changed:
  ----- Method: SpurBootstrap>>scavengeImage (in category 'bootstrap image') -----
  scavengeImage
  	"Scavenge the image to get it into a simpler state."
  	newHeap coInterpreter voidVMStateForSnapshot.
+ 	newHeap flushNewSpace!
- 	newHeap sufficientSpaceAfterGC: 0!

Item was changed:
  ----- Method: SpurBootstrap>>transform (in category 'bootstrap image') -----
  transform
  	self rememberRehashSymbol.
  	self installModifiedMethods.
  	self bootstrapImage.
  	self validate.
  	self rehashImage.
- 	self scavengeImage.
  	self followForwardingPointers.
+ 	self scavengeImage.
  	Transcript nextPutAll: 'done.'; flush.!



More information about the Vm-dev mailing list