Repository navigation
Expand file tree
/
Copy pathvisitor.lua
More file actions
324 lines (286 loc) · 7.9 KB
/
Copy pathvisitor.lua
File metadata and controls
324 lines (286 loc) · 7.9 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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
---@meta
---
---@class refvalue
---指向调试目标的某一个值的引用
---
---
---@alias light-refvalue refvalue | string | number | integer | boolean | nil
---如果需要指向的调试目标的值是一个立即值,则它也是一个立即值,否则是指向它的一个引用
---
---
---@class LuaDebugVisitor
---在调试器VM提供了一套可以访问、修改调试目标的数据以及状态的API。
---
---为了避免对调试目标的影响,luadebug尽可能地不持有调试目标的对象,所以visitor只会记录获取对象的路径,每次当调试器VM需要这个对象时,都会通过路径找到这个对象。由于这种方法和直接持有对象比,比较低效,所以visitor的每个访问API都提供了两个版本,例如getlocal和getlocalv。没有v的访问函数,总是会返回一个userdata,它保存了这个对象路径,每次访问都会遍历路径来找到它。有v的访问函数,如果对象是可以跨VM复制的值,例如number/integer/string/boolean等,那么visitor会将这个值复制到调试器VM,并返回它,如果不能复制,则依然是返回保存了路径的userdata。
---
---如果你只需要访问一些对象,使用v的访问函数就只够了,它会更加高效。只有当你需要修改对象时,才需要用没有v的访问函数。
---
local visitor = {}
---
---@type refvalue
---全局表。等同于_G。
---
visitor._G = nil
---
---@type refvalue
---注册表。等同于debug.getregistry()。
---
visitor._REGISTRY = nil
---
---@param frame integer
---@param index integer
---@return string | nil
---@return refvalue
---局部变量。等同于debug.getlocal(frame, index)。
---
function visitor.getlocal(frame, index)
end
---
---@param frame integer
---@param index integer
---@return string | nil
---@return light-refvalue
---局部变量。等同于debug.getlocal(frame, index)。
---
function visitor.getlocalv(frame, index)
end
---
---@param f refvalue
---@param index integer
---@return string | nil
---@return light-refvalue
---上值。等同于debug.getupvalue(f, index)。
---
function visitor.getupvalue(f, index)
end
---
---@param f refvalue
---@param index integer
---@return string | nil
---@return light-refvalue
---上值。等同于debug.getupvalue(f, index)。
---
function visitor.getupvaluev(f, index)
end
---
---@param value refvalue
---@return refvalue
---元表。等同于debug.getmetatable(value)。
---
function visitor.getmetatable(value)
end
---
---@param value refvalue
---@return light-refvalue
---元表。等同于debug.getmetatable(value)。
---
function visitor.getmetatablev(value)
end
---
---@param ud refvalue
---@param index integer | nil
---@return refvalue
---自定义值。等同于debug.getuservalue(ud, index)。
---
function visitor.getuservalue(ud, index)
end
---
---@param ud refvalue
---@param index integer | nil
---@return light-refvalue
---自定义值。等同于debug.getuservalue(ud, index)。
---
function visitor.getuservaluev(ud, index)
end
---
---@param t any
---@param key string
---@return refvalue
---访问表,key的类型必须是字符串。等同于t[key]。
---
function visitor.field(t, key)
end
---
---@param t any
---@param key string
---@return light-refvalue
---访问表,key的类型必须是字符串。等同于t[key]。
---
function visitor.fieldv(t, key)
end
---
---@param t any
---@param i? integer
---@param j? integer
---@return refvalue
---返回table数组部分的值,从i到j。
---返回值是一个数组,tablearray每两个个值分别为value/value(ref);tablehashv的值为value。
---
function visitor.tablearray(t, i, j)
end
---
---@param t any
---@param i? integer
---@param j? integer
---@return light-refvalue
---返回table数组部分的值,从i到j。
---返回值是一个数组,tablearray每两个个值分别为value/value(ref);tablehashv的值为value。
---
function visitor.tablearrayv(t, i, j)
end
---
---@param t any
---@param i? integer
---@param j? integer
---@return refvalue[]
---返回table哈希部分的值,从i到j。
---返回值是一个数组,tablehash每三个值分别为key/value/value(ref);tablehashv每两个值分别为key/value。
---
function visitor.tablehash(t, i, j)
end
---
---@param t any
---@param i? integer
---@param j? integer
---@return light-refvalue[]
---返回table哈希部分的值,从i到j。
---返回值是一个数组,tablehash每三个值分别为key/value/value(ref);tablehashv每两个值分别为key/value。
---
function visitor.tablehashv(t, i, j)
end
---
---@param t any
---@return integer
---@return integer
---返回table数组部分和哈希部分的长度。
---
function visitor.tablesize(t)
end
---
---@param ud refvalue
---@param offset integer
---@param count integer
---@return string | nil
---读取userdata的内存。
---
function visitor.udread(ud, offset, count)
end
---
---@param ud refvalue
---@param offset integer
---@param data string
---@param allowPartial boolean
---@return integer | boolean
---写入userdata的内存。
---
function visitor.udwrite(ud, offset, data, allowPartial)
end
---
---@param v refvalue | light-refvalue
---@return string
---返回v引用的值的类型,和type(v)略有不同。
--- * 如果type(v)=="number", 则会返回math.type(v),如果调试目标低于5.3则返回"float"。
--- * LUA_TLIGHTUSERDATA会返回"lightuserdata"。
--- * LUA_TNONE会返回"unknown"。
--- * C Function会返回"c function"。
--- * 其余情况返回type(v)。
---
function visitor.type(v)
end
---
---@param v refvalue | light-refvalue
---@return string
---@return string | number | integer | boolean | nil
---复制v引用的值到调试器VM中,如果v引用的值无法复制,则返回一个"lua_topointer(v)"形式的字符串。
---
function visitor.value(v)
end
---
---@param a refvalue | light-refvalue
---@param b refvalue | light-refvalue
---@return boolean
--- 返回a,b引用的值是否相等
---
function visitor.equal(a, b)
end
---
---@param v refvalue | light-refvalue
---@return string
--- 将v引用的值转为string
---
function visitor.tostring(v)
end
---
---@param v refvalue
---@param new light-refvalue
---@return boolean
---赋值new或者newv引用的值到v引用的值,返回是否成功。
---
function visitor.assign(v, new)
end
---
---@param frame integer | refvalue
---@param what string
---@param result table | nil
---@return table
---返回关于一个函数信息的表,如果有result则会将信息填在result中并返回。等同于debug.getinfo(frame, what)。
---
function visitor.getinfo(frame, what, result)
end
---
---@param script string
---@return refvalue
---在调试目标中加载script作为函数,并保存在注册表中。
---
function visitor.load(script)
end
---
---@param f any
---@vararg any
---@return boolean
---@return ...
---执行函数f,如果成功,则第一个返回值是true,随后会将f返回值保存在注册表中并其引用。如果失败,则返回false和错误原因。
---
function visitor.watch(f, ...)
end
---
---@param f any
---@vararg any
---@return boolean
---@return string | number | integer | boolean | nil
---执行函数f,如果成功,则第一个返回值是true,随后会将f的第一个返回值调用`visitor.value`并返回。如果失败,则返回false和错误原因。
---
function visitor.eval(f, ...)
end
---
---清除所有visitor.watch生成的引用。
---
function visitor.cleanwatch()
end
---
---@param co refvalue
---@return string
---co不是thread返回"invalid",否则返回coroutine.status(co)。
---
function visitor.costatus(co)
end
---
---@return integer
---等价于`collectgarbage "count"`。
---
function visitor.gccount()
end
---@class visitor.cfunctioninfo
---@field tostring string
---@field file_name string
---@field function_name string
---@field module_name string
---@field line_number string
---
---尝试将C function的转换成具体的符号
---@param fun refvalue
---@return visitor.cfunctioninfo?
---
function visitor.cfunctioninfo(fun)
end
return visitor