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 support

+47 -6
+1
include/config.h
··· 41 41 SLOT_CFUNC, 42 42 SLOT_CORO, 43 43 SLOT_PROTO, 44 + SLOT_FUNC_PROTO, 44 45 SLOT_ASYNC_PROTO, 45 46 SLOT_FROZEN, 46 47 SLOT_SEALED,
+1
include/config.h.in
··· 30 30 SLOT_CFUNC, 31 31 SLOT_CORO, 32 32 SLOT_PROTO, 33 + SLOT_FUNC_PROTO, 33 34 SLOT_ASYNC_PROTO, 34 35 SLOT_FROZEN, 35 36 SLOT_SEALED,
+45 -6
src/ant.c
··· 5970 5970 if ((js->flags & F_STRICT) && (streq(ptr, plen, "caller", 6) || streq(ptr, plen, "arguments", 9))) { 5971 5971 return js_mkerr_typed(js, JS_ERR_TYPE, "'%.*s' not allowed on functions in strict mode", (int)plen, ptr); 5972 5972 } 5973 + if (plen == STR_PROTO_LEN && memcmp(ptr, STR_PROTO, STR_PROTO_LEN) == 0) { 5974 + jsval_t proto = get_slot(js, mkval(T_OBJ, vdata(l)), SLOT_PROTO); 5975 + if (vtype(proto) != T_UNDEF) return proto; 5976 + return get_prototype_for_type(js, T_FUNC); 5977 + } 5973 5978 jsval_t func_obj = mkval(T_OBJ, vdata(l)); 5974 5979 jsoff_t off = lkp_proto(js, l, ptr, plen); 5975 5980 if (off != 0) { ··· 8332 8337 jsval_t closure_scope = for_let_capture_scope(js); 8333 8338 if (is_err(closure_scope)) return closure_scope; 8334 8339 set_slot(js, func_obj, SLOT_SCOPE, closure_scope); 8340 + 8341 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 8342 + if (vtype(func_proto) == T_FUNC) set_proto(js, func_obj, func_proto); 8335 8343 jsval_t val = mkval(T_FUNC, (unsigned long) vdata(func_obj)); 8336 8344 8337 8345 if (is_getter || is_setter) { ··· 8345 8353 if (key_str) { 8346 8354 if (is_getter) { 8347 8355 js_set_getter_desc(js, obj, key_str, key_len, val, JS_DESC_E | JS_DESC_C); 8348 - } else { 8349 - js_set_setter_desc(js, obj, key_str, key_len, val, JS_DESC_E | JS_DESC_C); 8350 - } 8356 + } else js_set_setter_desc(js, obj, key_str, key_len, val, JS_DESC_E | JS_DESC_C); 8351 8357 } 8352 8358 } else { 8353 8359 jsval_t res = setprop(js, obj, key, val); ··· 8503 8509 set_slot(js, func_obj, SLOT_ASYNC, js_mktrue()); 8504 8510 jsval_t async_proto = get_slot(js, js_glob(js), SLOT_ASYNC_PROTO); 8505 8511 if (vtype(async_proto) == T_FUNC) set_proto(js, func_obj, async_proto); 8512 + } else { 8513 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 8514 + if (vtype(func_proto) == T_FUNC) set_proto(js, func_obj, func_proto); 8506 8515 } 8507 8516 8508 8517 if (name_len > 0) { ··· 8727 8736 8728 8737 jsval_t bound = mkobj(js, 0); 8729 8738 jsval_t method_obj = mkval(T_OBJ, vdata(method)); 8739 + 8730 8740 set_slot(js, bound, SLOT_CODE, get_slot(js, method_obj, SLOT_CODE)); 8731 8741 set_slot(js, bound, SLOT_CODE_LEN, get_slot(js, method_obj, SLOT_CODE_LEN)); 8732 8742 set_slot(js, bound, SLOT_SCOPE, get_slot(js, method_obj, SLOT_SCOPE)); 8733 8743 set_slot(js, bound, SLOT_BOUND_THIS, js->this_val); 8744 + 8745 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 8746 + if (vtype(func_proto) == T_FUNC) set_proto(js, bound, func_proto); 8747 + 8734 8748 return mkval(T_FUNC, vdata(bound)); 8735 8749 } 8736 8750 return super_ctor; ··· 8827 8841 set_slot(js, func_obj, SLOT_ASYNC, js_mktrue()); 8828 8842 jsval_t async_proto = get_slot(js, js_glob(js), SLOT_ASYNC_PROTO); 8829 8843 if (vtype(async_proto) == T_FUNC) set_proto(js, func_obj, async_proto); 8844 + } else { 8845 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 8846 + if (vtype(func_proto) == T_FUNC) set_proto(js, func_obj, func_proto); 8830 8847 } 8831 8848 8832 8849 if (!(flags & F_NOEXEC)) { ··· 9651 9668 set_func_code(js, func_obj, fn_str, fn_pos); 9652 9669 free(fn_str); 9653 9670 9671 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 9672 + if (vtype(func_proto) == T_FUNC) set_proto(js, func_obj, func_proto); 9673 + 9654 9674 if (!(flags & F_NOEXEC)) { 9655 9675 jsval_t closure_scope = for_let_capture_scope(js); 9656 9676 if (is_err(closure_scope)) return closure_scope; ··· 10213 10233 jsval_t func_obj = mkobj(js, 0); 10214 10234 if (is_err(func_obj)) return func_obj; 10215 10235 set_func_code(js, func_obj, &js->code[pos], js->pos - pos); 10236 + 10237 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 10238 + if (vtype(func_proto) == T_FUNC) set_proto(js, func_obj, func_proto); 10239 + 10216 10240 jsval_t len_key = js_mkstr(js, "length", 6); 10217 10241 if (is_err(len_key)) return len_key; 10218 10242 jsval_t res_len = setprop(js, func_obj, len_key, tov(param_count)); ··· 12065 12089 set_slot(js, method_obj, SLOT_ASYNC, js_mktrue()); 12066 12090 jsval_t async_proto = get_slot(js, js_glob(js), SLOT_ASYNC_PROTO); 12067 12091 if (vtype(async_proto) == T_FUNC) set_proto(js, method_obj, async_proto); 12092 + } else { 12093 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 12094 + if (vtype(func_proto) == T_FUNC) set_proto(js, method_obj, func_proto); 12068 12095 } 12069 - if (super_len > 0) set_slot(js, method_obj, SLOT_SUPER, super_constructor); 12070 12096 12097 + if (super_len > 0) set_slot(js, method_obj, SLOT_SUPER, super_constructor); 12071 12098 jsval_t method_func = mkval(T_FUNC, (unsigned long) vdata(method_obj)); 12072 12099 12073 12100 if (m->is_getter || m->is_setter) { ··· 12140 12167 set_slot(js, func_obj, SLOT_SCOPE, func_scope); 12141 12168 if (super_len > 0) set_slot(js, func_obj, SLOT_SUPER, super_constructor); 12142 12169 12170 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 12171 + if (vtype(func_proto) == T_FUNC) set_proto(js, func_obj, func_proto); 12172 + 12143 12173 jsval_t name_key = js_mkstr(js, "name", 4); 12144 12174 if (is_err(name_key)) return name_key; 12145 12175 jsval_t name_val = class_name_len > 0 ? js_mkstr(js, class_name, class_name_len) : js_mkstr(js, "", 0); ··· 12193 12223 set_slot(js, method_obj, SLOT_SCOPE, func_scope); 12194 12224 if (super_len > 0) set_slot(js, method_obj, SLOT_SUPER, super_constructor); 12195 12225 12226 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 12227 + if (vtype(func_proto) == T_FUNC) set_proto(js, method_obj, func_proto); 12228 + 12196 12229 jsval_t method_func = mkval(T_FUNC, (unsigned long) vdata(method_obj)); 12197 12230 jsval_t set_res = setprop(js, func_obj, member_name, method_func); 12198 12231 if (is_err(set_res)) return set_res; ··· 12604 12637 bool caller_strict = (js->flags & F_STRICT) != 0; 12605 12638 12606 12639 jsval_t result = js_eval_inherit_strict(js, code_str, code_len, caller_strict); 12607 - 12608 12640 bool had_throw = (js->flags & F_THROW) != 0; 12609 12641 12610 12642 JS_RESTORE_STATE(js, saved); ··· 12963 12995 set_slot(js, bound_func, SLOT_BOUND_ARGS, bound_arr); 12964 12996 } 12965 12997 12966 - jsval_t bound = mkval(T_FUNC, (unsigned long) vdata(bound_func)); 12998 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 12999 + if (vtype(func_proto) == T_FUNC) set_proto(js, bound_func, func_proto); 12967 13000 13001 + jsval_t bound = mkval(T_FUNC, (unsigned long) vdata(bound_func)); 12968 13002 setprop(js, bound_func, js_mkstr(js, "length", 6), tov((double) bound_length)); 12969 13003 12970 13004 jsval_t proto_setup = setup_func_prototype(js, bound); ··· 12998 13032 set_slot(js, bound_func, SLOT_ASYNC, js_mktrue()); 12999 13033 jsval_t async_proto = get_slot(js, js_glob(js), SLOT_ASYNC_PROTO); 13000 13034 if (vtype(async_proto) == T_FUNC) set_proto(js, bound_func, async_proto); 13035 + } else { 13036 + jsval_t func_proto = get_slot(js, js_glob(js), SLOT_FUNC_PROTO); 13037 + if (vtype(func_proto) == T_FUNC) set_proto(js, bound_func, func_proto); 13001 13038 } 13002 13039 13003 13040 jsval_t data_slot = get_slot(js, func_obj, SLOT_DATA); ··· 21815 21852 setprop(js, function_proto_obj, ANT_STRING("bind"), js_mkfun(builtin_function_bind)); 21816 21853 setprop(js, function_proto_obj, ANT_STRING("toString"), js_mkfun(builtin_function_toString)); 21817 21854 jsval_t function_proto = mkval(T_FUNC, vdata(function_proto_obj)); 21855 + set_slot(js, glob, SLOT_FUNC_PROTO, function_proto); 21818 21856 21819 21857 jsval_t array_proto = js_mkobj(js); 21820 21858 set_proto(js, array_proto, object_proto); ··· 22097 22135 22098 22136 jsval_t async_func_proto_obj = js_mkobj(js); 22099 22137 set_proto(js, async_func_proto_obj, function_proto); 22138 + set_slot(js, async_func_proto_obj, SLOT_ASYNC, js_mktrue()); 22100 22139 jsval_t async_func_proto = mkval(T_FUNC, vdata(async_func_proto_obj)); 22101 22140 set_slot(js, glob, SLOT_ASYNC_PROTO, async_func_proto); 22102 22141