-- This Script is Part of the Prometheus Obfuscator by levno-710 -- -- if_statement.lua -- -- This Script contains the statement handler for the IfStatement. local Ast = require("prometheus.ast"); return function(self, statement, funcDepth) local scope = self.activeBlock.scope; local conditionReg = self:compileExpression(statement.condition, funcDepth, 1)[1]; local finalBlock = self:createBlock(); local nextBlock if statement.elsebody or #statement.elseifs > 0 then nextBlock = self:createBlock(); else nextBlock = finalBlock; end 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 self:compileBlock(statement.body, funcDepth); self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.NumberExpression(finalBlock.id)), {self.POS_REGISTER}, {}, false); for i, eif in ipairs(statement.elseifs) do self:setActiveBlock(nextBlock); conditionReg = self:compileExpression(eif.condition, funcDepth, 1)[1]; local innerBlock = self:createBlock(); if statement.elsebody or i < #statement.elseifs then nextBlock = self:createBlock(); else nextBlock = finalBlock; end local scope = self.activeBlock.scope; 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; self:compileBlock(eif.body, funcDepth); self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.NumberExpression(finalBlock.id)), {self.POS_REGISTER}, {}, false); end if statement.elsebody then self:setActiveBlock(nextBlock); self:compileBlock(statement.elsebody, funcDepth); self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.NumberExpression(finalBlock.id)), {self.POS_REGISTER}, {}, false); end self:setActiveBlock(finalBlock); end;