[Vm-dev] VM Maker: VMMaker-dtl.415.mcz
commits at source.squeak.org
commits at source.squeak.org
Sun Apr 19 21:30:43 UTC 2020
David T. Lewis uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker-dtl.415.mcz
==================== Summary ====================
Name: VMMaker-dtl.415
Author: dtl
Time: 19 April 2020, 5:30:30.208 pm
UUID: 747f8591-57e6-4950-858a-c7fbc22ad1c2
Ancestors: VMMaker-dtl.414
VMMaker 4.19.1
Required for Squeak trunk Collections-eem.885 and above.
Install primitiveArrayBecomeOneWayNoCopyHash as primitive 248, replacing obsolete primitiveInvokeObjectAsMethod.
Fix 128 primitiveArrayBecome to match oscog logic. This a fix from VMMaker.oscog-eem.647 which Eliot explained as follows:
Fix primitiveArrayBecome (the two-way become); it should /not/
specify copyHash. ObjectMemory ignores the copyHash flag when doing a two-way become, hence the wrong sense of the flag had
no effect. Hence correctly evaluate testBecomeIdentityHash.
The primitives now do this:
primitive 72: twoWay: false copyHash: true
primitive 128: twoWay: true copyHash: false
primitive 248: twoWay: false copyHash: false
primitive 249: twoWay: false copyHash: <arg 3 value>
=============== Diff against VMMaker-dtl.414 ===============
Item was changed:
----- Method: ContextInterpreter>>primitiveInvokeObjectAsMethod (in category 'control primitives') -----
primitiveInvokeObjectAsMethod
"Primitive. 'Invoke' an object like a function, sending the special message
run: originalSelector with: arguments in: aReceiver.
+ Installed as primitive 248 prior to VMMaker 4.19.1"
- "
| runSelector runReceiver runArgs newReceiver lookupClass |
runArgs := objectMemory instantiateClass: (objectMemory splObj: ClassArray) indexableSize: argumentCount.
objectMemory beRootIfOld: runArgs. "do we really need this?"
self transfer: argumentCount from: stackPointer - ((argumentCount - 1) * objectMemory bytesPerWord) to: runArgs + objectMemory baseHeaderSize.
runSelector := messageSelector.
runReceiver := self stackValue: argumentCount.
self pop: argumentCount+1.
"stack is clean here"
newReceiver := newMethod.
messageSelector := objectMemory splObj: SelectorRunWithIn.
argumentCount := 3.
self push: newReceiver.
self push: runSelector.
self push: runArgs.
self push: runReceiver.
lookupClass := objectMemory fetchClassOf: newReceiver.
self findNewMethodInClass: lookupClass.
self executeNewMethodFromCache. "Recursive xeq affects primFailCode"
self initPrimCall.
!
Item was changed:
----- Method: Interpreter class>>initializePrimitiveTable (in category 'initialization') -----
(excessive size, no diff calculated)
Item was changed:
----- Method: InterpreterPrimitives>>primitiveArrayBecome (in category 'object access primitives') -----
primitiveArrayBecome
"We must flush the method cache here, to eliminate stale references
to mutated classes and/or selectors."
| arg rcvr |
arg := self stackTop.
rcvr := self stackValue: 1.
+ self success: (objectMemory become: rcvr with: arg twoWay: true copyHash: false).
- self success: (objectMemory become: rcvr with: arg twoWay: true copyHash: true).
self successful ifTrue: [ self pop: 1 ].!
Item was added:
+ ----- Method: InterpreterPrimitives>>primitiveArrayBecomeOneWayNoCopyHash (in category 'object access primitives') -----
+ primitiveArrayBecomeOneWayNoCopyHash
+ "Similar to primitiveArrayBecomeOneWay but does /not/ copy the receiver's
+ elements identity hashes over the argument's elements identity hashes."
+
+ | arg rcvr |
+ arg := self stackTop.
+ rcvr := self stackValue: 1.
+ self success: (objectMemory become: rcvr with: arg twoWay: false copyHash: false).
+ self successful ifTrue: [ self pop: 1 ].!
Item was changed:
----- Method: InterpreterPrimitives>>primitiveInvokeObjectAsMethod (in category 'control primitives') -----
primitiveInvokeObjectAsMethod
"Primitive. 'Invoke' an object like a function, sending the special message
run: originalSelector with: arguments in: aReceiver.
+ Installed as primitive 248 prior to VMMaker 4.19.1"
- "
self subclassResponsibility!
Item was changed:
----- Method: StackInterpreter class>>initializePrimitiveTable (in category 'initialization') -----
(excessive size, no diff calculated)
Item was changed:
----- Method: StackInterpreterPrimitives>>primitiveInvokeObjectAsMethod (in category 'control primitives') -----
primitiveInvokeObjectAsMethod
"Primitive. 'Invoke' an object like a function, sending the special message
run: originalSelector with: arguments in: aReceiver.
+ Installed as primitive 248 prior to VMMaker 4.19.1"
- "
<returnTypeC: #void>
| runReceiver runArgs lookupClass |
runArgs := objectMemory eeInstantiateClass: (objectMemory splObj: ClassArray) indexableSize: argumentCount.
argumentCount - 1 to: 0 by: -1 do:
[:i| objectMemory storePointerUnchecked: i ofObject: runArgs withValue: self popStack].
runReceiver := self popStack.
"setup send of newMethod run: originalSelector with: runArgs in: runReceiver"
self push: newMethod. "newReceiver"
self push: messageSelector "original selector".
self push: runArgs.
self push: runReceiver.
"stack is clean here"
messageSelector := objectMemory splObj: SelectorRunWithIn.
argumentCount := 3.
lookupClass := objectMemory fetchClassOf: newMethod.
self findNewMethodInClass: lookupClass.
self executeNewMethod. "Recursive xeq affects successFlag"
self initPrimCall!
Item was changed:
----- Method: VMMaker class>>versionString (in category 'version testing') -----
versionString
"VMMaker versionString"
+ ^'4.19.1'!
- ^'4.18.1'!
More information about the Vm-dev
mailing list