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.

[ci] trigger build: implement dynamic property deletion support

+46 -10
+2
include/ant.h
··· 169 169 170 170 typedef jsval_t (*js_getter_fn)(ant_t *js, jsval_t obj, const char *key, size_t key_len); 171 171 typedef bool (*js_setter_fn)(ant_t *js, jsval_t obj, const char *key, size_t key_len, jsval_t value); 172 + typedef bool (*js_deleter_fn)(ant_t *js, jsval_t obj, const char *key, size_t key_len); 172 173 typedef jsval_t (*js_keys_fn)(ant_t *js, jsval_t obj); 173 174 174 175 void js_set_getter(ant_t *js, jsval_t obj, js_getter_fn getter); 175 176 void js_set_setter(ant_t *js, jsval_t obj, js_setter_fn setter); 177 + void js_set_deleter(ant_t *js, jsval_t obj, js_deleter_fn deleter); 176 178 void js_set_keys(ant_t *js, jsval_t obj, js_keys_fn keys); 177 179 178 180 void js_set_descriptor(ant_t *js, jsval_t obj, const char *key, size_t klen, int flags);
+36 -10
src/ant.c
··· 219 219 jsoff_t obj_offset; 220 220 js_getter_fn getter; 221 221 js_setter_fn setter; 222 + js_deleter_fn deleter; 222 223 js_keys_fn keys; 223 224 UT_hash_handle hh; 224 225 } dynamic_accessors_t; ··· 4859 4860 return entry->setter(js, obj, key, key_len, value); 4860 4861 } 4861 4862 4863 + static bool try_dynamic_deleter(struct js *js, jsval_t obj, const char *key, size_t key_len) { 4864 + jsoff_t obj_off = (jsoff_t)vdata(obj); 4865 + dynamic_accessors_t *entry = NULL; 4866 + HASH_FIND(hh, accessor_registry, &obj_off, sizeof(jsoff_t), entry); 4867 + if (!entry || !entry->deleter) return false; 4868 + return entry->deleter(js, obj, key, key_len); 4869 + } 4870 + 4862 4871 static jsval_t lookup(struct js *js, const char *buf, size_t len) { 4863 4872 if (js->flags & F_NOEXEC) return 0; 4864 4873 ··· 8816 8825 if (vtype(err) != T_UNDEF) return err; 8817 8826 8818 8827 jsoff_t prop_off = lkp(js, obj, key_str, len); 8819 - if (prop_off == 0) return js_true; 8828 + if (prop_off == 0) { 8829 + try_dynamic_deleter(js, obj, key_str, len); 8830 + return js_true; 8831 + } 8820 8832 8821 8833 if (is_nonconfig_prop(js, prop_off)) { 8822 8834 if (js->flags & F_STRICT) return js_mkerr_typed(js, JS_ERR_TYPE, "cannot delete non-configurable property"); ··· 22340 22352 entry = (dynamic_accessors_t *)malloc(sizeof(dynamic_accessors_t)); 22341 22353 if (!entry) return; 22342 22354 entry->obj_offset = obj_off; 22343 - entry->getter = NULL; 22344 - entry->setter = NULL; 22345 - entry->keys = NULL; 22355 + entry->getter = NULL; entry->setter = NULL; 22356 + entry->deleter = NULL; entry->keys = NULL; 22346 22357 HASH_ADD(hh, accessor_registry, obj_offset, sizeof(jsoff_t), entry); 22347 22358 } 22348 22359 entry->getter = getter; ··· 22358 22369 entry = (dynamic_accessors_t *)malloc(sizeof(dynamic_accessors_t)); 22359 22370 if (!entry) return; 22360 22371 entry->obj_offset = obj_off; 22361 - entry->getter = NULL; 22362 - entry->setter = NULL; 22363 - entry->keys = NULL; 22372 + entry->getter = NULL; entry->setter = NULL; 22373 + entry->deleter = NULL; entry->keys = NULL; 22364 22374 HASH_ADD(hh, accessor_registry, obj_offset, sizeof(jsoff_t), entry); 22365 22375 } 22366 22376 entry->setter = setter; 22367 22377 } 22368 22378 22379 + void js_set_deleter(struct js *js, jsval_t obj, js_deleter_fn deleter) { 22380 + if (!is_object_type(obj)) return; 22381 + if (vtype(obj) != T_OBJ) obj = mkval(T_OBJ, vdata(obj)); 22382 + jsoff_t obj_off = (jsoff_t)vdata(obj); 22383 + dynamic_accessors_t *entry = NULL; 22384 + HASH_FIND(hh, accessor_registry, &obj_off, sizeof(jsoff_t), entry); 22385 + if (!entry) { 22386 + entry = (dynamic_accessors_t *)malloc(sizeof(dynamic_accessors_t)); 22387 + if (!entry) return; 22388 + entry->obj_offset = obj_off; 22389 + entry->getter = NULL; entry->setter = NULL; 22390 + entry->deleter = NULL; entry->keys = NULL; 22391 + HASH_ADD(hh, accessor_registry, obj_offset, sizeof(jsoff_t), entry); 22392 + } 22393 + entry->deleter = deleter; 22394 + } 22395 + 22369 22396 void js_set_keys(struct js *js, jsval_t obj, js_keys_fn keys) { 22370 22397 if (!is_object_type(obj)) return; 22371 22398 if (vtype(obj) != T_OBJ) obj = mkval(T_OBJ, vdata(obj)); ··· 22376 22403 entry = (dynamic_accessors_t *)malloc(sizeof(dynamic_accessors_t)); 22377 22404 if (!entry) return; 22378 22405 entry->obj_offset = obj_off; 22379 - entry->getter = NULL; 22380 - entry->setter = NULL; 22381 - entry->keys = NULL; 22406 + entry->getter = NULL; entry->setter = NULL; 22407 + entry->deleter = NULL; entry->keys = NULL; 22382 22408 HASH_ADD(hh, accessor_registry, obj_offset, sizeof(jsoff_t), entry); 22383 22409 } 22384 22410 entry->keys = keys;
+8
src/modules/process.c
··· 1294 1294 return true; 1295 1295 } 1296 1296 1297 + static bool env_deleter(ant_t *js, jsval_t obj, const char *key, size_t key_len) { 1298 + CSTR_BUF(buf, 256); 1299 + char *key_str = CSTR_INIT(buf, key, key_len); 1300 + if (key_str) { unsetenv(key_str); cstr_free(&buf); } 1301 + return true; 1302 + } 1303 + 1297 1304 static void load_dotenv_file(ant_t *js, jsval_t env_obj) { 1298 1305 FILE *fp = fopen(".env", "r"); 1299 1306 if (fp == NULL) return; ··· 1674 1681 1675 1682 js_set_getter(js, env_obj, env_getter); 1676 1683 js_set_setter(js, env_obj, env_setter); 1684 + js_set_deleter(js, env_obj, env_deleter); 1677 1685 1678 1686 js_set(js, env_obj, "toObject", js_mkfun(env_to_object)); 1679 1687 js_set(js, env_obj, "toString", js_mkfun(env_toString));