- bench.sh fixen, zomg
-- intelli_03: seiteneffekte in der ersten zeile *ahhhh*
+- intelli_03: seiteneffekte; was ist mit der auswertungsreihenfolge?
+an die mailinglist
+
+Betreff: Seiteneffekte bei Expression
+
+Hallo,
+
+wie ist die Auswertungsreihenfolge bei Expressions mit Seiteneffekten, z.B. in
+diesem Fall:
+
+test.0
+> struct a end;
+> method f()
+> return this.a - inc();
+> end;
+> method inc()
+> return this.a--1;
+> end;
+
+
+test.call
+> long f(long[]);
+> long ar[] = {100};
+> int ret = f(ar);
+> #define ERG1 (100 - 101)
+> #define ERG2 (101 - 101)
+> printf("ret ist %2i (sollte %2i ODER %2i sein?)\n", ret, ERG1, ERG2);
+> RET(ret == ERG1 || ret == ERG2);
+
+
+Liebe Gruesse,
+Bernhard Urban
%}
%start begin
-%term O_RET=1 O_NULL=2 O_SUB=3 O_MUL=4 O_OR=5 O_LESS=6 O_EQ=7 O_ID=8 O_ADD=9 O_NUM=10 O_FIELD=11 O_MTWO=12 O_MFOUR=13 O_MEIGHT=14 O_MONE=15 O_ASSIGN=16 O_IF=17 O_BOOL=18 O_CALL=19 O_ARG=20 O_NOTHING=21
+%term O_RET=1 O_NULL=2 O_SUB=3 O_MUL=4 O_OR=5 O_LESS=6 O_EQ=7 O_ID=8 O_ADD=9 O_NUM=10 O_FIELD=11 O_MTWO=12 O_MFOUR=13 O_MEIGHT=14 O_MONE=15 O_ASSIGN=16 O_IF=17 O_BOOL=18 O_CALL=19 O_ARG=20 O_NOTHING=21 O_EXPR=22
%%
ret: O_RET(retexpr) # 2 # printf("\t//o_ret(expr)\n"); move(BN_REG, "rax");
+ret: O_EXPR(expr) # 0 #
retexpr: O_ID # 1 # printf("\t//retexpr\n"); if(bnode->param_index > -1) move(param_reg(bnode->param_index), BN_REG);
retexpr: expr
varsinout()
lblcountinout()
xxputsin(@Expr.s@,)
- @i @Statement.node@ = TREENULL;
+ @i @Statement.node@ = new_node(O_EXPR, @Expr.node@, TREENULL);
+ @reg @Statement.node@->reg = @Expr.node@->reg = next_reg((char *)NULL, @Expr.gparamges@);
+
+ @gen write_tree(@Statement.node@, 0); burm_label(@Statement.node@); burm_reduce(@Statement.node@, 1);
@}
| IF Expr THEN Statseq END
O_OR=5, O_LESS, O_EQ, O_ID, O_ADD,
O_NUM=10, O_FIELD, O_MTWO, O_MFOUR, O_MEIGHT,
O_MONE=15, O_ASSIGN, O_IF, O_BOOL, O_CALL,
- O_ARG=20, O_NOTHING
+ O_ARG=20, O_NOTHING, O_EXPR
};
static char *o_names[] = {
"O_OR", "O_LESS", "O_EQ", "O_ID", "O_ADD",
"O_NUM", "O_FIELD", "O_MTWO", "O_MFOUR", "O_MEIGHT",
"O_MONE", "O_ASSIGN", "O_IF", "O_BOOL", "O_CALL",
- "O_ARG", "O_NOTHING"
+ "O_ARG", "O_NOTHING", "O_EXPR"
};
struct treenode {