diff options
Diffstat (limited to 'src/lj_parse.c')
-rw-r--r-- | src/lj_parse.c | 166 |
1 files changed, 68 insertions, 98 deletions
diff --git a/src/lj_parse.c b/src/lj_parse.c index e8aafba2..064b9b19 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 | ||
166 | LJ_NORET LJ_NOINLINE static void err_syntax(LexState *ls, ErrMsg em) | 168 | LJ_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 | ||
171 | LJ_NORET LJ_NOINLINE static void err_token(LexState *ls, LexToken token) | 173 | LJ_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 | ||
176 | LJ_NORET static void err_limit(FuncState *fs, uint32_t limit, const char *what) | 178 | LJ_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. */ |
982 | static int lex_opt(LexState *ls, LexToken tok) | 984 | static 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. */ |
992 | static void lex_check(LexState *ls, LexToken tok) | 994 | static 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) | |||
1014 | static GCstr *lex_str(LexState *ls) | 1016 | static 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. */ | ||
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. */ | 1434 | /* Prepare variable info for prototype. */ |
1467 | static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar) | 1435 | static 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 | ||
@@ -1617,7 +1587,7 @@ static GCproto *fs_finish(LexState *ls, BCLine line) | |||
1617 | L->top--; /* Pop table of constants. */ | 1587 | L->top--; /* Pop table of constants. */ |
1618 | ls->vtop = fs->vbase; /* Reset variable stack. */ | 1588 | ls->vtop = fs->vbase; /* Reset variable stack. */ |
1619 | ls->fs = fs->prev; | 1589 | ls->fs = fs->prev; |
1620 | lua_assert(ls->fs != NULL || ls->token == TK_eof); | 1590 | lua_assert(ls->fs != NULL || ls->tok == TK_eof); |
1621 | return pt; | 1591 | return pt; |
1622 | } | 1592 | } |
1623 | 1593 | ||
@@ -1739,15 +1709,15 @@ static void expr_table(LexState *ls, ExpDesc *e) | |||
1739 | bcreg_reserve(fs, 1); | 1709 | bcreg_reserve(fs, 1); |
1740 | freg++; | 1710 | freg++; |
1741 | lex_check(ls, '{'); | 1711 | lex_check(ls, '{'); |
1742 | while (ls->token != '}') { | 1712 | while (ls->tok != '}') { |
1743 | ExpDesc key, val; | 1713 | ExpDesc key, val; |
1744 | vcall = 0; | 1714 | vcall = 0; |
1745 | if (ls->token == '[') { | 1715 | if (ls->tok == '[') { |
1746 | expr_bracket(ls, &key); /* Already calls expr_toval. */ | 1716 | expr_bracket(ls, &key); /* Already calls expr_toval. */ |
1747 | if (!expr_isk(&key)) expr_index(fs, e, &key); | 1717 | if (!expr_isk(&key)) expr_index(fs, e, &key); |
1748 | if (expr_isnumk(&key) && expr_numiszero(&key)) needarr = 1; else nhash++; | 1718 | if (expr_isnumk(&key) && expr_numiszero(&key)) needarr = 1; else nhash++; |
1749 | lex_check(ls, '='); | 1719 | lex_check(ls, '='); |
1750 | } else if ((ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) && | 1720 | } else if ((ls->tok == TK_name || (!LJ_52 && ls->tok == TK_goto)) && |
1751 | lj_lex_lookahead(ls) == '=') { | 1721 | lj_lex_lookahead(ls) == '=') { |
1752 | expr_str(ls, &key); | 1722 | expr_str(ls, &key); |
1753 | lex_check(ls, '='); | 1723 | lex_check(ls, '='); |
@@ -1840,11 +1810,11 @@ static BCReg parse_params(LexState *ls, int needself) | |||
1840 | lex_check(ls, '('); | 1810 | lex_check(ls, '('); |
1841 | if (needself) | 1811 | if (needself) |
1842 | var_new_lit(ls, nparams++, "self"); | 1812 | var_new_lit(ls, nparams++, "self"); |
1843 | if (ls->token != ')') { | 1813 | if (ls->tok != ')') { |
1844 | do { | 1814 | do { |
1845 | if (ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) { | 1815 | if (ls->tok == TK_name || (!LJ_52 && ls->tok == TK_goto)) { |
1846 | var_new(ls, nparams++, lex_str(ls)); | 1816 | var_new(ls, nparams++, lex_str(ls)); |
1847 | } else if (ls->token == TK_dots) { | 1817 | } else if (ls->tok == TK_dots) { |
1848 | lj_lex_next(ls); | 1818 | lj_lex_next(ls); |
1849 | fs->flags |= PROTO_VARARG; | 1819 | fs->flags |= PROTO_VARARG; |
1850 | break; | 1820 | break; |
@@ -1878,7 +1848,7 @@ static void parse_body(LexState *ls, ExpDesc *e, int needself, BCLine line) | |||
1878 | fs.bclim = pfs->bclim - pfs->pc; | 1848 | fs.bclim = pfs->bclim - pfs->pc; |
1879 | bcemit_AD(&fs, BC_FUNCF, 0, 0); /* Placeholder. */ | 1849 | bcemit_AD(&fs, BC_FUNCF, 0, 0); /* Placeholder. */ |
1880 | parse_chunk(ls); | 1850 | parse_chunk(ls); |
1881 | if (ls->token != TK_end) lex_match(ls, TK_end, TK_function, line); | 1851 | if (ls->tok != TK_end) lex_match(ls, TK_end, TK_function, line); |
1882 | pt = fs_finish(ls, (ls->lastline = ls->linenumber)); | 1852 | pt = fs_finish(ls, (ls->lastline = ls->linenumber)); |
1883 | pfs->bcbase = ls->bcstack + oldbase; /* May have been reallocated. */ | 1853 | pfs->bcbase = ls->bcstack + oldbase; /* May have been reallocated. */ |
1884 | pfs->bclim = (BCPos)(ls->sizebcstack - oldbase); | 1854 | pfs->bclim = (BCPos)(ls->sizebcstack - oldbase); |
@@ -1917,13 +1887,13 @@ static void parse_args(LexState *ls, ExpDesc *e) | |||
1917 | BCIns ins; | 1887 | BCIns ins; |
1918 | BCReg base; | 1888 | BCReg base; |
1919 | BCLine line = ls->linenumber; | 1889 | BCLine line = ls->linenumber; |
1920 | if (ls->token == '(') { | 1890 | if (ls->tok == '(') { |
1921 | #if !LJ_52 | 1891 | #if !LJ_52 |
1922 | if (line != ls->lastline) | 1892 | if (line != ls->lastline) |
1923 | err_syntax(ls, LJ_ERR_XAMBIG); | 1893 | err_syntax(ls, LJ_ERR_XAMBIG); |
1924 | #endif | 1894 | #endif |
1925 | lj_lex_next(ls); | 1895 | lj_lex_next(ls); |
1926 | if (ls->token == ')') { /* f(). */ | 1896 | if (ls->tok == ')') { /* f(). */ |
1927 | args.k = VVOID; | 1897 | args.k = VVOID; |
1928 | } else { | 1898 | } else { |
1929 | expr_list(ls, &args); | 1899 | expr_list(ls, &args); |
@@ -1931,11 +1901,11 @@ static void parse_args(LexState *ls, ExpDesc *e) | |||
1931 | setbc_b(bcptr(fs, &args), 0); /* Pass on multiple results. */ | 1901 | setbc_b(bcptr(fs, &args), 0); /* Pass on multiple results. */ |
1932 | } | 1902 | } |
1933 | lex_match(ls, ')', '(', line); | 1903 | lex_match(ls, ')', '(', line); |
1934 | } else if (ls->token == '{') { | 1904 | } else if (ls->tok == '{') { |
1935 | expr_table(ls, &args); | 1905 | expr_table(ls, &args); |
1936 | } else if (ls->token == TK_string) { | 1906 | } else if (ls->tok == TK_string) { |
1937 | expr_init(&args, VKSTR, 0); | 1907 | expr_init(&args, VKSTR, 0); |
1938 | args.u.sval = strV(&ls->tokenval); | 1908 | args.u.sval = strV(&ls->tokval); |
1939 | lj_lex_next(ls); | 1909 | lj_lex_next(ls); |
1940 | } else { | 1910 | } else { |
1941 | err_syntax(ls, LJ_ERR_XFUNARG); | 1911 | err_syntax(ls, LJ_ERR_XFUNARG); |
@@ -1961,32 +1931,32 @@ static void expr_primary(LexState *ls, ExpDesc *v) | |||
1961 | { | 1931 | { |
1962 | FuncState *fs = ls->fs; | 1932 | FuncState *fs = ls->fs; |
1963 | /* Parse prefix expression. */ | 1933 | /* Parse prefix expression. */ |
1964 | if (ls->token == '(') { | 1934 | if (ls->tok == '(') { |
1965 | BCLine line = ls->linenumber; | 1935 | BCLine line = ls->linenumber; |
1966 | lj_lex_next(ls); | 1936 | lj_lex_next(ls); |
1967 | expr(ls, v); | 1937 | expr(ls, v); |
1968 | lex_match(ls, ')', '(', line); | 1938 | lex_match(ls, ')', '(', line); |
1969 | expr_discharge(ls->fs, v); | 1939 | expr_discharge(ls->fs, v); |
1970 | } else if (ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) { | 1940 | } else if (ls->tok == TK_name || (!LJ_52 && ls->tok == TK_goto)) { |
1971 | var_lookup(ls, v); | 1941 | var_lookup(ls, v); |
1972 | } else { | 1942 | } else { |
1973 | err_syntax(ls, LJ_ERR_XSYMBOL); | 1943 | err_syntax(ls, LJ_ERR_XSYMBOL); |
1974 | } | 1944 | } |
1975 | for (;;) { /* Parse multiple expression suffixes. */ | 1945 | for (;;) { /* Parse multiple expression suffixes. */ |
1976 | if (ls->token == '.') { | 1946 | if (ls->tok == '.') { |
1977 | expr_field(ls, v); | 1947 | expr_field(ls, v); |
1978 | } else if (ls->token == '[') { | 1948 | } else if (ls->tok == '[') { |
1979 | ExpDesc key; | 1949 | ExpDesc key; |
1980 | expr_toanyreg(fs, v); | 1950 | expr_toanyreg(fs, v); |
1981 | expr_bracket(ls, &key); | 1951 | expr_bracket(ls, &key); |
1982 | expr_index(fs, v, &key); | 1952 | expr_index(fs, v, &key); |
1983 | } else if (ls->token == ':') { | 1953 | } else if (ls->tok == ':') { |
1984 | ExpDesc key; | 1954 | ExpDesc key; |
1985 | lj_lex_next(ls); | 1955 | lj_lex_next(ls); |
1986 | expr_str(ls, &key); | 1956 | expr_str(ls, &key); |
1987 | bcemit_method(fs, v, &key); | 1957 | bcemit_method(fs, v, &key); |
1988 | parse_args(ls, v); | 1958 | parse_args(ls, v); |
1989 | } else if (ls->token == '(' || ls->token == TK_string || ls->token == '{') { | 1959 | } else if (ls->tok == '(' || ls->tok == TK_string || ls->tok == '{') { |
1990 | expr_tonextreg(fs, v); | 1960 | expr_tonextreg(fs, v); |
1991 | parse_args(ls, v); | 1961 | parse_args(ls, v); |
1992 | } else { | 1962 | } else { |
@@ -1998,14 +1968,14 @@ static void expr_primary(LexState *ls, ExpDesc *v) | |||
1998 | /* Parse simple expression. */ | 1968 | /* Parse simple expression. */ |
1999 | static void expr_simple(LexState *ls, ExpDesc *v) | 1969 | static void expr_simple(LexState *ls, ExpDesc *v) |
2000 | { | 1970 | { |
2001 | switch (ls->token) { | 1971 | switch (ls->tok) { |
2002 | case TK_number: | 1972 | case TK_number: |
2003 | expr_init(v, (LJ_HASFFI && tviscdata(&ls->tokenval)) ? VKCDATA : VKNUM, 0); | 1973 | expr_init(v, (LJ_HASFFI && tviscdata(&ls->tokval)) ? VKCDATA : VKNUM, 0); |
2004 | copyTV(ls->L, &v->u.nval, &ls->tokenval); | 1974 | copyTV(ls->L, &v->u.nval, &ls->tokval); |
2005 | break; | 1975 | break; |
2006 | case TK_string: | 1976 | case TK_string: |
2007 | expr_init(v, VKSTR, 0); | 1977 | expr_init(v, VKSTR, 0); |
2008 | v->u.sval = strV(&ls->tokenval); | 1978 | v->u.sval = strV(&ls->tokval); |
2009 | break; | 1979 | break; |
2010 | case TK_nil: | 1980 | case TK_nil: |
2011 | expr_init(v, VKNIL, 0); | 1981 | expr_init(v, VKNIL, 0); |
@@ -2093,11 +2063,11 @@ static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit); | |||
2093 | static void expr_unop(LexState *ls, ExpDesc *v) | 2063 | static void expr_unop(LexState *ls, ExpDesc *v) |
2094 | { | 2064 | { |
2095 | BCOp op; | 2065 | BCOp op; |
2096 | if (ls->token == TK_not) { | 2066 | if (ls->tok == TK_not) { |
2097 | op = BC_NOT; | 2067 | op = BC_NOT; |
2098 | } else if (ls->token == '-') { | 2068 | } else if (ls->tok == '-') { |
2099 | op = BC_UNM; | 2069 | op = BC_UNM; |
2100 | } else if (ls->token == '#') { | 2070 | } else if (ls->tok == '#') { |
2101 | op = BC_LEN; | 2071 | op = BC_LEN; |
2102 | } else { | 2072 | } else { |
2103 | expr_simple(ls, v); | 2073 | expr_simple(ls, v); |
@@ -2114,7 +2084,7 @@ static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit) | |||
2114 | BinOpr op; | 2084 | BinOpr op; |
2115 | synlevel_begin(ls); | 2085 | synlevel_begin(ls); |
2116 | expr_unop(ls, v); | 2086 | expr_unop(ls, v); |
2117 | op = token2binop(ls->token); | 2087 | op = token2binop(ls->tok); |
2118 | while (op != OPR_NOBINOPR && priority[op].left > limit) { | 2088 | while (op != OPR_NOBINOPR && priority[op].left > limit) { |
2119 | ExpDesc v2; | 2089 | ExpDesc v2; |
2120 | BinOpr nextop; | 2090 | BinOpr nextop; |
@@ -2303,9 +2273,9 @@ static void parse_func(LexState *ls, BCLine line) | |||
2303 | lj_lex_next(ls); /* Skip 'function'. */ | 2273 | lj_lex_next(ls); /* Skip 'function'. */ |
2304 | /* Parse function name. */ | 2274 | /* Parse function name. */ |
2305 | var_lookup(ls, &v); | 2275 | var_lookup(ls, &v); |
2306 | while (ls->token == '.') /* Multiple dot-separated fields. */ | 2276 | while (ls->tok == '.') /* Multiple dot-separated fields. */ |
2307 | expr_field(ls, &v); | 2277 | expr_field(ls, &v); |
2308 | if (ls->token == ':') { /* Optional colon to signify method call. */ | 2278 | if (ls->tok == ':') { /* Optional colon to signify method call. */ |
2309 | needself = 1; | 2279 | needself = 1; |
2310 | expr_field(ls, &v); | 2280 | expr_field(ls, &v); |
2311 | } | 2281 | } |
@@ -2318,9 +2288,9 @@ static void parse_func(LexState *ls, BCLine line) | |||
2318 | /* -- Control transfer statements ----------------------------------------- */ | 2288 | /* -- Control transfer statements ----------------------------------------- */ |
2319 | 2289 | ||
2320 | /* Check for end of block. */ | 2290 | /* Check for end of block. */ |
2321 | static int endofblock(LexToken token) | 2291 | static int parse_isend(LexToken tok) |
2322 | { | 2292 | { |
2323 | switch (token) { | 2293 | switch (tok) { |
2324 | case TK_else: case TK_elseif: case TK_end: case TK_until: case TK_eof: | 2294 | case TK_else: case TK_elseif: case TK_end: case TK_until: case TK_eof: |
2325 | return 1; | 2295 | return 1; |
2326 | default: | 2296 | default: |
@@ -2335,7 +2305,7 @@ static void parse_return(LexState *ls) | |||
2335 | FuncState *fs = ls->fs; | 2305 | FuncState *fs = ls->fs; |
2336 | lj_lex_next(ls); /* Skip 'return'. */ | 2306 | lj_lex_next(ls); /* Skip 'return'. */ |
2337 | fs->flags |= PROTO_HAS_RETURN; | 2307 | fs->flags |= PROTO_HAS_RETURN; |
2338 | if (endofblock(ls->token) || ls->token == ';') { /* Bare return. */ | 2308 | if (parse_isend(ls->tok) || ls->tok == ';') { /* Bare return. */ |
2339 | ins = BCINS_AD(BC_RET0, 0, 1); | 2309 | ins = BCINS_AD(BC_RET0, 0, 1); |
2340 | } else { /* Return with one or more values. */ | 2310 | } else { /* Return with one or more values. */ |
2341 | ExpDesc e; /* Receives the _last_ expression in the list. */ | 2311 | ExpDesc e; /* Receives the _last_ expression in the list. */ |
@@ -2401,18 +2371,18 @@ static void parse_label(LexState *ls) | |||
2401 | lex_check(ls, TK_label); | 2371 | lex_check(ls, TK_label); |
2402 | /* Recursively parse trailing statements: labels and ';' (Lua 5.2 only). */ | 2372 | /* Recursively parse trailing statements: labels and ';' (Lua 5.2 only). */ |
2403 | for (;;) { | 2373 | for (;;) { |
2404 | if (ls->token == TK_label) { | 2374 | if (ls->tok == TK_label) { |
2405 | synlevel_begin(ls); | 2375 | synlevel_begin(ls); |
2406 | parse_label(ls); | 2376 | parse_label(ls); |
2407 | synlevel_end(ls); | 2377 | synlevel_end(ls); |
2408 | } else if (LJ_52 && ls->token == ';') { | 2378 | } else if (LJ_52 && ls->tok == ';') { |
2409 | lj_lex_next(ls); | 2379 | lj_lex_next(ls); |
2410 | } else { | 2380 | } else { |
2411 | break; | 2381 | break; |
2412 | } | 2382 | } |
2413 | } | 2383 | } |
2414 | /* Trailing label is considered to be outside of scope. */ | 2384 | /* Trailing label is considered to be outside of scope. */ |
2415 | if (endofblock(ls->token) && ls->token != TK_until) | 2385 | if (parse_isend(ls->tok) && ls->tok != TK_until) |
2416 | ls->vstack[idx].slot = fs->bl->nactvar; | 2386 | ls->vstack[idx].slot = fs->bl->nactvar; |
2417 | gola_resolve(ls, fs->bl, idx); | 2387 | gola_resolve(ls, fs->bl, idx); |
2418 | } | 2388 | } |
@@ -2596,9 +2566,9 @@ static void parse_for(LexState *ls, BCLine line) | |||
2596 | fscope_begin(fs, &bl, FSCOPE_LOOP); | 2566 | fscope_begin(fs, &bl, FSCOPE_LOOP); |
2597 | lj_lex_next(ls); /* Skip 'for'. */ | 2567 | lj_lex_next(ls); /* Skip 'for'. */ |
2598 | varname = lex_str(ls); /* Get first variable name. */ | 2568 | varname = lex_str(ls); /* Get first variable name. */ |
2599 | if (ls->token == '=') | 2569 | if (ls->tok == '=') |
2600 | parse_for_num(ls, varname, line); | 2570 | parse_for_num(ls, varname, line); |
2601 | else if (ls->token == ',' || ls->token == TK_in) | 2571 | else if (ls->tok == ',' || ls->tok == TK_in) |
2602 | parse_for_iter(ls, varname); | 2572 | parse_for_iter(ls, varname); |
2603 | else | 2573 | else |
2604 | err_syntax(ls, LJ_ERR_XFOR); | 2574 | err_syntax(ls, LJ_ERR_XFOR); |
@@ -2624,12 +2594,12 @@ static void parse_if(LexState *ls, BCLine line) | |||
2624 | BCPos flist; | 2594 | BCPos flist; |
2625 | BCPos escapelist = NO_JMP; | 2595 | BCPos escapelist = NO_JMP; |
2626 | flist = parse_then(ls); | 2596 | flist = parse_then(ls); |
2627 | while (ls->token == TK_elseif) { /* Parse multiple 'elseif' blocks. */ | 2597 | while (ls->tok == TK_elseif) { /* Parse multiple 'elseif' blocks. */ |
2628 | jmp_append(fs, &escapelist, bcemit_jmp(fs)); | 2598 | jmp_append(fs, &escapelist, bcemit_jmp(fs)); |
2629 | jmp_tohere(fs, flist); | 2599 | jmp_tohere(fs, flist); |
2630 | flist = parse_then(ls); | 2600 | flist = parse_then(ls); |
2631 | } | 2601 | } |
2632 | if (ls->token == TK_else) { /* Parse optional 'else' block. */ | 2602 | if (ls->tok == TK_else) { /* Parse optional 'else' block. */ |
2633 | jmp_append(fs, &escapelist, bcemit_jmp(fs)); | 2603 | jmp_append(fs, &escapelist, bcemit_jmp(fs)); |
2634 | jmp_tohere(fs, flist); | 2604 | jmp_tohere(fs, flist); |
2635 | lj_lex_next(ls); /* Skip 'else'. */ | 2605 | lj_lex_next(ls); /* Skip 'else'. */ |
@@ -2647,7 +2617,7 @@ static void parse_if(LexState *ls, BCLine line) | |||
2647 | static int parse_stmt(LexState *ls) | 2617 | static int parse_stmt(LexState *ls) |
2648 | { | 2618 | { |
2649 | BCLine line = ls->linenumber; | 2619 | BCLine line = ls->linenumber; |
2650 | switch (ls->token) { | 2620 | switch (ls->tok) { |
2651 | case TK_if: | 2621 | case TK_if: |
2652 | parse_if(ls, line); | 2622 | parse_if(ls, line); |
2653 | break; | 2623 | break; |
@@ -2705,7 +2675,7 @@ static void parse_chunk(LexState *ls) | |||
2705 | { | 2675 | { |
2706 | int islast = 0; | 2676 | int islast = 0; |
2707 | synlevel_begin(ls); | 2677 | synlevel_begin(ls); |
2708 | while (!islast && !endofblock(ls->token)) { | 2678 | while (!islast && !parse_isend(ls->tok)) { |
2709 | islast = parse_stmt(ls); | 2679 | islast = parse_stmt(ls); |
2710 | lex_opt(ls, ';'); | 2680 | lex_opt(ls, ';'); |
2711 | lua_assert(ls->fs->framesize >= ls->fs->freereg && | 2681 | lua_assert(ls->fs->framesize >= ls->fs->freereg && |
@@ -2740,7 +2710,7 @@ GCproto *lj_parse(LexState *ls) | |||
2740 | bcemit_AD(&fs, BC_FUNCV, 0, 0); /* Placeholder. */ | 2710 | bcemit_AD(&fs, BC_FUNCV, 0, 0); /* Placeholder. */ |
2741 | lj_lex_next(ls); /* Read-ahead first token. */ | 2711 | lj_lex_next(ls); /* Read-ahead first token. */ |
2742 | parse_chunk(ls); | 2712 | parse_chunk(ls); |
2743 | if (ls->token != TK_eof) | 2713 | if (ls->tok != TK_eof) |
2744 | err_token(ls, TK_eof); | 2714 | err_token(ls, TK_eof); |
2745 | pt = fs_finish(ls, ls->linenumber); | 2715 | pt = fs_finish(ls, ls->linenumber); |
2746 | L->top--; /* Drop chunkname. */ | 2716 | L->top--; /* Drop chunkname. */ |