diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-06-21 15:13:56 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-06-21 15:13:56 -0300 |
| commit | b69e712713785394ceefa11ab3e5f9636abea733 (patch) | |
| tree | 0fa1b8b00ffbb5cfe0113d290b48b4fc528d2695 | |
| parent | f51775950737eb4d097cda0bba143973b5385947 (diff) | |
| download | lua-b69e712713785394ceefa11ab3e5f9636abea733.tar.gz lua-b69e712713785394ceefa11ab3e5f9636abea733.tar.bz2 lua-b69e712713785394ceefa11ab3e5f9636abea733.zip | |
new way to generate SETLINEs
| -rw-r--r-- | lcode.c | 19 | ||||
| -rw-r--r-- | llex.c | 3 | ||||
| -rw-r--r-- | llex.h | 3 | ||||
| -rw-r--r-- | lparser.c | 70 | ||||
| -rw-r--r-- | lparser.h | 3 |
5 files changed, 41 insertions, 57 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lcode.c,v 1.36 2000/06/16 17:51:40 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 1.37 2000/06/21 17:05:49 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 | */ |
| @@ -307,9 +307,8 @@ static void luaK_goiffalse (FuncState *fs, expdesc *v, int keepvalue) { | |||
| 307 | 307 | ||
| 308 | 308 | ||
| 309 | static int code_label (FuncState *fs, OpCode op, int arg) { | 309 | static int code_label (FuncState *fs, OpCode op, int arg) { |
| 310 | int j = luaK_getlabel(fs); | 310 | luaK_getlabel(fs); /* those instructions may be jump targets */ |
| 311 | luaK_code1(fs, op, arg); | 311 | return luaK_code1(fs, op, arg); |
| 312 | return j; | ||
| 313 | } | 312 | } |
| 314 | 313 | ||
| 315 | 314 | ||
| @@ -624,9 +623,17 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) { | |||
| 624 | case iS: i = CREATE_S(o, arg1); break; | 623 | case iS: i = CREATE_S(o, arg1); break; |
| 625 | case iAB: i = CREATE_AB(o, arg1, arg2); break; | 624 | case iAB: i = CREATE_AB(o, arg1, arg2); break; |
| 626 | } | 625 | } |
| 627 | /* put new instruction in code array */ | 626 | /* check space for new instruction plus eventual SETLINE */ |
| 628 | luaM_growvector(fs->L, fs->f->code, fs->pc, 1, Instruction, | 627 | luaM_growvector(fs->L, fs->f->code, fs->pc, 2, Instruction, |
| 629 | "code size overflow", MAX_INT); | 628 | "code size overflow", MAX_INT); |
| 629 | /* check the need for SETLINE */ | ||
| 630 | if (fs->debug && fs->ls->lastline != fs->lastsetline) { | ||
| 631 | LexState *ls = fs->ls; | ||
| 632 | luaX_checklimit(ls, ls->lastline, MAXARG_U, "lines in a chunk"); | ||
| 633 | fs->f->code[fs->pc++] = CREATE_U(OP_SETLINE, ls->lastline); | ||
| 634 | fs->lastsetline = ls->lastline; | ||
| 635 | } | ||
| 636 | /* put new instruction in code array */ | ||
| 630 | fs->f->code[fs->pc] = i; | 637 | fs->f->code[fs->pc] = i; |
| 631 | return fs->pc++; | 638 | return fs->pc++; |
| 632 | } | 639 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: llex.c,v 1.63 2000/06/12 13:52:05 roberto Exp roberto $ | 2 | ** $Id: llex.c,v 1.64 2000/06/19 18:05:14 roberto Exp roberto $ |
| 3 | ** Lexical Analyzer | 3 | ** Lexical Analyzer |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -138,6 +138,7 @@ void luaX_setinput (lua_State *L, LexState *LS, ZIO *z, TString *source) { | |||
| 138 | LS->z = z; | 138 | LS->z = z; |
| 139 | LS->fs = NULL; | 139 | LS->fs = NULL; |
| 140 | LS->linenumber = 1; | 140 | LS->linenumber = 1; |
| 141 | LS->lastline = 1; | ||
| 141 | LS->source = source; | 142 | LS->source = source; |
| 142 | next(LS); /* read first char */ | 143 | next(LS); /* read first char */ |
| 143 | if (LS->current == '#') { | 144 | if (LS->current == '#') { |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: llex.h,v 1.28 2000/05/26 14:04:04 roberto Exp roberto $ | 2 | ** $Id: llex.h,v 1.29 2000/06/19 18:05:14 roberto Exp roberto $ |
| 3 | ** Lexical Analyzer | 3 | ** Lexical Analyzer |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -51,6 +51,7 @@ typedef struct LexState { | |||
| 51 | struct lua_State *L; | 51 | struct lua_State *L; |
| 52 | struct zio *z; /* input stream */ | 52 | struct zio *z; /* input stream */ |
| 53 | int linenumber; /* input line counter */ | 53 | int linenumber; /* input line counter */ |
| 54 | int lastline; /* line of last token `consumed' */ | ||
| 54 | TString *source; /* current source name */ | 55 | TString *source; /* current source name */ |
| 55 | } LexState; | 56 | } LexState; |
| 56 | 57 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lparser.c,v 1.96 2000/06/19 18:05:14 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 1.97 2000/06/19 18:26:23 roberto Exp roberto $ |
| 3 | ** LL(1) Parser and code generator for Lua | 3 | ** LL(1) Parser and code generator for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -56,6 +56,7 @@ static void exp1 (LexState *ls); | |||
| 56 | 56 | ||
| 57 | 57 | ||
| 58 | static void next (LexState *ls) { | 58 | static void next (LexState *ls) { |
| 59 | ls->lastline = ls->linenumber; | ||
| 59 | if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ | 60 | if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ |
| 60 | ls->t = ls->lookahead; /* use this one */ | 61 | ls->t = ls->lookahead; /* use this one */ |
| 61 | ls->lookahead.token = TK_EOS; /* and discharge it */ | 62 | ls->lookahead.token = TK_EOS; /* and discharge it */ |
| @@ -91,16 +92,6 @@ static void check_condition (LexState *ls, int c, const char *msg) { | |||
| 91 | } | 92 | } |
| 92 | 93 | ||
| 93 | 94 | ||
| 94 | static void setline (LexState *ls) { | ||
| 95 | FuncState *fs = ls->fs; | ||
| 96 | if (ls->L->debug && ls->linenumber != fs->lastsetline) { | ||
| 97 | luaX_checklimit(ls, ls->linenumber, MAXARG_U, "lines in a chunk"); | ||
| 98 | luaK_code1(fs, OP_SETLINE, ls->linenumber); | ||
| 99 | fs->lastsetline = ls->linenumber; | ||
| 100 | } | ||
| 101 | } | ||
| 102 | |||
| 103 | |||
| 104 | static int optional (LexState *ls, int c) { | 95 | static int optional (LexState *ls, int c) { |
| 105 | if (ls->t.token == c) { | 96 | if (ls->t.token == c) { |
| 106 | next(ls); | 97 | next(ls); |
| @@ -128,18 +119,6 @@ static void check_match (LexState *ls, int what, int who, int where) { | |||
| 128 | } | 119 | } |
| 129 | 120 | ||
| 130 | 121 | ||
| 131 | static void setline_and_next (LexState *ls) { | ||
| 132 | setline(ls); | ||
| 133 | next(ls); | ||
| 134 | } | ||
| 135 | |||
| 136 | |||
| 137 | static void check_END (LexState *ls, int who, int where) { | ||
| 138 | setline(ls); /* setline for END */ | ||
| 139 | check_match(ls, TK_END, who, where); | ||
| 140 | } | ||
| 141 | |||
| 142 | |||
| 143 | static int string_constant (FuncState *fs, TString *s) { | 122 | static int string_constant (FuncState *fs, TString *s) { |
| 144 | Proto *f = fs->f; | 123 | Proto *f = fs->f; |
| 145 | int c = s->u.s.constindex; | 124 | int c = s->u.s.constindex; |
| @@ -175,9 +154,7 @@ static int checkname (LexState *ls) { | |||
| 175 | 154 | ||
| 176 | static void luaI_registerlocalvar (LexState *ls, TString *varname, int line) { | 155 | static void luaI_registerlocalvar (LexState *ls, TString *varname, int line) { |
| 177 | FuncState *fs = ls->fs; | 156 | FuncState *fs = ls->fs; |
| 178 | /* start debug only when there are no active local variables, | 157 | if (fs->debug) { |
| 179 | but keep going after starting */ | ||
| 180 | if ((ls->L->debug && fs->nlocalvar == 0) || fs->nvars != 0) { | ||
| 181 | Proto *f = fs->f; | 158 | Proto *f = fs->f; |
| 182 | luaM_growvector(ls->L, f->locvars, fs->nvars, 1, LocVar, "", MAX_INT); | 159 | luaM_growvector(ls->L, f->locvars, fs->nvars, 1, LocVar, "", MAX_INT); |
| 183 | f->locvars[fs->nvars].varname = varname; | 160 | f->locvars[fs->nvars].varname = varname; |
| @@ -368,10 +345,8 @@ static void close_func (LexState *ls) { | |||
| 368 | luaM_reallocvector(L, f->kstr, f->nkstr, TString *); | 345 | luaM_reallocvector(L, f->kstr, f->nkstr, TString *); |
| 369 | luaM_reallocvector(L, f->knum, f->nknum, Number); | 346 | luaM_reallocvector(L, f->knum, f->nknum, Number); |
| 370 | luaM_reallocvector(L, f->kproto, f->nkproto, Proto *); | 347 | luaM_reallocvector(L, f->kproto, f->nkproto, Proto *); |
| 371 | if (f->locvars) { /* debug information? */ | 348 | luaI_registerlocalvar(ls, NULL, -1); /* flag end of vector */ |
| 372 | luaI_registerlocalvar(ls, NULL, -1); /* flag end of vector */ | 349 | luaM_reallocvector(L, f->locvars, fs->nvars, LocVar); |
| 373 | luaM_reallocvector(L, f->locvars, fs->nvars, LocVar); | ||
| 374 | } | ||
| 375 | ls->fs = fs->prev; | 350 | ls->fs = fs->prev; |
| 376 | LUA_ASSERT(L, fs->bl == NULL, "wrong list end"); | 351 | LUA_ASSERT(L, fs->bl == NULL, "wrong list end"); |
| 377 | } | 352 | } |
| @@ -383,6 +358,7 @@ Proto *luaY_parser (lua_State *L, ZIO *z) { | |||
| 383 | luaX_setinput(L, &lexstate, z, luaS_new(L, zname(z))); | 358 | luaX_setinput(L, &lexstate, z, luaS_new(L, zname(z))); |
| 384 | open_func(&lexstate, &funcstate); | 359 | open_func(&lexstate, &funcstate); |
| 385 | next(&lexstate); /* read first token */ | 360 | next(&lexstate); /* read first token */ |
| 361 | funcstate.debug = L->debug; /* previous `next' may scan a pragma */ | ||
| 386 | chunk(&lexstate); | 362 | chunk(&lexstate); |
| 387 | check_condition(&lexstate, (lexstate.t.token == TK_EOS), "<eof> expected"); | 363 | check_condition(&lexstate, (lexstate.t.token == TK_EOS), "<eof> expected"); |
| 388 | close_func(&lexstate); | 364 | close_func(&lexstate); |
| @@ -639,7 +615,6 @@ static void constructor (LexState *ls) { | |||
| 639 | 615 | ||
| 640 | static void simpleexp (LexState *ls, expdesc *v) { | 616 | static void simpleexp (LexState *ls, expdesc *v) { |
| 641 | FuncState *fs = ls->fs; | 617 | FuncState *fs = ls->fs; |
| 642 | setline(ls); | ||
| 643 | switch (ls->t.token) { | 618 | switch (ls->t.token) { |
| 644 | case TK_NUMBER: { /* simpleexp -> NUMBER */ | 619 | case TK_NUMBER: { /* simpleexp -> NUMBER */ |
| 645 | Number r = ls->t.seminfo.r; | 620 | Number r = ls->t.seminfo.r; |
| @@ -819,13 +794,13 @@ static void whilestat (LexState *ls, int line) { | |||
| 819 | expdesc v; | 794 | expdesc v; |
| 820 | Breaklabel bl; | 795 | Breaklabel bl; |
| 821 | enterbreak(fs, &bl); | 796 | enterbreak(fs, &bl); |
| 822 | setline_and_next(ls); /* trace WHILE when looping */ | 797 | next(ls); |
| 823 | cond(ls, &v); | 798 | cond(ls, &v); |
| 824 | check(ls, TK_DO); | 799 | check(ls, TK_DO); |
| 825 | block(ls); | 800 | block(ls); |
| 826 | luaK_patchlist(fs, luaK_jump(fs), while_init); | 801 | luaK_patchlist(fs, luaK_jump(fs), while_init); |
| 827 | luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); | 802 | luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); |
| 828 | check_END(ls, TK_WHILE, line); /* trace END when loop ends */ | 803 | check_match(ls, TK_END, TK_WHILE, line); |
| 829 | leavebreak(fs, &bl); | 804 | leavebreak(fs, &bl); |
| 830 | } | 805 | } |
| 831 | 806 | ||
| @@ -837,7 +812,7 @@ static void repeatstat (LexState *ls, int line) { | |||
| 837 | expdesc v; | 812 | expdesc v; |
| 838 | Breaklabel bl; | 813 | Breaklabel bl; |
| 839 | enterbreak(fs, &bl); | 814 | enterbreak(fs, &bl); |
| 840 | setline_and_next(ls); /* trace REPEAT when looping */ | 815 | next(ls); |
| 841 | block(ls); | 816 | block(ls); |
| 842 | check_match(ls, TK_UNTIL, TK_REPEAT, line); | 817 | check_match(ls, TK_UNTIL, TK_REPEAT, line); |
| 843 | cond(ls, &v); | 818 | cond(ls, &v); |
| @@ -905,23 +880,22 @@ static void forstat (LexState *ls, int line) { | |||
| 905 | TString *varname; | 880 | TString *varname; |
| 906 | Breaklabel bl; | 881 | Breaklabel bl; |
| 907 | enterbreak(fs, &bl); | 882 | enterbreak(fs, &bl); |
| 908 | setline_and_next(ls); /* skip `for' */ | 883 | next(ls); /* skip `for' */ |
| 909 | varname = str_checkname(ls); /* first variable name */ | 884 | varname = str_checkname(ls); /* first variable name */ |
| 910 | switch (ls->t.token) { | 885 | switch (ls->t.token) { |
| 911 | case '=': fornum(ls, varname); break; | 886 | case '=': fornum(ls, varname); break; |
| 912 | case ',': forlist(ls, varname); break; | 887 | case ',': forlist(ls, varname); break; |
| 913 | default: luaK_error(ls, "`=' or `,' expected"); | 888 | default: luaK_error(ls, "`=' or `,' expected"); |
| 914 | } | 889 | } |
| 915 | check_END(ls, TK_FOR, line); | 890 | check_match(ls, TK_END, TK_FOR, line); |
| 916 | leavebreak(fs, &bl); | 891 | leavebreak(fs, &bl); |
| 917 | } | 892 | } |
| 918 | 893 | ||
| 919 | 894 | ||
| 920 | static void test_then_block (LexState *ls, expdesc *v) { | 895 | static void test_then_block (LexState *ls, expdesc *v) { |
| 921 | /* test_then_block -> [IF | ELSEIF] cond THEN block */ | 896 | /* test_then_block -> [IF | ELSEIF] cond THEN block */ |
| 922 | setline_and_next(ls); /* skip IF or ELSEIF */ | 897 | next(ls); /* skip IF or ELSEIF */ |
| 923 | cond(ls, v); | 898 | cond(ls, v); |
| 924 | setline(ls); /* to trace the THEN */ | ||
| 925 | check(ls, TK_THEN); | 899 | check(ls, TK_THEN); |
| 926 | block(ls); /* `then' part */ | 900 | block(ls); /* `then' part */ |
| 927 | } | 901 | } |
| @@ -941,13 +915,13 @@ static void ifstat (LexState *ls, int line) { | |||
| 941 | if (ls->t.token == TK_ELSE) { | 915 | if (ls->t.token == TK_ELSE) { |
| 942 | luaK_concat(fs, &escapelist, luaK_jump(fs)); | 916 | luaK_concat(fs, &escapelist, luaK_jump(fs)); |
| 943 | luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); | 917 | luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); |
| 944 | setline_and_next(ls); /* skip ELSE */ | 918 | next(ls); /* skip ELSE */ |
| 945 | block(ls); /* `else' part */ | 919 | block(ls); /* `else' part */ |
| 946 | } | 920 | } |
| 947 | else | 921 | else |
| 948 | luaK_concat(fs, &escapelist, v.u.l.f); | 922 | luaK_concat(fs, &escapelist, v.u.l.f); |
| 949 | luaK_patchlist(fs, escapelist, luaK_getlabel(fs)); | 923 | luaK_patchlist(fs, escapelist, luaK_getlabel(fs)); |
| 950 | check_END(ls, TK_IF, line); | 924 | check_match(ls, TK_END, TK_IF, line); |
| 951 | } | 925 | } |
| 952 | 926 | ||
| 953 | 927 | ||
| @@ -956,7 +930,7 @@ static void localstat (LexState *ls) { | |||
| 956 | int nvars = 0; | 930 | int nvars = 0; |
| 957 | int nexps; | 931 | int nexps; |
| 958 | do { | 932 | do { |
| 959 | setline_and_next(ls); /* skip LOCAL or ',' */ | 933 | next(ls); /* skip LOCAL or ',' */ |
| 960 | store_localvar(ls, str_checkname(ls), nvars++); | 934 | store_localvar(ls, str_checkname(ls), nvars++); |
| 961 | } while (ls->t.token == ','); | 935 | } while (ls->t.token == ','); |
| 962 | if (optional(ls, '=')) | 936 | if (optional(ls, '=')) |
| @@ -989,7 +963,7 @@ static void funcstat (LexState *ls, int line) { | |||
| 989 | expdesc v; | 963 | expdesc v; |
| 990 | check_condition(ls, (ls->fs->prev == NULL), | 964 | check_condition(ls, (ls->fs->prev == NULL), |
| 991 | "cannot nest this kind of function declaration"); | 965 | "cannot nest this kind of function declaration"); |
| 992 | setline_and_next(ls); /* skip FUNCTION */ | 966 | next(ls); /* skip FUNCTION */ |
| 993 | needself = funcname(ls, &v); | 967 | needself = funcname(ls, &v); |
| 994 | body(ls, needself, line); | 968 | body(ls, needself, line); |
| 995 | luaK_storevar(ls, &v); | 969 | luaK_storevar(ls, &v); |
| @@ -1000,7 +974,6 @@ static void namestat (LexState *ls) { | |||
| 1000 | /* stat -> func | ['%'] NAME assignment */ | 974 | /* stat -> func | ['%'] NAME assignment */ |
| 1001 | FuncState *fs = ls->fs; | 975 | FuncState *fs = ls->fs; |
| 1002 | expdesc v; | 976 | expdesc v; |
| 1003 | setline(ls); | ||
| 1004 | var_or_func(ls, &v); | 977 | var_or_func(ls, &v); |
| 1005 | if (v.k == VEXP) { /* stat -> func */ | 978 | if (v.k == VEXP) { /* stat -> func */ |
| 1006 | check_condition(ls, luaK_lastisopen(fs), "syntax error"); /* an upvalue? */ | 979 | check_condition(ls, luaK_lastisopen(fs), "syntax error"); /* an upvalue? */ |
| @@ -1016,7 +989,7 @@ static void namestat (LexState *ls) { | |||
| 1016 | static void retstat (LexState *ls) { | 989 | static void retstat (LexState *ls) { |
| 1017 | /* stat -> RETURN explist */ | 990 | /* stat -> RETURN explist */ |
| 1018 | FuncState *fs = ls->fs; | 991 | FuncState *fs = ls->fs; |
| 1019 | setline_and_next(ls); /* skip RETURN */ | 992 | next(ls); /* skip RETURN */ |
| 1020 | if (!block_follow(ls->t.token)) | 993 | if (!block_follow(ls->t.token)) |
| 1021 | explist1(ls); /* optional return values */ | 994 | explist1(ls); /* optional return values */ |
| 1022 | luaK_code1(fs, OP_RETURN, ls->fs->nlocalvar); | 995 | luaK_code1(fs, OP_RETURN, ls->fs->nlocalvar); |
| @@ -1031,7 +1004,7 @@ static void breakstat (LexState *ls) { | |||
| 1031 | Breaklabel *bl = fs->bl; | 1004 | Breaklabel *bl = fs->bl; |
| 1032 | if (!bl) | 1005 | if (!bl) |
| 1033 | luaK_error(ls, "no loop to break"); | 1006 | luaK_error(ls, "no loop to break"); |
| 1034 | setline_and_next(ls); /* skip BREAK */ | 1007 | next(ls); /* skip BREAK */ |
| 1035 | luaK_adjuststack(fs, currentlevel - bl->stacklevel); | 1008 | luaK_adjuststack(fs, currentlevel - bl->stacklevel); |
| 1036 | luaK_concat(fs, &bl->breaklist, luaK_jump(fs)); | 1009 | luaK_concat(fs, &bl->breaklist, luaK_jump(fs)); |
| 1037 | fs->stacklevel = currentlevel; | 1010 | fs->stacklevel = currentlevel; |
| @@ -1050,9 +1023,9 @@ static int stat (LexState *ls) { | |||
| 1050 | return 0; | 1023 | return 0; |
| 1051 | } | 1024 | } |
| 1052 | case TK_DO: { /* stat -> DO block END */ | 1025 | case TK_DO: { /* stat -> DO block END */ |
| 1053 | setline_and_next(ls); /* skip DO */ | 1026 | next(ls); /* skip DO */ |
| 1054 | block(ls); | 1027 | block(ls); |
| 1055 | check_END(ls, TK_DO, line); | 1028 | check_match(ls, TK_END, TK_DO, line); |
| 1056 | return 0; | 1029 | return 0; |
| 1057 | } | 1030 | } |
| 1058 | case TK_FOR: { /* stat -> forstat */ | 1031 | case TK_FOR: { /* stat -> forstat */ |
| @@ -1113,13 +1086,14 @@ static void body (LexState *ls, int needself, int line) { | |||
| 1113 | FuncState new_fs; | 1086 | FuncState new_fs; |
| 1114 | open_func(ls, &new_fs); | 1087 | open_func(ls, &new_fs); |
| 1115 | new_fs.f->lineDefined = line; | 1088 | new_fs.f->lineDefined = line; |
| 1089 | new_fs.debug = ls->L->debug; | ||
| 1116 | check(ls, '('); | 1090 | check(ls, '('); |
| 1117 | if (needself) | 1091 | if (needself) |
| 1118 | add_localvar(ls, "self"); | 1092 | add_localvar(ls, "self"); |
| 1119 | parlist(ls); | 1093 | parlist(ls); |
| 1120 | check(ls, ')'); | 1094 | check(ls, ')'); |
| 1121 | chunk(ls); | 1095 | chunk(ls); |
| 1122 | check_END(ls, TK_FUNCTION, line); | 1096 | check_match(ls, TK_END, TK_FUNCTION, line); |
| 1123 | close_func(ls); | 1097 | close_func(ls); |
| 1124 | pushclosure(ls, &new_fs); | 1098 | pushclosure(ls, &new_fs); |
| 1125 | } | 1099 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lparser.h,v 1.16 2000/04/06 17:36:52 roberto Exp roberto $ | 2 | ** $Id: lparser.h,v 1.17 2000/05/25 18:26:42 roberto Exp roberto $ |
| 3 | ** LL(1) Parser and code generator for Lua | 3 | ** LL(1) Parser and code generator for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -49,6 +49,7 @@ typedef struct FuncState { | |||
| 49 | int nupvalues; /* number of upvalues */ | 49 | int nupvalues; /* number of upvalues */ |
| 50 | int nvars; /* number of entries in f->locvars */ | 50 | int nvars; /* number of entries in f->locvars */ |
| 51 | int lastsetline; /* line where last SETLINE was issued */ | 51 | int lastsetline; /* line where last SETLINE was issued */ |
| 52 | int debug; /* flag to generate debug information */ | ||
| 52 | struct Breaklabel *bl; /* chain of breakable blocks */ | 53 | struct Breaklabel *bl; /* chain of breakable blocks */ |
| 53 | expdesc upvalues[MAXUPVALUES]; /* upvalues */ | 54 | expdesc upvalues[MAXUPVALUES]; /* upvalues */ |
| 54 | TString *localvar[MAXLOCALS]; /* store local variable names */ | 55 | TString *localvar[MAXLOCALS]; /* store local variable names */ |
