Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion de.peeeq.wurstscript/parserspec/jass_im.parseq
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@ ImMethod(@ignoreForEquality de.peeeq.wurstscript.ast.Element trace,


ImStmts * ImStmt
ImVarargLoopVars * ImVarargLoopVar

ImVarargLoopVar(ref ImVar var)

ImStmt =
ImIf(@ignoreForEquality de.peeeq.wurstscript.ast.Element trace, ImExpr condition, ImStmts thenBlock, ImStmts elseBlock)
Expand All @@ -82,7 +85,7 @@ ImStmt =
| ImReturn(@ignoreForEquality de.peeeq.wurstscript.ast.Element trace, ImExprOpt returnValue)
| ImSet(@ignoreForEquality de.peeeq.wurstscript.ast.Element trace, ImLExpr left, ImExpr right)
| ImExpr
| ImVarargLoop(@ignoreForEquality de.peeeq.wurstscript.ast.Element trace, ImStmts body, ref ImVar loopVar)
| ImVarargLoop(@ignoreForEquality de.peeeq.wurstscript.ast.Element trace, ImStmts body, ImVarargLoopVars loopVars)


ImExprOpt =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.peeeq.wurstscript.intermediatelang.interpreter;

import com.google.common.base.Preconditions;
import de.peeeq.wurstio.jassinterpreter.InterpreterException;
import de.peeeq.wurstio.jassinterpreter.VarargArray;
import de.peeeq.wurstscript.intermediatelang.ILaddress;
Expand Down Expand Up @@ -72,11 +73,13 @@ public static void run(ImStmts stmts, ProgramState globalState, LocalState local


public static void run(ImVarargLoop loop, ProgramState globalState, LocalState localState) {
Preconditions.checkState(loop.getLoopVars().size() == 1,
"Expected one vararg loop variable in the interpreter.");
ImFunction func = loop.getNearestFunc();
ImVar varargParam = func.getParameters().get(func.getParameters().size() - 1);
VarargArray val = (VarargArray) localState.getVal(varargParam);
for (int i = 0; i < val.size(); i++) {
localState.setVal(loop.getLoopVar(), val.get(i));
localState.setVal(loop.getLoopVars().get(0).getVar(), val.get(i));
loop.getBody().runStatements(globalState, localState);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,10 @@ private static void applyMerges(ImFunction func, Map<ImVar, ImVar> merges) {
}
@Override public void visit(ImVarargLoop varargLoop) {
super.visit(varargLoop);
ImVar m = merges.get(varargLoop.getLoopVar());
if (m != null) varargLoop.setLoopVar(m);
for (ImVarargLoopVar loopVar : varargLoop.getLoopVars()) {
ImVar m = merges.get(loopVar.getVar());
if (m != null) loopVar.setVar(m);
}
}
});
}
Expand All @@ -123,6 +125,10 @@ private static int removeUnusedLocals(ImFunction f) {
@Override public void visit(ImVarAccess va) { super.visit(va); used.add(va.getVar()); }
@Override public void visit(ImMemberAccess ma) { super.visit(ma); used.add(ma.getVar()); }
@Override public void visit(ImVarArrayAccess vaa) { super.visit(vaa); used.add(vaa.getVar()); }
@Override public void visit(ImVarargLoop loop) {
super.visit(loop);
loop.getLoopVars().forEach(v -> used.add(v.getVar()));
}
});
List<ImVar> locals = new ArrayList<>(f.getLocals());
int before = locals.size();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -261,9 +261,9 @@ private void indexElementAfterChildren(Element element, ImFunction owner, Object
} else if (element instanceof ImVarargLoop) {
ImVar varargParameter = varargParameter(owner);
if (varargParameter != null) {
addDependency(
variableFact(varargParameter),
variableFact(((ImVarargLoop) element).getLoopVar()));
for (ImVarargLoopVar loopVar : ((ImVarargLoop) element).getLoopVars()) {
addDependency(variableFact(varargParameter), variableFact(loopVar.getVar()));
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ public void visit(ImSet va) {
@Override
public void visit(ImVarargLoop va) {
super.visit(va);
imVars.add(va.getLoopVar());
va.getLoopVars().forEach(v -> imVars.add(v.getVar()));
}

});
Expand Down Expand Up @@ -405,7 +405,7 @@ public void visit(ImSet va) {
@Override
public void visit(ImVarargLoop va) {
super.visit(va);
imVars.add(va.getLoopVar());
va.getLoopVars().forEach(v -> imVars.add(v.getVar()));
}

});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import de.peeeq.wurstscript.types.TypesHelper;

import java.util.*;
import java.util.stream.Collectors;

import static de.peeeq.wurstscript.jassIm.JassIm.ImStatementExpr;
import static de.peeeq.wurstscript.jassIm.JassIm.ImStmts;
Expand Down Expand Up @@ -278,7 +279,10 @@ private ImStmts rewriteStmtForEarlyReturn(ImStmt s, ImVar doneVar, ImVar retVar)
ImStmts loopBody = JassIm.ImStmts();
loopBody.add(JassIm.ImExitwhen(l.getTrace(), JassIm.ImVarAccess(doneVar)));
loopBody.addAll(rewriteForEarlyReturns(l.getBody().copy(), doneVar, retVar).removeAll());
return JassIm.ImStmts(JassIm.ImVarargLoop(l.getTrace(), loopBody, l.getLoopVar()));
return JassIm.ImStmts(JassIm.ImVarargLoop(l.getTrace(), loopBody,
JassIm.ImVarargLoopVars(l.getLoopVars().stream()
.map(v -> JassIm.ImVarargLoopVar(v.getVar()))
.collect(Collectors.toList()))));
}
// Keep tree ownership valid when rewrapping statements into new blocks.
return JassIm.ImStmts(s.copy());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@ public void check(Element e) {
checkType(e, ((ImMethod) e).getMethodClass());
checkRooted(e, ((ImMethod) e).getImplementation());
} else if (e instanceof ImVarargLoop) {
checkRooted(e, ((ImVarargLoop) e).getLoopVar());
for (ImVarargLoopVar loopVar : ((ImVarargLoop) e).getLoopVars()) {
checkRooted(e, loopVar.getVar());
}
} else if (e instanceof ImTypeVarDispatch) {
checkRooted(e, ((ImTypeVarDispatch) e).getTypeClassFunc());
checkRooted(e, ((ImTypeVarDispatch) e).getTypeVariable());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,20 @@ public void visit(ImVarAccess va) {
}
}

