Skip to content

Commit 080163a

Browse files
authored
fix: debug.traceback of loadstring get unknown file #1259 (#1260)
* fix: debug.traceback of loadstring get unknown file #1259 * fix the linter errors * add a test: loadstring sourceMapTraceback gives traceback * better test for loadstring sourceMapTraceback gives traceback
1 parent ffcca57 commit 080163a

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

src/lualib/SourceMapTraceBack.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,23 @@ export function __TS__SourceMapTraceBack(this: void, fileName: string, sourceMap
4343
let [result] = string.gsub(trace, "(%S+)%.lua:(%d+)", (file, line) =>
4444
replacer(`${file}.lua`, `${file}.ts`, line)
4545
);
46-
[result] = string.gsub(result, '(%[string "[^"]+"%]):(%d+)', (file, line) =>
47-
replacer(file, "unknown", line)
48-
);
46+
47+
const stringReplacer = (file: string, line: string) => {
48+
const fileSourceMap: SourceMap = globalThis.__TS__sourcemap[file];
49+
if (fileSourceMap && fileSourceMap[line]) {
50+
const chunkName = string.match(file, '%[string "([^"]+)"%]')[0];
51+
const [sourceName] = string.gsub(chunkName, ".lua$", ".ts");
52+
const data = fileSourceMap[line];
53+
if (typeof data === "number") {
54+
return `${sourceName}:${data}`;
55+
}
56+
57+
return `${data.file}:${data.line}`;
58+
}
59+
60+
return `${file}:${line}`;
61+
};
62+
[result] = string.gsub(result, '(%[string "[^"]+"%]):(%d+)', (file, line) => stringReplacer(file, line));
4963

5064
return result;
5165
}) as typeof debug.traceback;

test/unit/printer/sourcemaps.spec.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { SourceMapConsumer } from "source-map";
22
import * as tstl from "../../../src";
3+
import { LuaTarget, transpileString } from "../../../src";
34
import { couldNotResolveRequire } from "../../../src/transpilation/diagnostics";
45
import * as util from "../../util";
56
import { lineAndColumnOf } from "./utils";
@@ -326,3 +327,24 @@ test("Inline sourcemaps", () => {
326327
const inlineSourceMap = Buffer.from(inlineSourceMapMatch, "base64").toString();
327328
expect(inlineSourceMap).toBe(file.luaSourceMap);
328329
});
330+
331+
test("loadstring sourceMapTraceback gives traceback", () => {
332+
const loadStrCode = transpileString(
333+
`function bar() {
334+
const trace = (debug.traceback as (this: void)=>string)();
335+
return trace;
336+
}
337+
return bar();`,
338+
{ sourceMapTraceback: true, luaTarget: LuaTarget.Lua51 }
339+
).file?.lua;
340+
341+
const builder = util.testModule`
342+
const luaCode = \`${loadStrCode}\`;
343+
return loadstring(luaCode, "foo.lua")();
344+
`
345+
.setTsHeader("declare function loadstring(this: void, string: string, chunkname: string): () => unknown")
346+
.setOptions({ sourceMapTraceback: true, luaTarget: LuaTarget.Lua51 });
347+
348+
const traceback = builder.getLuaExecutionResult();
349+
expect(traceback).toContain("foo.ts");
350+
});

0 commit comments

Comments
 (0)