VM Maker: VMMaker.oscog-eem.889.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-eem.889.mcz

commits-2
 
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!