From 0614f9e96044e3abdb73bb4655ae4dbbc5b09395 Mon Sep 17 00:00:00 2001 From: Frotty Date: Mon, 23 Feb 2026 15:35:21 +0100 Subject: [PATCH 1/3] Restore stackframes after function bridges --- .../imtranslation/StackTraceInjector2.java | 20 +++++++-- .../tests/wurstscript/tests/BugTests.java | 45 +++++++++++++++++++ 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/StackTraceInjector2.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/StackTraceInjector2.java index 8df4773e3..4491b4146 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/StackTraceInjector2.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/StackTraceInjector2.java @@ -380,14 +380,22 @@ private void rewriteFuncRefs(final List funcRefs, Set ImVar traceLimit = JassIm.ImVar(trace, TypesHelper.imInt(), "stacktraceLimit", false); f.getLocals().add(traceLimit); ImStmts stmts = JassIm.ImStmts(); - stmts.add(JassIm.ImSet(trace, JassIm.ImVarAccess(traceStr), JassIm.ImStringVal(""))); + stmts.add(JassIm.ImSet(trace, JassIm.ImVarAccess(traceStr), JassIm.ImStringVal(" Stacktrace:"))); stmts.add(JassIm.ImSet(trace, JassIm.ImVarAccess(traceI), JassIm.ImVarAccess(stackSize))); stmts.add(JassIm.ImSet(trace, JassIm.ImVarAccess(traceLimit), JassIm.ImIntVal(0))); ImStmts loopBody = JassIm.ImStmts(); @@ -447,6 +455,12 @@ private void rewriteErrorStatements(final Multimap JassIm.ImOperatorCall(WurstOperator.PLUS, JassIm.ImExprs(JassIm.ImStringVal("\n "), JassIm.ImVarArrayAccess(trace, stack, JassIm.ImExprs(JassIm.ImVarAccess(traceI))))))))); + // Make empty traces explicit instead of returning an empty string. + stmts.add(JassIm.ImIf(trace, JassIm.ImOperatorCall(WurstOperator.EQ, + JassIm.ImExprs(JassIm.ImVarAccess(traceStr), JassIm.ImStringVal("Stacktrace:"))), + JassIm.ImStmts(JassIm.ImSet(trace, JassIm.ImVarAccess(traceStr), JassIm.ImStringVal("Stacktrace: "))), + JassIm.ImStmts())); + s.replaceBy(JassIm.ImStatementExpr(stmts, JassIm.ImVarAccess(traceStr))); } } diff --git a/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/BugTests.java b/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/BugTests.java index d7b869f3d..2f7e32c3c 100644 --- a/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/BugTests.java +++ b/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/BugTests.java @@ -1,5 +1,7 @@ package tests.wurstscript.tests; +import com.google.common.base.Charsets; +import com.google.common.io.Files; import de.peeeq.wurstio.jassinterpreter.InterpreterException; import de.peeeq.wurstscript.ast.ClassDef; import de.peeeq.wurstscript.ast.FuncDef; @@ -1070,6 +1072,18 @@ public void testStacktrace() { " if foo(bar(1), bar(2))", " testSuccess()" ); + + try { + String jass = Files.toString( + new File(TEST_OUTPUT_PATH + "BugTests_testStacktrace_stacktraceinlopt.j"), + Charsets.UTF_8 + ); + Assert.assertTrue(jass.contains("wurst_stack_depth")); + Assert.assertTrue(jass.contains("wurst_stack")); + Assert.assertFalse(jass.contains("return \"\"")); + } catch (IOException e) { + throw new RuntimeException(e); + } } @Test @@ -1450,6 +1464,37 @@ public void executeFuncWithStackTrace() { ); } + @Test + public void executeFuncBridgeRestoresStackDepth() { + test().executeProg(false).executeTests(false).lines( + "package Test", + "@extern native ExecuteFunc(string f)", + "function getStackTraceString() returns string", + " return \"\"", + "function foo()", + " getStackTraceString()", + "function caller()", + " getStackTraceString()", + " ExecuteFunc(\"foo\")", + " getStackTraceString()", + "init", + " caller()" + ); + + try { + String jass = Files.toString( + new File(TEST_OUTPUT_PATH + "BugTests_executeFuncBridgeRestoresStackDepth_stacktraceinlopt.j"), + Charsets.UTF_8 + ); + Assert.assertTrue(jass.contains("function bridge_foo")); + Assert.assertTrue(jass.contains("bridge_oldStackDepth")); + Assert.assertTrue(jass.contains("set wurst_stack_depth = 0")); + Assert.assertTrue(jass.contains("set wurst_stack_depth = bridge_oldStackDepth")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + @Test public void agentTypeComparisonsWurst() { testAssertErrorsLinesWithStdLib(true, "Cannot compare types sound with rect", From 01e1fd994bb8d26395abba415772953cbb47332f Mon Sep 17 00:00:00 2001 From: Frotty Date: Mon, 23 Feb 2026 15:45:46 +0100 Subject: [PATCH 2/3] Update StackTraceInjector2.java --- .../translation/imtranslation/StackTraceInjector2.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/StackTraceInjector2.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/StackTraceInjector2.java index 4491b4146..092fb6d01 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/StackTraceInjector2.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/StackTraceInjector2.java @@ -457,8 +457,8 @@ private void rewriteErrorStatements(final Multimap // Make empty traces explicit instead of returning an empty string. stmts.add(JassIm.ImIf(trace, JassIm.ImOperatorCall(WurstOperator.EQ, - JassIm.ImExprs(JassIm.ImVarAccess(traceStr), JassIm.ImStringVal("Stacktrace:"))), - JassIm.ImStmts(JassIm.ImSet(trace, JassIm.ImVarAccess(traceStr), JassIm.ImStringVal("Stacktrace: "))), + JassIm.ImExprs(JassIm.ImVarAccess(traceStr), JassIm.ImStringVal(" Stacktrace:"))), + JassIm.ImStmts(JassIm.ImSet(trace, JassIm.ImVarAccess(traceStr), JassIm.ImStringVal(" Stacktrace: "))), JassIm.ImStmts())); s.replaceBy(JassIm.ImStatementExpr(stmts, JassIm.ImVarAccess(traceStr))); From 7df65ffafd5e69ce8b7fda0441b02121d458f4a2 Mon Sep 17 00:00:00 2001 From: Frotty Date: Mon, 23 Feb 2026 16:58:42 +0100 Subject: [PATCH 3/3] fix --- .../translation/imtranslation/StackTraceInjector2.java | 9 +-------- .../test/java/tests/wurstscript/tests/BugTests.java | 10 +++++----- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/StackTraceInjector2.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/StackTraceInjector2.java index 092fb6d01..47a695cac 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/StackTraceInjector2.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/StackTraceInjector2.java @@ -380,21 +380,14 @@ private void rewriteFuncRefs(final List funcRefs, Set