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/4] =?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/4] =?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 = {} From 69bc72e5d35877d05df51c60bcada082fd87940b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Thu, 3 Sep 2026 14:54:37 +0800 Subject: [PATCH 3/4] =?UTF-8?q?review=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=88=A0?= =?UTF-8?q?=E9=99=A4eval.dump=E7=9A=845.2=20compat=E5=88=86=E6=94=AF?= =?UTF-8?q?=EF=BC=88undump=E4=B8=8D=E6=94=AF=E6=8C=81=EF=BC=89=EF=BC=9Bpca?= =?UTF-8?q?ll=E4=BF=9D=E6=8A=A4=E4=BB=85=E9=99=90=E7=9B=AE=E6=A0=87VM?= =?UTF-8?q?=E7=9A=84dump=E4=BA=A7=E7=89=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extension/script/backend/worker/eval.lua | 20 ++------------ extension/script/backend/worker/parser.lua | 32 +++++++++++++--------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/extension/script/backend/worker/eval.lua b/extension/script/backend/worker/eval.lua index 27eab9d85..fe6eb8d0d 100644 --- a/extension/script/backend/worker/eval.lua +++ b/extension/script/backend/worker/eval.lua @@ -43,23 +43,9 @@ local function generate(name, init) end generate("dump", function() - if luaver.LUAVERSION <= 52 then - local compat_dump = assert(load(readfile 'backend.worker.eval.dump')) - return function(content) - local ok, res, err = pcall(compat_dump, content) - if ok and res ~= nil then - return true, res - end - 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')) - return function(content) - return rdebug.eval(eval_dump, content, 0) - end + local eval_dump = assert(rdebug.load(readfile 'backend.worker.eval.dump')) + return function(content) + return rdebug.eval(eval_dump, content, 0) end end) diff --git a/extension/script/backend/worker/parser.lua b/extension/script/backend/worker/parser.lua index 94548c3d6..cd874dad3 100644 --- a/extension/script/backend/worker/parser.lua +++ b/extension/script/backend/worker/parser.lua @@ -96,25 +96,31 @@ end return function (content, syntaxCompatibility) local err local bin + local cl, v if syntaxCompatibility then bin, err = dumpTarget(content) + if not bin then + local log = require 'common.log' + log.error("ERROR:"..(err or "unknown error")) + return + end + local ok + ok, cl, v = pcall(undump, bin) + if not ok then + local log = require 'common.log' + log.error("ERROR:"..tostring(cl)) + return + end else local f f, err = load(content) - if f then - bin = string.dump(f) + if not f then + local log = require 'common.log' + log.error("ERROR:"..(err or "unknown error")) + return end - end - if not bin then - local log = require 'common.log' - log.error("ERROR:"..(err or "unknown error")) - return - end - local ok, cl, v = pcall(undump, bin) - if not ok then - local log = require 'common.log' - log.error("ERROR:"..tostring(cl)) - return + bin = string.dump(f) + cl, v = undump(bin) end version = v local si = { activelines = {}, definelines = {} } From c500357a67b994daa972a256632d8bc60e299208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Thu, 3 Sep 2026 21:41:24 +0800 Subject: [PATCH 4/4] =?UTF-8?q?review=E4=BF=AE=E5=A4=8D=EF=BC=9A=E7=A7=BB?= =?UTF-8?q?=E9=99=A4eval.dump=E5=A4=9A=E4=BD=99=E7=9A=84=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E4=B8=AA=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extension/script/backend/worker/eval.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/script/backend/worker/eval.lua b/extension/script/backend/worker/eval.lua index fe6eb8d0d..043ddd34f 100644 --- a/extension/script/backend/worker/eval.lua +++ b/extension/script/backend/worker/eval.lua @@ -45,7 +45,7 @@ end generate("dump", function() local eval_dump = assert(rdebug.load(readfile 'backend.worker.eval.dump')) return function(content) - return rdebug.eval(eval_dump, content, 0) + return rdebug.eval(eval_dump, content) end end)