[Vm-dev] VM Maker: VMMaker.oscog-eem.1196.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Apr 14 23:18:54 UTC 2015
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1196.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1196
Author: eem
Time: 14 April 2015, 4:16:37.464 pm
UUID: c4a2dfab-74cd-4fea-a202-fb28c5accc00
Ancestors: VMMaker.oscog-eem.1195
Fix bug in computing offsets for arg access in
frameless methods when args are on stack and
there is a link register. In this case there is no
return pc to skip over.
=============== Diff against VMMaker.oscog-eem.1195 ===============
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)
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.
0 to: methodOrBlockNumTemps - 1 do:
[:i|
desc := self simStackAt: i.
desc
type: SSBaseOffset;
spilled: true;
annotateUse: false;
register: SPReg;
+ offset: ((backEnd hasLinkRegister
+ ifTrue: [methodOrBlockNumArgs - 1- i]
+ ifFalse: [methodOrBlockNumArgs - i]) * objectMemory wordSize);
- offset: ((methodOrBlockNumTemps - i) * objectMemory wordSize);
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: 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: ((backEnd hasLinkRegister
+ ifTrue: [methodOrBlockNumArgs - 1- i]
+ ifFalse: [methodOrBlockNumArgs - i]) * objectMemory wordSize);
- offset: ((methodOrBlockNumArgs - i) * objectMemory wordSize);
bcptr: startpc]].
simSpillBase := simStackPtr := methodOrBlockNumArgs - 1!
More information about the Vm-dev
mailing list