diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-10-03 11:02:40 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-10-03 11:02:40 -0300 |
| commit | 6dd0c6ccbcddc875933cab872008f57cbbbf997b (patch) | |
| tree | 1be44c1159f8d1d0c06bd884e5c86498e7652f55 | |
| parent | a77413acd0735754ffedde30bd09d86897964534 (diff) | |
| download | lua-6dd0c6ccbcddc875933cab872008f57cbbbf997b.tar.gz lua-6dd0c6ccbcddc875933cab872008f57cbbbf997b.tar.bz2 lua-6dd0c6ccbcddc875933cab872008f57cbbbf997b.zip | |
numeral expressions keep their values in struct 'expdesc'
| -rw-r--r-- | lcode.h | 6 | ||||
| -rw-r--r-- | lparser.c | 39 | ||||
| -rw-r--r-- | lparser.h | 8 |
3 files changed, 29 insertions, 24 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lcode.h,v 1.44 2005/05/20 15:53:42 roberto Exp $ | 2 | ** $Id: lcode.h,v 1.45 2005/08/29 20:49:21 roberto Exp roberto $ |
| 3 | ** Code generator for Lua | 3 | ** Code generator for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -24,7 +24,7 @@ | |||
| 24 | ** grep "ORDER OPR" if you change these enums | 24 | ** grep "ORDER OPR" if you change these enums |
| 25 | */ | 25 | */ |
| 26 | typedef enum BinOpr { | 26 | typedef enum BinOpr { |
| 27 | OPR_ADD, OPR_SUB, OPR_MULT, OPR_DIV, OPR_MOD, OPR_POW, | 27 | OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW, |
| 28 | OPR_CONCAT, | 28 | OPR_CONCAT, |
| 29 | OPR_NE, OPR_EQ, | 29 | OPR_NE, OPR_EQ, |
| 30 | OPR_LT, OPR_LE, OPR_GT, OPR_GE, | 30 | OPR_LT, OPR_LE, OPR_GT, OPR_GE, |
| @@ -37,7 +37,7 @@ typedef enum BinOpr { | |||
| 37 | typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; | 37 | typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; |
| 38 | 38 | ||
| 39 | 39 | ||
| 40 | #define getcode(fs,e) ((fs)->f->code[(e)->info]) | 40 | #define getcode(fs,e) ((fs)->f->code[(e)->u.s.info]) |
| 41 | 41 | ||
| 42 | #define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx) | 42 | #define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx) |
| 43 | 43 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lparser.c,v 2.35 2005/08/29 20:49:21 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 2.36 2005/09/30 14:21:56 roberto Exp roberto $ |
| 3 | ** Lua Parser | 3 | ** Lua Parser |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -144,7 +144,7 @@ static TString *str_checkname (LexState *ls) { | |||
| 144 | static void init_exp (expdesc *e, expkind k, int i) { | 144 | static void init_exp (expdesc *e, expkind k, int i) { |
| 145 | e->f = e->t = NO_JUMP; | 145 | e->f = e->t = NO_JUMP; |
| 146 | e->k = k; | 146 | e->k = k; |
| 147 | e->info = i; | 147 | e->u.s.info = i; |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | 150 | ||
| @@ -203,7 +203,7 @@ static int indexupvalue (FuncState *fs, TString *name, expdesc *v) { | |||
| 203 | Proto *f = fs->f; | 203 | Proto *f = fs->f; |
| 204 | int oldsize = f->sizeupvalues; | 204 | int oldsize = f->sizeupvalues; |
| 205 | for (i=0; i<f->nups; i++) { | 205 | for (i=0; i<f->nups; i++) { |
| 206 | if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->info) { | 206 | if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) { |
| 207 | lua_assert(f->upvalues[i] == name); | 207 | lua_assert(f->upvalues[i] == name); |
| 208 | return i; | 208 | return i; |
| 209 | } | 209 | } |
| @@ -217,7 +217,7 @@ static int indexupvalue (FuncState *fs, TString *name, expdesc *v) { | |||
| 217 | luaC_objbarrier(fs->L, f, name); | 217 | luaC_objbarrier(fs->L, f, name); |
| 218 | lua_assert(v->k == VLOCAL || v->k == VUPVAL); | 218 | lua_assert(v->k == VLOCAL || v->k == VUPVAL); |
| 219 | fs->upvalues[f->nups].k = cast(lu_byte, v->k); | 219 | fs->upvalues[f->nups].k = cast(lu_byte, v->k); |
| 220 | fs->upvalues[f->nups].info = cast(lu_byte, v->info); | 220 | fs->upvalues[f->nups].info = cast(lu_byte, v->u.s.info); |
| 221 | return f->nups++; | 221 | return f->nups++; |
| 222 | } | 222 | } |
| 223 | 223 | ||
| @@ -255,7 +255,7 @@ static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { | |||
| 255 | else { /* not found at current level; try upper one */ | 255 | else { /* not found at current level; try upper one */ |
| 256 | if (singlevaraux(fs->prev, n, var, 0) == VGLOBAL) | 256 | if (singlevaraux(fs->prev, n, var, 0) == VGLOBAL) |
| 257 | return VGLOBAL; | 257 | return VGLOBAL; |
| 258 | var->info = indexupvalue(fs, n, var); /* else was LOCAL or UPVAL */ | 258 | var->u.s.info = indexupvalue(fs, n, var); /* else was LOCAL or UPVAL */ |
| 259 | var->k = VUPVAL; /* upvalue in this level */ | 259 | var->k = VUPVAL; /* upvalue in this level */ |
| 260 | return VUPVAL; | 260 | return VUPVAL; |
| 261 | } | 261 | } |
| @@ -267,7 +267,7 @@ static void singlevar (LexState *ls, expdesc *var) { | |||
| 267 | TString *varname = str_checkname(ls); | 267 | TString *varname = str_checkname(ls); |
| 268 | FuncState *fs = ls->fs; | 268 | FuncState *fs = ls->fs; |
| 269 | if (singlevaraux(fs, varname, var, 1) == VGLOBAL) | 269 | if (singlevaraux(fs, varname, var, 1) == VGLOBAL) |
| 270 | var->info = luaK_stringK(fs, varname); /* info points to global name */ | 270 | var->u.s.info = luaK_stringK(fs, varname); /* info points to global name */ |
| 271 | } | 271 | } |
| 272 | 272 | ||
| 273 | 273 | ||
| @@ -472,8 +472,8 @@ static void recfield (LexState *ls, struct ConsControl *cc) { | |||
| 472 | checknext(ls, '='); | 472 | checknext(ls, '='); |
| 473 | luaK_exp2RK(fs, &key); | 473 | luaK_exp2RK(fs, &key); |
| 474 | expr(ls, &val); | 474 | expr(ls, &val); |
| 475 | luaK_codeABC(fs, OP_SETTABLE, cc->t->info, luaK_exp2RK(fs, &key), | 475 | luaK_codeABC(fs, OP_SETTABLE, cc->t->u.s.info, luaK_exp2RK(fs, &key), |
| 476 | luaK_exp2RK(fs, &val)); | 476 | luaK_exp2RK(fs, &val)); |
| 477 | fs->freereg = reg; /* free registers */ | 477 | fs->freereg = reg; /* free registers */ |
| 478 | } | 478 | } |
| 479 | 479 | ||
| @@ -483,7 +483,7 @@ static void closelistfield (FuncState *fs, struct ConsControl *cc) { | |||
| 483 | luaK_exp2nextreg(fs, &cc->v); | 483 | luaK_exp2nextreg(fs, &cc->v); |
| 484 | cc->v.k = VVOID; | 484 | cc->v.k = VVOID; |
| 485 | if (cc->tostore == LFIELDS_PER_FLUSH) { | 485 | if (cc->tostore == LFIELDS_PER_FLUSH) { |
| 486 | luaK_setlist(fs, cc->t->info, cc->na, cc->tostore); /* flush */ | 486 | luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore); /* flush */ |
| 487 | cc->tostore = 0; /* no more items pending */ | 487 | cc->tostore = 0; /* no more items pending */ |
| 488 | } | 488 | } |
| 489 | } | 489 | } |
| @@ -493,13 +493,13 @@ static void lastlistfield (FuncState *fs, struct ConsControl *cc) { | |||
| 493 | if (cc->tostore == 0) return; | 493 | if (cc->tostore == 0) return; |
| 494 | if (hasmultret(cc->v.k)) { | 494 | if (hasmultret(cc->v.k)) { |
| 495 | luaK_setmultret(fs, &cc->v); | 495 | luaK_setmultret(fs, &cc->v); |
| 496 | luaK_setlist(fs, cc->t->info, cc->na, LUA_MULTRET); | 496 | luaK_setlist(fs, cc->t->u.s.info, cc->na, LUA_MULTRET); |
| 497 | cc->na--; /* do not count last expression (unknown number of elements) */ | 497 | cc->na--; /* do not count last expression (unknown number of elements) */ |
| 498 | } | 498 | } |
| 499 | else { | 499 | else { |
| 500 | if (cc->v.k != VVOID) | 500 | if (cc->v.k != VVOID) |
| 501 | luaK_exp2nextreg(fs, &cc->v); | 501 | luaK_exp2nextreg(fs, &cc->v); |
| 502 | luaK_setlist(fs, cc->t->info, cc->na, cc->tostore); | 502 | luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore); |
| 503 | } | 503 | } |
| 504 | } | 504 | } |
| 505 | 505 | ||
| @@ -657,7 +657,7 @@ static void funcargs (LexState *ls, expdesc *f) { | |||
| 657 | } | 657 | } |
| 658 | } | 658 | } |
| 659 | lua_assert(f->k == VNONRELOC); | 659 | lua_assert(f->k == VNONRELOC); |
| 660 | base = f->info; /* base register for call */ | 660 | base = f->u.s.info; /* base register for call */ |
| 661 | if (hasmultret(args.k)) | 661 | if (hasmultret(args.k)) |
| 662 | nparams = LUA_MULTRET; /* open call */ | 662 | nparams = LUA_MULTRET; /* open call */ |
| 663 | else { | 663 | else { |
| @@ -746,7 +746,8 @@ static void simpleexp (LexState *ls, expdesc *v) { | |||
| 746 | constructor | FUNCTION body | primaryexp */ | 746 | constructor | FUNCTION body | primaryexp */ |
| 747 | switch (ls->t.token) { | 747 | switch (ls->t.token) { |
| 748 | case TK_NUMBER: { | 748 | case TK_NUMBER: { |
| 749 | init_exp(v, VK, luaK_numberK(ls->fs, ls->t.seminfo.r)); | 749 | init_exp(v, VKNUM, 0); |
| 750 | v->u.nval = ls->t.seminfo.r; | ||
| 750 | break; | 751 | break; |
| 751 | } | 752 | } |
| 752 | case TK_STRING: { | 753 | case TK_STRING: { |
| @@ -805,7 +806,7 @@ static BinOpr getbinopr (int op) { | |||
| 805 | switch (op) { | 806 | switch (op) { |
| 806 | case '+': return OPR_ADD; | 807 | case '+': return OPR_ADD; |
| 807 | case '-': return OPR_SUB; | 808 | case '-': return OPR_SUB; |
| 808 | case '*': return OPR_MULT; | 809 | case '*': return OPR_MUL; |
| 809 | case '/': return OPR_DIV; | 810 | case '/': return OPR_DIV; |
| 810 | case '%': return OPR_MOD; | 811 | case '%': return OPR_MOD; |
| 811 | case '^': return OPR_POW; | 812 | case '^': return OPR_POW; |
| @@ -927,18 +928,18 @@ static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { | |||
| 927 | int conflict = 0; | 928 | int conflict = 0; |
| 928 | for (; lh; lh = lh->prev) { | 929 | for (; lh; lh = lh->prev) { |
| 929 | if (lh->v.k == VINDEXED) { | 930 | if (lh->v.k == VINDEXED) { |
| 930 | if (lh->v.info == v->info) { /* conflict? */ | 931 | if (lh->v.u.s.info == v->u.s.info) { /* conflict? */ |
| 931 | conflict = 1; | 932 | conflict = 1; |
| 932 | lh->v.info = extra; /* previous assignment will use safe copy */ | 933 | lh->v.u.s.info = extra; /* previous assignment will use safe copy */ |
| 933 | } | 934 | } |
| 934 | if (lh->v.aux == v->info) { /* conflict? */ | 935 | if (lh->v.u.s.aux == v->u.s.info) { /* conflict? */ |
| 935 | conflict = 1; | 936 | conflict = 1; |
| 936 | lh->v.aux = extra; /* previous assignment will use safe copy */ | 937 | lh->v.u.s.aux = extra; /* previous assignment will use safe copy */ |
| 937 | } | 938 | } |
| 938 | } | 939 | } |
| 939 | } | 940 | } |
| 940 | if (conflict) { | 941 | if (conflict) { |
| 941 | luaK_codeABC(fs, OP_MOVE, fs->freereg, v->info, 0); /* make copy */ | 942 | luaK_codeABC(fs, OP_MOVE, fs->freereg, v->u.s.info, 0); /* make copy */ |
| 942 | luaK_reserveregs(fs, 1); | 943 | luaK_reserveregs(fs, 1); |
| 943 | } | 944 | } |
| 944 | } | 945 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lparser.h,v 1.54 2005/03/09 16:28:07 roberto Exp roberto $ | 2 | ** $Id: lparser.h,v 1.55 2005/04/25 19:24:10 roberto Exp roberto $ |
| 3 | ** Lua Parser | 3 | ** Lua Parser |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -23,6 +23,7 @@ typedef enum { | |||
| 23 | VTRUE, | 23 | VTRUE, |
| 24 | VFALSE, | 24 | VFALSE, |
| 25 | VK, /* info = index of constant in `k' */ | 25 | VK, /* info = index of constant in `k' */ |
| 26 | VKNUM, /* nval = numerical value */ | ||
| 26 | VLOCAL, /* info = local register */ | 27 | VLOCAL, /* info = local register */ |
| 27 | VUPVAL, /* info = index of upvalue in `upvalues' */ | 28 | VUPVAL, /* info = index of upvalue in `upvalues' */ |
| 28 | VGLOBAL, /* info = index of table; aux = index of global name in `k' */ | 29 | VGLOBAL, /* info = index of table; aux = index of global name in `k' */ |
| @@ -36,7 +37,10 @@ typedef enum { | |||
| 36 | 37 | ||
| 37 | typedef struct expdesc { | 38 | typedef struct expdesc { |
| 38 | expkind k; | 39 | expkind k; |
| 39 | int info, aux; | 40 | union { |
| 41 | struct { int info, aux; } s; | ||
| 42 | lua_Number nval; | ||
| 43 | } u; | ||
| 40 | int t; /* patch list of `exit when true' */ | 44 | int t; /* patch list of `exit when true' */ |
| 41 | int f; /* patch list of `exit when false' */ | 45 | int f; /* patch list of `exit when false' */ |
| 42 | } expdesc; | 46 | } expdesc; |
