-- This Script is Part of the Prometheus Obfuscator by levno-710 -- -- if_else.lua -- -- This Script contains the statement handler for the IfElseExpression. local Ast = require("prometheus.ast"); return function(self, expression, funcDepth, numReturns) local scope = self.activeBlock.scope; 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 finalBlock = self:createBlock(); local nextBlock = self:createBlock(); local innerBlock = self:createBlock(); self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.OrExpression(Ast.AndExpression(self:register(scope, conditionReg), Ast.NumberExpression(innerBlock.id)), Ast.NumberExpression(nextBlock.id))), {self.POS_REGISTER}, {conditionReg}, false); self:freeRegister(conditionReg, false); self:setActiveBlock(innerBlock); scope = innerBlock.scope; local trueReg = self:compileExpression(expression.true_value, funcDepth, 1)[1]; self:addStatement(self:copyRegisters(scope, {resReg}, {trueReg}), {resReg}, {trueReg}, false); self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.NumberExpression(finalBlock.id)), {self.POS_REGISTER}, {}, false); for _, elif in ipairs(expression.elseifs) do self:setActiveBlock(nextBlock); conditionReg = self:compileExpression(elif.condition, funcDepth, 1)[1]; local elifBlock = self:createBlock(); nextBlock = self:createBlock(); local elifScope = self.activeBlock.scope; self:addStatement(self:setRegister(elifScope, self.POS_REGISTER, Ast.OrExpression(Ast.AndExpression(self:register(elifScope, conditionReg), Ast.NumberExpression(elifBlock.id)), Ast.NumberExpression(nextBlock.id))), {self.POS_REGISTER}, {conditionReg}, false); self:freeRegister(conditionReg, false); self:setActiveBlock(elifBlock); elifScope = elifBlock.scope; local valueReg = self:compileExpression(elif.value, funcDepth, 1)[1]; self:addStatement(self:copyRegisters(elifScope, {resReg}, {valueReg}), {resReg}, {valueReg}, false); self:addStatement(self:setRegister(elifScope, self.POS_REGISTER, Ast.NumberExpression(finalBlock.id)), {self.POS_REGISTER}, {}, false); end self:setActiveBlock(nextBlock); scope = self.activeBlock.scope; local falseReg = self:compileExpression(expression.false_value, funcDepth, 1)[1]; self:addStatement(self:copyRegisters(scope, {resReg}, {falseReg}), {resReg}, {falseReg}, false); self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.NumberExpression(finalBlock.id)), {self.POS_REGISTER}, {}, false); 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