-- 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;