aboutsummaryrefslogtreecommitdiff
path: root/src/lj_parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_parse.c')
-rw-r--r--src/lj_parse.c166
1 files changed, 68 insertions, 98 deletions
diff --git a/src/lj_parse.c b/src/lj_parse.c
index 7ff7d728..cdb89baf 100644
--- a/src/lj_parse.c
+++ b/src/lj_parse.c
@@ -13,6 +13,7 @@
13#include "lj_gc.h" 13#include "lj_gc.h"
14#include "lj_err.h" 14#include "lj_err.h"
15#include "lj_debug.h" 15#include "lj_debug.h"
16#include "lj_buf.h"
16#include "lj_str.h" 17#include "lj_str.h"
17#include "lj_tab.h" 18#include "lj_tab.h"
18#include "lj_func.h" 19#include "lj_func.h"
@@ -21,6 +22,7 @@
21#if LJ_HASFFI 22#if LJ_HASFFI
22#include "lj_ctype.h" 23#include "lj_ctype.h"
23#endif 24#endif
25#include "lj_strfmt.h"
24#include "lj_lex.h" 26#include "lj_lex.h"
25#include "lj_parse.h" 27#include "lj_parse.h"
26#include "lj_vm.h" 28#include "lj_vm.h"
@@ -165,12 +167,12 @@ LJ_STATIC_ASSERT((int)BC_MODVV-(int)BC_ADDVV == (int)OPR_MOD-(int)OPR_ADD);
165 167
166LJ_NORET LJ_NOINLINE static void err_syntax(LexState *ls, ErrMsg em) 168LJ_NORET LJ_NOINLINE static void err_syntax(LexState *ls, ErrMsg em)
167{ 169{
168 lj_lex_error(ls, ls->token, em); 170 lj_lex_error(ls, ls->tok, em);
169} 171}
170 172
171LJ_NORET LJ_NOINLINE static void err_token(LexState *ls, LexToken token) 173LJ_NORET LJ_NOINLINE static void err_token(LexState *ls, LexToken tok)
172{ 174{
173 lj_lex_error(ls, ls->token, LJ_ERR_XTOKEN, lj_lex_token2str(ls, token)); 175 lj_lex_error(ls, ls->tok, LJ_ERR_XTOKEN, lj_lex_token2str(ls, tok));
174} 176}
175 177
176LJ_NORET static void err_limit(FuncState *fs, uint32_t limit, const char *what) 178LJ_NORET static void err_limit(FuncState *fs, uint32_t limit, const char *what)
@@ -981,7 +983,7 @@ static void bcemit_unop(FuncState *fs, BCOp op, ExpDesc *e)
981/* Check and consume optional token. */ 983/* Check and consume optional token. */
982static int lex_opt(LexState *ls, LexToken tok) 984static int lex_opt(LexState *ls, LexToken tok)
983{ 985{
984 if (ls->token == tok) { 986 if (ls->tok == tok) {
985 lj_lex_next(ls); 987 lj_lex_next(ls);
986 return 1; 988 return 1;
987 } 989 }
@@ -991,7 +993,7 @@ static int lex_opt(LexState *ls, LexToken tok)
991/* Check and consume token. */ 993/* Check and consume token. */
992static void lex_check(LexState *ls, LexToken tok) 994static void lex_check(LexState *ls, LexToken tok)
993{ 995{
994 if (ls->token != tok) 996 if (ls->tok != tok)
995 err_token(ls, tok); 997 err_token(ls, tok);
996 lj_lex_next(ls); 998 lj_lex_next(ls);
997} 999}
@@ -1005,7 +1007,7 @@ static void lex_match(LexState *ls, LexToken what, LexToken who, BCLine line)
1005 } else { 1007 } else {
1006 const char *swhat = lj_lex_token2str(ls, what); 1008 const char *swhat = lj_lex_token2str(ls, what);
1007 const char *swho = lj_lex_token2str(ls, who); 1009 const char *swho = lj_lex_token2str(ls, who);
1008 lj_lex_error(ls, ls->token, LJ_ERR_XMATCH, swhat, swho, line); 1010 lj_lex_error(ls, ls->tok, LJ_ERR_XMATCH, swhat, swho, line);
1009 } 1011 }
1010 } 1012 }
1011} 1013}
@@ -1014,9 +1016,9 @@ static void lex_match(LexState *ls, LexToken what, LexToken who, BCLine line)
1014static GCstr *lex_str(LexState *ls) 1016static GCstr *lex_str(LexState *ls)
1015{ 1017{
1016 GCstr *s; 1018 GCstr *s;
1017 if (ls->token != TK_name && (LJ_52 || ls->token != TK_goto)) 1019 if (ls->tok != TK_name && (LJ_52 || ls->tok != TK_goto))
1018 err_token(ls, TK_name); 1020 err_token(ls, TK_name);
1019 s = strV(&ls->tokenval); 1021 s = strV(&ls->tokval);
1020 lj_lex_next(ls); 1022 lj_lex_next(ls);
1021 return s; 1023 return s;
1022} 1024}
@@ -1429,78 +1431,46 @@ static void fs_fixup_line(FuncState *fs, GCproto *pt,
1429 } 1431 }
1430} 1432}
1431 1433
1432/* Resize buffer if needed. */
1433static LJ_NOINLINE void fs_buf_resize(LexState *ls, MSize len)
1434{
1435 MSize sz = ls->sb.sz * 2;
1436 while (ls->sb.n + len > sz) sz = sz * 2;
1437 lj_str_resizebuf(ls->L, &ls->sb, sz);
1438}
1439
1440static LJ_AINLINE void fs_buf_need(LexState *ls, MSize len)
1441{
1442 if (LJ_UNLIKELY(ls->sb.n + len > ls->sb.sz))
1443 fs_buf_resize(ls, len);
1444}
1445
1446/* Add string to buffer. */
1447static void fs_buf_str(LexState *ls, const char *str, MSize len)
1448{
1449 char *p = ls->sb.buf + ls->sb.n;
1450 MSize i;
1451 ls->sb.n += len;
1452 for (i = 0; i < len; i++) p[i] = str[i];
1453}
1454
1455/* Add ULEB128 value to buffer. */
1456static void fs_buf_uleb128(LexState *ls, uint32_t v)
1457{
1458 MSize n = ls->sb.n;
1459 uint8_t *p = (uint8_t *)ls->sb.buf;
1460 for (; v >= 0x80; v >>= 7)
1461 p[n++] = (uint8_t)((v & 0x7f) | 0x80);
1462 p[n++] = (uint8_t)v;
1463 ls->sb.n = n;
1464}
1465
1466/* Prepare variable info for prototype. */ 1434/* Prepare variable info for prototype. */
1467static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar) 1435static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar)
1468{ 1436{
1469 VarInfo *vs =ls->vstack, *ve; 1437 VarInfo *vs =ls->vstack, *ve;
1470 MSize i, n; 1438 MSize i, n;
1471 BCPos lastpc; 1439 BCPos lastpc;
1472 lj_str_resetbuf(&ls->sb); /* Copy to temp. string buffer. */ 1440 lj_buf_reset(&ls->sb); /* Copy to temp. string buffer. */
1473 /* Store upvalue names. */ 1441 /* Store upvalue names. */
1474 for (i = 0, n = fs->nuv; i < n; i++) { 1442 for (i = 0, n = fs->nuv; i < n; i++) {
1475 GCstr *s = strref(vs[fs->uvmap[i]].name); 1443 GCstr *s = strref(vs[fs->uvmap[i]].name);
1476 MSize len = s->len+1; 1444 MSize len = s->len+1;
1477 fs_buf_need(ls, len); 1445 char *p = lj_buf_more(&ls->sb, len);
1478 fs_buf_str(ls, strdata(s), len); 1446 p = lj_buf_wmem(p, strdata(s), len);
1447 setsbufP(&ls->sb, p);
1479 } 1448 }
1480 *ofsvar = ls->sb.n; 1449 *ofsvar = sbuflen(&ls->sb);
1481 lastpc = 0; 1450 lastpc = 0;
1482 /* Store local variable names and compressed ranges. */ 1451 /* Store local variable names and compressed ranges. */
1483 for (ve = vs + ls->vtop, vs += fs->vbase; vs < ve; vs++) { 1452 for (ve = vs + ls->vtop, vs += fs->vbase; vs < ve; vs++) {
1484 if (!gola_isgotolabel(vs)) { 1453 if (!gola_isgotolabel(vs)) {
1485 GCstr *s = strref(vs->name); 1454 GCstr *s = strref(vs->name);
1486 BCPos startpc; 1455 BCPos startpc;
1456 char *p;
1487 if ((uintptr_t)s < VARNAME__MAX) { 1457 if ((uintptr_t)s < VARNAME__MAX) {
1488 fs_buf_need(ls, 1 + 2*5); 1458 p = lj_buf_more(&ls->sb, 1 + 2*5);
1489 ls->sb.buf[ls->sb.n++] = (uint8_t)(uintptr_t)s; 1459 *p++ = (char)(uintptr_t)s;
1490 } else { 1460 } else {
1491 MSize len = s->len+1; 1461 MSize len = s->len+1;
1492 fs_buf_need(ls, len + 2*5); 1462 p = lj_buf_more(&ls->sb, len + 2*5);
1493 fs_buf_str(ls, strdata(s), len); 1463 p = lj_buf_wmem(p, strdata(s), len);
1494 } 1464 }
1495 startpc = vs->startpc; 1465 startpc = vs->startpc;
1496 fs_buf_uleb128(ls, startpc-lastpc); 1466 p = lj_strfmt_wuleb128(p, startpc-lastpc);
1497 fs_buf_uleb128(ls, vs->endpc-startpc); 1467 p = lj_strfmt_wuleb128(p, vs->endpc-startpc);
1468 setsbufP(&ls->sb, p);
1498 lastpc = startpc; 1469 lastpc = startpc;
1499 } 1470 }
1500 } 1471 }
1501 fs_buf_need(ls, 1); 1472 lj_buf_putb(&ls->sb, '\0'); /* Terminator for varinfo. */
1502 ls->sb.buf[ls->sb.n++] = '\0'; /* Terminator for varinfo. */ 1473 return sbuflen(&ls->sb);
1503 return ls->sb.n;
1504} 1474}
1505 1475
1506/* Fixup variable info for prototype. */ 1476/* Fixup variable info for prototype. */
@@ -1508,7 +1478,7 @@ static void fs_fixup_var(LexState *ls, GCproto *pt, uint8_t *p, size_t ofsvar)
1508{ 1478{
1509 setmref(pt->uvinfo, p); 1479 setmref(pt->uvinfo, p);
1510 setmref(pt->varinfo, (char *)p + ofsvar); 1480 setmref(pt->varinfo, (char *)p + ofsvar);
1511 memcpy(p, ls->sb.buf, ls->sb.n); /* Copy from temp. string buffer. */ 1481 memcpy(p, sbufB(&ls->sb), sbuflen(&ls->sb)); /* Copy from temp. buffer. */
1512} 1482}
1513#else 1483#else
1514 1484
@@ -1615,7 +1585,7 @@ static GCproto *fs_finish(LexState *ls, BCLine line)
1615 L->top--; /* Pop table of constants. */ 1585 L->top--; /* Pop table of constants. */
1616 ls->vtop = fs->vbase; /* Reset variable stack. */ 1586 ls->vtop = fs->vbase; /* Reset variable stack. */
1617 ls->fs = fs->prev; 1587 ls->fs = fs->prev;
1618 lua_assert(ls->fs != NULL || ls->token == TK_eof); 1588 lua_assert(ls->fs != NULL || ls->tok == TK_eof);
1619 return pt; 1589 return pt;
1620} 1590}
1621 1591
@@ -1737,15 +1707,15 @@ static void expr_table(LexState *ls, ExpDesc *e)
1737 bcreg_reserve(fs, 1); 1707 bcreg_reserve(fs, 1);
1738 freg++; 1708 freg++;
1739 lex_check(ls, '{'); 1709 lex_check(ls, '{');
1740 while (ls->token != '}') { 1710 while (ls->tok != '}') {
1741 ExpDesc key, val; 1711 ExpDesc key, val;
1742 vcall = 0; 1712 vcall = 0;
1743 if (ls->token == '[') { 1713 if (ls->tok == '[') {
1744 expr_bracket(ls, &key); /* Already calls expr_toval. */ 1714 expr_bracket(ls, &key); /* Already calls expr_toval. */
1745 if (!expr_isk(&key)) expr_index(fs, e, &key); 1715 if (!expr_isk(&key)) expr_index(fs, e, &key);
1746 if (expr_isnumk(&key) && expr_numiszero(&key)) needarr = 1; else nhash++; 1716 if (expr_isnumk(&key) && expr_numiszero(&key)) needarr = 1; else nhash++;
1747 lex_check(ls, '='); 1717 lex_check(ls, '=');
1748 } else if ((ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) && 1718 } else if ((ls->tok == TK_name || (!LJ_52 && ls->tok == TK_goto)) &&
1749 lj_lex_lookahead(ls) == '=') { 1719 lj_lex_lookahead(ls) == '=') {
1750 expr_str(ls, &key); 1720 expr_str(ls, &key);
1751 lex_check(ls, '='); 1721 lex_check(ls, '=');
@@ -1838,11 +1808,11 @@ static BCReg parse_params(LexState *ls, int needself)
1838 lex_check(ls, '('); 1808 lex_check(ls, '(');
1839 if (needself) 1809 if (needself)
1840 var_new_lit(ls, nparams++, "self"); 1810 var_new_lit(ls, nparams++, "self");
1841 if (ls->token != ')') { 1811 if (ls->tok != ')') {
1842 do { 1812 do {
1843 if (ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) { 1813 if (ls->tok == TK_name || (!LJ_52 && ls->tok == TK_goto)) {
1844 var_new(ls, nparams++, lex_str(ls)); 1814 var_new(ls, nparams++, lex_str(ls));
1845 } else if (ls->token == TK_dots) { 1815 } else if (ls->tok == TK_dots) {
1846 lj_lex_next(ls); 1816 lj_lex_next(ls);
1847 fs->flags |= PROTO_VARARG; 1817 fs->flags |= PROTO_VARARG;
1848 break; 1818 break;
@@ -1876,7 +1846,7 @@ static void parse_body(LexState *ls, ExpDesc *e, int needself, BCLine line)
1876 fs.bclim = pfs->bclim - pfs->pc; 1846 fs.bclim = pfs->bclim - pfs->pc;
1877 bcemit_AD(&fs, BC_FUNCF, 0, 0); /* Placeholder. */ 1847 bcemit_AD(&fs, BC_FUNCF, 0, 0); /* Placeholder. */
1878 parse_chunk(ls); 1848 parse_chunk(ls);
1879 if (ls->token != TK_end) lex_match(ls, TK_end, TK_function, line); 1849 if (ls->tok != TK_end) lex_match(ls, TK_end, TK_function, line);
1880 pt = fs_finish(ls, (ls->lastline = ls->linenumber)); 1850 pt = fs_finish(ls, (ls->lastline = ls->linenumber));
1881 pfs->bcbase = ls->bcstack + oldbase; /* May have been reallocated. */ 1851 pfs->bcbase = ls->bcstack + oldbase; /* May have been reallocated. */
1882 pfs->bclim = (BCPos)(ls->sizebcstack - oldbase); 1852 pfs->bclim = (BCPos)(ls->sizebcstack - oldbase);
@@ -1915,13 +1885,13 @@ static void parse_args(LexState *ls, ExpDesc *e)
1915 BCIns ins; 1885 BCIns ins;
1916 BCReg base; 1886 BCReg base;
1917 BCLine line = ls->linenumber; 1887 BCLine line = ls->linenumber;
1918 if (ls->token == '(') { 1888 if (ls->tok == '(') {
1919#if !LJ_52 1889#if !LJ_52
1920 if (line != ls->lastline) 1890 if (line != ls->lastline)
1921 err_syntax(ls, LJ_ERR_XAMBIG); 1891 err_syntax(ls, LJ_ERR_XAMBIG);
1922#endif 1892#endif
1923 lj_lex_next(ls); 1893 lj_lex_next(ls);
1924 if (ls->token == ')') { /* f(). */ 1894 if (ls->tok == ')') { /* f(). */
1925 args.k = VVOID; 1895 args.k = VVOID;
1926 } else { 1896 } else {
1927 expr_list(ls, &args); 1897 expr_list(ls, &args);
@@ -1929,11 +1899,11 @@ static void parse_args(LexState *ls, ExpDesc *e)
1929 setbc_b(bcptr(fs, &args), 0); /* Pass on multiple results. */ 1899 setbc_b(bcptr(fs, &args), 0); /* Pass on multiple results. */
1930 } 1900 }
1931 lex_match(ls, ')', '(', line); 1901 lex_match(ls, ')', '(', line);
1932 } else if (ls->token == '{') { 1902 } else if (ls->tok == '{') {
1933 expr_table(ls, &args); 1903 expr_table(ls, &args);
1934 } else if (ls->token == TK_string) { 1904 } else if (ls->tok == TK_string) {
1935 expr_init(&args, VKSTR, 0); 1905 expr_init(&args, VKSTR, 0);
1936 args.u.sval = strV(&ls->tokenval); 1906 args.u.sval = strV(&ls->tokval);
1937 lj_lex_next(ls); 1907 lj_lex_next(ls);
1938 } else { 1908 } else {
1939 err_syntax(ls, LJ_ERR_XFUNARG); 1909 err_syntax(ls, LJ_ERR_XFUNARG);
@@ -1959,32 +1929,32 @@ static void expr_primary(LexState *ls, ExpDesc *v)
1959{ 1929{
1960 FuncState *fs = ls->fs; 1930 FuncState *fs = ls->fs;
1961 /* Parse prefix expression. */ 1931 /* Parse prefix expression. */
1962 if (ls->token == '(') { 1932 if (ls->tok == '(') {
1963 BCLine line = ls->linenumber; 1933 BCLine line = ls->linenumber;
1964 lj_lex_next(ls); 1934 lj_lex_next(ls);
1965 expr(ls, v); 1935 expr(ls, v);
1966 lex_match(ls, ')', '(', line); 1936 lex_match(ls, ')', '(', line);
1967 expr_discharge(ls->fs, v); 1937 expr_discharge(ls->fs, v);
1968 } else if (ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) { 1938 } else if (ls->tok == TK_name || (!LJ_52 && ls->tok == TK_goto)) {
1969 var_lookup(ls, v); 1939 var_lookup(ls, v);
1970 } else { 1940 } else {
1971 err_syntax(ls, LJ_ERR_XSYMBOL); 1941 err_syntax(ls, LJ_ERR_XSYMBOL);
1972 } 1942 }
1973 for (;;) { /* Parse multiple expression suffixes. */ 1943 for (;;) { /* Parse multiple expression suffixes. */
1974 if (ls->token == '.') { 1944 if (ls->tok == '.') {
1975 expr_field(ls, v); 1945 expr_field(ls, v);
1976 } else if (ls->token == '[') { 1946 } else if (ls->tok == '[') {
1977 ExpDesc key; 1947 ExpDesc key;
1978 expr_toanyreg(fs, v); 1948 expr_toanyreg(fs, v);
1979 expr_bracket(ls, &key); 1949 expr_bracket(ls, &key);
1980 expr_index(fs, v, &key); 1950 expr_index(fs, v, &key);
1981 } else if (ls->token == ':') { 1951 } else if (ls->tok == ':') {
1982 ExpDesc key; 1952 ExpDesc key;
1983 lj_lex_next(ls); 1953 lj_lex_next(ls);
1984 expr_str(ls, &key); 1954 expr_str(ls, &key);
1985 bcemit_method(fs, v, &key); 1955 bcemit_method(fs, v, &key);
1986 parse_args(ls, v); 1956 parse_args(ls, v);
1987 } else if (ls->token == '(' || ls->token == TK_string || ls->token == '{') { 1957 } else if (ls->tok == '(' || ls->tok == TK_string || ls->tok == '{') {
1988 expr_tonextreg(fs, v); 1958 expr_tonextreg(fs, v);
1989 parse_args(ls, v); 1959 parse_args(ls, v);
1990 } else { 1960 } else {
@@ -1996,14 +1966,14 @@ static void expr_primary(LexState *ls, ExpDesc *v)
1996/* Parse simple expression. */ 1966/* Parse simple expression. */
1997static void expr_simple(LexState *ls, ExpDesc *v) 1967static void expr_simple(LexState *ls, ExpDesc *v)
1998{ 1968{
1999 switch (ls->token) { 1969 switch (ls->tok) {
2000 case TK_number: 1970 case TK_number:
2001 expr_init(v, (LJ_HASFFI && tviscdata(&ls->tokenval)) ? VKCDATA : VKNUM, 0); 1971 expr_init(v, (LJ_HASFFI && tviscdata(&ls->tokval)) ? VKCDATA : VKNUM, 0);
2002 copyTV(ls->L, &v->u.nval, &ls->tokenval); 1972 copyTV(ls->L, &v->u.nval, &ls->tokval);
2003 break; 1973 break;
2004 case TK_string: 1974 case TK_string:
2005 expr_init(v, VKSTR, 0); 1975 expr_init(v, VKSTR, 0);
2006 v->u.sval = strV(&ls->tokenval); 1976 v->u.sval = strV(&ls->tokval);
2007 break; 1977 break;
2008 case TK_nil: 1978 case TK_nil:
2009 expr_init(v, VKNIL, 0); 1979 expr_init(v, VKNIL, 0);
@@ -2091,11 +2061,11 @@ static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit);
2091static void expr_unop(LexState *ls, ExpDesc *v) 2061static void expr_unop(LexState *ls, ExpDesc *v)
2092{ 2062{
2093 BCOp op; 2063 BCOp op;
2094 if (ls->token == TK_not) { 2064 if (ls->tok == TK_not) {
2095 op = BC_NOT; 2065 op = BC_NOT;
2096 } else if (ls->token == '-') { 2066 } else if (ls->tok == '-') {
2097 op = BC_UNM; 2067 op = BC_UNM;
2098 } else if (ls->token == '#') { 2068 } else if (ls->tok == '#') {
2099 op = BC_LEN; 2069 op = BC_LEN;
2100 } else { 2070 } else {
2101 expr_simple(ls, v); 2071 expr_simple(ls, v);
@@ -2112,7 +2082,7 @@ static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit)
2112 BinOpr op; 2082 BinOpr op;
2113 synlevel_begin(ls); 2083 synlevel_begin(ls);
2114 expr_unop(ls, v); 2084 expr_unop(ls, v);
2115 op = token2binop(ls->token); 2085 op = token2binop(ls->tok);
2116 while (op != OPR_NOBINOPR && priority[op].left > limit) { 2086 while (op != OPR_NOBINOPR && priority[op].left > limit) {
2117 ExpDesc v2; 2087 ExpDesc v2;
2118 BinOpr nextop; 2088 BinOpr nextop;
@@ -2301,9 +2271,9 @@ static void parse_func(LexState *ls, BCLine line)
2301 lj_lex_next(ls); /* Skip 'function'. */ 2271 lj_lex_next(ls); /* Skip 'function'. */
2302 /* Parse function name. */ 2272 /* Parse function name. */
2303 var_lookup(ls, &v); 2273 var_lookup(ls, &v);
2304 while (ls->token == '.') /* Multiple dot-separated fields. */ 2274 while (ls->tok == '.') /* Multiple dot-separated fields. */
2305 expr_field(ls, &v); 2275 expr_field(ls, &v);
2306 if (ls->token == ':') { /* Optional colon to signify method call. */ 2276 if (ls->tok == ':') { /* Optional colon to signify method call. */
2307 needself = 1; 2277 needself = 1;
2308 expr_field(ls, &v); 2278 expr_field(ls, &v);
2309 } 2279 }
@@ -2316,9 +2286,9 @@ static void parse_func(LexState *ls, BCLine line)
2316/* -- Control transfer statements ----------------------------------------- */ 2286/* -- Control transfer statements ----------------------------------------- */
2317 2287
2318/* Check for end of block. */ 2288/* Check for end of block. */
2319static int endofblock(LexToken token) 2289static int parse_isend(LexToken tok)
2320{ 2290{
2321 switch (token) { 2291 switch (tok) {
2322 case TK_else: case TK_elseif: case TK_end: case TK_until: case TK_eof: 2292 case TK_else: case TK_elseif: case TK_end: case TK_until: case TK_eof:
2323 return 1; 2293 return 1;
2324 default: 2294 default:
@@ -2333,7 +2303,7 @@ static void parse_return(LexState *ls)
2333 FuncState *fs = ls->fs; 2303 FuncState *fs = ls->fs;
2334 lj_lex_next(ls); /* Skip 'return'. */ 2304 lj_lex_next(ls); /* Skip 'return'. */
2335 fs->flags |= PROTO_HAS_RETURN; 2305 fs->flags |= PROTO_HAS_RETURN;
2336 if (endofblock(ls->token) || ls->token == ';') { /* Bare return. */ 2306 if (parse_isend(ls->tok) || ls->tok == ';') { /* Bare return. */
2337 ins = BCINS_AD(BC_RET0, 0, 1); 2307 ins = BCINS_AD(BC_RET0, 0, 1);
2338 } else { /* Return with one or more values. */ 2308 } else { /* Return with one or more values. */
2339 ExpDesc e; /* Receives the _last_ expression in the list. */ 2309 ExpDesc e; /* Receives the _last_ expression in the list. */
@@ -2399,18 +2369,18 @@ static void parse_label(LexState *ls)
2399 lex_check(ls, TK_label); 2369 lex_check(ls, TK_label);
2400 /* Recursively parse trailing statements: labels and ';' (Lua 5.2 only). */ 2370 /* Recursively parse trailing statements: labels and ';' (Lua 5.2 only). */
2401 for (;;) { 2371 for (;;) {
2402 if (ls->token == TK_label) { 2372 if (ls->tok == TK_label) {
2403 synlevel_begin(ls); 2373 synlevel_begin(ls);
2404 parse_label(ls); 2374 parse_label(ls);
2405 synlevel_end(ls); 2375 synlevel_end(ls);
2406 } else if (LJ_52 && ls->token == ';') { 2376 } else if (LJ_52 && ls->tok == ';') {
2407 lj_lex_next(ls); 2377 lj_lex_next(ls);
2408 } else { 2378 } else {
2409 break; 2379 break;
2410 } 2380 }
2411 } 2381 }
2412 /* Trailing label is considered to be outside of scope. */ 2382 /* Trailing label is considered to be outside of scope. */
2413 if (endofblock(ls->token) && ls->token != TK_until) 2383 if (parse_isend(ls->tok) && ls->tok != TK_until)
2414 ls->vstack[idx].slot = fs->bl->nactvar; 2384 ls->vstack[idx].slot = fs->bl->nactvar;
2415 gola_resolve(ls, fs->bl, idx); 2385 gola_resolve(ls, fs->bl, idx);
2416} 2386}
@@ -2594,9 +2564,9 @@ static void parse_for(LexState *ls, BCLine line)
2594 fscope_begin(fs, &bl, FSCOPE_LOOP); 2564 fscope_begin(fs, &bl, FSCOPE_LOOP);
2595 lj_lex_next(ls); /* Skip 'for'. */ 2565 lj_lex_next(ls); /* Skip 'for'. */
2596 varname = lex_str(ls); /* Get first variable name. */ 2566 varname = lex_str(ls); /* Get first variable name. */
2597 if (ls->token == '=') 2567 if (ls->tok == '=')
2598 parse_for_num(ls, varname, line); 2568 parse_for_num(ls, varname, line);
2599 else if (ls->token == ',' || ls->token == TK_in) 2569 else if (ls->tok == ',' || ls->tok == TK_in)
2600 parse_for_iter(ls, varname); 2570 parse_for_iter(ls, varname);
2601 else 2571 else
2602 err_syntax(ls, LJ_ERR_XFOR); 2572 err_syntax(ls, LJ_ERR_XFOR);
@@ -2622,12 +2592,12 @@ static void parse_if(LexState *ls, BCLine line)
2622 BCPos flist; 2592 BCPos flist;
2623 BCPos escapelist = NO_JMP; 2593 BCPos escapelist = NO_JMP;
2624 flist = parse_then(ls); 2594 flist = parse_then(ls);
2625 while (ls->token == TK_elseif) { /* Parse multiple 'elseif' blocks. */ 2595 while (ls->tok == TK_elseif) { /* Parse multiple 'elseif' blocks. */
2626 jmp_append(fs, &escapelist, bcemit_jmp(fs)); 2596 jmp_append(fs, &escapelist, bcemit_jmp(fs));
2627 jmp_tohere(fs, flist); 2597 jmp_tohere(fs, flist);
2628 flist = parse_then(ls); 2598 flist = parse_then(ls);
2629 } 2599 }
2630 if (ls->token == TK_else) { /* Parse optional 'else' block. */ 2600 if (ls->tok == TK_else) { /* Parse optional 'else' block. */
2631 jmp_append(fs, &escapelist, bcemit_jmp(fs)); 2601 jmp_append(fs, &escapelist, bcemit_jmp(fs));
2632 jmp_tohere(fs, flist); 2602 jmp_tohere(fs, flist);
2633 lj_lex_next(ls); /* Skip 'else'. */ 2603 lj_lex_next(ls); /* Skip 'else'. */
@@ -2645,7 +2615,7 @@ static void parse_if(LexState *ls, BCLine line)
2645static int parse_stmt(LexState *ls) 2615static int parse_stmt(LexState *ls)
2646{ 2616{
2647 BCLine line = ls->linenumber; 2617 BCLine line = ls->linenumber;
2648 switch (ls->token) { 2618 switch (ls->tok) {
2649 case TK_if: 2619 case TK_if:
2650 parse_if(ls, line); 2620 parse_if(ls, line);
2651 break; 2621 break;
@@ -2703,7 +2673,7 @@ static void parse_chunk(LexState *ls)
2703{ 2673{
2704 int islast = 0; 2674 int islast = 0;
2705 synlevel_begin(ls); 2675 synlevel_begin(ls);
2706 while (!islast && !endofblock(ls->token)) { 2676 while (!islast && !parse_isend(ls->tok)) {
2707 islast = parse_stmt(ls); 2677 islast = parse_stmt(ls);
2708 lex_opt(ls, ';'); 2678 lex_opt(ls, ';');
2709 lua_assert(ls->fs->framesize >= ls->fs->freereg && 2679 lua_assert(ls->fs->framesize >= ls->fs->freereg &&
@@ -2738,7 +2708,7 @@ GCproto *lj_parse(LexState *ls)
2738 bcemit_AD(&fs, BC_FUNCV, 0, 0); /* Placeholder. */ 2708 bcemit_AD(&fs, BC_FUNCV, 0, 0); /* Placeholder. */
2739 lj_lex_next(ls); /* Read-ahead first token. */ 2709 lj_lex_next(ls); /* Read-ahead first token. */
2740 parse_chunk(ls); 2710 parse_chunk(ls);
2741 if (ls->token != TK_eof) 2711 if (ls->tok != TK_eof)
2742 err_token(ls, TK_eof); 2712 err_token(ls, TK_eof);
2743 pt = fs_finish(ls, ls->linenumber); 2713 pt = fs_finish(ls, ls->linenumber);
2744 L->top--; /* Drop chunkname. */ 2714 L->top--; /* Drop chunkname. */