[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