From bd2d6716e386dd5cafc483af0cfc5aa608c1891e Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 7 Jun 2010 13:24:58 +0200 Subject: [PATCH] gesamt: leerstehende Expr's auswerten (weil da Methodenaufrufe drin sein koennten) --- gesamt/TODO | 33 ++++++++++++++++++++++++++++++++- gesamt/code.bfe | 3 ++- gesamt/parser.y | 5 ++++- gesamt/tree.h | 4 ++-- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/gesamt/TODO b/gesamt/TODO index 7327635..511b51b 100644 --- a/gesamt/TODO +++ b/gesamt/TODO @@ -1,2 +1,33 @@ - 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 diff --git a/gesamt/code.bfe b/gesamt/code.bfe index dba5023..4bd1e83 100644 --- a/gesamt/code.bfe +++ b/gesamt/code.bfe @@ -258,7 +258,7 @@ void prep_arg(struct treenode *bnode, int moveit) %} %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 %% @@ -284,6 +284,7 @@ ifstat: O_IF(O_BOOL(expr)) # 1 # /* dann braucht man kein test */ 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 diff --git a/gesamt/parser.y b/gesamt/parser.y index 2d42baa..1d7a7c6 100644 --- a/gesamt/parser.y +++ b/gesamt/parser.y @@ -197,7 +197,10 @@ Statement: 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 diff --git a/gesamt/tree.h b/gesamt/tree.h index a6d52c4..8a651e7 100644 --- a/gesamt/tree.h +++ b/gesamt/tree.h @@ -14,7 +14,7 @@ enum { 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[] = { @@ -22,7 +22,7 @@ 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 { -- 2.25.1