[Vm-dev] VM Maker: VMMaker.oscog-ul.2756.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon May 25 19:56:54 UTC 2020
Levente Uzonyi uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-ul.2756.mcz
==================== Summary ====================
Name: VMMaker.oscog-ul.2756
Author: ul
Time: 25 May 2020, 9:54:24.664084 pm
UUID: b5df77c0-0837-4f41-89e0-d9c656e94d50
Ancestors: VMMaker.oscog-eem.2755
- don't let primitive 145 (#primitiveConstantFillSpur) modify immutable obejcts
- provide custom error codes from the same primitive
=============== Diff against VMMaker.oscog-eem.2755 ===============
Item was changed:
----- Method: InterpreterPrimitives>>primitiveConstantFillSpur (in category 'sound primitives') -----
primitiveConstantFillSpur
"Fill the receiver, which must be an indexable non-pointer object, with the given integer value."
<inline: true>
| fillValue rcvr format end i oddBytes |
<var: #fillValue type: #usqLong>
<var: #end type: #usqInt>
<var: #i type: #usqInt>
+ argumentCount ~= 1 ifTrue:
+ [^self primitiveFailFor: PrimErrBadNumArgs].
- fillValue := self positive64BitValueOf: self stackTop.
rcvr := self stackValue: 1.
+ ((objectMemory isNonImmediate: rcvr)
+ and: [(format := objectMemory formatOf: rcvr) >= objectMemory sixtyFourBitIndexableFormat]) ifFalse:
+ [^self primitiveFailFor: PrimErrBadReceiver].
+ (objectMemory isObjImmutable: rcvr) ifTrue:
+ [^self primitiveFailFor: PrimErrNoModification].
+ fillValue := self positive64BitValueOf: self stackTop.
+ self successful ifFalse:
+ [^self primitiveFailFor: PrimErrBadArgument].
- (self successful
- and: [(objectMemory isNonImmediate: rcvr)
- and: [(format := objectMemory formatOf: rcvr) >= objectMemory sixtyFourBitIndexableFormat]]) ifFalse:
- [^self primitiveFail].
format >= objectMemory firstShortFormat
ifTrue:
[format >= objectMemory firstByteFormat
ifTrue:
[(fillValue > 16rFF or: [format >= objectMemory firstCompiledMethodFormat]) ifTrue:
[^self primitiveFail].
fillValue := fillValue + (fillValue << 8) + (fillValue << 16) + (fillValue << 24).
oddBytes := format bitAnd: 7]
ifFalse:
[fillValue > 16rFFFF ifTrue:
[^self primitiveFail].
fillValue := fillValue + (fillValue << 16).
oddBytes := (format bitAnd: 3) << 1].
fillValue := fillValue + (fillValue << 32)]
ifFalse:
[format = objectMemory sixtyFourBitIndexableFormat
ifTrue:
[oddBytes := 0]
ifFalse:
[fillValue > 16rFFFFFFFF ifTrue:
[^self primitiveFail].
fillValue := fillValue + (fillValue << 32).
oddBytes := (format bitAnd: 1) << 2]].
end := objectMemory addressAfter: rcvr.
i := rcvr + objectMemory baseHeaderSize.
[i < end] whileTrue:
[objectMemory long64At: i put: fillValue.
i := i + 8].
"now ensure trailing bytes are zero"
oddBytes > 0 ifTrue:
[self flag: #endianness.
fillValue := fillValue >> (8 * oddBytes).
objectMemory long64At: i - 8 put: fillValue].
self pop: 1!
More information about the Vm-dev
mailing list