Skip to content

Commit f225734

Browse files
authored
fix(codegenerator): prevent for-loop iterator shadowing from undeclaring outer locals #9
Enter a new scope for numeric and generic for-loop iteration variables so shadowed outer locals aren't removed when the loop ends. Replaces explicit undeclare/free logic with `leaveScope` cleanup.
1 parent 2f25893 commit f225734

1 file changed

Lines changed: 4 additions & 4 deletions

File tree

the-tiny-lua-compiler.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2879,6 +2879,7 @@ function CodeGenerator:processForGenericStatement(node)
28792879
local expressions = node.expressions
28802880
local body = node.body
28812881

2882+
self:enterScope()
28822883
local baseRegister = self.stackSize
28832884
local expressionRegisters = self:processExpressionList(expressions, 3)
28842885
self:declareLocalVariables(iterators)
@@ -2897,8 +2898,7 @@ function CodeGenerator:processForGenericStatement(node)
28972898
-- Emit jump back to the start of the loop if there are more values.
28982899
self:emitJumpBack(loopStartPC)
28992900
end)
2900-
self:undeclareVariables(iterators)
2901-
self:freeRegisters(#iterators + expressionRegisters)
2901+
self:leaveScope()
29022902
end
29032903

29042904
function CodeGenerator:processForNumericStatement(node)
@@ -2908,6 +2908,7 @@ function CodeGenerator:processForNumericStatement(node)
29082908
local stepExpr = node.step
29092909
local body = node.body
29102910

2911+
self:enterScope()
29112912
local startRegister = self:processExpressionNode(startExpr)
29122913
self:processExpressionNode(limitExpr)
29132914
local stepRegister = self:allocateRegisters(1)
@@ -2935,8 +2936,7 @@ function CodeGenerator:processForNumericStatement(node)
29352936
-- if R(A) <?= R(A+1) then { pc+=sBx R(A+3)=R(A) }
29362937
self:emitInstruction("FORLOOP", startRegister, loopStartPC - loopEndPC - 1)
29372938
end)
2938-
self:freeRegisters(3) -- Free startRegister, endRegister, stepRegister
2939-
self:undeclareVariable(varName)
2939+
self:leaveScope()
29402940
end
29412941

29422942
function CodeGenerator:processWhileStatement(node)

0 commit comments

Comments
 (0)