-
Notifications
You must be signed in to change notification settings - Fork 196
Expand file tree
/
Copy pathfunction_declaration.lua
More file actions
83 lines (77 loc) · 4.63 KB
/
function_declaration.lua
File metadata and controls
83 lines (77 loc) · 4.63 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
70
71
72
73
74
75
76
77
78
79
80
81
82
-- This Script is Part of the Prometheus Obfuscator by levno-710
--
-- function_declaration.lua
--
-- This Script contains the statement handler for the FunctionDeclaration.
local Ast = require("prometheus.ast");
return function(self, statement, funcDepth)
local scope = self.activeBlock.scope;
local retReg = self:compileFunction(statement, funcDepth);
if(#statement.indices > 0) then
local tblReg;
if statement.scope.isGlobal then
tblReg = self:allocRegister(false);
self:addStatement(self:setRegister(scope, tblReg, Ast.StringExpression(statement.scope:getVariableName(statement.id))), {tblReg}, {}, false);
self:addStatement(self:setRegister(scope, tblReg, Ast.IndexExpression(self:env(scope), self:register(scope, tblReg))), {tblReg}, {tblReg}, true);
else
if self.scopeFunctionDepths[statement.scope] == funcDepth then
if self:isUpvalue(statement.scope, statement.id) then
tblReg = self:allocRegister(false);
local reg = self:getVarRegister(statement.scope, statement.id, funcDepth);
self:addStatement(self:setRegister(scope, tblReg, self:getUpvalueMember(scope, self:register(scope, reg))), {tblReg}, {reg}, true);
else
tblReg = self:getVarRegister(statement.scope, statement.id, funcDepth, retReg);
end
else
tblReg = self:allocRegister(false);
local upvalId = self:getUpvalueId(statement.scope, statement.id);
scope:addReferenceToHigherScope(self.containerFuncScope, self.currentUpvaluesVar);
self:addStatement(self:setRegister(scope, tblReg, self:getUpvalueMember(scope, Ast.IndexExpression(Ast.VariableExpression(self.containerFuncScope, self.currentUpvaluesVar), Ast.NumberExpression(upvalId)))), {tblReg}, {}, true);
end
end
for i = 1, #statement.indices - 1 do
local index = statement.indices[i];
local indexReg = self:compileExpression(Ast.StringExpression(index), funcDepth, 1)[1];
local tblRegOld = tblReg;
tblReg = self:allocRegister(false);
self:addStatement(self:setRegister(scope, tblReg, Ast.IndexExpression(self:register(scope, tblRegOld), self:register(scope, indexReg))), {tblReg}, {tblReg, indexReg}, false);
self:freeRegister(tblRegOld, false);
self:freeRegister(indexReg, false);
end
local index = statement.indices[#statement.indices];
local indexReg = self:compileExpression(Ast.StringExpression(index), funcDepth, 1)[1];
self:addStatement(Ast.AssignmentStatement({
Ast.AssignmentIndexing(self:register(scope, tblReg), self:register(scope, indexReg)),
}, {
self:register(scope, retReg),
}), {}, {tblReg, indexReg, retReg}, true);
self:freeRegister(indexReg, false);
self:freeRegister(tblReg, false);
self:freeRegister(retReg, false);
return;
end
if statement.scope.isGlobal then
local tmpReg = self:allocRegister(false);
self:addStatement(self:setRegister(scope, tmpReg, Ast.StringExpression(statement.scope:getVariableName(statement.id))), {tmpReg}, {}, false);
self:addStatement(Ast.AssignmentStatement({Ast.AssignmentIndexing(self:env(scope), self:register(scope, tmpReg))},
{self:register(scope, retReg)}), {}, {tmpReg, retReg}, true);
self:freeRegister(tmpReg, false);
else
if self.scopeFunctionDepths[statement.scope] == funcDepth then
if self:isUpvalue(statement.scope, statement.id) then
local reg = self:getVarRegister(statement.scope, statement.id, funcDepth);
self:addStatement(self:setUpvalueMember(scope, self:register(scope, reg), self:register(scope, retReg)), {}, {reg, retReg}, true);
else
local reg = self:getVarRegister(statement.scope, statement.id, funcDepth, retReg);
if reg ~= retReg then
self:addStatement(self:setRegister(scope, reg, self:register(scope, retReg)), {reg}, {retReg}, false);
end
end
else
local upvalId = self:getUpvalueId(statement.scope, statement.id);
scope:addReferenceToHigherScope(self.containerFuncScope, self.currentUpvaluesVar);
self:addStatement(self:setUpvalueMember(scope, Ast.IndexExpression(Ast.VariableExpression(self.containerFuncScope, self.currentUpvaluesVar), Ast.NumberExpression(upvalId)), self:register(scope, retReg)), {}, {retReg}, true);
end
end
self:freeRegister(retReg, false);
end;