@Override
public void visit(ImVarargLoop loop) {
super.visit(loop);
Preconditions.checkState(loop.getLoopVars().size() == 1,
"Expected one vararg loop variable before tuple elimination.");
ImVar loopVar = loop.getLoopVars().get(0).getVar();
if (TypesHelper.typeContainsTuples(loopVar.getType())) {
loop.setLoopVars(JassIm.ImVarargLoopVars(
translator.getTupleScalarVars(loopVar).stream()
.map(JassIm::ImVarargLoopVar)
.collect(Collectors.toList())));
}
}

@Override
public void visit(ImVarArrayAccess va) {
super.visit(va);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

import static de.peeeq.wurstscript.jassIm.JassIm.*;

Expand Down Expand Up @@ -659,7 +660,14 @@ public static Result flatten(ImGetStackTrace e, ImTranslator translator,

public static Result flatten(ImVarargLoop s, ImTranslator translator, ImFunction f) {
return new Result(Collections.singletonList(
JassIm.ImVarargLoop(s.getTrace(), flattenStatements(s.getBody(), translator, f), s.getLoopVar())));
JassIm.ImVarargLoop(s.getTrace(), flattenStatements(s.getBody(), translator, f),
copyVarargLoopVars(s.getLoopVars()))));
}

private static ImVarargLoopVars copyVarargLoopVars(ImVarargLoopVars loopVars) {
return JassIm.ImVarargLoopVars(loopVars.stream()
.map(v -> JassIm.ImVarargLoopVar(v.getVar()))
.collect(Collectors.toList()));
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -507,7 +507,9 @@ public static void print(ImCompiletimeExpr e, Appendable sb, int indent) {

public static void print(ImVarargLoop e, Appendable sb, int indent) {
append(sb, "foreach vararg ");
e.getLoopVar().print(sb, indent);
append(sb, e.getLoopVars().stream()
.map(v -> v.getVar().getName())
.collect(Collectors.joining(", ")));
append(sb, " {\n");
e.getBody().print(sb, indent + 1);
indent(sb, indent);
Expand Down Expand Up @@ -599,6 +601,10 @@ public static String asString(ImTypeArgument s) {
return s.getType() + "" + s.getTypeClassBinding();
}

public static String asString(ImVarargLoopVar s) {
return s.getVar().getName() + smallHash(s.getVar());
}

public static void print(ImCast e, Appendable sb, int indent) {
append(sb, "(");
e.getExpr().print(sb, indent);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,11 @@ public void visit(ImMethod e) {


@Override
public void visit(ImVarargLoop e) {
public void visit(ImVarargLoopVar e) {
super.visit(e);
Element newChild = oldToNew.get(e.getLoopVar());
Element newChild = oldToNew.get(e.getVar());
if (newChild != null) {
e.setLoopVar((ImVar) newChild);
e.setVar((ImVar) newChild);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,8 @@ private static ImStmt case_StmtForVararg(StmtForIn s, ImTranslator t, ImFunction
List<ImStmt> result = Lists.newArrayList();
ImVar loopVar = t.getVarFor(s.getLoopVar());

result.add(ImVarargLoop(s, ImStmts(t.translateStatements(f, s.getBody())), loopVar));
result.add(ImVarargLoop(s, ImStmts(t.translateStatements(f, s.getBody())),
ImVarargLoopVars(ImVarargLoopVar(loopVar))));

f.getLocals().add(loopVar);
return ImHelper.statementExprVoid(ImStmts(result));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ private static void collectAllVars(Element e, Set<ImVar> result) {
result.add(((ImVarArrayAccess) e).getVar());
} else if (e instanceof ImMemberAccess) {
result.add(((ImMemberAccess) e).getVar());
} else if (e instanceof ImVarargLoop) {
((ImVarargLoop) e).getLoopVars().forEach(v -> result.add(v.getVar()));
}

// Continue traversal
Expand Down Expand Up @@ -85,6 +87,12 @@ public void visit(ImVarAccess e) {
result.add(e.getVar());
}

@Override
public void visit(ImVarargLoop e) {
e.getLoopVars().forEach(v -> result.add(v.getVar()));
super.visit(e);
}

@Override
public void visit(ImVarArrayAccess e) {
result.add(e.getVar());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.google.common.base.Preconditions;
import de.peeeq.wurstscript.attributes.CompileError;
import de.peeeq.wurstscript.jassIm.*;
import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -170,6 +171,9 @@ private void redirectCall(ImFunctionCall call, ImFunction newFunc) {
}

private void unrollVarargLoop(ImVarargLoop imLoop, List<ImVar> newParams) {
Preconditions.checkState(imLoop.getLoopVars().size() == 1,
"Expected one vararg loop variable before vararg elimination.");
ImVar loopVar = imLoop.getLoopVars().get(0).getVar();
ImStatementExpr stmtExpr = ImHelper.statementExprVoid(JassIm.ImStmts());

for (int i = 0; i < newParams.size(); i++) {
Expand All @@ -179,7 +183,7 @@ private void unrollVarargLoop(ImVarargLoop imLoop, List<ImVar> newParams) {
@Override
public void visit(ImVarAccess access) {
super.visit(access);
if (access.getVar() == imLoop.getLoopVar()) {
if (access.getVar() == loopVar) {
access.setVar(newParams.get(finalI));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import de.peeeq.wurstscript.luaAst.*;

import java.util.List;
import java.util.stream.Collectors;

import static de.peeeq.wurstscript.translation.lua.translation.ExprTranslation.WURST_ABORT_THREAD_SENTINEL;
import de.peeeq.wurstscript.jassIm.ImFunction;
Expand Down Expand Up @@ -80,7 +81,9 @@ public static void translate(ImSet s, List<LuaStatement> res, LuaTranslator tr)


public static void translate(ImVarargLoop loop, List<LuaStatement> res, LuaTranslator tr) {
List<ImVar> loopVars = tr.imTr.getTupleScalarVars(loop.getLoopVar());
List<ImVar> loopVars = loop.getLoopVars().stream()
.map(ImVarargLoopVar::getVar)
.collect(Collectors.toList());
// The loop is built from real AST nodes (a while loop) instead of literal
// 'for ... do' / 'end' lines: the printer stops printing a statement list
// after a return/break (Lua forbids trailing statements), which would
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package tests.utils;

import tests.wurstscript.tests.CompilerFuzzTestsSC;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
Expand All @@ -11,13 +12,20 @@
public class SmallCheckViaJUnitCoreTestNG {

@Test
public void runGraphInterpreterTestsSC() {
public void runSmallCheckSuite() {
Result r = JUnitCore.runClasses(GraphInterpreterTestsSC.class);
assertNoFailures(r, "GraphInterpreter");

Result compilerFuzz = JUnitCore.runClasses(CompilerFuzzTestsSC.class);
assertNoFailures(compilerFuzz, "CompilerFuzz");
}

private void assertNoFailures(Result r, String suiteName) {
if (!r.wasSuccessful()) {
String msg = r.getFailures().stream()
.map(Failure::toString)
.map(Failure::getTrace)
.collect(Collectors.joining("\n\n"));
Assert.fail("SmallCheck failures:\n" + msg);
Assert.fail("SmallCheck failures (" + suiteName + "):\n" + msg);
}
}
}
Loading
Loading