[squeak-dev] The Inbox: Compiler-ct.463.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Nov 16 11:41:01 UTC 2021


A new version of Compiler was added to project The Inbox:
http://source.squeak.org/inbox/Compiler-ct.463.mcz

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

Name: Compiler-ct.463
Author: ct
Time: 16 November 2021, 12:40:59.711376 pm
UUID: 8f758ee8-125c-d54d-b581-72ab467f92ae
Ancestors: Compiler-eem.460

Fixes a DNU in the decompiler when the stack contains flags (such as CaseFlag) while trying to match a #to:[by:]do: loop. Can be reproduced with String >> #format: ct 12/7/2019 15:05 (Collections-ct.867).

=============== Diff against Compiler-eem.460 ===============

Item was changed:
  ----- Method: Decompiler>>startAndLimitFor:from:into: (in category 'private') -----
  startAndLimitFor: incrVar from: aStack into: binaryBlock
  	"If incrVar matches the increment of a whileLoop at the end of statements
  	 evaluate binaryBlock with the init statement for incrVar and the init statement
  	 for the block's limit, if any, and answer true.  Otherwise answer false.  Used to
  	 help convert whileTrue: loops into to:[by:]do: loops."
  	| guard initExpr limitInit size |
  	((size := aStack size) >= 1
+ 	 and: [(initExpr := aStack at: size) isKindOf: ParseNode]
+ 	 and: [initExpr isAssignmentNode]) ifFalse:
- 	 and: [(initExpr := aStack at: size) isAssignmentNode]) ifFalse:
  		[^false].
  	initExpr variable == incrVar ifTrue:
  		[binaryBlock value: initExpr value: nil.
  		 ^true].
  	limitInit := initExpr.
  	(size >= 2
+ 	 and: [((initExpr := aStack at: size - 1) isKindOf: ParseNode)
+ 	 and: [initExpr isAssignmentNode
+ 	 and: [initExpr variable == incrVar]
- 	 and: [(initExpr := aStack at: size - 1) isAssignmentNode
- 	 and: [initExpr variable == incrVar
  	 and: [(guard := statements last receiver) isBlockNode
  	 and: [guard statements size = 1
  	 and: [(guard := guard statements first) isMessageNode
  	 and: [guard receiver == incrVar
  	 and: [guard arguments first == limitInit variable]]]]]]]) ifTrue:
  		[binaryBlock value: initExpr value: limitInit.
  		 ^true].
  	^false!



More information about the Squeak-dev mailing list