Skip to content

Commit bf1c1d7

Browse files
committed
Fix bug in Compiler
1 parent ba0bffe commit bf1c1d7

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

src/prometheus/compiler/compiler.lua

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,6 +1308,52 @@ function Compiler:compileStatement(statement, funcDepth)
13081308
-- Function Declaration
13091309
if(statement.kind == AstKind.FunctionDeclaration) then
13101310
local retReg = self:compileFunction(statement, funcDepth);
1311+
if(#statement.indices > 0) then
1312+
local tblReg;
1313+
if statement.scope.isGlobal then
1314+
tblReg = self:allocRegister(false);
1315+
self:addStatement(self:setRegister(scope, tblReg, Ast.StringExpression(statement.scope:getVariableName(statement.id))), {tblReg}, {}, false);
1316+
self:addStatement(self:setRegister(scope, tblReg, Ast.IndexExpression(self:env(scope), self:register(scope, tblReg))), {tblReg}, {tblReg}, true);
1317+
else
1318+
if self.scopeFunctionDepths[statement.scope] == funcDepth then
1319+
if self:isUpvalue(statement.scope, statement.id) then
1320+
tblReg = self:allocRegister(false);
1321+
local reg = self:getVarRegister(statement.scope, statement.id, funcDepth);
1322+
self:addStatement(self:setRegister(scope, tblReg, self:getUpvalueMember(scope, self:register(scope, reg))), {tblReg}, {reg}, true);
1323+
else
1324+
tblReg = self:getVarRegister(statement.scope, statement.id, funcDepth, retReg);
1325+
end
1326+
else
1327+
tblReg = self:allocRegister(false);
1328+
local upvalId = self:getUpvalueId(statement.scope, statement.id);
1329+
scope:addReferenceToHigherScope(self.containerFuncScope, self.currentUpvaluesVar);
1330+
self:addStatement(self:setRegister(scope, tblReg, self:getUpvalueMember(scope, Ast.IndexExpression(Ast.VariableExpression(self.containerFuncScope, self.currentUpvaluesVar), Ast.NumberExpression(upvalId)))), {tblReg}, {}, true);
1331+
end
1332+
end
1333+
1334+
for i = 1, #statement.indices - 1 do
1335+
local index = statement.indices[i];
1336+
local indexReg = self:compileExpression(Ast.StringExpression(index), funcDepth, 1)[1];
1337+
local tblRegOld = tblReg;
1338+
tblReg = self:allocRegister(false);
1339+
self:addStatement(self:setRegister(scope, tblReg, Ast.IndexExpression(self:register(scope, tblRegOld), self:register(scope, indexReg))), {tblReg}, {tblReg, indexReg}, false);
1340+
self:freeRegister(tblRegOld, false);
1341+
self:freeRegister(indexReg, false);
1342+
end
1343+
1344+
local index = statement.indices[#statement.indices];
1345+
local indexReg = self:compileExpression(Ast.StringExpression(index), funcDepth, 1)[1];
1346+
self:addStatement(Ast.AssignmentStatement({
1347+
Ast.AssignmentIndexing(self:register(scope, tblReg), self:register(scope, indexReg)),
1348+
}, {
1349+
self:register(scope, retReg),
1350+
}), {}, {tblReg, indexReg, retReg}, true);
1351+
self:freeRegister(indexReg, false);
1352+
self:freeRegister(tblReg, false);
1353+
self:freeRegister(retReg, false);
1354+
1355+
return;
1356+
end
13111357
if statement.scope.isGlobal then
13121358
local tmpReg = self:allocRegister(false);
13131359
self:addStatement(self:setRegister(scope, tmpReg, Ast.StringExpression(statement.scope:getVariableName(statement.id))), {tmpReg}, {}, false);

0 commit comments

Comments
 (0)