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.

arrow param void token list

+30 -40
+1 -1
examples/results.txt
··· 680 680 compat-table/es6/arrow.new-target.js: OK 681 681 compat-table/es6/arrow.no-line-break.js: failed 682 682 compat-table/es6/arrow.no-prototype.js: OK 683 - compat-table/es6/arrow.precedence.js: failed 683 + compat-table/es6/arrow.precedence.js: OK 684 684 compat-table/es6/arrow.this-call-apply.js: OK 685 685 compat-table/es6/class.accessor-properties.js: OK 686 686 compat-table/es6/class.anonymous.js: OK
+24 -33
src/silver/ast.c
··· 520 520 l_globalthis: { CONSUME(); return mk(N_GLOBAL_THIS); } 521 521 522 522 l_ident: { 523 - uint32_t ident_off = (uint32_t)TOFF; 524 523 CONSUME(); 525 - sv_ast_t *id = mk_ident_from_tok(p); 526 - if (LA() == TOK_ARROW) { 527 - NEXT(); CONSUME(); 528 - sv_ast_t *fn = mk(N_FUNC); 529 - fn->flags = FN_ARROW; 530 - fn->src_off = ident_off; 531 - sv_ast_list_push(&fn->args, id); 532 - fn->body = parse_arrow_body(p); 533 - fn->src_end = (uint32_t)(TOFF + TLEN); 534 - return fn; 535 - } 536 - return id; 524 + return mk_ident_from_tok(p); 537 525 } 538 526 539 527 l_paren: { ··· 541 529 CONSUME(); 542 530 if (NEXT() == TOK_RPAREN) { 543 531 CONSUME(); 544 - if (LA() == TOK_ARROW) { 545 - NEXT(); CONSUME(); 546 - sv_ast_t *fn = mk(N_FUNC); 547 - fn->flags = FN_ARROW; 548 - fn->src_off = paren_off; 549 - fn->body = parse_arrow_body(p); 550 - fn->src_end = (uint32_t)(TOFF + TLEN); 551 - return fn; 552 - } 553 - return mk(N_UNDEF); 532 + sv_ast_t *n = mk(N_UNDEF); 533 + n->flags |= FN_PAREN; 534 + n->src_off = paren_off; 535 + return n; 554 536 } 555 537 sv_ast_t *expr = parse_expr(p); 556 538 expect(p, TOK_RPAREN); 557 - if (LA() == TOK_ARROW) { 558 - NEXT(); CONSUME(); 559 - sv_ast_t *fn = mk(N_FUNC); 560 - fn->flags = FN_ARROW; 561 - fn->src_off = paren_off; 562 - push_arrow_params_from_expr(fn, expr); 563 - fn->body = parse_arrow_body(p); 564 - fn->src_end = (uint32_t)(TOFF + TLEN); 565 - return fn; 566 - } 567 539 expr->flags |= FN_PAREN; 540 + expr->src_off = paren_off; 568 541 return expr; 569 542 } 570 543 ··· 1186 1159 static sv_ast_t *parse_assign(P) { 1187 1160 sv_ast_t *left = parse_ternary(p); 1188 1161 uint8_t op = NEXT(); 1162 + if (op == TOK_ARROW) { 1163 + CONSUME(); 1164 + sv_ast_t *fn = mk(N_FUNC); 1165 + fn->flags = FN_ARROW; 1166 + fn->src_off = left->src_off; 1167 + if (left->type == N_IDENT) { 1168 + sv_ast_list_push(&fn->args, left); 1169 + } else if (left->flags & FN_PAREN) { 1170 + if (left->type != N_UNDEF) 1171 + push_arrow_params_from_expr(fn, left); 1172 + } else { 1173 + SV_MKERR_TYPED(JS, JS_ERR_SYNTAX, "Malformed arrow function parameter list"); 1174 + return mk(N_EMPTY); 1175 + } 1176 + fn->body = parse_arrow_body(p); 1177 + fn->src_end = (uint32_t)(TOFF + TLEN); 1178 + return fn; 1179 + } 1189 1180 if (is_assign_op(op)) { 1190 1181 if (left->type == N_NEW_TARGET) { 1191 1182 SV_MKERR_TYPED(JS, JS_ERR_SYNTAX, "Invalid left-hand side in assignment");
+5 -6
src/silver/ops/globals.h
··· 106 106 ) { 107 107 sv_atom_t *a = &func->atoms[sv_get_u32(ip + 1)]; 108 108 ant_value_t super_val = sv_vm_get_super_val(vm); 109 - if (a->len == 5 && memcmp(a->str, "super", 5) == 0 && 110 - vtype(super_val) != T_UNDEF) { 109 + if (a->len == 5 && memcmp(a->str, "super", 5) == 0 && vtype(super_val) != T_UNDEF) { 111 110 ant_value_t sv = super_val; 112 111 vm->stack[vm->sp++] = sv; 113 112 return sv; 114 113 } 115 114 ant_value_t val = sv_global_get_interned_ic(js, a->str, func, ip); 116 - if (is_undefined(val)) 117 - return js_mkerr_typed( 118 - js, JS_ERR_REFERENCE, "'%.*s' is not defined", 119 - (int)a->len, a->str); 115 + if (is_undefined(val) && lkp_interned(js, js->global, a->str, a->len) == 0) return js_mkerr_typed( 116 + js, JS_ERR_REFERENCE, "'%.*s' is not defined", 117 + (int)a->len, a->str 118 + ); 120 119 vm->stack[vm->sp++] = val; 121 120 return val; 122 121 }