Skip to content

Commit

Permalink
重写rdebug.value
Browse files Browse the repository at this point in the history
  • Loading branch information
actboy168 committed Apr 5, 2024
1 parent acb8cd0 commit 1cb16ab
Show file tree
Hide file tree
Showing 6 changed files with 344 additions and 191 deletions.
42 changes: 30 additions & 12 deletions docs/luadebug/visitor.lua
Original file line number Diff line number Diff line change
Expand Up @@ -201,32 +201,50 @@ 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引用的值无法复制,则返回一个"type: lua_topointer(v)"形式的字符串。
---复制v引用的值到调试器VM中,如果v引用的值无法复制,则返回一个"lua_topointer(v)"形式的字符串。
---
function visitor.value(v)
end

---
---@param v refvalue
---@param new light-refvalue
---@param a refvalue | light-refvalue
---@param b refvalue | light-refvalue
---@return boolean
---赋值new或者newv引用的值到v引用的值,返回是否成功。
--- 返回a,b引用的值是否相等
---
function visitor.assign(v, new)
function visitor.equal(a, b)
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)。
--- 将v引用的值转为string
---
function visitor.type(v)
function visitor.tostring(v)
end

---
---@param v refvalue
---@param new light-refvalue
---@return boolean
---赋值new或者newv引用的值到v引用的值,返回是否成功。
---
function visitor.assign(v, new)
end

---
Expand Down
14 changes: 6 additions & 8 deletions extension/script/backend/worker.lua
Original file line number Diff line number Diff line change
Expand Up @@ -707,8 +707,8 @@ local ERREVENT_ERRMEM <const> = 0x04
local ERREVENT_ERRERR <const> = 0x05
local ERREVENT_PANIC <const> = 0x10

local function GlobalFunction(name)
return rdebug.value(rdebug.fieldv(rdebug._G, name))
local function GlobalFunction(func, name)
return rdebug.fieldv(rdebug._G, name)
end

local function getExceptionType(errcode, skip)
Expand All @@ -718,11 +718,10 @@ local function getExceptionType(errcode, skip)
if info.what ~= 'C' then
return "runtime"
end
local raisefunc = rdebug.value(info.func)
if raisefunc == GlobalFunction "assert" then
if rdebug.eqaul(info.func, GlobalFunction "assert") then
return "assert"
end
if raisefunc == GlobalFunction "error" then
if rdebug.eqaul(info.func, GlobalFunction "error") then
return "error"
end
end
Expand Down Expand Up @@ -752,11 +751,10 @@ local function getExceptionCaught(errcode, skip)
if level >= 100 then
return 'native'
end
local f = rdebug.value(info.func)
if f == pcall then
if rdebug.eqaul(info.func, pcall) then
return 'lua'
end
if f == xpcall then
if rdebug.eqaul(info.func, xpcall) then
return 'lua'
end
level = level + 1
Expand Down
23 changes: 11 additions & 12 deletions extension/script/backend/worker/serialize.lua
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,7 @@ local function putKey(k)
puts("]")
end

local function putTable(t)
local uniquekey = rdebug.value(t)
local function putTable(t, uniquekey)
if visited[uniquekey] then
puts('<table>')
elseif level >= DEPTH then
Expand Down Expand Up @@ -124,17 +123,17 @@ local function putTable(t)
end

function putValue(v)
local tv = rdebug.type(v)
if tv == 'string' then
puts(("%q"):format(rdebug.value(v)))
elseif tv == 'float' then
puts(floatToString(rdebug.value(v)))
elseif tv == 'integer' or tv == 'boolean' or tv == 'nil' then
puts(tostring(rdebug.value(v)))
elseif tv == 'table' then
putTable(v)
local type, value = rdebug.value(v)
if type == 'string' then
puts(("%q"):format(value))
elseif type == 'float' then
puts(floatToString(value))
elseif type == 'integer' or value == 'boolean' or value == 'nil' then
puts(tostring(value))
elseif type == 'table' then
putTable(v, value)
else
puts('<'..tv..'>')
puts('<'..type..'>')
end
end

Expand Down
18 changes: 8 additions & 10 deletions extension/script/backend/worker/traceback.lua
Original file line number Diff line number Diff line change
Expand Up @@ -69,17 +69,16 @@ local function findfield(t, f, level)
local loct = rdebug.tablehashv(t, 0, 5000)
for i = 1, #loct, 2 do
local key, value = loct[i], loct[i + 1]
if rdebug.type(key) == 'string' then
local skey = rdebug.value(key)
if not (level == 2 and skey == '_G') then
local tvalue = rdebug.type(value)
if (tvalue == 'function' or tvalue == 'c function') and rdebug.value(value) == f then
return skey
local key_type, key_value = rdebug.value(key)
if key_type == 'string' then
if not (level == 2 and key_value == '_G') then
if rdebug.equal(value, f) then
return key_value
end
if tvalue == 'table' then
if rdebug.type(value) == 'table' then
local res = findfield(value, f, level - 1)
if res then
return skey..'.'..res
return key_value..'.'..res
end
end
end
Expand All @@ -88,7 +87,6 @@ local function findfield(t, f, level)
end

local function pushglobalfuncname(f)
f = rdebug.value(f)
if f ~= nil then
return findfield(rdebug._G, f, 2)
end
Expand Down Expand Up @@ -136,7 +134,7 @@ local function findfirstlua(message)
end

local function replacewhere(flags, error)
local errormessage = tostring(rdebug.value(error))
local errormessage = rdebug.tostring(error)
if flags[1] == "syntax" then
return findfirstlua(errormessage)
end
Expand Down
Loading

0 comments on commit 1cb16ab

Please sign in to comment.