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 WeakRef, FinalizationRegistry, and proxy data support

+129
+129
src/ant.c
··· 20965 20965 return ws_obj; 20966 20966 } 20967 20967 20968 + static jsval_t builtin_WeakRef(struct js *js, jsval_t *args, int nargs) { 20969 + if (nargs < 1 || vtype(args[0]) != T_OBJ) { 20970 + return js_mkerr(js, "WeakRef target must be an object"); 20971 + } 20972 + 20973 + jsval_t wr_obj = mkobj(js, 0); 20974 + jsval_t wr_proto = get_ctor_proto(js, "WeakRef", 7); 20975 + if (vtype(wr_proto) == T_OBJ) set_proto(js, wr_obj, wr_proto); 20976 + set_slot(js, wr_obj, SLOT_DATA, args[0]); 20977 + 20978 + return wr_obj; 20979 + } 20980 + 20981 + static jsval_t weakref_deref(struct js *js, jsval_t *args, int nargs) { 20982 + (void)args; (void)nargs; 20983 + jsval_t this_val = js->this_val; 20984 + if (vtype(this_val) != T_OBJ) return js_mkundef(); 20985 + 20986 + jsval_t target = get_slot(js, this_val, SLOT_DATA); 20987 + if (vtype(target) != T_OBJ) return js_mkundef(); 20988 + 20989 + return target; 20990 + } 20991 + 20992 + static jsval_t builtin_FinalizationRegistry(struct js *js, jsval_t *args, int nargs) { 20993 + if (nargs < 1 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) { 20994 + return js_mkerr(js, "FinalizationRegistry callback must be a function"); 20995 + } 20996 + 20997 + jsval_t fr_obj = mkobj(js, 0); 20998 + jsval_t fr_proto = get_ctor_proto(js, "FinalizationRegistry", 20); 20999 + if (vtype(fr_proto) == T_OBJ) set_proto(js, fr_obj, fr_proto); 21000 + 21001 + set_slot(js, fr_obj, SLOT_DATA, args[0]); 21002 + set_slot(js, fr_obj, SLOT_MAP, mkarr(js)); 21003 + 21004 + return fr_obj; 21005 + } 21006 + 21007 + static jsval_t finreg_register(struct js *js, jsval_t *args, int nargs) { 21008 + jsval_t this_val = js->this_val; 21009 + if (vtype(this_val) != T_OBJ) return js_mkundef(); 21010 + 21011 + if (nargs < 1 || vtype(args[0]) != T_OBJ) { 21012 + return js_mkerr(js, "FinalizationRegistry.register target must be an object"); 21013 + } 21014 + 21015 + jsval_t target = args[0]; 21016 + jsval_t held_value = nargs > 1 ? args[1] : js_mkundef(); 21017 + jsval_t unregister_token = nargs > 2 ? args[2] : js_mkundef(); 21018 + 21019 + if (vdata(target) == vdata(held_value) && vtype(held_value) == T_OBJ) { 21020 + return js_mkerr(js, "target and held value must not be the same"); 21021 + } 21022 + 21023 + jsval_t registrations = get_slot(js, this_val, SLOT_MAP); 21024 + if (vtype(registrations) != T_ARR) return js_mkundef(); 21025 + 21026 + jsval_t entry = mkarr(js); 21027 + jsoff_t len = arr_length(js, registrations); 21028 + 21029 + char idx[16]; 21030 + size_t idx_len = uint_to_str(idx, sizeof(idx), 0); 21031 + setprop(js, entry, js_mkstr(js, idx, idx_len), target); 21032 + idx_len = uint_to_str(idx, sizeof(idx), 1); 21033 + setprop(js, entry, js_mkstr(js, idx, idx_len), held_value); 21034 + idx_len = uint_to_str(idx, sizeof(idx), 2); 21035 + setprop(js, entry, js_mkstr(js, idx, idx_len), unregister_token); 21036 + setprop(js, entry, js_mkstr(js, "length", 6), tov(3.0)); 21037 + 21038 + idx_len = uint_to_str(idx, sizeof(idx), len); 21039 + setprop(js, registrations, js_mkstr(js, idx, idx_len), entry); 21040 + setprop(js, registrations, js_mkstr(js, "length", 6), tov((double)(len + 1))); 21041 + 21042 + return js_mkundef(); 21043 + } 21044 + 21045 + static jsval_t finreg_unregister(struct js *js, jsval_t *args, int nargs) { 21046 + jsval_t this_val = js->this_val; 21047 + if (vtype(this_val) != T_OBJ) return js_mkfalse(); 21048 + 21049 + if (nargs < 1 || vtype(args[0]) != T_OBJ) { 21050 + return js_mkerr(js, "FinalizationRegistry.unregister token must be an object"); 21051 + } 21052 + 21053 + jsval_t token = args[0]; 21054 + jsval_t registrations = get_slot(js, this_val, SLOT_MAP); 21055 + if (vtype(registrations) != T_ARR) return js_mkfalse(); 21056 + 21057 + jsoff_t len = arr_length(js, registrations); 21058 + bool removed = false; 21059 + 21060 + for (jsoff_t i = 0; i < len; i++) { 21061 + jsval_t entry = arr_get(js, registrations, i); 21062 + if (vtype(entry) != T_ARR) continue; 21063 + jsval_t entry_token = arr_get(js, entry, 2); 21064 + if (vtype(entry_token) == T_OBJ && vdata(entry_token) == vdata(token)) { 21065 + char idx[16]; size_t idx_len = uint_to_str(idx, sizeof(idx), i); 21066 + setprop(js, registrations, js_mkstr(js, idx, idx_len), js_mkundef()); 21067 + removed = true; 21068 + } 21069 + } 21070 + 21071 + return removed ? js_mktrue() : js_mkfalse(); 21072 + } 21073 + 20968 21074 static proxy_data_t *get_proxy_data(jsval_t obj) { 20969 21075 if (vtype(obj) != T_OBJ) return NULL; 20970 21076 jsoff_t off = (jsoff_t)vdata(obj); ··· 21600 21706 setprop(js, weakset_proto, js_mkstr(js, "has", 3), js_mkfun(weakset_has)); 21601 21707 setprop(js, weakset_proto, js_mkstr(js, "delete", 6), js_mkfun(weakset_delete)); 21602 21708 21709 + jsval_t weakref_proto = js_mkobj(js); 21710 + set_proto(js, weakref_proto, object_proto); 21711 + setprop(js, weakref_proto, js_mkstr(js, "deref", 5), js_mkfun(weakref_deref)); 21712 + 21713 + jsval_t finreg_proto = js_mkobj(js); 21714 + set_proto(js, finreg_proto, object_proto); 21715 + setprop(js, finreg_proto, js_mkstr(js, "register", 8), js_mkfun(finreg_register)); 21716 + setprop(js, finreg_proto, js_mkstr(js, "unregister", 10), js_mkfun(finreg_unregister)); 21717 + 21603 21718 jsval_t promise_proto = js_mkobj(js); 21604 21719 set_proto(js, promise_proto, object_proto); 21605 21720 setprop(js, promise_proto, js_mkstr(js, "then", 4), js_mkfun(builtin_promise_then)); ··· 21735 21850 js_setprop_nonconfigurable(js, weakset_ctor_obj, "prototype", 9, weakset_proto); 21736 21851 setprop(js, weakset_ctor_obj, ANT_STRING("name"), ANT_STRING("WeakSet")); 21737 21852 setprop(js, glob, js_mkstr(js, "WeakSet", 7), mkval(T_FUNC, vdata(weakset_ctor_obj))); 21853 + 21854 + jsval_t weakref_ctor_obj = mkobj(js, 0); 21855 + set_proto(js, weakref_ctor_obj, function_proto); 21856 + set_slot(js, weakref_ctor_obj, SLOT_CFUNC, js_mkfun(builtin_WeakRef)); 21857 + js_setprop_nonconfigurable(js, weakref_ctor_obj, "prototype", 9, weakref_proto); 21858 + setprop(js, weakref_ctor_obj, ANT_STRING("name"), ANT_STRING("WeakRef")); 21859 + setprop(js, glob, js_mkstr(js, "WeakRef", 7), mkval(T_FUNC, vdata(weakref_ctor_obj))); 21860 + 21861 + jsval_t finreg_ctor_obj = mkobj(js, 0); 21862 + set_proto(js, finreg_ctor_obj, function_proto); 21863 + set_slot(js, finreg_ctor_obj, SLOT_CFUNC, js_mkfun(builtin_FinalizationRegistry)); 21864 + js_setprop_nonconfigurable(js, finreg_ctor_obj, "prototype", 9, finreg_proto); 21865 + setprop(js, finreg_ctor_obj, ANT_STRING("name"), ANT_STRING("FinalizationRegistry")); 21866 + setprop(js, glob, js_mkstr(js, "FinalizationRegistry", 20), mkval(T_FUNC, vdata(finreg_ctor_obj))); 21738 21867 21739 21868 jsval_t proxy_ctor_obj = mkobj(js, 0); 21740 21869 set_proto(js, proxy_ctor_obj, function_proto);