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.

improve function prototype handling

+78 -15
+78 -15
src/ant.c
··· 3475 3475 return js_mkundef(); 3476 3476 } 3477 3477 3478 + static jsval_t get_function_instance_proto_from_new_target(struct js *js, jsval_t fallback_proto) { 3479 + jsval_t instance_proto = js_mkundef(); 3480 + 3481 + if (vtype(js->new_target) == T_FUNC) { 3482 + jsval_t nt_obj = mkval(T_OBJ, vdata(js->new_target)); 3483 + jsoff_t nt_proto_off = lkp_interned(js, nt_obj, INTERN_PROTOTYPE, 9); 3484 + if (nt_proto_off != 0) { 3485 + jsval_t nt_proto = resolveprop(js, mkval(T_PROP, nt_proto_off)); 3486 + if (is_object_type(nt_proto)) instance_proto = nt_proto; 3487 + } 3488 + } 3489 + 3490 + if (!is_object_type(instance_proto) && is_object_type(fallback_proto)) { 3491 + instance_proto = fallback_proto; 3492 + } return instance_proto; 3493 + } 3494 + 3478 3495 static void infer_func_name(struct js *js, jsval_t func, const char *name, size_t len) { 3479 3496 jsval_t func_obj = mkval(T_OBJ, vdata(func)); 3480 3497 if (vtype(get_slot(js, func_obj, SLOT_NAME)) != T_UNDEF) return; ··· 11715 11732 if (!expect(js, TOK_RPAREN, &res)) goto done; 11716 11733 11717 11734 jsoff_t body_start = js->pos; 11735 + jsoff_t body_end_pos = 0; 11736 + uint8_t body_end_token = TOK_ERR; 11737 + uint8_t body_end_consumed = 1; 11738 + jsoff_t body_end_toff = 0, body_end_tlen = 0; 11739 + 11740 + int body_end_stream_pos = 0; 11718 11741 loop_block_ctx_t forin_loop_ctx = {0}; 11742 + 11719 11743 if (exe) loop_block_init(js, &forin_loop_ctx); 11720 11744 js->flags |= F_NOEXEC; 11721 11745 v = js_block_or_stmt(js); 11722 11746 if (is_err2(&v, &res)) goto done; 11723 - jsoff_t body_end = js->pos; 11747 + 11748 + body_end_pos = js->pos; 11749 + body_end_token = js->tok; 11750 + body_end_consumed = js->consumed; 11751 + body_end_toff = js->toff; 11752 + body_end_tlen = js->tlen; 11753 + body_end_stream_pos = js->token_stream_pos; 11724 11754 11725 11755 if (exe) { 11726 11756 jsval_t obj = resolveprop(js, obj_expr); 11727 11757 for_iter_ctx_t ctx = { 11728 - body_start, body_end, 11758 + body_start, body_end_pos, 11729 11759 var_name_off, var_name_len, 11730 11760 is_const_var, flags, 11731 11761 has_destructure, destructure_off, ··· 11738 11768 if (js->flags & F_RETURN) goto done; 11739 11769 } 11740 11770 11741 - js->pos = body_end; 11742 - js->tok = TOK_SEMICOLON; 11743 - js->consumed = 0; 11771 + js->pos = body_end_pos; 11772 + js->tok = body_end_token; 11773 + js->consumed = body_end_consumed; 11774 + js->toff = body_end_toff; 11775 + js->tlen = body_end_tlen; 11776 + js->token_stream_pos = body_end_stream_pos; 11777 + 11744 11778 goto done; 11745 11779 } 11746 11780 ··· 11750 11784 if (!expect(js, TOK_RPAREN, &res)) goto done; 11751 11785 11752 11786 jsoff_t body_start = js->pos; 11787 + jsoff_t body_end_pos = 0; 11788 + uint8_t body_end_token = TOK_ERR; 11789 + uint8_t body_end_consumed = 1; 11790 + jsoff_t body_end_toff = 0, body_end_tlen = 0; 11791 + 11792 + int body_end_stream_pos = 0; 11753 11793 loop_block_ctx_t forof_loop_ctx = {0}; 11794 + 11754 11795 if (exe) loop_block_init(js, &forof_loop_ctx); 11755 11796 js->flags |= F_NOEXEC; 11756 11797 v = js_block_or_stmt(js); 11757 11798 if (is_err2(&v, &res)) goto done; 11758 - jsoff_t body_end = js->pos; 11799 + 11800 + body_end_pos = js->pos; 11801 + body_end_token = js->tok; 11802 + body_end_consumed = js->consumed; 11803 + body_end_toff = js->toff; 11804 + body_end_tlen = js->tlen; 11805 + body_end_stream_pos = js->token_stream_pos; 11759 11806 11760 11807 if (exe) { 11761 11808 jsval_t iterable = resolveprop(js, iter_expr); 11762 11809 uint8_t itype = vtype(iterable); 11763 11810 for_iter_ctx_t ctx = { 11764 - body_start, body_end, 11811 + body_start, body_end_pos, 11765 11812 var_name_off, var_name_len, 11766 11813 is_const_var, flags, 11767 11814 has_destructure, destructure_off, ··· 11779 11826 if (js->flags & F_RETURN) goto done; 11780 11827 } 11781 11828 11782 - js->pos = body_end; 11783 - js->tok = TOK_SEMICOLON; 11784 - js->consumed = 0; 11829 + js->pos = body_end_pos; 11830 + js->tok = body_end_token; 11831 + js->consumed = body_end_consumed; 11832 + js->toff = body_end_toff; 11833 + js->tlen = body_end_tlen; 11834 + js->token_stream_pos = body_end_stream_pos; 11835 + 11785 11836 goto done; 11786 11837 } 11787 11838 ··· 13884 13935 set_func_code_ptr(js, func_obj, "(){}", 4); 13885 13936 set_slot(js, func_obj, SLOT_SCOPE, js_glob(js)); 13886 13937 13938 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 13939 + jsval_t instance_proto = get_function_instance_proto_from_new_target(js, func_proto); 13940 + if (is_object_type(instance_proto)) set_proto(js, func_obj, instance_proto); 13941 + 13887 13942 jsval_t func = mkval(T_FUNC, (unsigned long) vdata(func_obj)); 13888 - 13889 13943 jsval_t proto_setup = setup_func_prototype(js, func); 13944 + 13890 13945 if (is_err(proto_setup)) return proto_setup; 13891 - 13892 13946 return func; 13893 13947 } 13894 13948 ··· 13985 14039 jsval_t func_obj = mkobj(js, 0); 13986 14040 if (is_err(func_obj)) { free(code_buf); return func_obj; } 13987 14041 13988 - set_func_code(js, func_obj, code_buf, pos); 13989 - free(code_buf); 14042 + set_func_code(js, func_obj, code_buf, pos); free(code_buf); 13990 14043 set_slot(js, func_obj, SLOT_SCOPE, js_glob(js)); 13991 14044 14045 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 14046 + jsval_t instance_proto = get_function_instance_proto_from_new_target(js, func_proto); 14047 + if (is_object_type(instance_proto)) set_proto(js, func_obj, instance_proto); 14048 + 13992 14049 jsval_t func = mkval(T_FUNC, (unsigned long) vdata(func_obj)); 13993 14050 jsval_t proto_setup = setup_func_prototype(js, func); 13994 - if (is_err(proto_setup)) return proto_setup; 13995 14051 14052 + if (is_err(proto_setup)) return proto_setup; 13996 14053 return func; 13997 14054 } 13998 14055 ··· 14312 14369 jsval_t async_slot = get_slot(js, func_obj, SLOT_ASYNC); 14313 14370 if (vtype(async_slot) == T_BOOL && vdata(async_slot) == 1) { 14314 14371 set_slot(js, bound_func, SLOT_ASYNC, js_true); 14372 + } 14373 + 14374 + jsval_t target_proto = get_proto(js, func); 14375 + if (is_object_type(target_proto)) { 14376 + set_proto(js, bound_func, target_proto); 14377 + } else if (vtype(async_slot) == T_BOOL && vdata(async_slot) == 1) { 14315 14378 jsval_t async_proto = get_slot(js, js_glob(js), SLOT_ASYNC_PROTO); 14316 14379 if (vtype(async_proto) == T_FUNC) set_proto(js, bound_func, async_proto); 14317 14380 } else {