Skip to content

Commit 2fa9745

Browse files
committed
Fix bugs in Compiler
1 parent 227988e commit 2fa9745

File tree

1 file changed

+92
-22
lines changed

1 file changed

+92
-22
lines changed

src/prometheus/compiler/compiler.lua

Lines changed: 92 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
-- The max Number of variables used as registers
77
local MAX_REGS = 100;
8+
local MAX_REGS_MUL = 0;
89

910
local Compiler = {};
1011

@@ -655,7 +656,7 @@ function Compiler:allocRegister(isVar)
655656

656657

657658
local id = 0;
658-
if self.usedRegisters < MAX_REGS * 0.75 then
659+
if self.usedRegisters < MAX_REGS * MAX_REGS_MUL then
659660
repeat
660661
id = math.random(1, MAX_REGS - 1);
661662
until not self.registers[id];
@@ -1008,7 +1009,7 @@ function Compiler:compileBlock(block, funcDepth)
10081009
local scope = self.activeBlock.scope;
10091010
for id, name in ipairs(block.scope.variables) do
10101011
local varReg = self:getVarRegister(block.scope, id, funcDepth, nil);
1011-
if self:isUpvalue(block.scope, id) then -- TODO
1012+
if self:isUpvalue(block.scope, id) then
10121013
scope:addReferenceToHigherScope(self.scope, self.freeUpvalueFunc);
10131014
self:addStatement(self:setRegister(scope, varReg, Ast.FunctionCallExpression(Ast.VariableExpression(self.scope, self.freeUpvalueFunc), {
10141015
self:register(scope, varReg)
@@ -1076,14 +1077,15 @@ function Compiler:compileStatement(statement, funcDepth)
10761077

10771078
for i, id in ipairs(statement.ids) do
10781079
if(exprregs[i]) then
1079-
local varreg = self:getVarRegister(statement.scope, id, funcDepth, exprregs[i]);
10801080
if(self:isUpvalue(statement.scope, id)) then
1081+
local varreg = self:getVarRegister(statement.scope, id, funcDepth);
10811082
local varReg = self:getVarRegister(statement.scope, id, funcDepth, nil);
10821083
scope:addReferenceToHigherScope(self.scope, self.allocUpvalFunction);
10831084
self:addStatement(self:setRegister(scope, varReg, Ast.FunctionCallExpression(Ast.VariableExpression(self.scope, self.allocUpvalFunction), {})), {varReg}, {}, false);
10841085
self:addStatement(self:setUpvalueMember(scope, self:register(scope, varReg), self:register(scope, exprregs[i])), {}, {varReg, exprregs[i]}, true);
10851086
self:freeRegister(exprregs[i], false);
10861087
else
1088+
local varreg = self:getVarRegister(statement.scope, id, funcDepth, exprregs[i]);
10871089
self:addStatement(self:copyRegisters(scope, {varreg}, {exprregs[i]}), {varreg}, {exprregs[i]}, false);
10881090
self:freeRegister(exprregs[i], false);
10891091
end
@@ -1132,8 +1134,8 @@ function Compiler:compileStatement(statement, funcDepth)
11321134
if(statement.kind == AstKind.PassSelfFunctionCallStatement) then
11331135
local baseReg = self:compileExpression(statement.base, funcDepth, 1)[1];
11341136
local tmpReg = self:allocRegister(false);
1135-
local args = {};
1136-
local regs = {};
1137+
local args = { self:register(scope, baseReg) };
1138+
local regs = { baseReg };
11371139

11381140
for i, expr in ipairs(statement.args) do
11391141
if i == #statement.args and (expr.kind == AstKind.FunctionCallExpression or expr.kind == AstKind.PassSelfFunctionCallExpression) then
@@ -1163,14 +1165,17 @@ function Compiler:compileStatement(statement, funcDepth)
11631165

11641166
-- Local Function Declaration
11651167
if(statement.kind == AstKind.LocalFunctionDeclaration) then
1166-
local retReg = self:compileFunction(statement, funcDepth);
1167-
local varReg = self:getVarRegister(statement.scope, statement.id, funcDepth, retReg);
1168+
11681169
if(self:isUpvalue(statement.scope, statement.id)) then
1170+
local varReg = self:getVarRegister(statement.scope, statement.id, funcDepth, nil);
11691171
scope:addReferenceToHigherScope(self.scope, self.allocUpvalFunction);
11701172
self:addStatement(self:setRegister(scope, varReg, Ast.FunctionCallExpression(Ast.VariableExpression(self.scope, self.allocUpvalFunction), {})), {varReg}, {}, false);
1173+
local retReg = self:compileFunction(statement, funcDepth);
11711174
self:addStatement(self:setUpvalueMember(scope, self:register(scope, varReg), self:register(scope, retReg)), {}, {varReg, retReg}, true);
11721175
self:freeRegister(retReg, false);
11731176
else
1177+
local retReg = self:compileFunction(statement, funcDepth);
1178+
local varReg = self:getVarRegister(statement.scope, statement.id, funcDepth, retReg);
11741179
self:addStatement(self:copyRegisters(scope, {varReg}, {retReg}), {varReg}, {retReg}, false);
11751180
self:freeRegister(retReg, false);
11761181
end
@@ -1188,11 +1193,14 @@ function Compiler:compileStatement(statement, funcDepth)
11881193
self:freeRegister(tmpReg, false);
11891194
else
11901195
if self.scopeFunctionDepths[statement.scope] == funcDepth then
1191-
local reg = self:getVarRegister(statement.scope, statement.id, funcDepth, retReg);
11921196
if self:isUpvalue(statement.scope, statement.id) then
1197+
local reg = self:getVarRegister(statement.scope, statement.id, funcDepth);
11931198
self:addStatement(self:setUpvalueMember(scope, self:register(scope, reg), self:register(scope, retReg)), {}, {reg, retReg}, true);
1194-
elseif reg ~= retReg then
1195-
self:addStatement(self:setRegister(scope, reg, self:register(scope, retReg)), {reg}, {retReg}, false);
1199+
else
1200+
local reg = self:getVarRegister(statement.scope, statement.id, funcDepth, retReg);
1201+
if reg ~= retReg then
1202+
self:addStatement(self:setRegister(scope, reg, self:register(scope, retReg)), {reg}, {retReg}, false);
1203+
end
11961204
end
11971205
else
11981206
local upvalId = self:getUpvalueId(statement.scope, statement.id);
@@ -1252,11 +1260,14 @@ function Compiler:compileStatement(statement, funcDepth)
12521260
self:freeRegister(tmpReg, false);
12531261
else
12541262
if self.scopeFunctionDepths[primaryExpr.scope] == funcDepth then
1255-
local reg = self:getVarRegister(primaryExpr.scope, primaryExpr.id, funcDepth, exprregs[i]);
12561263
if self:isUpvalue(primaryExpr.scope, primaryExpr.id) then
1264+
local reg = self:getVarRegister(primaryExpr.scope, primaryExpr.id, funcDepth);
12571265
self:addStatement(self:setUpvalueMember(scope, self:register(scope, reg), self:register(scope, exprregs[i])), {}, {reg, exprregs[i]}, true);
1258-
elseif reg ~= exprregs[i] then
1259-
self:addStatement(self:setRegister(scope, reg, self:register(scope, exprregs[i])), {reg}, {exprregs[i]}, false);
1266+
else
1267+
local reg = self:getVarRegister(primaryExpr.scope, primaryExpr.id, funcDepth, exprregs[i]);
1268+
if reg ~= exprregs[i] then
1269+
self:addStatement(self:setRegister(scope, reg, self:register(scope, exprregs[i])), {reg}, {exprregs[i]}, false);
1270+
end
12601271
end
12611272
else
12621273
local upvalId = self:getUpvalueId(primaryExpr.scope, primaryExpr.id);
@@ -1568,13 +1579,63 @@ function Compiler:compileStatement(statement, funcDepth)
15681579

15691580
-- Break Statement
15701581
if(statement.kind == AstKind.BreakStatement) then
1582+
local toFreeVars = {};
1583+
local statScope;
1584+
repeat
1585+
statScope = statScope and statScope.parentScope or statement.scope;
1586+
for id, name in ipairs(statScope.variables) do
1587+
table.insert(toFreeVars, {
1588+
scope = statScope,
1589+
id = id;
1590+
});
1591+
end
1592+
until statScope == statement.loop.body.scope;
1593+
1594+
for i, var in pairs(toFreeVars) do
1595+
local varScope, id = var.scope, var.id;
1596+
local varReg = self:getVarRegister(varScope, id, nil, nil);
1597+
if self:isUpvalue(varScope, id) then
1598+
scope:addReferenceToHigherScope(self.scope, self.freeUpvalueFunc);
1599+
self:addStatement(self:setRegister(scope, varReg, Ast.FunctionCallExpression(Ast.VariableExpression(self.scope, self.freeUpvalueFunc), {
1600+
self:register(scope, varReg)
1601+
})), {varReg}, {varReg}, false);
1602+
else
1603+
self:addStatement(self:setRegister(scope, varReg, Ast.NilExpression()), {varReg}, {}, false);
1604+
end
1605+
end
1606+
15711607
self:addStatement(self:setPos(scope, statement.loop.__final_block.id), {self.POS_REGISTER}, {}, false);
15721608
self.activeBlock.advanceToNextBlock = false;
15731609
return;
15741610
end
15751611

15761612
-- Contiue Statement
1577-
if(statement.kind == AstKind.BreakStatement) then
1613+
if(statement.kind == AstKind.ContinueStatement) then
1614+
local toFreeVars = {};
1615+
local statScope;
1616+
repeat
1617+
statScope = statScope and statScope.parentScope or statement.scope;
1618+
for id, name in pairs(statScope.variables) do
1619+
table.insert(toFreeVars, {
1620+
scope = statScope,
1621+
id = id;
1622+
});
1623+
end
1624+
until statScope == statement.loop.body.scope;
1625+
1626+
for i, var in ipairs(toFreeVars) do
1627+
local varScope, id = var.scope, var.id;
1628+
local varReg = self:getVarRegister(varScope, id, nil, nil);
1629+
if self:isUpvalue(varScope, id) then
1630+
scope:addReferenceToHigherScope(self.scope, self.freeUpvalueFunc);
1631+
self:addStatement(self:setRegister(scope, varReg, Ast.FunctionCallExpression(Ast.VariableExpression(self.scope, self.freeUpvalueFunc), {
1632+
self:register(scope, varReg)
1633+
})), {varReg}, {varReg}, false);
1634+
else
1635+
self:addStatement(self:setRegister(scope, varReg, Ast.NilExpression()), {varReg}, {}, false);
1636+
end
1637+
end
1638+
15781639
self:addStatement(self:setPos(scope, statement.loop.__start_block.id), {self.POS_REGISTER}, {}, false);
15791640
self.activeBlock.advanceToNextBlock = false;
15801641
return;
@@ -1692,7 +1753,6 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
16921753
end
16931754
local argRegs = {};
16941755

1695-
-- TODO: Function call multi return pass
16961756
for i, expr in ipairs(expression.args) do
16971757
table.insert(argRegs, self:compileExpression(expr, funcDepth, 1)[1]);
16981758
end
@@ -1738,12 +1798,22 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
17381798
retRegs[i] = self:allocRegister(false);
17391799
end
17401800
end
1741-
local argRegs = {};
17421801

1743-
local argRegs = { baseReg };
1802+
local args = { self:register(scope, baseReg) };
1803+
local regs = { baseReg };
17441804

17451805
for i, expr in ipairs(expression.args) do
1746-
table.insert(argRegs, self:compileExpression(expr, funcDepth, 1)[1]);
1806+
if i == #expression.args and (expr.kind == AstKind.FunctionCallExpression or expr.kind == AstKind.PassSelfFunctionCallExpression) then
1807+
local reg = self:compileExpression(expr, funcDepth, self.RETURN_ALL)[1];
1808+
table.insert(args, Ast.FunctionCallExpression(
1809+
self:unpack(scope),
1810+
{self:register(scope, reg)}));
1811+
table.insert(regs, reg);
1812+
else
1813+
local reg = self:compileExpression(expr, funcDepth, 1)[1];
1814+
table.insert(args, self:register(scope, reg));
1815+
table.insert(regs, reg);
1816+
end
17471817
end
17481818

17491819
if(numReturns > 1 or returnAll) then
@@ -1753,9 +1823,9 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
17531823
self:addStatement(self:setRegister(scope, tmpReg, Ast.IndexExpression(self:register(scope, baseReg), self:register(scope, tmpReg))), {tmpReg}, {baseReg, tmpReg}, false);
17541824

17551825
if returnAll then
1756-
self:addStatement(self:setRegister(scope, retRegs[1], Ast.TableConstructorExpression{Ast.TableEntry(Ast.FunctionCallExpression(self:register(scope, tmpReg), self:registerList(scope, argRegs)))}), {retRegs[1]}, {baseReg, unpack(argRegs)}, true);
1826+
self:addStatement(self:setRegister(scope, retRegs[1], Ast.TableConstructorExpression{Ast.TableEntry(Ast.FunctionCallExpression(self:register(scope, tmpReg), args))}), {retRegs[1]}, {baseReg, unpack(regs)}, true);
17571827
else
1758-
self:addStatement(self:setRegister(scope, tmpReg, Ast.TableConstructorExpression{Ast.TableEntry(Ast.FunctionCallExpression(self:register(scope, tmpReg), self:registerList(scope, argRegs)))}), {tmpReg}, {baseReg, unpack(argRegs)}, true);
1828+
self:addStatement(self:setRegister(scope, tmpReg, Ast.TableConstructorExpression{Ast.TableEntry(Ast.FunctionCallExpression(self:register(scope, tmpReg), args))}), {tmpReg}, {baseReg, unpack(regs)}, true);
17591829

17601830
for i, reg in ipairs(retRegs) do
17611831
self:addStatement(self:setRegister(scope, reg, Ast.IndexExpression(self:register(scope, tmpReg), Ast.NumberExpression(i))), {reg}, {tmpReg}, false);
@@ -1769,11 +1839,11 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
17691839
self:addStatement(self:setRegister(scope, tmpReg, Ast.StringExpression(expression.passSelfFunctionName)), {tmpReg}, {}, false);
17701840
self:addStatement(self:setRegister(scope, tmpReg, Ast.IndexExpression(self:register(scope, baseReg), self:register(scope, tmpReg))), {tmpReg}, {baseReg, tmpReg}, false);
17711841

1772-
self:addStatement(self:setRegister(scope, retRegs[1], Ast.FunctionCallExpression(self:register(scope, tmpReg), self:registerList(scope, argRegs))), {retRegs[1]}, {baseReg, unpack(argRegs)}, true);
1842+
self:addStatement(self:setRegister(scope, retRegs[1], Ast.FunctionCallExpression(self:register(scope, tmpReg), args)), {retRegs[1]}, {baseReg, unpack(regs)}, true);
17731843
end
17741844

17751845
self:freeRegister(baseReg, false);
1776-
for i, reg in ipairs(argRegs) do
1846+
for i, reg in ipairs(regs) do
17771847
self:freeRegister(reg, false);
17781848
end
17791849

0 commit comments

Comments
 (0)