1+ -- This Script is Part of the Prometheus Obfuscator by levno-710
2+ --
3+ -- if_else.lua
4+ --
5+ -- This Script contains the statement handler for the IfElseExpression.
6+
7+ local Ast = require (" prometheus.ast" );
8+
9+ return function (self , expression , funcDepth , numReturns )
10+ local scope = self .activeBlock .scope ;
11+ local posState = self .registers [self .POS_REGISTER ];
12+ self .registers [self .POS_REGISTER ] = self .VAR_REGISTER ;
13+
14+ local regs = {};
15+ for i = 1 , numReturns do
16+ regs [i ] = self :allocRegister ();
17+ if i ~= 1 then
18+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {}, false );
19+ end
20+ end
21+
22+ local resReg = regs [1 ];
23+ local tmpReg ;
24+
25+ if posState then
26+ tmpReg = self :allocRegister (false );
27+ self :addStatement (self :copyRegisters (scope , {tmpReg }, {self .POS_REGISTER }), {tmpReg }, {self .POS_REGISTER }, false );
28+ end
29+
30+ local conditionReg = self :compileExpression (expression .condition , funcDepth , 1 )[1 ];
31+
32+ local finalBlock = self :createBlock ();
33+ local nextBlock = self :createBlock ();
34+ local innerBlock = self :createBlock ();
35+
36+ 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 );
37+ self :freeRegister (conditionReg , false );
38+
39+ self :setActiveBlock (innerBlock );
40+ scope = innerBlock .scope ;
41+
42+ local trueReg = self :compileExpression (expression .true_value , funcDepth , 1 )[1 ];
43+ self :addStatement (self :copyRegisters (scope , {resReg }, {trueReg }), {resReg }, {trueReg }, false );
44+ self :addStatement (self :setRegister (scope , self .POS_REGISTER , Ast .NumberExpression (finalBlock .id )), {self .POS_REGISTER }, {}, false );
45+
46+ for _ , elif in ipairs (expression .elseifs ) do
47+ self :setActiveBlock (nextBlock );
48+ conditionReg = self :compileExpression (elif .condition , funcDepth , 1 )[1 ];
49+ local elifBlock = self :createBlock ();
50+ nextBlock = self :createBlock ();
51+ local elifScope = self .activeBlock .scope ;
52+
53+ 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 );
54+ self :freeRegister (conditionReg , false );
55+
56+ self :setActiveBlock (elifBlock );
57+ elifScope = elifBlock .scope ;
58+ local valueReg = self :compileExpression (elif .value , funcDepth , 1 )[1 ];
59+ self :addStatement (self :copyRegisters (elifScope , {resReg }, {valueReg }), {resReg }, {valueReg }, false );
60+ self :addStatement (self :setRegister (elifScope , self .POS_REGISTER , Ast .NumberExpression (finalBlock .id )), {self .POS_REGISTER }, {}, false );
61+ end
62+
63+ self :setActiveBlock (nextBlock );
64+ scope = self .activeBlock .scope ;
65+ local falseReg = self :compileExpression (expression .false_value , funcDepth , 1 )[1 ];
66+ self :addStatement (self :copyRegisters (scope , {resReg }, {falseReg }), {resReg }, {falseReg }, false );
67+ self :addStatement (self :setRegister (scope , self .POS_REGISTER , Ast .NumberExpression (finalBlock .id )), {self .POS_REGISTER }, {}, false );
68+
69+ self .registers [self .POS_REGISTER ] = posState ;
70+
71+ self :setActiveBlock (finalBlock );
72+ scope = finalBlock .scope ;
73+
74+ if tmpReg then
75+ self :addStatement (self :copyRegisters (scope , {self .POS_REGISTER }, {tmpReg }), {self .POS_REGISTER }, {tmpReg }, false );
76+ self :freeRegister (tmpReg , false );
77+ end
78+
79+ return regs ;
80+ end
0 commit comments