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]! |
Free forum by Nabble | Edit this page |