[Vm-dev] VM Maker: VMMaker.oscog-eem.2254.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Jul 18 22:03:52 UTC 2017
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2254.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.2254
Author: eem
Time: 18 July 2017, 3:02:56.421478 pm
UUID: 4f2c2cce-f4a2-469a-93f1-97ed941df0ad
Ancestors: VMMaker.oscog-eem.2253
Spur: Fail become if copyHash is true and target is immutable.
FloatArrayPlugin: Fix length & normalize to return at failure points instead of continuing.
=============== Diff against VMMaker.oscog-eem.2253 ===============
Item was changed:
----- Method: FloatArrayPlugin>>primitiveLength (in category 'arithmetic primitives') -----
primitiveLength
"Primitive. Compute the length of the argument (sqrt of sum of component squares)."
<export: true>
| rcvr rcvrPtr length len |
<var: #rcvrPtr type: #'float *'>
<var: #len type: #double>
rcvr := interpreterProxy stackValue: 0.
(interpreterProxy isWords: rcvr) ifFalse:
+ [^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
- [interpreterProxy primitiveFailFor: PrimErrBadReceiver].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
len := 0.0.
+ 0 to: length-1 do:
+ [:i| len := len + ((self cCoerce: (rcvrPtr at: i) to: #double) * (self cCoerce: (rcvrPtr at: i) to: #double)) ].
- 0 to: length-1 do:[:i|
- len := len + ((self cCoerce: (rcvrPtr at: i) to: #double) * (self cCoerce: (rcvrPtr at: i) to: #double)).
- ].
len > 0.0 ifFalse:
+ [^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
- [interpreterProxy primitiveFailFor: PrimErrBadReceiver].
interpreterProxy pop: 1 thenPush: (interpreterProxy floatObjectOf: (self sqrt: len))!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveNormalize (in category 'arithmetic primitives') -----
primitiveNormalize
"Primitive. Normalize the argument (A FloatArray) in place."
<export: true>
| rcvr rcvrPtr length len |
<var: #rcvrPtr type: #'float *'>
<var: #len type: #double>
rcvr := interpreterProxy stackValue: 0.
(interpreterProxy isWords: rcvr) ifFalse:
+ [^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
- [interpreterProxy primitiveFailFor: PrimErrBadReceiver].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
len := 0.0.
+ 0 to: length - 1 do:
+ [:i| len := len + ((self cCoerce: (rcvrPtr at: i) to: #double) * (self cCoerce: (rcvrPtr at: i) to: #double)) ].
- 0 to: length-1 do:[:i|
- len := len + ((self cCoerce: (rcvrPtr at: i) to: #double) * (self cCoerce: (rcvrPtr at: i) to: #double)).
- ].
len > 0.0 ifFalse:
+ [^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
- [interpreterProxy primitiveFailFor: PrimErrBadReceiver].
len := self sqrt: len.
+ 0 to: length - 1 do:
+ [:i| rcvrPtr at: i put: ((self cCoerce: (rcvrPtr at: i) to: #double) / len) ].
- 0 to: length-1 do:[:i|
- rcvrPtr at: i put: ((self cCoerce: (rcvrPtr at: i) to: #double) / len).
- ].
"Leave receiver on the stack."!
Item was changed:
----- Method: SpurMemoryManager>>containsOnlyValidBecomeObjects:and:twoWay:copyHash: (in category 'become implementation') -----
containsOnlyValidBecomeObjects: array1 and: array2 twoWay: isTwoWay copyHash: copyHash
"Answer 0 if neither array contains an object inappropriate for the become operation.
Otherwise answer an informative error code for the first offending object found:
Can't become: immediates => PrimErrInappropriate
Shouldn't become pinned objects => PrimErrObjectIsPinned.
Shouldn't become immutable objects => PrimErrNoModification.
Can't copy hash into immediates => PrimErrInappropriate.
Two-way become may require memory to create copies => PrimErrNoMemory.
As a side-effect unforward any forwarders in the two arrays if answering 0."
<inline: true>
| fieldOffset effectsFlags oop1 oop2 size |
fieldOffset := self lastPointerOf: array1.
effectsFlags := size := 0.
"array1 is known to be the same size as array2"
[fieldOffset >= self baseHeaderSize] whileTrue:
[oop1 := self longAt: array1 + fieldOffset.
(self isOopForwarded: oop1) ifTrue:
[oop1 := self followForwarded: oop1.
self longAt: array1 + fieldOffset put: oop1].
self ifOopInvalidForBecome: oop1 errorCodeInto: [:errCode| ^errCode].
effectsFlags := effectsFlags bitOr: (self becomeEffectFlagsFor: oop1).
oop2 := self longAt: array2 + fieldOffset.
(self isOopForwarded: oop2) ifTrue:
[oop2 := self followForwarded: oop2.
self longAt: array2 + fieldOffset put: oop2].
isTwoWay
ifTrue:
[self ifOopInvalidForBecome: oop2 errorCodeInto: [:errCode| ^errCode].
size := size + (self bytesInObject: oop1) + (self bytesInObject: oop2).
effectsFlags := effectsFlags bitOr: (self becomeEffectFlagsFor: oop2)]
ifFalse:
+ [(copyHash and: [(self isImmediate: oop2) or: [self isImmutable: oop2]]) ifTrue:
- [(copyHash and: [self isImmediate: oop2]) ifTrue:
[^PrimErrInappropriate]].
fieldOffset := fieldOffset - self bytesPerOop].
size >= (totalFreeOldSpace + (scavengeThreshold - freeStart)) ifTrue:
[^PrimErrNoMemory].
"only set flags after checking all args."
becomeEffectsFlags := effectsFlags.
^0!
More information about the Vm-dev
mailing list