Skip to content

Commit f2ce462

Browse files
committed
Add if expression support to the compiler
1 parent c8f13f6 commit f2ce462

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

src/prometheus/compiler/compiler.lua

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2359,6 +2359,64 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
23592359
return regs;
23602360
end
23612361

2362+
if(expression.kind == AstKind.IfElseExpression) then
2363+
local posState = self.registers[self.POS_REGISTER];
2364+
self.registers[self.POS_REGISTER] = self.VAR_REGISTER;
2365+
2366+
local regs = {};
2367+
for i=1, numReturns do
2368+
regs[i] = self:allocRegister();
2369+
if(i ~= 1) then
2370+
self:addStatement(self:setRegister(scope, regs[i], Ast.NilExpression()), {regs[i]}, {}, false);
2371+
end
2372+
end
2373+
2374+
local resReg = regs[1];
2375+
local tmpReg;
2376+
2377+
if posState then
2378+
tmpReg = self:allocRegister(false);
2379+
self:addStatement(self:copyRegisters(scope, {tmpReg}, {self.POS_REGISTER}), {tmpReg}, {self.POS_REGISTER}, false);
2380+
end
2381+
2382+
local conditionReg = self:compileExpression(expression.condition, funcDepth, 1)[1];
2383+
2384+
local trueBlock, falseBlock, finalBlock = self:createBlock(), self:createBlock(), self:createBlock();
2385+
2386+
self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.OrExpression(Ast.AndExpression(self:register(scope, conditionReg), Ast.NumberExpression(trueBlock.id)), Ast.NumberExpression(falseBlock.id))), {self.POS_REGISTER}, {conditionReg}, false);
2387+
self:freeRegister(conditionReg, false);
2388+
2389+
do
2390+
self:setActiveBlock(trueBlock);
2391+
local scope = trueBlock.scope;
2392+
local trueReg = self:compileExpression(expression.true_value, funcDepth, 1)[1];
2393+
self:addStatement(self:copyRegisters(scope, {resReg}, {trueReg}), {resReg}, {trueReg}, false);
2394+
self:freeRegister(trueReg, false);
2395+
self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.NumberExpression(finalBlock.id)), {self.POS_REGISTER}, {}, false);
2396+
end
2397+
2398+
do
2399+
self:setActiveBlock(falseBlock);
2400+
local scope = falseBlock.scope;
2401+
local falseReg = self:compileExpression(expression.false_value, funcDepth, 1)[1];
2402+
self:addStatement(self:copyRegisters(scope, {resReg}, {falseReg}), {resReg}, {falseReg}, false);
2403+
self:freeRegister(falseReg, false);
2404+
self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.NumberExpression(finalBlock.id)), {self.POS_REGISTER}, {}, false);
2405+
end
2406+
2407+
self.registers[self.POS_REGISTER] = posState;
2408+
2409+
self:setActiveBlock(finalBlock);
2410+
scope = finalBlock.scope;
2411+
2412+
if tmpReg then
2413+
self:addStatement(self:copyRegisters(scope, {self.POS_REGISTER}, {tmpReg}), {self.POS_REGISTER}, {tmpReg}, false);
2414+
self:freeRegister(tmpReg, false);
2415+
end
2416+
2417+
return regs;
2418+
end
2419+
23622420
logger:error(string.format("%s is not an compliable expression!", expression.kind));
23632421
end
23642422

src/prometheus/visitast.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,8 @@ function visitExpression(expression, previsit, postvisit, data)
237237
end
238238
if(expression.kind == AstKind.IfElseExpression) then
239239
expression.condition = visitExpression(expression.condition, previsit, postvisit, data);
240-
expression.true_expr = visitExpression(expression.true_expr, previsit, postvisit, data);
241-
expression.false_expr = visitExpression(expression.false_expr, previsit, postvisit, data);
240+
expression.true_value = visitExpression(expression.true_value, previsit, postvisit, data);
241+
expression.false_value = visitExpression(expression.false_value, previsit, postvisit, data);
242242
end
243243

244244
if(type(postvisit) == "function") then

0 commit comments

Comments
 (0)