[Vm-dev] VM Maker: VMMaker.oscog-eem.1318.mcz

commits at source.squeak.org commits at source.squeak.org
Thu May 21 19:25:09 UTC 2015


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

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

Name: VMMaker.oscog-eem.1318
Author: eem
Time: 21 May 2015, 12:23:05.452 pm
UUID: dc8819e1-ef78-459c-9ee5-7f67a285f5d2
Ancestors: VMMaker.oscog-eem.1317

Spur:
Fix bad C bug in nextInSortedFreeListLink:given:.  The result
type must be usqInt, otherwise the list can be wrongly
terminated and the second compaction pass can segfault.

Change printFreeChunk:isNextChunk: to
printFreeChunk:printAsTreeNode:, and use it to implement
printSortedFreeList.

Make checkTraversableSortedFreeList robust in presence of
empty sorted free list.

=============== Diff against VMMaker.oscog-eem.1317 ===============

Item was changed:
  ----- Method: SpurMemoryManager>>checkTraversableSortedFreeList (in category 'simulation only') -----
  checkTraversableSortedFreeList
  	| prevFree prevPrevFree freeChunk |
  	<api>
  	<inline: false>
  	prevFree := prevPrevFree := 0.
+ 	firstFreeChunk = 0 ifTrue:
+ 		[^lastFreeChunk = 0].
  	freeChunk := firstFreeChunk.
  	self allOldSpaceEntitiesDo:
  		[:o| | objOop next limit |
  		(self isFreeObject: o) ifTrue:
  			[self assert: o = freeChunk.
  			 next := self nextInSortedFreeListLink: freeChunk given: prevFree.
  			 limit := next = 0 ifTrue: [endOfMemory] ifFalse: [next].
  			 "coInterpreter transcript cr; print: freeChunk; tab; print: o; tab; print: prevFree; nextPutAll: '<->'; print: next; flush."
  			 objOop := freeChunk.
  			 [self oop: (objOop := self objectAfter: objOop) isLessThan: limit] whileTrue:
  				[self assert: (self isFreeObject: objOop) not].
  			 prevPrevFree := prevFree.
  			 prevFree := freeChunk.
  			 freeChunk := next]].
  	self assert: prevFree = lastFreeChunk.
  	self assert: (self nextInSortedFreeListLink: lastFreeChunk given: 0) = prevPrevFree.
  	self assert: freeChunk = 0.
  	^true!

Item was changed:
  ----- Method: SpurMemoryManager>>inOrderPrintFreeTree:printList: (in category 'debug printing') -----
  inOrderPrintFreeTree: freeChunk printList: printNextList
  	"print free chunks in freeTree in order."
  	<api>
  	| next |
  	(next := self fetchPointer: self freeChunkSmallerIndex ofFreeChunk: freeChunk) ~= 0 ifTrue:
  		[self inOrderPrintFreeTree: next printList: printNextList].
+ 	self printFreeChunk: freeChunk printAsTreeNode: true.
- 	self printFreeChunk: freeChunk isNextChunk: false.
  	printNextList ifTrue:
  		[next := freeChunk.
  		 [(next := self fetchPointer: self freeChunkNextIndex ofFreeChunk: next) ~= 0] whileTrue:
  			[coInterpreter tab.
+ 			 self printFreeChunk: next printAsTreeNode: false]].
- 			 self printFreeChunk: next isNextChunk: true]].
  	(next := self fetchPointer: self freeChunkLargerIndex ofFreeChunk: freeChunk) ~= 0 ifTrue:
  		[self inOrderPrintFreeTree: next printList: printNextList]!

