[Vm-dev] VM Maker: VMMaker.oscog-eem.2082.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Jan 11 01:25:39 UTC 2017
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2082.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.2082
Author: eem
Time: 10 January 2017, 5:24:49.762499 pm
UUID: f987e1db-f4c0-40ed-86ec-7a478cb89067
Ancestors: VMMaker.oscog-eem.2081
Spur:
Go the extra few inches and extract the store check in primitiveSpurStringReplace.
=============== Diff against VMMaker.oscog-eem.2081 ===============
Item was changed:
----- Method: InterpreterPrimitives>>primitiveSpurStringReplace (in category 'indexing primitives') -----
primitiveSpurStringReplace
"<array> primReplaceFrom: start to: stop with: replacement startingAt: repStart
<primitive: 105>"
<inline: true>
| array start stop repl replStart arrayFmt arrayLength arrayInstSize replFmt replLength replInstSize srcDelta |
array := self stackValue: 4.
start := self stackValue: 3.
stop := self stackValue: 2.
repl := self stackValue: 1.
replStart := self stackValue: 0.
((objectMemory isNonIntegerObject: start)
or: [(objectMemory isNonIntegerObject: stop)
or: [(objectMemory isNonIntegerObject: replStart)
or: [objectMemory isImmediate: repl]]]) ifTrue: "can happen in LgInt copy"
[^self primitiveFailFor: PrimErrBadArgument].
start := objectMemory integerValueOf: start.
stop := objectMemory integerValueOf: stop.
replStart := objectMemory integerValueOf: replStart.
(stop >= start and: [objectMemory isObjImmutable: array]) ifTrue:
[^self primitiveFailFor: PrimErrNoModification].
arrayFmt := objectMemory formatOf: array.
arrayLength := objectMemory lengthOf: array format: arrayFmt.
arrayFmt := objectMemory classFormatFromInstFormat: arrayFmt.
replFmt := objectMemory formatOf: repl.
replLength := objectMemory lengthOf: repl format: replFmt.
replFmt := objectMemory classFormatFromInstFormat: replFmt.
"Array formats (without oddFields bits) must be the same"
(arrayFmt = replFmt
and: [arrayFmt < objectMemory firstCompiledMethodFormat]) ifFalse:
[^self primitiveFailFor: PrimErrInappropriate].
+ "N.B. In the below start - 1 to: stop - 1 do:, Slang is intelligent enough to use < instead of <= so avoiding the stop - 1."
arrayFmt <= objectMemory lastPointerFormat
ifTrue:
[arrayInstSize := objectMemory fixedFieldsOf: array format: arrayFmt length: arrayLength.
replInstSize := objectMemory fixedFieldsOf: repl format: replFmt length: replLength.
(start >= 1 and: [start - 1 <= stop and: [stop + arrayInstSize <= arrayLength
and: [replStart >= 1 and: [stop - start + replStart + replInstSize <= replLength]]]]) ifFalse:
[^self primitiveFailFor: PrimErrBadIndex].
+ start := start + arrayInstSize.
+ stop := stop + arrayInstSize.
+ srcDelta := (replStart + replInstSize) - start.
+ (objectMemory isOldObject: array)
+ ifTrue:
+ [| mustRemember oop |
+ mustRemember := false.
+ start - 1 to: stop - 1 do:
+ [:i |
+ oop := objectMemory fetchPointer: srcDelta + i ofObject: repl.
+ (objectMemory isYoung: oop) ifTrue:
+ [mustRemember := true].
+ objectMemory storePointerUnchecked: i ofObject: array withValue: oop].
+ mustRemember ifTrue:
+ [objectMemory possibleRootStoreInto: array]]
+ ifFalse:
+ [start - 1 to: stop - 1 do:
+ [:i | objectMemory storePointerUnchecked: i ofObject: array withValue: (objectMemory fetchPointer: srcDelta + i ofObject: repl)]]]
- srcDelta := (replStart + replInstSize) - (start + arrayInstSize).
- start + arrayInstSize - 1 to: stop + arrayInstSize - 1 do:
- [:i |
- objectMemory storePointer: i ofObject: array withValue: (objectMemory fetchPointer: srcDelta + i ofObject: repl)]]
ifFalse:
[(start >= 1 and: [start - 1 <= stop and: [stop <= arrayLength
and: [replStart >= 1 and: [stop - start + replStart <= replLength]]]]) ifFalse:
[^self primitiveFailFor: PrimErrBadIndex].
srcDelta := replStart - start.
arrayFmt >= objectMemory firstShortFormat
ifTrue: "8 & 16-bit word type objects"
[arrayFmt >= objectMemory firstByteFormat
ifTrue: "byte-type objects"
[start - 1 to: stop - 1 do:
[:i | objectMemory storeByte: i ofObject: array withValue: (objectMemory fetchByte: srcDelta + i ofObject: repl)]]
ifFalse: "short type objects"
[start - 1 to: stop - 1 do:
[:i | objectMemory storeShort16: i ofObject: array withValue: (objectMemory fetchShort16: srcDelta + i ofObject: repl)]]]
ifFalse: "32 & 64-bit word type objects"
[arrayFmt >= objectMemory firstLongFormat
ifTrue: "word-type objects"
[start - 1 to: stop - 1 do:
[:i | objectMemory storeLong32: i ofObject: array withValue: (objectMemory fetchLong32: srcDelta + i ofObject: repl)]]
ifFalse: "long type objects"
[start - 1 to: stop - 1 do:
[:i | objectMemory storeLong64: i ofObject: array withValue: (objectMemory fetchLong64: srcDelta + i ofObject: repl)]]]].
"We might consider comparing stop - start to some value here and using forceInterruptCheck"
self pop: argumentCount "leave rcvr on stack"!
More information about the Vm-dev
mailing list