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

commits at source.squeak.org commits at source.squeak.org
Sun Mar 9 19:10:00 UTC 2014


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

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

Name: VMMaker.oscog-eem.635
Author: eem
Time: 9 March 2014, 11:06:51.319 am
UUID: d3e35b87-a79e-44a1-975b-549d6ae06743
Ancestors: VMMaker.oscog-eem.634

Fix decoding the per-segment bridge span/seg size info on load
and successfully load a multi-segment Newspeak bootstrap image.
Finally!

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

Item was changed:
  ----- Method: SpurSegmentManager>>readHeapFromImageFile:dataBytes: (in category 'snapshot') -----
  readHeapFromImageFile: f dataBytes: numBytes
  	"Read numBytes of image data from f into memory at memoryBaseForImageRead.
  	 Answer the number of bytes written.  In addition, read each segment, build up the
  	 segment info for swizzling, while eliminating the bridge objects at the end of each
  	 segment that specify the distance to and the size of the subsequent segment."
  	<var: #f type: #sqImageFile>
  	<inline: false>
+ 	| bytesRead totalBytesRead bridgehead bridge nextSegmentSize oldBase newBase segInfo bridgeSpan |
- 	| bytesRead totalBytesRead bridge nextSegmentSize oldBase newBase segInfo bridgeSpan |
  	<var: 'segInfo' type: #'SpurSegmentInfo *'>
  	self allocateOrExtendSegmentInfos.
  
  	"segment sizes include the two-header-word bridge at the end of each segment."
  	numSegments := totalBytesRead := 0.
  	oldBase := 0. "N.B. still must be adjusted by oldBaseAddr."
  	newBase := manager oldSpaceStart.
  	nextSegmentSize := firstSegmentSize.
+ 	bridgehead := firstSegmentSize + manager oldSpaceStart - manager bridgeSize.
- 	bridge := firstSegmentSize + manager oldSpaceStart - manager baseHeaderSize.
  	[segInfo := self addressOf: (segments at: numSegments).
  	 segInfo
  		segStart: oldBase;					"N.B. still must be adjusted by oldBaseAddr."
  		segSize: nextSegmentSize;
  		swizzle: newBase - oldBase.	"N.B. still must be adjusted by oldBaseAddr."
  	 bytesRead := self readHeapFrom: f at: newBase dataBytes: nextSegmentSize.
  	 bytesRead > 0 ifTrue:
  			[totalBytesRead := totalBytesRead + bytesRead].
  	 bytesRead ~= nextSegmentSize ifTrue:
  		[^totalBytesRead].
  	 numSegments := numSegments + 1.
+ 	 bridge := bridgehead + manager baseHeaderSize.
+ 	 bridgeSpan := (manager rawNumSlotsOf: bridgehead) = 0
- 	 bridgeSpan := (manager rawNumSlotsOf: bridge) = 0
  						ifTrue: [0]
  						ifFalse: [manager bytesPerSlot * (manager rawOverflowSlotsOf: bridge)].
  	 oldBase := oldBase + nextSegmentSize + bridgeSpan.
  	 newBase := newBase + nextSegmentSize - manager bridgeSize.
  	 nextSegmentSize := manager longLongAt: bridge.
  	 nextSegmentSize ~= 0] whileTrue:
+ 		[bridgehead := bridgehead - manager bridgeSize + nextSegmentSize].
- 		[bridge := bridge - manager bridgeSize + nextSegmentSize].
  	"newBase should point just past the last bridge. all others should have been eliminated."
  	self assert: newBase - manager oldSpaceStart
  				= (totalBytesRead - (numSegments * manager bridgeSize)).
  	"set freeOldSpaceStart now for adjustAllOopsBy:"
  	manager setFreeOldSpaceStart: newBase.
  	"we're done. nil firstSegmentSize for a subsequent snapshot."
  	firstSegmentSize := nil.
  	^totalBytesRead!



More information about the Vm-dev mailing list