[squeak-dev] The Trunk: Compiler-eem.240.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Nov 6 21:15:41 UTC 2012

Eliot Miranda uploaded a new version of Compiler to project The Trunk:

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

Name: Compiler-eem.240
Author: eem
Time: 6 November 2012, 1:15:13.684 pm
UUID: 7b6bc3de-112b-442d-8f73-3cafe5819fbc
Ancestors: Compiler-eem.239

Have the decompiler map whileTrue/False: [] to whileTrue/False
instead of relying on MethodNode.  Fixes decompiler tests
after fixing printing of whileTrue/False: [] to be side-effect free
in Compiler-eem.239.

=============== Diff against Compiler-eem.239 ===============

Item was changed:
  ----- Method: Decompiler>>jump:if: (in category 'instruction decoding') -----
  jump: dist if: condition
  	| savePc sign elsePc elseStart end cond ifExpr thenBlock elseBlock
+ 	  thenJump elseJump condHasValue isIfNil saveStack blockBody blockArgs |
- 	  thenJump elseJump condHasValue isIfNil saveStack blockBody |
  	lastJumpIfPcStack addLast: lastPc.
  	stack last == CascadeFlag ifTrue: [^ [self case: dist] ensure: [lastJumpIfPcStack removeLast]].
  	elsePc := lastPc.
  	elseStart := pc + dist.
  	end := limit.
  	"Check for bfp-jmp to invert condition.
  	Don't be fooled by a loop with a null body."
  	sign := condition.
  	savePc := pc.
  	self interpretJump ifNotNil:
  		 (elseDist >= 0 and: [elseStart = pc]) ifTrue:
  			 [sign := sign not.  elseStart := pc + elseDist]].
  	pc := savePc.
  	ifExpr := stack removeLast.
  	(isIfNil := stack size > 0 and: [stack last == IfNilFlag]) ifTrue:
  		[stack removeLast].
  	saveStack := stack.
  	stack := OrderedCollection new.
  	thenBlock := self blockTo: elseStart.
  	condHasValue := hasValue or: [isIfNil].
  	"ensure jump is within block (in case thenExpr returns)"
  	thenJump := exit <= end ifTrue: [exit] ifFalse: [elseStart].
  	"if jump goes back, then it's a loop"
  	thenJump < elseStart
  			["Must be a while loop...
  			  thenJump will jump to the beginning of the while expr.  In the case of while's
  			  with a block in the condition, the while expr should include more than just
  			  the last expression: find all the statements needed by re-decompiling."
  			stack := saveStack.
  			pc := thenJump.
  			blockBody := self statementsTo: elsePc.
  			"discard unwanted statements from block"
  			blockBody size - 1 timesRepeat: [statements removeLast].
+ 			blockArgs := thenBlock statements = constructor codeEmptyBlock statements
+ 							ifTrue: [#()]
+ 							ifFalse: [{ thenBlock }].
  			statements addLast:
  					codeMessage: (constructor codeBlock: blockBody returns: false)
  					selector: (constructor
+ 								codeSelector: (blockArgs isEmpty
+ 												ifTrue:
+ 													[sign
+ 														ifTrue: [#whileFalse]
+ 														ifFalse: [#whileTrue]]
+ 												ifFalse:
+ 													[sign
+ 														ifTrue: [#whileFalse:]
+ 														ifFalse: [#whileTrue:]])
- 								codeSelector: (sign
- 												ifTrue: [#whileFalse:]
- 												ifFalse: [#whileTrue:])
  								code: #macro)
+ 					arguments: blockArgs).
- 					arguments: { thenBlock }).
  			pc := elseStart.
  			self convertToDoLoop]
  			["Must be a conditional..."
  			elseBlock := self blockTo: thenJump.
  			elseJump := exit.
  			"if elseJump is backwards, it is not part of the elseExpr"
  			elseJump < elsePc ifTrue:
  				[pc := lastPc].
  			cond := isIfNil
  								codeMessage: ifExpr ifNilReceiver
  								selector: (constructor
  											codeSelector: (sign ifTrue: [#ifNotNil:] ifFalse: [#ifNil:])
  											code: #macro)
  								arguments: (Array with: thenBlock)]
  								codeMessage: ifExpr
  								selector: (constructor codeSelector: #ifTrue:ifFalse: code: #macro)
  								arguments:	(sign
  												ifTrue: [{elseBlock. thenBlock}]
  												ifFalse: [{thenBlock. elseBlock}])].
  			stack := saveStack.
  				ifTrue: [stack addLast: cond]
  				ifFalse: [statements addLast: cond]].
  	lastJumpIfPcStack removeLast.!

More information about the Squeak-dev mailing list