Item was changed:
  ----- Method: SpurMemoryManager>>nextInSortedFreeListLink:given: (in category 'compaction') -----
  nextInSortedFreeListLink: freeChunk given: prevFree
  	 "Answer the next free free chunk using the xor trick to use only one field, see e.g.
  		The Art of Computer Programming, Vol 1, D.E. Knuth, 3rd Ed, Sec 2.2.4 `Circular Lists', exercise. 18
  		http://en.wikipedia.org/wiki/XOR_linked_list."
  	<api>
+ 	^((self fetchPointer: self freeChunkNextIndex ofFreeChunk: freeChunk) bitXor: prevFree) asUnsignedInteger!
- 	^(self fetchPointer: self freeChunkNextIndex ofFreeChunk: freeChunk) bitXor: prevFree!

Item was changed:
  ----- Method: SpurMemoryManager>>printFreeChunk: (in category 'debug printing') -----
  printFreeChunk: freeChunk
  	<api>
+ 	self printFreeChunk: freeChunk printAsTreeNode: true!
- 	self printFreeChunk: freeChunk isNextChunk: false!

Item was removed:
- ----- Method: SpurMemoryManager>>printFreeChunk:isNextChunk: (in category 'debug printing') -----
- printFreeChunk: freeChunk isNextChunk: isNextChunk
- 	| numBytes |
- 	numBytes := self bytesInObject: freeChunk.
- 	coInterpreter
- 		print: 'freeChunk '; printHexPtrnp: freeChunk;
- 		print: ' bytes '; printNum: numBytes;
- 		print: ' next '; printHexPtrnp: (self fetchPointer: self freeChunkNextIndex
- 											ofFreeChunk: freeChunk).
- 	(numBytes >= (self numFreeLists * self allocationUnit)
- 	 and: [isNextChunk not]) ifTrue:
- 		[coInterpreter
- 			print: ' ^ '; printHexPtrnp: (self fetchPointer: self freeChunkParentIndex
- 											ofFreeChunk: freeChunk);
- 			print: ' < '; printHexPtrnp: (self fetchPointer: self freeChunkSmallerIndex
- 											ofFreeChunk: freeChunk);
- 			print: ' > '; printHexPtrnp: (self fetchPointer: self freeChunkLargerIndex
- 											ofFreeChunk: freeChunk)].
- 	coInterpreter cr!

Item was added:
+ ----- Method: SpurMemoryManager>>printFreeChunk:printAsTreeNode: (in category 'debug printing') -----
+ printFreeChunk: freeChunk printAsTreeNode: printAsTreeNode
+ 	| numBytes |
+ 	numBytes := self bytesInObject: freeChunk.
+ 	coInterpreter
+ 		print: 'freeChunk '; printHexPtrnp: freeChunk;
+ 		print: ' bytes '; printNum: numBytes;
+ 		print: ' next '; printHexPtrnp: (self fetchPointer: self freeChunkNextIndex
+ 											ofFreeChunk: freeChunk).
+ 	(numBytes >= (self numFreeLists * self allocationUnit)
+ 	 and: [printAsTreeNode]) ifTrue:
+ 		[coInterpreter
+ 			print: ' ^ '; printHexPtrnp: (self fetchPointer: self freeChunkParentIndex
+ 											ofFreeChunk: freeChunk);
+ 			print: ' < '; printHexPtrnp: (self fetchPointer: self freeChunkSmallerIndex
+ 											ofFreeChunk: freeChunk);
+ 			print: ' > '; printHexPtrnp: (self fetchPointer: self freeChunkLargerIndex
+ 											ofFreeChunk: freeChunk)].
+ 	coInterpreter cr!

Item was added:
+ ----- Method: SpurMemoryManager>>printSortedFreeList (in category 'debug printing') -----
+ printSortedFreeList
+ 	<api>
+ 	| freeChunk prevFree nextFree |
+ 	(firstFreeChunk > 0 and: [lastFreeChunk > firstFreeChunk]) ifFalse:
+ 		[coInterpreter print: 'sorted free list empty or corrupt'; cr.
+ 		 ^self].
+ 	freeChunk := firstFreeChunk.
+ 	prevFree := 0.
+ 	[((self addressCouldBeObj: freeChunk)
+ 	 and: [self isFreeObject: freeChunk]) ifFalse:
+ 		[coInterpreter printHexnp: freeChunk; print: ' is not a free chunk!!' ; cr.
+ 		 ^self].
+ 	 self printFreeChunk: freeChunk printAsTreeNode: false.
+ 	 freeChunk ~= lastFreeChunk] whileTrue:
+ 		[nextFree := self nextInSortedFreeListLink: freeChunk given: prevFree.
+ 		 prevFree := freeChunk.
+ 		 freeChunk := nextFree]!



More information about the Vm-dev mailing list