[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