[Vm-dev] VM Maker: VMMaker.oscog-eem.2589.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Nov 22 21:21:06 UTC 2019

Eliot Miranda uploaded a new version of VMMaker to project VM Maker:

==================== Summary ====================

Name: VMMaker.oscog-eem.2589
Author: eem
Time: 22 November 2019, 1:20:45.793955 pm
UUID: 5beddd90-a4e7-4e3d-95de-550f911e96b4
Ancestors: VMMaker.oscog-eem.2588

Slang for plugins.

Fix resultSendAlwaysFails: to include the two new failure sends, primitiveFailForFFIException:at: primitiveFailForOSError:.

As a micro optimization, if the enclosing method has type #sqInt then return the falures directly, as they're all typed as sqInt.  That should save an instruction :-)

=============== Diff against VMMaker.oscog-eem.2588 ===============

Item was changed:
  ----- Method: SmartSyntaxPluginTMethod>>fixUpReturnOneStmt:on: (in category 'transforming') -----
  fixUpReturnOneStmt: stmt on: sStream
  	| expr exprRetStmts "p t" |
  	stmt isReturn ifFalse: [^sStream nextPut: stmt].
  	expr := stmt expression.
  	(expr isSend
  	 and: [self resultSendAlwaysFails: expr]) ifTrue:
  		["failure returns"
+ 		 returnType = #sqInt
+ 			ifTrue: [sStream nextPut: (TReturnNode new setExpression: expr)]
+ 			ifFalse: [sStream nextPut: expr; nextPut: self nullReturnExpr].
- 		 sStream nextPut: expr; nextPut: self nullReturnExpr.
  	(expr isVariable and: ['nil' = expr name]) ifTrue:
  		["^ nil -- this is never right unless automatically generated"
  		 sStream nextPut: stmt.
  	(expr isVariable and: ['self' = expr name]) ifTrue:
  		["^ self"
  		 fullArgs isEmpty ifFalse:
  			[sStream nextPut: (self statementGuardedWithSuccess: (self popExpr: fullArgs size))].
  		 sStream nextPut: self nullReturnExpr.
  	(expr isVariable or: [expr isConstant]) ifTrue:
  		["^ variable or ^ constant without guardchecking"
  			nextPut: (sStream isEmpty "No statements to cause failure, therefore no need for failure guard."
  							[self pop: fullArgs size + 1 thenReturnExpr: expr]
  							[self statementGuardedWithSuccess:
  								(self pop: fullArgs size + 1 thenReturnExpr: expr)]);
  			nextPut: self nullReturnExpr.
  	"^ expr with necessary guard checking"
  	"p := sStream position."
  	exprRetStmts := Array streamContents:
  		 (self resultExpressionCanFail: expr)
  				["t := 1."
  					nextPut: (self assign: (self oopVariable: '_return_value') expression: expr);
  					nextPut: (self statementGuardedWithSuccess: (self pop: fullArgs size + 1
  																		thenReturnExpr: (self oopVariable: '_return_value')))]
  				["t := 2."
  				 ersStream nextPut: (self pop: fullArgs size + 1 thenReturnExpr: expr)]].
  		sStream isEmpty "No statements to cause failure, therefore no need for an initial failure guard."
  			ifTrue: [sStream nextPutAll: exprRetStmts]
  				["t := t + 2."
  				 sStream nextPut: (self statementGuardedWithSuccess: exprRetStmts)].
  	sStream nextPut: self nullReturnExpr.
  	"Them := Dictionary new"
  	"(Them at: t ifAbsentPut: [Dictionary new])
  		at: self selector
  		put: (sStream originalContents copyFrom: p + 1 to: sStream position)"!

Item was changed:
  ----- Method: SmartSyntaxPluginTMethod>>resultSendAlwaysFails: (in category 'private') -----
  resultSendAlwaysFails: aTSendNode
+ 	^(#(primitiveFail primitiveFailFor: primitiveFailForFFIException:at: primitiveFailForOSError:) includes: aTSendNode selector)
- 	^(#(primitiveFail primitiveFailFor:) includes: aTSendNode selector)
  		or: [aTSendNode selector == #success:
  			 and: [aTSendNode args first isConstant
  			 and: [aTSendNode args first value == false]]]!

More information about the Vm-dev mailing list