The Inbox: Compiler.quasiquote-eem.251.mcz

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

The Inbox: Compiler.quasiquote-eem.251.mcz

commits-2
A new version of Compiler was added to project The Inbox:
http://source.squeak.org/inbox/Compiler.quasiquote-eem.251.mcz

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

Name: Compiler.quasiquote-eem.251
Author: eem
Time: 8 February 2013, 3:47:10.327 pm
UUID: 521891bc-15a3-4687-ba25-3c15865e80f8
Ancestors: Compiler.quasiquote-eem.250

Fix incomplete fix for decompilation of #to:do: loops in
Compiler-eem.242.  Fixes decompilation of e.g. compilation
of SoundRecorder>>segmentsAbove:normalizedVolume:
when compiled with Compiler-nice.224 or later.

=============== Diff against Compiler.quasiquote-eem.250 ===============

Item was changed:
  ----- Method: Decompiler>>convertToDoLoop (in category 'private') -----
  convertToDoLoop
  "If statements contains the pattern
  var := startExpr.
  [var <= limit] whileTrue: [...statements... var := var + incConst]
  then replace this by
  startExpr to: limit by: incConst do: [:var | ...statements...]"
  | initStmt toDoStmt limitStmt |
  (stack notEmpty
  and: [stack last isAssignmentNode])
  ifTrue:
  [initStmt := stack last.
  (toDoStmt := statements last toDoFromWhileWithInit: initStmt) ifNil:
  [^self].
+ stack removeLast.
+ statements removeLast; addLast: toDoStmt]
- stack removeLast; addLast: toDoStmt.
- statements removeLast]
  ifFalse:
  [statements size < 2 ifTrue:
  [^self].
  initStmt := statements at: statements size-1.
  (toDoStmt := statements last toDoFromWhileWithInit: initStmt) ifNil:
  [^self].
  statements removeLast; removeLast; addLast: toDoStmt].
  initStmt variable scope: -1.  "Flag arg as block temp"
 
  "Attempt further conversion of the pattern
  limitVar := limitExpr.
  startExpr to: limitVar by: incConst do: [:var | ...statements...]
  to
  startExpr to: limitExpr by: incConst do: [:var | ...statements...].
  The complication here is that limitVar := limitExpr's value may be used, in which case it'll
  be statements last, or may not be used, in which case it'll be statements nextToLast."
  statements size < 2 ifTrue: [^ self].
  limitStmt := statements last.
  ((limitStmt isMemberOf: AssignmentNode)
  and: [limitStmt variable isTemp
  and: [limitStmt variable == toDoStmt arguments first]]) ifFalse:
  [limitStmt := statements at: statements size-1.
  ((limitStmt isMemberOf: AssignmentNode)
  and: [limitStmt variable isTemp
  and: [limitStmt variable == toDoStmt arguments first]]) ifFalse:
  [^self]].
 
  (self blockScopeRefersOnlyOnceToTemp: limitStmt variable fieldOffset) ifFalse:
  [^self].
  toDoStmt arguments at: 1 put: limitStmt value.
  limitStmt variable scope: -2.  "Flag limit var so it won't print"
  statements last == limitStmt
  ifTrue: [statements removeLast]
  ifFalse: [statements removeLast; removeLast; addLast: toDoStmt]!