-
Notifications
You must be signed in to change notification settings - Fork 196
Expand file tree
/
Copy pathor.lua
More file actions
69 lines (55 loc) · 2.61 KB
/
or.lua
File metadata and controls
69 lines (55 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
-- 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;