Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions src/prometheus/compiler/compiler.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2359,6 +2359,64 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
return regs;
end

if(expression.kind == AstKind.IfElseExpression) then
local posState = self.registers[self.POS_REGISTER];
self.registers[self.POS_REGISTER] = self.VAR_REGISTER;

local regs = {};
for i=1, numReturns do
regs[i] = self:allocRegister();
if(i ~= 1) then
self:addStatement(self:setRegister(scope, regs[i], Ast.NilExpression()), {regs[i]}, {}, false);
end
end

local resReg = regs[1];
local tmpReg;

if posState then
tmpReg = self:allocRegister(false);
self:addStatement(self:copyRegisters(scope, {tmpReg}, {self.POS_REGISTER}), {tmpReg}, {self.POS_REGISTER}, false);
end

local conditionReg = self:compileExpression(expression.condition, funcDepth, 1)[1];

local trueBlock, falseBlock, finalBlock = self:createBlock(), self:createBlock(), self:createBlock();

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);
self:freeRegister(conditionReg, false);

do
self:setActiveBlock(trueBlock);
local scope = trueBlock.scope;
local trueReg = self:compileExpression(expression.true_value, funcDepth, 1)[1];
self:addStatement(self:copyRegisters(scope, {resReg}, {trueReg}), {resReg}, {trueReg}, false);
self:freeRegister(trueReg, false);
self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.NumberExpression(finalBlock.id)), {self.POS_REGISTER}, {}, false);
end

do
self:setActiveBlock(falseBlock);
local scope = falseBlock.scope;
local falseReg = self:compileExpression(expression.false_value, funcDepth, 1)[1];
self:addStatement(self:copyRegisters(scope, {resReg}, {falseReg}), {resReg}, {falseReg}, false);
self:freeRegister(falseReg, false);
self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.NumberExpression(finalBlock.id)), {self.POS_REGISTER}, {}, false);
end

self.registers[self.POS_REGISTER] = posState;

self:setActiveBlock(finalBlock);
scope = finalBlock.scope;

if tmpReg then
self:addStatement(self:copyRegisters(scope, {self.POS_REGISTER}, {tmpReg}), {self.POS_REGISTER}, {tmpReg}, false);
self:freeRegister(tmpReg, false);
end

return regs;
end

logger:error(string.format("%s is not an compliable expression!", expression.kind));
end

Expand Down
4 changes: 2 additions & 2 deletions src/prometheus/visitast.lua
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,8 @@ function visitExpression(expression, previsit, postvisit, data)
end
if(expression.kind == AstKind.IfElseExpression) then
expression.condition = visitExpression(expression.condition, previsit, postvisit, data);
expression.true_expr = visitExpression(expression.true_expr, previsit, postvisit, data);
expression.false_expr = visitExpression(expression.false_expr, previsit, postvisit, data);
expression.true_value = visitExpression(expression.true_value, previsit, postvisit, data);
expression.false_value = visitExpression(expression.false_value, previsit, postvisit, data);
end

if(type(postvisit) == "function") then
Expand Down