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.

add new token checks for block and ASI tokens

+53 -24
+53 -24
src/ant.c
··· 698 698 return (bits[tok >> 6] >> (tok & 63)) & 1; 699 699 } 700 700 701 + static inline bool is_block_tok(uint8_t tok) { 702 + static const uint64_t bits[4] = { 703 + 0x2108000000000110ull, 704 + 0x0000000000124075ull, 0, 0 705 + }; 706 + return (bits[tok >> 6] >> (tok & 63)) & 1; 707 + } 708 + 709 + static inline bool is_asi_ok_tok(uint8_t tok) { 710 + static const uint64_t bits[4] = { 711 + 0x0000000000000212ull, 0, 0, 0 712 + }; 713 + return (bits[tok >> 6] >> (tok & 63)) & 1; 714 + } 715 + 701 716 static inline bool is_unboxed_obj(struct js *js, jsval_t val, jsval_t expected_proto) { 702 717 if (vtype(val) != T_OBJ) return false; 703 718 if (vtype(get_slot(js, val, SLOT_PRIMITIVE)) != T_UNDEF) return false; ··· 4352 4367 return tok; 4353 4368 } 4354 4369 4370 + static bool is_typeof_bare_ident(struct js *js) { 4371 + jsoff_t pos = js->pos, toff = js->toff, tlen = js->tlen; 4372 + uint8_t tok = js->tok, consumed = js->consumed; 4373 + bool had_newline = js->had_newline; 4374 + 4375 + int depth = 0; 4376 + uint8_t t = next(js); 4377 + while (t == TOK_LPAREN) { js->consumed = 1; t = next(js); depth++; } 4378 + 4379 + bool bare = (t == TOK_IDENTIFIER); 4380 + if (bare) { 4381 + js->consumed = 1; 4382 + t = next(js); 4383 + while (depth > 0 && t == TOK_RPAREN) { js->consumed = 1; t = next(js); depth--; } 4384 + if (t == TOK_DOT || t == TOK_LBRACKET || t == TOK_LPAREN || t == TOK_OPTIONAL_CHAIN) bare = false; 4385 + } 4386 + 4387 + js->pos = pos; js->toff = toff; js->tlen = tlen; 4388 + js->tok = tok; js->consumed = consumed; js->had_newline = had_newline; 4389 + return bare; 4390 + } 4391 + 4355 4392 void js_mkscope(struct js *js) { 4356 4393 assert((js->flags & F_NOEXEC) == 0); 4357 4394 if (global_scope_stack == NULL) utarray_new(global_scope_stack, &jsoff_icd); ··· 4583 4620 static jsval_t js_block(struct js *js, bool create_scope) { 4584 4621 jsval_t res = js_mkundef(); 4585 4622 if (create_scope) mkscope(js); 4623 + 4586 4624 js->consumed = 1; 4587 4625 hoist_function_declarations(js); 4626 + 4588 4627 uint8_t peek; 4589 4628 while ((peek = next(js)) != TOK_EOF && peek != TOK_RBRACE && !is_err(res)) { 4590 4629 uint8_t t = js->tok; 4591 4630 res = js_stmt(js); 4592 - bool is_block_tok = (t == TOK_LBRACE || t == TOK_IF || t == TOK_WHILE || 4593 - t == TOK_DO || t == TOK_FUNC || t == TOK_FOR || t == TOK_IMPORT || 4594 - t == TOK_EXPORT || t == TOK_SEMICOLON || t == TOK_SWITCH || 4595 - t == TOK_TRY || t == TOK_CLASS || t == TOK_ASYNC); 4596 - bool asi_ok = js->had_newline || js->tok == TOK_SEMICOLON || js->tok == TOK_RBRACE || js->tok == TOK_EOF; 4597 - if (!is_err(res) && !is_block_tok && !asi_ok) { 4598 - res = js_mkerr_typed(js, JS_ERR_SYNTAX, "; expected"); 4599 - break; 4631 + if (!is_err(res) && !is_block_tok(t) && !(js->had_newline || is_asi_ok_tok(js->tok))) { 4632 + res = js_mkerr_typed(js, JS_ERR_SYNTAX, "; expected"); break; 4600 4633 } 4601 4634 if (js->flags & (F_RETURN | F_THROW)) break; 4602 4635 } 4636 + 4603 4637 if (js->tok == TOK_RBRACE) js->consumed = 1; 4604 4638 if (create_scope) delscope(js); 4639 + 4605 4640 return res; 4606 4641 } 4607 4642 ··· 8568 8603 } 8569 8604 return js_postfix(js); 8570 8605 8571 - do_new: { 8606 + do_new: { 8572 8607 js->consumed = 1; 8573 8608 jsval_t obj = mkobj(js, 0); 8574 8609 jsval_t saved_this = js->this_val; ··· 8672 8707 return new_result; 8673 8708 } 8674 8709 8675 - do_delete: { 8710 + do_delete: { 8676 8711 js->consumed = 1; 8677 8712 8678 8713 if ((js->flags & F_STRICT) && next(js) == TOK_IDENTIFIER) { ··· 8792 8827 return js_mktrue(); 8793 8828 } 8794 8829 8795 - do_await: { 8830 + do_await: { 8796 8831 js->consumed = 1; 8797 8832 jsval_t expr = js_unary(js); 8798 8833 if (is_err(expr)) return expr; ··· 8851 8886 return is_error ? js_throw(js, result) : result; 8852 8887 } 8853 8888 8854 - do_prefix_inc: { 8889 + do_prefix_inc: { 8855 8890 uint8_t op = js->tok; 8856 8891 js->consumed = 1; 8857 8892 if ((js->flags & F_STRICT) && next(js) == TOK_IDENTIFIER && is_eval_or_arguments(js, js->toff, js->tlen)) { ··· 8868 8903 } 8869 8904 return do_op(js, op == TOK_POSTINC ? TOK_PLUS : TOK_MINUS, resolved, tov(1)); 8870 8905 } 8871 - 8872 - do_typeof: { 8906 + 8907 + do_typeof: { 8873 8908 js->consumed = 1; 8874 - jsoff_t saved_pos = js->pos; 8875 - uint8_t saved_tok = js->tok, saved_consumed = js->consumed, saved_flags = js->flags; 8909 + bool bare = is_typeof_bare_ident(js); 8876 8910 jsval_t operand = js_unary(js); 8877 - if (is_err(operand)) { 8878 - js->pos = saved_pos; js->tok = saved_tok; js->consumed = saved_consumed; 8879 - js->flags = (saved_flags & ~F_THROW) | F_NOEXEC; 8880 - js_unary(js); 8881 - js->flags = saved_flags & ~F_THROW; 8882 - operand = js_mkundef(); 8883 - } 8911 + if (is_err(operand) && bare) operand = js_mkundef(); 8912 + else if (is_err(operand)) return operand; 8884 8913 return do_op(js, TOK_TYPEOF, js_mkundef(), operand); 8885 8914 } 8886 8915 8887 - do_unary_op: { 8916 + do_unary_op: { 8888 8917 uint8_t t = js->tok; 8889 8918 if (t == TOK_MINUS) t = TOK_UMINUS; 8890 8919 if (t == TOK_PLUS) t = TOK_UPLUS;