VM Maker: VMMaker.oscog-eem.2293.mcz

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

VM Maker: VMMaker.oscog-eem.2293.mcz

commits-2
 
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2293.mcz

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

Name: VMMaker.oscog-eem.2293
Author: eem
Time: 8 December 2017, 4:03:39.353313 pm
UUID: 42fb0654-3c58-4388-b25e-dbad57cd0747
Ancestors: VMMaker.oscog-eem.2292

Fix vorgotten variables in the unused variable elimination scheme for inlined value:[value:*] and to:by:do:

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

Item was changed:
  ----- Method: CCodeGenerator>>generateToByDo:on:indent: (in category 'C translation') -----
  generateToByDo: msgNode on: aStream indent: level
  "Generate the C code for this message onto the given stream."
  "N.B. MessageNode>>asTranslatorNodeIn: adds the limit var as a hidden fourth argument."
  | blockExpr iterationVar limitExpr mayHaveSideEffects limitVar step |
  blockExpr := msgNode args third.
  blockExpr args size = 1 ifFalse:
  [self error: 'wrong number of block arguments'].
  iterationVar := blockExpr args first.
  limitExpr := msgNode args first.
  aStream nextPutAll: 'for (', iterationVar, ' = '.
+ self noteUsedVariableName: iterationVar.
  self emitCExpression: msgNode receiver on: aStream.
  mayHaveSideEffects := msgNode args size = 4. "See TMethod>>prepareMethodIn:"
  mayHaveSideEffects ifTrue:
  [limitVar := msgNode args last.
  aStream nextPutAll: ', ', limitVar name, ' = '.
  self emitCExpression: limitExpr on: aStream.
  limitExpr := limitVar].
  aStream nextPutAll: '; ', iterationVar.
  step := msgNode args at: 2.
  self generateToByDoLimitExpression: limitExpr
  negative: (self stepExpressionIsNegative: step)
  on: aStream.
  aStream nextPutAll: '; ', iterationVar, ' += '.
  self emitCExpression: step on: aStream.
  aStream nextPutAll: ') {'; cr.
  blockExpr emitCCodeOn: aStream level: level + 1 generator: self.
  aStream tab: level.
  aStream nextPut: $}!

Item was changed:
  ----- Method: CCodeGenerator>>generateValue:on:indent: (in category 'C translation') -----
  generateValue: aTSendNode on: aStream indent: level
  "Reduce [:formal ... :formalN| body ] value: actual ... value: actualN
  to body with formals substituted for by actuals."
  | substitution substitutionDict newLabels |
  self assert: aTSendNode receiver isStmtList.
  self assert: aTSendNode receiver args size = aTSendNode args size.
  substitution := aTSendNode receiver copy.
  substitution renameLabelsForInliningInto: currentMethod.
  substitutionDict := Dictionary new: aTSendNode args size * 2.
  aTSendNode receiver args with: aTSendNode args do:
  [ :argName :exprNode |
  exprNode isLeaf
  ifTrue: [substitutionDict at: argName put: exprNode]
  ifFalse:
  [aStream nextPutAll: argName; nextPutAll: ' = '.
+ self noteUsedVariableName: argName.
  exprNode emitCCodeAsExpressionOn: aStream level: level generator: self.
  aStream nextPut: $; ; crtab: level]].
  substitution
  bindVariablesIn: substitutionDict;
  emitCCodeOn: aStream level: level generator: self.
  newLabels := Set withAll: currentMethod labels.
  substitution nodesDo:
  [:node| node isLabel ifTrue: [node label ifNotNil: [:label| newLabels add: label]]].
  "now add the new labels so that a subsequent inline of
  the same block will be renamed with different labels."
  currentMethod labels: newLabels!

Item was added:
+ ----- Method: CCodeGenerator>>noteUsedVariableName: (in category 'utilities') -----
+ noteUsedVariableName: variableName
+ currentMethod ifNotNil:
+ [:m| m noteUsedVariableName: variableName]!