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