MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

(#2) handle contextual keywords

+51 -17
+44 -17
src/ant.c
··· 703 703 return (tok >= TOK_ASYNC && tok <= TOK_GLOBAL_THIS) || tok == TOK_TYPEOF; 704 704 } 705 705 706 + static inline bool is_contextual_keyword(uint8_t tok) { 707 + return tok == TOK_FROM || tok == TOK_OF || tok == TOK_AS || tok == TOK_ASYNC; 708 + } 709 + 710 + static inline bool is_valid_param_name(uint8_t tok) { 711 + return tok == TOK_IDENTIFIER || is_contextual_keyword(tok); 712 + } 713 + 706 714 static bool is_valid_arrow_param_tok(uint8_t tok) { 707 715 static const uint64_t bits[4] = { 708 - 0x0004000000000FCCull, 709 - 0x041CC01003C00000ull, 716 + 0x000C000000000FCCull, 717 + 0x041CC0100BC00808ull, 710 718 0x0000000000800100ull, 711 719 0x0000000000000000ull 712 720 }; ··· 797 805 return mkval(T_OBJ, loadoff(js, (jsoff_t) (vdata(scope) + sizeof(jsoff_t)))); 798 806 } 799 807 800 - #define CHECKV(_v) do { if (is_err(_v)) { res = (_v); goto done; } } while (0) 801 - #define EXPECT(_tok, _e) do { if (next(js) != _tok) { _e; return js_mkerr_typed(js, JS_ERR_SYNTAX, "parse error"); }; js->consumed = 1; } while (0) 808 + #define CHECKV(_v) \ 809 + if (is_err(_v)) { \ 810 + res = (_v); \ 811 + goto done; \ 812 + } 813 + 814 + #define EXPECT(_tok, _e) \ 815 + if (next(js) != _tok) { \ 816 + _e; \ 817 + return js_mkerr_typed(js, JS_ERR_SYNTAX, "parse error"); \ 818 + } else js->consumed = 1 819 + 820 + #define EXPECT_IDENT(...) \ 821 + if (!is_valid_param_name(next(js))) { \ 822 + __VA_ARGS__; \ 823 + return js_mkerr_typed(js, JS_ERR_SYNTAX, "identifier expected"); \ 824 + } else js->consumed = 1 802 825 803 826 static bool is_digit(int c); 804 827 static bool is_proxy(struct js *js, jsval_t obj); ··· 6304 6327 } 6305 6328 6306 6329 jsoff_t identlen = 0; 6330 + 6307 6331 uint8_t tok = parseident(&fn[fnpos], fnlen - fnpos, &identlen); 6332 + bool is_valid_ident = (tok == TOK_IDENTIFIER || is_contextual_keyword(tok)); 6308 6333 6309 - if (tok != TOK_IDENTIFIER && (fn[fnpos] == '{' || fn[fnpos] == '[')) { 6334 + if (!is_valid_ident && (fn[fnpos] == '{' || fn[fnpos] == '[')) { 6310 6335 char bracket_open = fn[fnpos]; 6311 6336 char bracket_close = (bracket_open == '{') ? '}' : ']'; 6337 + 6312 6338 jsoff_t pattern_start = fnpos; 6313 - int depth = 1; 6314 - fnpos++; 6339 + int depth = 1; fnpos++; 6340 + 6315 6341 while (fnpos < fnlen && depth > 0) { 6316 6342 if (fn[fnpos] == bracket_open) depth++; 6317 6343 else if (fn[fnpos] == bracket_close) depth--; ··· 6337 6363 continue; 6338 6364 } 6339 6365 6340 - if (tok != TOK_IDENTIFIER) break; 6366 + if (!is_valid_ident) break; 6341 6367 6342 6368 if (is_rest) { 6343 6369 pf->rest_param_start = fnpos; ··· 8429 8455 param_entry_t entry = {NULL, 0}; 8430 8456 utarray_push_back(params, &entry); 8431 8457 if (next(js) == TOK_ASSIGN) { js->consumed = 1; skip_default_value(js); } 8432 - } else if (next(js) == TOK_IDENTIFIER) { 8458 + } else if (is_valid_param_name(next(js))) { 8433 8459 const char *name = &js->code[js->toff]; 8434 8460 size_t len = js->tlen; 8435 8461 ··· 8591 8617 return js_func_literal(js, false); 8592 8618 } 8593 8619 case TOK_ASYNC: { 8620 + jsoff_t async_off = js->toff, async_len = js->tlen; 8594 8621 js->consumed = 1; 8595 8622 uint8_t next_tok = next(js); 8596 8623 if (next_tok == TOK_FUNC) { ··· 8694 8721 } 8695 8722 return mkcoderef((jsoff_t) id_start, (jsoff_t) id_len); 8696 8723 } 8697 - return js_mkerr_typed(js, JS_ERR_SYNTAX, "unexpected token after async"); 8724 + return mkcoderef(async_off, async_len); 8698 8725 } 8699 8726 8700 8727 case TOK_SUPER: { ··· 9843 9870 } 9844 9871 js->consumed = 1; 9845 9872 } else { 9846 - EXPECT(TOK_IDENTIFIER, ); 9873 + EXPECT_IDENT(); 9847 9874 var_off = js->toff; 9848 9875 var_len = js->tlen; 9849 9876 js->consumed = 1; ··· 9931 9958 9932 9959 if (next(js) == TOK_COLON) { 9933 9960 js->consumed = 1; 9934 - EXPECT(TOK_IDENTIFIER, ); 9961 + EXPECT_IDENT(); 9935 9962 ivoff = js->toff; ivlen = js->tlen; 9936 9963 js->consumed = 1; 9937 9964 } ··· 10108 10135 10109 10136 JS_RESTORE_STATE(js, end_state); 10110 10137 } else { 10111 - EXPECT(TOK_IDENTIFIER, ); 10138 + EXPECT_IDENT(); 10112 10139 js->consumed = 0; 10113 10140 jsoff_t noff = js->toff, nlen = js->tlen; 10114 10141 char *name = (char *) &js->code[noff]; ··· 10207 10234 uint8_t exe = !(js->flags & F_NOEXEC); 10208 10235 uint8_t saved_flags = js->flags; 10209 10236 js->consumed = 1; 10210 - EXPECT(TOK_IDENTIFIER, ); 10237 + EXPECT_IDENT(); 10211 10238 js->consumed = 0; 10212 10239 jsoff_t noff = js->toff, nlen = js->tlen; 10213 10240 char *name = (char *) &js->code[noff]; ··· 10278 10305 static jsval_t js_func_decl_async(struct js *js) { 10279 10306 uint8_t exe = !(js->flags & F_NOEXEC); 10280 10307 js->consumed = 1; 10281 - EXPECT(TOK_IDENTIFIER, ); 10308 + EXPECT_IDENT(); 10282 10309 js->consumed = 0; 10283 10310 jsoff_t noff = js->toff, nlen = js->tlen; 10284 10311 char *name = (char *) &js->code[noff]; ··· 11844 11871 if (next(js) == TOK_IDENTIFIER && js->tlen == 7 && 11845 11872 streq(&js->code[js->toff], js->tlen, "extends", 7)) { 11846 11873 js->consumed = 1; 11847 - EXPECT(TOK_IDENTIFIER, ); 11874 + EXPECT_IDENT(); 11848 11875 super_off = js->toff; 11849 11876 super_len = js->tlen; 11850 11877 js->consumed = 1; ··· 12275 12302 12276 12303 js->consumed = 1; 12277 12304 for (;;) { 12278 - EXPECT(TOK_IDENTIFIER, ); 12305 + EXPECT_IDENT(); 12279 12306 js->consumed = 0; 12280 12307 jsoff_t noff = js->toff, nlen = js->tlen; 12281 12308 char *name = (char *) &js->code[noff];
+7
tests/test_contextual_keyword.js
··· 1 + const async = 'meow'; 2 + 3 + function size(from, to) { 4 + return to - from + 1; 5 + } 6 + 7 + console.log(size(1, 10), async);