[Pkg] The Trunk: System-eem.987.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Dec 15 22:20:08 UTC 2017
Eliot Miranda uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-eem.987.mcz
==================== Summary ====================
Name: System-eem.987
Author: eem
Time: 15 December 2017, 2:19:51.532605 pm
UUID: 5f61563a-54e7-4ec7-a2dc-8bd71ce75760
Ancestors: System-eem.986
Spur Image Segments. Fix mapping of out pointer oops in 32-bit segment loads. Fix typos & tweak comments. Nuke an inadvertent halt.
=============== Diff against System-eem.986 ===============
Item was changed:
----- Method: Spur32BitImageSegmentLoader>>mapPC:in: (in category 'private') -----
mapPC: pc in: compiledCode
+ "Assuming the word size of compiledCode is 8, and that the pc is one for a word size of 4,
+ map the pc from 4 to 8 byte literals. The filter is in updatePCDependentObjects."
- "Assuming the word size of compiledCode is 8, and that the pc is one for a word size of 4, map the pc from 4 to 8.
- The filter is in updatePCDependentObjects."
^pc + (compiledCode numLiterals + 1 * 4)!
Item was changed:
----- Method: Spur32BitImageSegmentLoader>>readOop (in category 'reading') -----
readOop
"Read an oop and map it to an object:
- The oop may be immediate in which case its tag indicates its class and the remeaining bits its value.
- the oop may have its top bit set in which case it is an index into the outPointers
- otherwise the oop is a byte offset from the start of the first object in the segment and is in oopMap"
| oop topBit |
oop := self readUint32.
topBit := oop bitShift: -31.
^(oop bitAnd: 3) caseOf: {
[0] -> [topBit = 1
+ ifTrue: [outPointers at: oop - 16r80000000 / 4 + 1]
- ifTrue: [outPointers at: oop - 16r80000000 / 8 + 1]
ifFalse: [oopMap at: oop]].
[1] -> [(oop bitShift: -1) - (topBit = 1 ifTrue: [16r80000000] ifFalse: [0])].
[3] -> [(oop bitShift: -1) - (topBit = 1 ifTrue: [16r80000000] ifFalse: [0])].
[2] -> [Character value: (oop bitShift: -2)]}!
Item was changed:
----- Method: Spur64BitImageSegmentLoader>>mapPC:in: (in category 'private') -----
mapPC: pc in: compiledCode
+ "Assuming the word size of compiledCode is 4, and that the pc is one for a word size of 8,
+ map the pc from 8 to 4 byte literals. The filter is in updatePCDependentObjects."
- "Assuming the word size of compiledCode is 4, and that the pc is one for a word size of 8, map the pc from 8 to 4.
- The filter is in updatePCDependentObjects."
^pc - (compiledCode numLiterals + 1 * 4)!
Item was changed:
----- Method: Spur64BitImageSegmentLoader>>readObject (in category 'reading') -----
readObject
"Read the header and the class of the object, instantiate it, and store it in oopMap at its oop."
| headerLo headerHi oop numSlots classIndex format rawNumSlots |
"the oop is the address of the two byte header (which follows the overflow size word, if there is one)."
oop := position - 8. "compensate for 64-bit version stamp"
- oop = 1390072 ifTrue: [self halt].
headerLo := self readUint32.
headerHi := self readUint32.
rawNumSlots := headerHi bitShift: -24.
rawNumSlots = 255
ifTrue: "128-bit header; overflow slots in least significant 32 bits of first 64-bit header word"
[numSlots := headerLo.
oop := position - 8. "compensate for 64-bit version stamp"
headerLo := self readUint32.
headerHi := self readUint32]
ifFalse: "64-bit header"
[numSlots := rawNumSlots].
"N.B. The format field is a 5 bit field, but immediately above it is the
remembered bit which is used to mark classes is the segment."
self checkValidFormat: (format := (headerLo bitShift: -24) bitAnd: 63).
classIndex := headerLo bitAnd: 16r3FFFFF.
^[oopMap at: oop ifAbsentPut:
[self allocateObject: format classIndex: classIndex slots: numSlots]]
ensure: "Spur objects have at least one slot"
[position := oop + 16 + ((numSlots max: 1) * 8)]!
Item was changed:
----- Method: Spur64BitImageSegmentLoader>>readOop (in category 'reading') -----
readOop
"Read an oop and map it to an object:
- The oop may be immediate in which case its tag indicates its class and the remeaining bits its value.
- the oop may have its top bit set in which case it is an index into the outPointers
- otherwise the oop is a byte offset from the start of the first object in the segment and is in oopMap.
The method is written to avoid large integer arithmetic as much as possible."
| lo hi topBit oop |
lo := self readUint32.
hi := self readUint32.
topBit := hi bitShift: -31.
^(lo bitAnd: 7) caseOf: {
[0] -> [topBit = 1
ifTrue:
[oop := (hi - 16r80000000 bitShift: 32) + lo.
outPointers at: oop / 8 + 1]
ifFalse:
[oop := (hi bitShift: 32) + lo.
oopMap at: oop]].
[1] -> [(lo bitShift: -3) bitOr: (hi - (topBit = 1 ifTrue: [16r100000000] ifFalse: [0]) bitShift: 29)].
[2] -> [Character value: ((lo bitShift: -3) bitOr: (hi bitShift: 29))].
[4] -> [(hi = 0 and: [lo <= 15]) "+ve & -ve zero"
ifTrue: [lo <= 7 ifTrue: [0.0] ifFalse: [-0.0]]
ifFalse: "convert lo: | tag | sign | mantissa low 28 bits | hi: | mantissa high 24 bits | exponent - 896 |
to hi: | mantissa high 20 bits | exponent 11 bits | sign | lo: | mantissa low 32 bits |"
+ [(BoxedFloat64 basicNew: 2)
- [^(BoxedFloat64 basicNew: 2)
basicAt: 1 put: ((lo bitAnd: 8) bitShift: 28) + ((hi bitShift: -4) + (896 bitShift: 20));
basicAt: 2 put: (lo bitShift: -4) + ((hi bitAnd: 15) bitShift: 28);
+ * 1.0 "& reduce to SmallFloat64 if possible"]]}
- * 1.0]]}
otherwise: [self error: 'unrecognized tag pattern']!
Item was changed:
----- Method: SpurImageSegmentLoader>>oopIndexForClassIndex: (in category 'private') -----
oopIndexForClassIndex: classIndex
+ "When a classIndex doesn't have the topBit set it maps to an oop in the segment thusly:"
- "Whebn a classIndex doesn't have the topBit set it maps to an oop in the segment thusly:"
^classIndex - 16 "self firstClassIndexPun" * 8 "self allocationUnit"!
More information about the Packages
mailing list