@@ -380,14 +380,22 @@ private void rewriteFuncRefs(final List<ImFuncRefOrCall> funcRefs, Set<ImFunctio
380380 ImExprs args = JassIm .ImExprs (str );
381381 ImStmts body = bridgeFunc .getBody ();
382382 de .peeeq .wurstscript .ast .Element trace = frTrace ;
383+ ImVar savedStackDepth = JassIm .ImVar (trace , TypesHelper .imInt (), "bridge_oldStackDepth" , false );
384+ bridgeFunc .getLocals ().add (savedStackDepth );
385+ body .add (JassIm .ImSet (trace , JassIm .ImVarAccess (savedStackDepth ), JassIm .ImVarAccess (stackSize )));
383386 // reset stack and add information for callback:
384387 body .add (JassIm .ImSet (trace , JassIm .ImVarAccess (stackSize ), JassIm .ImIntVal (0 )));
385388
386389 ImFunctionCall call = JassIm .ImFunctionCall (frTrace , f , JassIm .ImTypeArguments (), args , true , CallType .NORMAL );
387390 if (bridgeFunc .getReturnType () instanceof ImVoid ) {
388- stmt = call ;
391+ body .add (call );
392+ stmt = JassIm .ImSet (trace , JassIm .ImVarAccess (stackSize ), JassIm .ImVarAccess (savedStackDepth ));
389393 } else {
390- stmt = JassIm .ImReturn (frTrace , call );
394+ ImVar bridgeReturn = JassIm .ImVar (trace , bridgeFunc .getReturnType ().copy (), "bridge_return" , false );
395+ bridgeFunc .getLocals ().add (bridgeReturn );
396+ body .add (JassIm .ImSet (trace , JassIm .ImVarAccess (bridgeReturn ), call ));
397+ body .add (JassIm .ImSet (trace , JassIm .ImVarAccess (stackSize ), JassIm .ImVarAccess (savedStackDepth )));
398+ stmt = JassIm .ImReturn (frTrace , JassIm .ImVarAccess (bridgeReturn ));
391399 }
392400 body .add (stmt );
393401
@@ -426,7 +434,7 @@ private void rewriteErrorStatements(final Multimap<ImFunction, ImGetStackTrace>
426434 ImVar traceLimit = JassIm .ImVar (trace , TypesHelper .imInt (), "stacktraceLimit" , false );
427435 f .getLocals ().add (traceLimit );
428436 ImStmts stmts = JassIm .ImStmts ();
429- stmts .add (JassIm .ImSet (trace , JassIm .ImVarAccess (traceStr ), JassIm .ImStringVal ("" )));
437+ stmts .add (JassIm .ImSet (trace , JassIm .ImVarAccess (traceStr ), JassIm .ImStringVal (" Stacktrace: " )));
430438 stmts .add (JassIm .ImSet (trace , JassIm .ImVarAccess (traceI ), JassIm .ImVarAccess (stackSize )));
431439 stmts .add (JassIm .ImSet (trace , JassIm .ImVarAccess (traceLimit ), JassIm .ImIntVal (0 )));
432440 ImStmts loopBody = JassIm .ImStmts ();
@@ -447,6 +455,12 @@ private void rewriteErrorStatements(final Multimap<ImFunction, ImGetStackTrace>
447455 JassIm .ImOperatorCall (WurstOperator .PLUS , JassIm .ImExprs (JassIm .ImStringVal ("\n " ),
448456 JassIm .ImVarArrayAccess (trace , stack , JassIm .ImExprs (JassIm .ImVarAccess (traceI )))))))));
449457
458+ // Make empty traces explicit instead of returning an empty string.
459+ stmts .add (JassIm .ImIf (trace , JassIm .ImOperatorCall (WurstOperator .EQ ,
460+ JassIm .ImExprs (JassIm .ImVarAccess (traceStr ), JassIm .ImStringVal ("Stacktrace:" ))),
461+ JassIm .ImStmts (JassIm .ImSet (trace , JassIm .ImVarAccess (traceStr ), JassIm .ImStringVal ("Stacktrace: <none>" ))),
462+ JassIm .ImStmts ()));
463+
450464 s .replaceBy (JassIm .ImStatementExpr (stmts , JassIm .ImVarAccess (traceStr )));
451465 }
452466 }
0 commit comments