Skip to content

Commit 2bb0fa6

Browse files
committed
fix evaluation order for assignments
first left, then right
1 parent 1c6c688 commit 2bb0fa6

File tree

3 files changed

+35
-30
lines changed

3 files changed

+35
-30
lines changed

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/EliminateTuples.java

+11-27
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import de.peeeq.wurstscript.jassIm.*;
88
import de.peeeq.wurstscript.translation.imtranslation.ImTranslator.VarsForTupleResult;
99
import de.peeeq.wurstscript.types.TypesHelper;
10-
import de.peeeq.wurstscript.utils.Pair;
1110
import de.peeeq.wurstscript.utils.Utils;
1211

1312
import java.util.ArrayList;
@@ -24,28 +23,7 @@
2423
*/
2524
public class EliminateTuples {
2625

27-
/*
28-
TODO this could be simplified:
2926

30-
Visit and rewrite only the expressions that must be changed:
31-
32-
33-
34-
2. Normalize Tuples in statement-expressions (move to first tuple param)
35-
36-
Normalize
37-
{stmts >> <e1,e2,e3>}
38-
becomes <{stmts >> e1}, e2, e3}
39-
40-
41-
3. Remove tuple expressions
42-
43-
44-
- In parameters: Just flatten
45-
- Assignments: Become several assignments
46-
- In Return: Use temp returns
47-
48-
*/
4927

5028
public static void eliminateTuplesProg(ImProg imProg, ImTranslator translator) {
5129

@@ -108,7 +86,6 @@ public void visit(ImTupleSelection ts) {
10886
extractSideEffect(te, stmts);
10987
} else { // if it is the part we want to return ...
11088
result = extractSideEffect(te, stmts);
111-
// TODO in this and all the following remove side effects and add them to stmts
11289
}
11390
}
11491
assert result != null;
@@ -404,8 +381,16 @@ private static ImStatementExpr inSet(ImSet imSet, ImFunction f) {
404381
ImTupleExpr right = (ImTupleExpr) imSet.getRight();
405382

406383
ImStmts stmts = JassIm.ImStmts();
384+
385+
// 1) extract side effects from left expressions
386+
List<ImExpr> leftExprs = new ArrayList<>();
387+
for (ImExpr expr : left.getExprs()) {
388+
leftExprs.add(extractSideEffect(expr, stmts));
389+
}
390+
391+
407392
List<ImVar> tempVars = new ArrayList<>();
408-
// first assign right hand side to temporary variables:
393+
// 2) assign right hand side to temporary variables:
409394
for (ImExpr expr : right.getExprs()) {
410395
ImVar temp = JassIm.ImVar(expr.attrTrace(), expr.attrTyp(), "tuple_temp", false);
411396
expr.setParent(null);
@@ -414,9 +399,8 @@ private static ImStatementExpr inSet(ImSet imSet, ImFunction f) {
414399
f.getLocals().add(temp);
415400
}
416401
// then assign right vars
417-
// TODO side effects from left expressions should come before side effects on right
418-
for (int i = 0; i < left.getExprs().size(); i++) {
419-
ImLExpr leftE = (ImLExpr) left.getExprs().get(i);
402+
for (int i = 0; i < leftExprs.size(); i++) {
403+
ImLExpr leftE = (ImLExpr) leftExprs.get(i);
420404
leftE.setParent(null);
421405
stmts.add(JassIm.ImSet(imSet.getTrace(), leftE, JassIm.ImVarAccess(tempVars.get(i))));
422406
}

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/Flatten.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -234,10 +234,10 @@ public static Result flatten(ImReturn s, ImTranslator t, ImFunction f) {
234234

235235

236236
public static Result flatten(ImSet s, ImTranslator t, ImFunction f) {
237-
Result r = s.getRight().flatten(t, f);
238237
Result l = s.getLeft().flatten(t, f);
239-
List<ImStmt> stmts = Lists.newArrayList(r.stmts);
240-
stmts.addAll(l.stmts);
238+
Result r = s.getRight().flatten(t, f);
239+
List<ImStmt> stmts = Lists.newArrayList(l.stmts);
240+
stmts.addAll(r.stmts);
241241
stmts.add(JassIm.ImSet(s.getTrace(), (ImLExpr) l.expr, r.expr));
242242
return new Result(stmts);
243243
}

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

+21
Original file line numberDiff line numberDiff line change
@@ -506,4 +506,25 @@ public void tupleArrayInClass2() { // see #572
506506
);
507507
}
508508

509+
@Test
510+
public void tupleArraySideEvaluationOrder() {
511+
testAssertOkLines(true,
512+
"package test",
513+
"native testSuccess()",
514+
"int x = 1",
515+
"tuple p(int x, int y)",
516+
"p array ar",
517+
"function foo() returns int",
518+
" x = x * 2",
519+
" return 1",
520+
"function bar() returns int",
521+
" x = x + 1",
522+
" return 1",
523+
"init",
524+
" ar[foo()] = p(bar(), 7)",
525+
" if x == 3 and ar[1].x == 1 and ar[1].y == 7",
526+
" testSuccess()"
527+
);
528+
}
529+
509530
}

0 commit comments

Comments
 (0)