diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imoptimizer/ImOptimizer.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imoptimizer/ImOptimizer.java index 97849b8cd..a57157511 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imoptimizer/ImOptimizer.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imoptimizer/ImOptimizer.java @@ -76,6 +76,8 @@ public void localOptimizations() { totalCount.forEach((k, v) -> { WLogger.info("== " + k + ": " + v); }); + + InitFunctionCleaner.clean(trans.getImProg()); } public void doNullsetting() { diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imoptimizer/InitFunctionCleaner.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imoptimizer/InitFunctionCleaner.java new file mode 100644 index 000000000..066883601 --- /dev/null +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imoptimizer/InitFunctionCleaner.java @@ -0,0 +1,59 @@ +package de.peeeq.wurstscript.translation.imoptimizer; + +import de.peeeq.wurstscript.jassIm.*; + +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public class InitFunctionCleaner { + + public static void clean(ImProg prog) { + List initFuncs = prog.getFunctions().stream().filter(func -> func.getName().startsWith + ("init_") && func.getBody().size() == 1).collect(Collectors.toList()); + + initFuncs.forEach(func -> { + ImVar globalBridge = null; + for (ImVar global : prog.getGlobals()) { + if (global.getName().equals("ref_function_" + func.getName())) { + globalBridge = global; + break; + } + } + if (globalBridge != null) { + Collection imVarReads = globalBridge.attrReads(); + if (imVarReads.size() == 1) { + ImVarRead initRead = imVarReads.iterator().next(); + ImVar var = initRead.getVar(); + + Optional mainFunc = prog.getFunctions().stream().filter(f -> f.getName().equals("main")).findFirst(); + if (mainFunc.isPresent()) { + ImStmts body = mainFunc.get().getBody(); + for (int i = 0; i < body.size(); i++) { + ImStmt imStmt = body.get(i); + if (imStmt instanceof ImFunctionCall) { + ImFunction calledFunc = ((ImFunctionCall) imStmt).getFunc(); + if (calledFunc.getName().equals("TriggerAddCondition")) { + int finalI = i; + ((ImFunctionCall) imStmt).getArguments().forEach(arg -> { + if ((arg instanceof ImFunctionCall) && ((ImFunctionCall) arg).getFunc().getName().equals("Condition")) { + ImExpr next = ((ImFunctionCall) arg).getArguments().iterator().next(); + if ((next instanceof ImVarAccess) && ((ImVarAccess) next).getVar().structuralEquals(var)) { + imStmt.replaceBy(JassIm.ImNull()); + if (body.get(finalI - 1) instanceof ImFunctionCall) { + body.get(finalI - 1).replaceBy(JassIm.ImNull()); + } + body.get(finalI + 1).replaceBy(JassIm.ImNull()); + } + } + }); + } + } + } + } + } + } + }); + } +} diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imoptimizer/UselessFunctionCallsRemover.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imoptimizer/UselessFunctionCallsRemover.java index 6700f0a52..3e04c4795 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imoptimizer/UselessFunctionCallsRemover.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imoptimizer/UselessFunctionCallsRemover.java @@ -222,7 +222,7 @@ private static void initFunctionsWithoutSideEffects() { "R2S", "R2SW", "Rad2Deg", "S2I", "S2R", "Sin", "SquareRoot", "StringCase", "StringHash", "StringLength", "SubString", "Tan", "TimerGetElapsed", "TimerGetRemaining", "TimerGetTimeout", "VersionGet", "WaygateGetDestinationX", "WaygateGetDestinationY", "WaygateIsActive", - "WaygateSetDestination"); + "WaygateSetDestination", "Player"); // just to be sure, sort it again Collections.sort(functionsWithoutSideEffects); }