Skip to content

Commit 6ef1338

Browse files
committed
Preserve renamed Lua callback targets
1 parent 1c8e627 commit 6ef1338

2 files changed

Lines changed: 41 additions & 5 deletions

File tree

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/lua/translation/LuaTranslator.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -406,14 +406,23 @@ LuaFunction callbackAdapterFor(ImFunction target) {
406406
callbackAdapters.put(target, adapter);
407407

408408
LuaFunction errorHandler = callbackErrorHandler();
409-
String xpcall = "xpcall(" + targetLua.getName() + ", " + errorHandler.getName() + ", ...)";
409+
LuaExprFunctionCallByName xpcall = LuaAst.LuaExprFunctionCallByName("xpcall",
410+
LuaAst.LuaExprlist(
411+
LuaAst.LuaExprFuncRef(targetLua),
412+
LuaAst.LuaExprFuncRef(errorHandler),
413+
LuaAst.LuaExprVarAccess(dots.copy())));
410414
if (target.getReturnType() instanceof ImVoid) {
411-
adapter.getBody().add(LuaAst.LuaLiteral(xpcall));
415+
adapter.getBody().add(xpcall);
412416
} else {
413417
// Keep exactly the first callback result. Returning select(2, xpcall(...)) directly
414418
// could leak additional Lua return values into a surrounding argument list.
415-
adapter.getBody().add(LuaAst.LuaLiteral("local _, result = " + xpcall));
416-
adapter.getBody().add(LuaAst.LuaLiteral("return result"));
419+
LuaVariable ignored = LuaAst.LuaVariable("_", LuaAst.LuaNoExpr());
420+
LuaVariable result = LuaAst.LuaVariable("result", LuaAst.LuaNoExpr());
421+
adapter.getBody().add(ignored);
422+
adapter.getBody().add(result);
423+
adapter.getBody().add(LuaAst.LuaAssignment(
424+
LuaAst.LuaLiteral("_, result"), xpcall));
425+
adapter.getBody().add(LuaAst.LuaReturn(LuaAst.LuaExprVarAccess(result)));
417426
}
418427
luaModel.add(adapter);
419428
return adapter;

de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/LuaTranslationTests.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2523,11 +2523,38 @@ public void luaFunctionRefsReuseOneAdapterAndPreserveSingleReturn() {
25232523
assertEquals("both Condition calls must reference the cached adapter", 2,
25242524
countMatches(compiled, "Condition\\(" + Pattern.quote(adapter) + "\\)"));
25252525
String adapterBody = getFunctionBody(compiled, adapter);
2526-
assertTrue(adapterBody.contains("local _, result = xpcall(predicate,"));
2526+
assertTrue(adapterBody.contains("_, result = xpcall(predicate,"));
25272527
assertTrue(adapterBody.contains("return result"));
25282528
assertFalse("callback sites must not allocate anonymous wrappers", compiled.contains("Condition(function ("));
25292529
}
25302530

2531+
@Test
2532+
public void luaFunctionRefAdapterTracksLateClassFunctionRename() {
2533+
String compiled = compileLuaWithCUs(
2534+
"LuaTranslationTests_luaFunctionRefAdapterTracksLateClassFunctionRename",
2535+
false,
2536+
Collections.emptyList(),
2537+
new RunArgs().with("-lua"),
2538+
"package Test",
2539+
"@extern native consume(code callback)",
2540+
"@extern native CallbackOwner_staticCallback()",
2541+
"class CallbackOwner",
2542+
" function start()",
2543+
" consume(function staticCallback)",
2544+
" private static function staticCallback()",
2545+
" consume(function staticCallback)",
2546+
"init",
2547+
" CallbackOwner_staticCallback()",
2548+
" new CallbackOwner().start()"
2549+
);
2550+
2551+
String callbackName = singleMatch(compiled,
2552+
"function\\s+(CallbackOwner_[A-Za-z0-9_]*staticCallback[A-Za-z0-9_]*)\\(\\)", 1);
2553+
assertTrue("adapter must track the class callback's final name:\n" + compiled,
2554+
compiled.contains("xpcall(" + callbackName + ","));
2555+
assertFalse(compiled.contains("xpcall(staticCallback,"));
2556+
}
2557+
25312558
@Test
25322559
public void luaFunctionRefStacktraceHandlerUsesWurstStackPosition() throws IOException {
25332560
CU errorHandling = new CU("ErrorHandling.wurst", String.join("\n",

0 commit comments

Comments
 (0)