-- Secro macro runtime __SECRO_NATIVE = function(source, captures) local env = {} local mt = {} mt.__index = function(_, key) local c = captures[key] if c then return c[1]() end return _G[key] end mt.__newindex = function(_, key, value) local c = captures[key] if c and c[2] then return c[2](value) end rawset(env, key, value) end setmetatable(env, mt) local chunk, err = loadstring("return " .. source, "=secro_native") if not chunk then error(err) end local fn = chunk() if setfenv then setfenv(fn, env) end return fn end local function __SECRO_ID(value) return value end local function __SECRO_ATTR() end SECRO_OBFUSCATED = true LPH_OBFUSCATED = true SECRO_NO_VIRTUALIZE = __SECRO_ID LPH_NO_VIRTUALIZE = __SECRO_ID SECRO_VIRTUALIZE = __SECRO_ID LPH_VIRTUALIZE = __SECRO_ID SECRO_ENCSTR = __SECRO_ID LPH_ENCSTR = __SECRO_ID SECRO_ENCNUM = __SECRO_ID LPH_ENCNUM = __SECRO_ID SECRO_STRENC = __SECRO_ID LPH_STRENC = __SECRO_ID SECRO_NUMENC = __SECRO_ID LPH_NUMENC = __SECRO_ID SECRO_ENCBUF = function(value) if buffer and buffer.fromstring then return buffer.fromstring(value) end return value end LPH_ENCBUF = SECRO_ENCBUF SECRO_BUFENC = SECRO_ENCBUF LPH_BUFENC = SECRO_ENCBUF SECRO_CRASH = function() end LPH_CRASH = SECRO_CRASH SECRO_PRECHECK = function(check) if check then check() end end LPH_PRECHECK = SECRO_PRECHECK SECRO_REWRITE = __SECRO_ID LPH_REWRITE = __SECRO_ID SECRO_ASSUME = __SECRO_ID LPH_ASSUME = __SECRO_ID SECRO_OPAQUE = __SECRO_ID LPH_OPAQUE = __SECRO_ID SECRO_ATTRIBUTES = __SECRO_ATTR LPH_ATTRIBUTES = __SECRO_ATTR SECRO_VM = __SECRO_ATTR LPH_VM = __SECRO_ATTR SECRO_PRESET = __SECRO_ATTR LPH_PRESET = __SECRO_ATTR SECRO_OPTIMIZE = __SECRO_ATTR LPH_OPTIMIZE = __SECRO_ATTR SECRO_NO_UPVALUES = __SECRO_ATTR LPH_NO_UPVALUES = __SECRO_ATTR SECRO_ERROR_HANDLING = __SECRO_ATTR LPH_ERROR_HANDLING = __SECRO_ATTR SECRO_UNSAFE_ENVIRONMENT = __SECRO_ATTR LPH_UNSAFE_ENVIRONMENT = __SECRO_ATTR SECRO_UNROLL = __SECRO_ATTR LPH_UNROLL = __SECRO_ATTR SECRO_INLINE = __SECRO_ATTR LPH_INLINE = __SECRO_ATTR SECRO_TRANSFORM = __SECRO_ATTR LPH_TRANSFORM = __SECRO_ATTR SECRO_NONE = "NONE" SECRO_OPAL = "OPAL" SECRO_ONYX = "ONYX" SECRO_FAST = "FAST" SECRO_BALANCED = "BALANCED" SECRO_SECURE = "SECURE" SECRO_EXTRACT = "EXTRACT" SECRO_CONTROL_FLOW = "CONTROL_FLOW" SECRO_REWRITE_NAMECALLS = "REWRITE_NAMECALLS" SECRO_GLOBALS = "GLOBALS" SECRO_CONSTANTS = "CONSTANTS" LPH_NONE = SECRO_NONE LPH_OPAL = SECRO_OPAL LPH_ONYX = SECRO_ONYX LPH_FAST = SECRO_FAST LPH_BALANCED = SECRO_BALANCED LPH_SECURE = SECRO_SECURE LPH_EXTRACT = SECRO_EXTRACT LPH_CONTROL_FLOW = SECRO_CONTROL_FLOW LPH_REWRITE_NAMECALLS = SECRO_REWRITE_NAMECALLS LPH_GLOBALS = SECRO_GLOBALS LPH_CONSTANTS = SECRO_CONSTANTS local function __SECRO_STACKALLOC(size, base) base = base or 1 local allocation = {__size = size, __base = base, __end = base + size - 1} return setmetatable(allocation, { __index = function(self, key) if key == "__len" then return self.__size end if key == "clear" then return function(s, first, last) first, last = first or s.__base, last or s.__end for i = first, last do s[i] = nil end end end if key == "unpack" then return function(s, first, last) first, last = first or s.__base, last or s.__end return table.unpack(s, first, last) end end if key == "pack" then return function(s, first, last) first, last = first or s.__base, last or s.__end return table.pack and table.pack(table.unpack(s, first, last)) or {table.unpack(s, first, last)} end end end, }) end SECRO_STACKALLOC = __SECRO_STACKALLOC LPH_STACKALLOC = __SECRO_STACKALLOC local x=2 local f=__SECRO_NATIVE("function(a)\n local g=__SECRO_NATIVE(\"function() return x+a end\",{[\"__SECRO_NATIVE\"]={function() return __SECRO_NATIVE end,function(__secro_value) __SECRO_NATIVE=__secro_value end},[\"a\"]={function() return a end,function(__secro_value) a=__secro_value end},[\"x\"]={function() return x end,function(__secro_value) x=__secro_value end}})\n return g()\nend",{["SECRO_NO_VIRTUALIZE"]={function() return SECRO_NO_VIRTUALIZE end,function(__secro_value) SECRO_NO_VIRTUALIZE=__secro_value end},["__SECRO_NATIVE"]={function() return __SECRO_NATIVE end,function(__secro_value) __SECRO_NATIVE=__secro_value end},["a"]={function() return a end,function(__secro_value) a=__secro_value end},["g"]={function() return g end,function(__secro_value) g=__secro_value end},["x"]={function() return x end,function(__secro_value) x=__secro_value end}}) print("NESTED", f(5))