[Vm-dev] VM Maker: VMMaker.oscog-cb.2412.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Jun 8 09:21:48 UTC 2018

ClementBera uploaded a new version of VMMaker to project VM Maker:

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

Name: VMMaker.oscog-cb.2412
Author: cb
Time: 8 June 2018, 11:21:25.866032 am
UUID: f19cf5db-fa17-4984-8f08-aac504dd5d67
Ancestors: VMMaker.oscog-cb.2411

- Fixed compilation errors and some warnings.

=============== Diff against VMMaker.oscog-cb.2411 ===============

Item was changed:
  ----- Method: SpurMemoryManager>>storePointer:ofFreeChunk:withValue: (in category 'heap management') -----
  storePointer: fieldIndex ofFreeChunk: objOop withValue: valuePointer
  	self assert: (self isFreeObject: objOop).
  	self assert: (valuePointer = 0 or: [self isFreeObject: valuePointer]).
  	self assert: (fieldIndex >= 0 and: [fieldIndex < (self numSlotsOfAny: objOop)
+ 				or: [fieldIndex = 0 "forwarders and free objs"
+ 				or: [fieldIndex = 1 and: [self wordSize = 4]]]]).
- 				or: [fieldIndex = 0 "forwarders and free objs"]
- 				or: [fieldIndex = 1 and: [self wordSize = 4]]]).
  		longAt: objOop + self baseHeaderSize + (fieldIndex << self shiftForWord)
  		put: valuePointer!

Item was changed:
  ----- Method: SpurMemoryManager>>unlinkFreeChunk:atIndex:bytesBigEnoughForPrevPointer: (in category 'free space') -----
  unlinkFreeChunk: chunk atIndex: index bytesBigEnoughForPrevPointer: bytesBigEnoughForPrevPointer 
  	"Unlink and answer a small chunk from one of the fixed size freeLists"
  	<inline: true> "inlining is important because bytesBigEnoughForPrevPointer is often true"
  	self assert: ((self bytesInObject: chunk) = (index * self allocationUnit)
  				and: [index > 1 "a.k.a. (self bytesInObject: chunk) > self allocationUnit"
  				and: [(self startOfObject: chunk) = chunk]]).
+ 	"For some reason the assertion is not compiled correctly"
+ 	self cCode: '' inSmalltalk: [self assert: (self bytesBigEnoughForPrevPointer:(self bytesInObject: chunk)) = bytesBigEnoughForPrevPointer].
- 	self assert: (self bytesBigEnoughForPrevPointer:(self bytesInObject: chunk)) = bytesBigEnoughForPrevPointer.
  		at: index 
  		put: (next := self
  				fetchPointer: self freeChunkNextIndex
  				ofFreeChunk: chunk).
  	(bytesBigEnoughForPrevPointer and: [next ~= 0]) ifTrue:
  		[self storePointer: self freeChunkPrevIndex ofFreeChunk: next withValue: 0].

Item was changed:
  ----- Method: SpurMemoryManager>>unlinkFreeChunk:chunkBytes: (in category 'free space') -----
  unlinkFreeChunk: freeChunk chunkBytes: chunkBytes
  	"Unlink a free object from the free lists. Do not alter totalFreeOldSpace. Used for coalescing."
  	| index node next prev |
  	index := chunkBytes / self allocationUnit.
  	"Pathological 64 bits case - size 1 - single linked list"
  	(self bytesBigEnoughForPrevPointer: chunkBytes) ifFalse:
  		[node := freeLists at: index.
  			 prev := 0.
  			 [node ~= 0] whileTrue:
  				[self assert: node = (self startOfObject: node).
  				 self assertValidFreeObject: node.
  				 next := self fetchPointer: self freeChunkNextIndex ofFreeChunk: node.
  				 node = freeChunk ifTrue:
  					[prev = 0
  						ifTrue: [self unlinkFreeChunk: freeChunk atIndex: index bytesBigEnoughForPrevPointer: false]
  						ifFalse: [self setNextFreeChunkOf: prev withValue: next bytesBigEnoughForPrevPointer: false].
+ 					 ^freeChunk].
- 					 ^self].
  				 prev := node.
  				 node := next].
  			 self error: 'freeChunk not found in free list of size 1'].
  	prev := self fetchPointer: self freeChunkPrevIndex ofFreeChunk: freeChunk.
  	"Has prev element: update double linked list"
  	prev ~= 0 ifTrue:
  			setNextFreeChunkOf: prev 
  			withValue: (self fetchPointer: self freeChunkNextIndex ofFreeChunk: freeChunk) 
  			chunkBytes: chunkBytes.
+ 		 ^freeChunk].
- 		 ^self].
  	"Is the beginning of a list"
  	"Small chunk"
+ 	(index < self numFreeLists and: [1 << index <= freeListsMask]) ifTrue: 
+ 		[self unlinkFreeChunk: freeChunk atIndex: index bytesBigEnoughForPrevPointer: true.
+ 		 ^freeChunk].
- 	(index < self numFreeLists and: [1 << index <= freeListsMask]) ifTrue: [
- 		^self unlinkFreeChunk: freeChunk atIndex: index bytesBigEnoughForPrevPointer: true ].
  	"Large chunk"
  	 next := self fetchPointer: self freeChunkNextIndex ofFreeChunk: freeChunk.
  	 next = 0
  		ifTrue: "no list; remove the interior node"
  			[self unlinkSolitaryFreeTreeNode: freeChunk]
  		ifFalse: "list; replace node with it"
+ 			[self inFreeTreeReplace: freeChunk with: next].
+ 	^freeChunk
- 			[self inFreeTreeReplace: freeChunk with: next]

More information about the Vm-dev mailing list