|
1 | | -type debug_getinfo = { |
2 | | - name = string, |
3 | | - namewhat = string, |
| 1 | +local type DebugHookCallback = function=(event: "call" | "return" | "tail call" | "count" | "line", line: number | nil)>(nil) |
| 2 | +local type DebugHookMask = "c" | "r" | "l" | "cr" | "cl" | "rl" | "crl" |
| 3 | +local type LineNumber = -1 .. inf |
| 4 | +type DebugGetInfo = { |
| 5 | + name = string | nil, |
| 6 | + namewhat = "global" | "local" | "method" | "field" | "upvalue" | "", |
4 | 7 | source = string, |
5 | 8 | short_src = string, |
6 | | - linedefined = number, |
7 | | - lastlinedefined = number, |
8 | | - what = string, |
9 | | - currentline = number, |
| 9 | + linedefined = LineNumber, |
| 10 | + lastlinedefined = LineNumber, |
| 11 | + what = "Lua" | "C" | "main" | "tail", |
| 12 | + currentline = LineNumber, |
10 | 13 | istailcall = boolean, |
11 | | - nups = number, |
12 | | - nparams = number, |
| 14 | + nups = 0 .. inf, |
| 15 | + nparams = 0 .. inf, |
13 | 16 | isvararg = boolean, |
14 | | - func = any, |
15 | | - activelines = {[number] = boolean}, |
| 17 | + func = AnyFunction | nil, |
| 18 | + activelines = {[LineNumber] = boolean} | nil, |
16 | 19 | } |
| 20 | +-- Main debug library interface |
17 | 21 | type debug = { |
18 | | - sethook = function=(thread: thread, hook: empty_function, mask: string, count: number)>(nil) | function=(thread: thread, hook: empty_function, mask: string)>(nil) | function=(hook: empty_function, mask: string)>(nil), |
19 | | - getregistry = function=()>(nil), |
20 | | - traceback = function=(thread: thread, message: any, level: number)>(string) | function=(thread: thread, message: any)>(string) | function=(thread: thread)>(string) | function=()>(string), |
21 | | - setlocal = function=(thread: thread, level: number, local_: number, value: any)>(string | nil) | function=(level: number, local_: number, value: any)>(string | nil), |
22 | | - getinfo = function=(thread: thread, f: empty_function | number, what: nil | string)>(debug_getinfo | nil) | function=(thread: thread, f: empty_function | number, what: nil | string)>(debug_getinfo | nil) | function=(f: empty_function | number, what: nil | string)>(debug_getinfo | nil), |
23 | | - upvalueid = function=(f: empty_function, n: number)>(userdata), |
24 | | - setupvalue = function=(f: empty_function, up: number, value: any)>(string | nil), |
25 | | - getlocal = function=(thread: thread, f: number | empty_function, local_: number)>(string | nil, any) | function=(f: number | empty_function, local_: number)>(string | nil, any), |
26 | | - upvaluejoin = function=(f1: empty_function, n1: number, f2: empty_function, n2: number)>(nil), |
27 | | - getupvalue = function=(f: empty_function, up: number)>(string | nil, any), |
28 | | - getmetatable = function=(value: any)>(Table | nil), |
29 | | - setmetatable = function=(value: any, Table: Table | nil)>(any), |
30 | | - gethook = function=(thread: thread)>(empty_function, string, number) | function=()>(empty_function, string, number), |
31 | | - getuservalue = function=(u: userdata)>(Table | nil), |
32 | 22 | debug = function=()>(nil), |
33 | | - getfenv = function=(o: any)>(Table), |
34 | | - setfenv = function=(object: any, Table: Table)>(any), |
35 | | - setuservalue = function=(udata: userdata, value: Table | nil)>(userdata), |
| 23 | + gethook = function=()>((DebugHookCallback | nil, DebugHookMask | nil, number | nil)), |
| 24 | + sethook = function=(hook: DebugHookCallback | nil, mask: DebugHookMask | nil, count: number | nil)>(nil), |
| 25 | + getinfo = function=(f: AnyFunction | 1 .. inf, what: $"^[nSltufL]+$" | nil)>(DebugGetInfo | nil), |
| 26 | + getlocal = function=(level: 1 .. inf | Function, local_idx: 1 .. inf)>((string, any) | (nil)), |
| 27 | + setlocal = function=(level: 1 .. inf | Function, local_idx: 1 .. inf, value: any)>(string | nil), |
| 28 | + getmetatable = function=(value: any)>(AnyTable | nil), |
| 29 | + setmetatable = function=(value: any, metatable: AnyTable | nil)>(any), |
| 30 | + getregistry = function=()>(AnyTable), |
| 31 | + getupvalue = function=(f: AnyFunction, up_idx: 1 .. inf)>((string, any) | (nil)), |
| 32 | + setupvalue = function=(f: AnyFunction, up_idx: 1 .. inf, value: any)>(), |
| 33 | + upvalueid = function=(f: AnyFunction, n: 1 .. inf)>(userdata), |
| 34 | + upvaluejoin = function=(f1: AnyFunction, n1: 1 .. inf, f2: AnyFunction, n2: 1 .. inf)>(nil), |
| 35 | + getuservalue = function=(u: userdata)>(any), |
| 36 | + setuservalue = function=(udata: userdata, value: any)>(userdata), |
| 37 | + traceback = function=(message: any | nil, level: 1 .. inf | nil)>(string), |
36 | 38 | } |
37 | | -type debug.getfenv = getfenv |
38 | | -type debug.setfenv = setfenv |
| 39 | + |
| 40 | +analyzer function debug.setfenv(val: Function, table: Table) |
| 41 | + if val and (val:IsLiteral() or val.Type == "function") then |
| 42 | + if val.Type == "number" then |
| 43 | + analyzer:SetEnvironmentOverride(analyzer.environment_nodes[val:GetData()], table, "runtime") |
| 44 | + elseif val:GetFunctionBodyNode() then |
| 45 | + analyzer:SetEnvironmentOverride(val:GetFunctionBodyNode(), table, "runtime") |
| 46 | + end |
| 47 | + end |
| 48 | +end |
| 49 | + |
| 50 | +analyzer function debug.getfenv(func: Function | nil) |
| 51 | + if not func then return analyzer:GetDefaultEnvironment("typesystem") end |
| 52 | + |
| 53 | + return analyzer:GetGlobalEnvironmentOverride(func:GetFunctionBodyNode() or func, "runtime") |
| 54 | +end |
| 55 | + |
| 56 | +type getfenv = debug.getfenv |
| 57 | +type setfenv = debug.setfenv |
0 commit comments