Skip to content

Commit a6ad825

Browse files
committed
fixes
1 parent f6d1559 commit a6ad825

2 files changed

Lines changed: 40 additions & 0 deletions

File tree

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/optimizer/SideEffectAnalyzer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,11 @@ private boolean functionHasSideEffects(ImFunction func) {
503503
cache.put(func, sideEffect);
504504
return sideEffect;
505505
}
506+
if (func.isExtern()) {
507+
// Extern implementations are not represented in IM and may have runtime effects.
508+
cache.put(func, true);
509+
return true;
510+
}
506511
if (!inProgress.add(func)) {
507512
return true;
508513
}

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
import de.peeeq.wurstscript.ast.WurstModel;
1010
import de.peeeq.wurstscript.intermediatelang.optimizer.FunctionSplitter;
1111
import de.peeeq.wurstscript.intermediatelang.optimizer.LocalMerger;
12+
import de.peeeq.wurstscript.intermediatelang.optimizer.SideEffectAnalyzer;
1213
import de.peeeq.wurstscript.jassIm.*;
1314
import de.peeeq.wurstscript.translation.imtranslation.ImTranslator;
15+
import de.peeeq.wurstscript.translation.imtranslation.FunctionFlagEnum;
1416
import de.peeeq.wurstscript.types.TypesHelper;
1517
import de.peeeq.wurstscript.utils.Utils;
1618
import io.vavr.collection.HashSet;
@@ -1156,6 +1158,39 @@ public void testFunctionSplitter() {
11561158

11571159
}
11581160

1161+
@Test
1162+
public void externCallIsObservableSideEffectEvenWithEmptyBody() {
1163+
WurstModel model = Ast.WurstModel();
1164+
ImTranslator tr = new ImTranslator(model, false, new RunArgs());
1165+
ImProg prog = tr.getImProg();
1166+
Element trace = Ast.NoExpr();
1167+
1168+
ImFunction externFunc = JassIm.ImFunction(
1169+
trace,
1170+
"someExternCall",
1171+
JassIm.ImTypeVars(),
1172+
JassIm.ImVars(),
1173+
TypesHelper.imInt(),
1174+
JassIm.ImVars(),
1175+
JassIm.ImStmts(),
1176+
Collections.singletonList(FunctionFlagEnum.IS_EXTERN)
1177+
);
1178+
prog.getFunctions().add(externFunc);
1179+
1180+
ImFunctionCall externCall = JassIm.ImFunctionCall(
1181+
trace,
1182+
externFunc,
1183+
JassIm.ImTypeArguments(),
1184+
JassIm.ImExprs(),
1185+
false,
1186+
de.peeeq.wurstscript.translation.imtranslation.CallType.NORMAL
1187+
);
1188+
1189+
SideEffectAnalyzer analyzer = new SideEffectAnalyzer(prog);
1190+
assertTrue(analyzer.hasObservableSideEffects(externCall, f -> false),
1191+
"extern calls must be treated as observable side effects");
1192+
}
1193+
11591194
@Test
11601195
public void unaryMinus_minInt_notFolded() {
11611196
testAssertOkLines(true,

0 commit comments

Comments
 (0)