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! |
Free forum by Nabble | Edit this page |