-- This Script is Part of the Prometheus Obfuscator by levno-710 -- -- or.lua -- -- This Script contains the expression handler for the OrExpression. 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 lhsReg = self:compileExpression(expression.lhs, funcDepth, 1)[1]; if expression.rhs.isConstant then local rhsReg = self:compileExpression(expression.rhs, funcDepth, 1)[1]; self:addStatement(self:setRegister(scope, resReg, Ast.OrExpression(self:register(scope, lhsReg), self:register(scope, rhsReg))), {resReg}, {lhsReg, rhsReg}, false); if tmpReg then self:freeRegister(tmpReg, false); end self:freeRegister(lhsReg, false); self:freeRegister(rhsReg, false); return regs; end local block1, block2 = self:createBlock(), self:createBlock(); self:addStatement(self:copyRegisters(scope, {resReg}, {lhsReg}), {resReg}, {lhsReg}, false); self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.OrExpression(Ast.AndExpression(self:register(scope, lhsReg), Ast.NumberExpression(block2.id)), Ast.NumberExpression(block1.id))), {self.POS_REGISTER}, {lhsReg}, false); self:freeRegister(lhsReg, false); do self:setActiveBlock(block1); local scope = block1.scope; local rhsReg = self:compileExpression(expression.rhs, funcDepth, 1)[1]; self:addStatement(self:copyRegisters(scope, {resReg}, {rhsReg}), {resReg}, {rhsReg}, false); self:freeRegister(rhsReg, false); self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.NumberExpression(block2.id)), {self.POS_REGISTER}, {}, false); end self.registers[self.POS_REGISTER] = posState; self:setActiveBlock(block2); scope = block2.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;