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

commits at source.squeak.org commits at source.squeak.org
Wed Oct 30 02:00:38 UTC 2013


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

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

Name: VMMaker.oscog-eem.483
Author: eem
Time: 29 October 2013, 6:57:29.448 pm
UUID: 2b2db56c-c062-41fe-81fa-f872365cde4f
Ancestors: VMMaker.oscog-eem.482

Fix bug in eliminateAndFreeForwarders that forgot to free the last
run of forwarded objects in the final sweep.

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

Item was changed:
  ----- Method: SpurMemoryManager>>eliminateAndFreeForwarders (in category 'gc - global') -----
  eliminateAndFreeForwarders
  	"As the final phase of global garbage collect, sweep
  	 the heap to follow forwarders, then free forwarders"
  	| lowestForwarded firstForwarded lastForwarded |
  	self assert: (self isForwarded: nilObj) not.
  	self assert: (self isForwarded: falseObj) not.
  	self assert: (self isForwarded: trueObj) not.
  	self assert: (self isForwarded: hiddenRootsObj) not.
  	(self isForwarded: specialObjectsOop) ifTrue:
  		[specialObjectsOop := self followForwarded: specialObjectsOop].
  	scavenger followRememberedForwardersAndForgetFreeObjects.
  	self doScavenge: TenureByAge.
  	lowestForwarded := 0.
  	"sweep, following forwarders in all live objects, and finding the first forwarder."
  	self allOldSpaceObjectsDo:
  		[:o|
  		(self isForwarded: o)
  			ifTrue:
  				[lowestForwarded = 0 ifTrue:
  					[lowestForwarded := o]]
  			ifFalse:
  				[0 to: (self numPointerSlotsOf: o) - 1 do:
  					[:i| | f |
  					f := self fetchPointer: i ofObject: o.
  					(self isOopForwarded: f) ifTrue:
  						[f := self followForwarded: f.
  						 self assert: ((self isImmediate: f) or: [self isYoung: f]) not.
  						 self storePointerUnchecked: i ofObject: o withValue: f]]]].
  	firstForwarded := lastForwarded := 0.
  	"sweep from lowest forwarder, coalescing runs of forwarders."
  	self allOldSpaceObjectsFrom: lowestForwarded do:
  		[:o|
  		(self isForwarded: o)
  			ifTrue:
  				[firstForwarded = 0 ifTrue:
  					[firstForwarded := o].
  				 lastForwarded := o]
  			ifFalse:
  				[firstForwarded ~= 0 ifTrue:
  					[| start bytes |
+ 					 start := self startOfObject: firstForwarded.
+ 					 bytes := (self addressAfter: lastForwarded) - start.
+ 					 self addFreeChunkWithBytes: bytes at: start].
+ 				 firstForwarded := 0]].
+ 	firstForwarded ~= 0 ifTrue:
+ 		[| start bytes |
+ 		 start := self startOfObject: firstForwarded.
+ 		 bytes := (self addressAfter: lastForwarded) - start.
+ 		 self addFreeChunkWithBytes: bytes at: start].!
- 					start := self startOfObject: firstForwarded.
- 					bytes := (self addressAfter: lastForwarded) - start.
- 					self addFreeChunkWithBytes: bytes at: start].
- 				 firstForwarded := 0]]!



More information about the Vm-dev mailing list