From ba6a508abd603ffccd8bb0ff514845528ee9faf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Wed, 2 Sep 2026 15:46:21 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=81=A2=E5=A4=8Deval.dump=EF=BC=9A?= =?UTF-8?q?=E6=96=B0=E5=A2=9EsyntaxCompatibility=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B9=E6=98=BE=E5=BC=8F=E6=8C=87=E5=AE=9A=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E7=9B=AE=E6=A0=87=E8=A7=A3=E9=87=8A=E5=99=A8?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=EF=BC=9B=E4=BF=AE=E5=A4=8Dundump55=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E7=BC=93=E5=AD=98=E6=9C=AA=E9=87=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compile/common/package_json.lua | 5 ++++ extension/package.nls.json | 1 + .../script/backend/worker/breakpoint.lua | 12 ++++++-- extension/script/backend/worker/eval.lua | 18 ++++++++++++ extension/script/backend/worker/eval/dump.lua | 6 ++++ extension/script/backend/worker/parser.lua | 28 +++++++++++++++---- extension/script/backend/worker/undump.lua | 1 + 7 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 extension/script/backend/worker/eval/dump.lua diff --git a/compile/common/package_json.lua b/compile/common/package_json.lua index eba919b73..9b0fd9929 100644 --- a/compile/common/package_json.lua +++ b/compile/common/package_json.lua @@ -164,6 +164,11 @@ attributes.common = { markdownDescription = "%lua.debug.launch.luaVersion.description%", type = "string", }, + syntaxCompatibility = { + default = false, + markdownDescription = "%lua.debug.launch.syntaxCompatibility.description%", + type = "boolean", + }, outputCapture = { default = { }, diff --git a/extension/package.nls.json b/extension/package.nls.json index 663631afb..4aae0b9fb 100644 --- a/extension/package.nls.json +++ b/extension/package.nls.json @@ -4,6 +4,7 @@ "lua.debug.launch.console.integratedTerminal.description": "VS Code integrated terminal.", "lua.debug.launch.console.externalTerminal.description": "External terminal that can be configured in user settings.", "lua.debug.launch.luaVersion.description": "Default lua version.", + "lua.debug.launch.syntaxCompatibility.description": "Use the target Lua VM to parse source syntax for breakpoint line information.", "lua.debug.launch.luaArch.description": "Default lua arch.", "lua.debug.launch.sourceCoding.description": "Source encoding.", "lua.debug.launch.path.description": "Search path for Lua programs", diff --git a/extension/script/backend/worker/breakpoint.lua b/extension/script/backend/worker/breakpoint.lua index a80750df8..b515cfd46 100644 --- a/extension/script/backend/worker/breakpoint.lua +++ b/extension/script/backend/worker/breakpoint.lua @@ -15,6 +15,11 @@ local protosById = {} -- {["{ld}_{lld}_{srcId}"] = proto} local waitinstbp = {} -- {[funcId] = {[pc] = bp}} local m = {} local enable = false +local syntaxCompatibility = false + +ev.on('initializing', function(config) + syntaxCompatibility = config.syntaxCompatibility == true +end) local function updateHook() local hasInstBp = next(instbreakpoints) ~= nil or next(waitinstbp) ~= nil @@ -211,7 +216,7 @@ function m.find(src, currentline) end local function parserInlineLineinfo(src) - local old = parser(src.content) + local old = parser(src.content, syntaxCompatibility) if not old then return end @@ -241,9 +246,9 @@ local function calcLineInfo(src, content) if src.content then src.lineinfo = parserInlineLineinfo(src) elseif content then - src.lineinfo = parser(content) + src.lineinfo = parser(content, syntaxCompatibility) elseif src.sourceReference then - src.lineinfo = parser(source.getCode(src.sourceReference)) + src.lineinfo = parser(source.getCode(src.sourceReference), syntaxCompatibility) end end return src.lineinfo @@ -531,6 +536,7 @@ ev.on('terminated', function() waitinstbp = {} info = {} enable = false + syntaxCompatibility = false hookmgr.break_open(false) if hookmgr.instbreak_open then hookmgr.instbreak_open(false) diff --git a/extension/script/backend/worker/eval.lua b/extension/script/backend/worker/eval.lua index cea4e9e80..4416b6ac3 100644 --- a/extension/script/backend/worker/eval.lua +++ b/extension/script/backend/worker/eval.lua @@ -42,6 +42,24 @@ local function generate(name, init) end end +generate("dump", function() + if luaver.LUAVERSION <= 52 then + local compat_dump = assert(load(readfile 'backend.worker.eval.dump')) + return function(content) + local res, err = compat_dump(content) + if res then + return true, res + end + return false, err + end + else + local eval_dump = assert(rdebug.load(readfile 'backend.worker.eval.dump')) + return function(content) + return rdebug.eval(eval_dump, content, 0) + end + end +end) + generate("ffi_reflect", function () if not luaver.isjit then return diff --git a/extension/script/backend/worker/eval/dump.lua b/extension/script/backend/worker/eval/dump.lua new file mode 100644 index 000000000..2e165ddb7 --- /dev/null +++ b/extension/script/backend/worker/eval/dump.lua @@ -0,0 +1,6 @@ +local content = ... +local f = load(content, "=eval.dump") +if not f then + return +end +return string.dump(f) diff --git a/extension/script/backend/worker/parser.lua b/extension/script/backend/worker/parser.lua index 491de0680..c82739c6f 100644 --- a/extension/script/backend/worker/parser.lua +++ b/extension/script/backend/worker/parser.lua @@ -84,14 +84,32 @@ local function normalize(lineinfo, si) end end -return function (content) - local f, err = load(content) - if not f then +local function dumpTarget(content) + local eval = require 'backend.worker.eval' + local ok, bin = eval.dump(content) + if ok and type(bin) == "string" then + return bin + end + return nil, type(bin) == "string" and bin or "can not dump function." +end + +return function (content, syntaxCompatibility) + local err + local bin + if syntaxCompatibility then + bin, err = dumpTarget(content) + else + local f + f, err = load(content) + if f then + bin = string.dump(f) + end + end + if not bin then local log = require 'common.log' - log.error("ERROR:"..err) + log.error("ERROR:"..(err or "unknown error")) return end - local bin = string.dump(f) local cl, v = undump(bin) version = v local si = { activelines = {}, definelines = {} } diff --git a/extension/script/backend/worker/undump.lua b/extension/script/backend/worker/undump.lua index 94e7915ae..b86b1f87c 100644 --- a/extension/script/backend/worker/undump.lua +++ b/extension/script/backend/worker/undump.lua @@ -528,6 +528,7 @@ local undump55; do end function undump55(cl) + cached = {} CheckHeader() cl.nupvalues = LoadByte() cl.f = {} From eba327f6bbb500452a24596567d79b72510daeb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Wed, 2 Sep 2026 16:29:16 +0800 Subject: [PATCH 2/2] =?UTF-8?q?review=E4=BF=AE=E5=A4=8D=EF=BC=9Aeval.dump?= =?UTF-8?q?=E6=8A=9B=E5=87=BA=E7=9C=9F=E5=AE=9E=E8=AF=AD=E6=B3=95=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=B9=B6pcall=E4=BF=9D=E6=8A=A4compat=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=EF=BC=9Bundump=E5=A4=B1=E8=B4=A5=E6=97=B6=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E9=99=8D=E7=BA=A7=EF=BC=9Bnls=E6=B3=A8=E6=98=8E?= =?UTF-8?q?=E9=80=82=E7=94=A8=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extension/package.nls.json | 2 +- extension/script/backend/worker/eval.lua | 9 ++++++--- extension/script/backend/worker/eval/dump.lua | 4 ++-- extension/script/backend/worker/parser.lua | 7 ++++++- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/extension/package.nls.json b/extension/package.nls.json index 4aae0b9fb..3d6c6a101 100644 --- a/extension/package.nls.json +++ b/extension/package.nls.json @@ -4,7 +4,7 @@ "lua.debug.launch.console.integratedTerminal.description": "VS Code integrated terminal.", "lua.debug.launch.console.externalTerminal.description": "External terminal that can be configured in user settings.", "lua.debug.launch.luaVersion.description": "Default lua version.", - "lua.debug.launch.syntaxCompatibility.description": "Use the target Lua VM to parse source syntax for breakpoint line information.", + "lua.debug.launch.syntaxCompatibility.description": "Use the target Lua VM to parse source syntax for breakpoint line information. Note: only takes effect for Lua 5.3+ targets and requires a compatible bytecode format.", "lua.debug.launch.luaArch.description": "Default lua arch.", "lua.debug.launch.sourceCoding.description": "Source encoding.", "lua.debug.launch.path.description": "Search path for Lua programs", diff --git a/extension/script/backend/worker/eval.lua b/extension/script/backend/worker/eval.lua index 4416b6ac3..27eab9d85 100644 --- a/extension/script/backend/worker/eval.lua +++ b/extension/script/backend/worker/eval.lua @@ -46,11 +46,14 @@ generate("dump", function() if luaver.LUAVERSION <= 52 then local compat_dump = assert(load(readfile 'backend.worker.eval.dump')) return function(content) - local res, err = compat_dump(content) - if res then + local ok, res, err = pcall(compat_dump, content) + if ok and res ~= nil then return true, res end - return false, err + if ok then + return false, 'can not dump function.' + end + return false, res end else local eval_dump = assert(rdebug.load(readfile 'backend.worker.eval.dump')) diff --git a/extension/script/backend/worker/eval/dump.lua b/extension/script/backend/worker/eval/dump.lua index 2e165ddb7..57963aa23 100644 --- a/extension/script/backend/worker/eval/dump.lua +++ b/extension/script/backend/worker/eval/dump.lua @@ -1,6 +1,6 @@ local content = ... -local f = load(content, "=eval.dump") +local f, err = load(content, "=eval.dump") if not f then - return + error(err, 0) end return string.dump(f) diff --git a/extension/script/backend/worker/parser.lua b/extension/script/backend/worker/parser.lua index c82739c6f..94548c3d6 100644 --- a/extension/script/backend/worker/parser.lua +++ b/extension/script/backend/worker/parser.lua @@ -110,7 +110,12 @@ return function (content, syntaxCompatibility) log.error("ERROR:"..(err or "unknown error")) return end - local cl, v = undump(bin) + local ok, cl, v = pcall(undump, bin) + if not ok then + local log = require 'common.log' + log.error("ERROR:"..tostring(cl)) + return + end version = v local si = { activelines = {}, definelines = {} } local lineinfo = {}