[Vm-dev] VM Maker: VMMaker.oscog-eem.889.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Sep 30 22:32:48 UTC 2014
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.889.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.889
Author: eem
Time: 30 September 2014, 3:29:12.712 pm
UUID: f7ca0f83-4116-4c07-8307-3c23f8f5600a
Ancestors: VMMaker.oscog-eem.888
Fix the assert fail caused by a frameless method with
an unaccessed temp. Move the assert check to
genPushTemporaryVariable:.
=============== Diff against VMMaker.oscog-eem.888 ===============
Item was changed:
----- Method: StackToRegisterMappingCogit>>genPushTemporaryVariable: (in category 'bytecode generators') -----
genPushTemporaryVariable: index
+ "If a frameless method (not a block), only argument temps can be accessed.
+ This is assured by the use of needsFrameIfMod16GENumArgs: in pushTemp."
+ self assert: (inBlock or: [needsFrame or: [index < methodOrBlockNumArgs]]).
^self ssPushDesc: (simStack at: index)!
Item was changed:
----- Method: StackToRegisterMappingCogit>>initSimStackForFramelessBlock: (in category 'simulation stack') -----
initSimStackForFramelessBlock: startpc
+ "The register receiver (the closure itself) and args are pushed by the closure value primitive(s)
- "The register receiver (he closure itself) and args are pushed by the closure value primitive(s)
and hence a frameless block has all arguments and copied values pushed to the stack. However,
the method receiver (self) is put in the ReceiverResultRegister by the block entry."
| desc |
<var: #desc type: #'CogSimStackEntry *'>
simSelf
type: SSRegister;
spilled: false;
annotateUse: false;
register: ReceiverResultReg.
optStatus
isReceiverResultRegLive: true;
ssEntry: (self addressOf: simSelf).
self assert: methodOrBlockNumTemps >= methodOrBlockNumArgs.
- self assert: self numRegArgs <= 2.
0 to: methodOrBlockNumTemps - 1 do:
[:i|
desc := self simStackAt: i.
desc
type: SSBaseOffset;
spilled: true;
annotateUse: false;
register: SPReg;
offset: ((methodOrBlockNumTemps - i) * BytesPerWord);
bcptr: startpc].
simSpillBase := simStackPtr := methodOrBlockNumTemps - 1!
Item was changed:
----- Method: StackToRegisterMappingCogit>>initSimStackForFramelessMethod: (in category 'simulation stack') -----
initSimStackForFramelessMethod: startpc
| desc |
<var: #desc type: #'CogSimStackEntry *'>
simSelf
type: SSRegister;
spilled: false;
annotateUse: false;
register: ReceiverResultReg.
optStatus
isReceiverResultRegLive: true;
ssEntry: (self addressOf: simSelf).
+ self assert: methodOrBlockNumTemps >= methodOrBlockNumArgs.
- self assert: (methodOrBlockNumTemps = methodOrBlockNumArgs
- or: [coInterpreter isQuickPrimitiveIndex: primitiveIndex]).
self assert: self numRegArgs <= 2.
(methodOrBlockNumArgs between: 1 and: self numRegArgs)
ifTrue:
[desc := self simStackAt: 0.
desc
type: SSRegister;
spilled: false;
annotateUse: false;
register: Arg0Reg;
bcptr: startpc.
methodOrBlockNumArgs > 1 ifTrue:
[desc := self simStackAt: 1.
desc
type: SSRegister;
spilled: false;
annotateUse: false;
register: Arg1Reg;
bcptr: startpc]]
ifFalse:
[0 to: methodOrBlockNumArgs - 1 do:
[:i|
desc := self simStackAt: i.
desc
type: SSBaseOffset;
register: SPReg;
spilled: true;
annotateUse: false;
offset: ((methodOrBlockNumArgs - i) * BytesPerWord);
bcptr: startpc]].
simSpillBase := simStackPtr := methodOrBlockNumArgs - 1!
More information about the Vm-dev
mailing list