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.

consolidate runtime cleanup logic

+38 -30
+1
include/gc.h
··· 3 3 4 4 #include <types.h> 5 5 #include <stddef.h> 6 + #include <stdbool.h> 6 7 7 8 #define ROPE_FLAG (1ULL << 63) 8 9 #define ROPE_DEPTH_SHIFT 56
+3 -1
include/runtime.h
··· 21 21 struct ant_runtime *ant_runtime_init(struct js *js, int argc, char **argv, struct arg_file *ls_p); 22 22 23 23 const char *code_arena_alloc(const char *code, size_t len); 24 - void code_arena_reset(void); 25 24 size_t code_arena_get_memory(void); 25 + 26 + void code_arena_reset(void); 27 + void destroy_runtime(struct js *js); 26 28 27 29 #endif
+3 -2
libant/scripts/header.sh
··· 19 19 "common.h:$INCLUDE_DIR/common.h" 20 20 "types.h:$INCLUDE_DIR/types.h" 21 21 "gc.h:$INCLUDE_DIR/gc.h" 22 - "ant.h:$INCLUDE_DIR/ant.h" 23 22 "roots.h:$INCLUDE_DIR/roots.h" 23 + "uthash.h:$VENDOR_DIR/uthash-2.3.0/src/uthash.h" 24 24 "utarray.h:$VENDOR_DIR/uthash-2.3.0/src/utarray.h" 25 + "ant.h:$INCLUDE_DIR/ant.h" 25 26 "internal.h:$INCLUDE_DIR/internal.h" 26 27 "minicoro.h:$VENDOR_DIR/minicoro/minicoro.h" 27 28 "sugar.h:$INCLUDE_DIR/sugar.h" ··· 110 111 continue 111 112 fi 112 113 113 - if [[ "$line" =~ ^[[:space:]]*#[[:space:]]*include[[:space:]]+\<(config|common|argtable3|types|utarray|minicoro)\.h\> ]]; then 114 + if [[ "$line" =~ ^[[:space:]]*#[[:space:]]*include[[:space:]]+\<(config|common|argtable3|types|utarray|uthash|minicoro)\.h\> ]]; then 114 115 continue 115 116 fi 116 117
+22 -22
src/ant.c
··· 799 799 static jsval_t get_ctor_proto(struct js *js, const char *name, size_t len); 800 800 static jsoff_t lkp_interned(struct js *js, jsval_t obj, const char *search_intern, size_t len); 801 801 802 - static descriptor_entry_t *lookup_descriptor(jsoff_t obj_off, const char *key, size_t klen); 802 + static descriptor_entry_t *lookup_descriptor(struct js *js, jsoff_t obj_off, const char *key, size_t klen); 803 803 static const char *bigint_digits(struct js *js, jsval_t v, size_t *len); 804 804 805 805 typedef struct { jsval_t handle; bool is_new; } ctor_t; ··· 1342 1342 bool should_hide = streq(key, klen, STR_PROTO, STR_PROTO_LEN) || streq(key, klen, tag_sym_key, strlen(tag_sym_key)); 1343 1343 1344 1344 if (!should_hide) { 1345 - descriptor_entry_t *desc = lookup_descriptor(obj_off, key, klen); 1345 + descriptor_entry_t *desc = lookup_descriptor(js, obj_off, key, klen); 1346 1346 if (desc && !desc->enumerable) should_hide = true; 1347 1347 } 1348 1348 ··· 1701 1701 bool should_hide = streq(key, klen, STR_PROTO, STR_PROTO_LEN) || streq(key, klen, tag_sym_key, strlen(tag_sym_key)); 1702 1702 1703 1703 if (!should_hide) { 1704 - descriptor_entry_t *desc = lookup_descriptor(obj_off, key, klen); 1704 + descriptor_entry_t *desc = lookup_descriptor(js, obj_off, key, klen); 1705 1705 if (desc && !desc->enumerable) should_hide = true; 1706 1706 } 1707 1707 ··· 3580 3580 3581 3581 { 3582 3582 jsoff_t obj_off = (jsoff_t)vdata(obj); 3583 - descriptor_entry_t *desc = lookup_descriptor(obj_off, key, klen); 3583 + descriptor_entry_t *desc = lookup_descriptor(js, obj_off, key, klen); 3584 3584 3585 3585 if (!desc) goto no_descriptor; 3586 3586 ··· 5350 5350 5351 5351 for (jsval_t current = obj; is_object_type(current); ) { 5352 5352 jsoff_t current_off = (jsoff_t)vdata(current); 5353 - descriptor_entry_t *desc = lookup_descriptor(current_off, buf, len); 5353 + descriptor_entry_t *desc = lookup_descriptor(js, current_off, buf, len); 5354 5354 5355 5355 if (desc && desc->has_getter) { 5356 5356 *getter_out = desc->getter; ··· 5376 5376 jsval_t current = obj; 5377 5377 while (vtype(current) == T_OBJ || vtype(current) == T_FUNC) { 5378 5378 jsoff_t current_off = (jsoff_t)vdata(current); 5379 - descriptor_entry_t *desc = lookup_descriptor(current_off, buf, len); 5379 + descriptor_entry_t *desc = lookup_descriptor(js, current_off, buf, len); 5380 5380 5381 5381 if (desc && desc->has_setter) { 5382 5382 *setter_out = desc->setter; ··· 6188 6188 return js_mkerr_typed(js, JS_ERR_TYPE, "'%.*s' not allowed on functions in strict mode", (int)keylen, keystr); 6189 6189 } 6190 6190 jsoff_t obj_off = (jsoff_t)vdata(obj); 6191 - descriptor_entry_t *desc = lookup_descriptor(obj_off, keystr, keylen); 6191 + descriptor_entry_t *desc = lookup_descriptor(js, obj_off, keystr, keylen); 6192 6192 if (desc && (desc->has_getter || desc->has_setter)) { 6193 6193 jsval_t key = js_mkstr(js, keystr, keylen); 6194 6194 return mkpropref(obj_off, (jsoff_t)vdata(key)); ··· 6318 6318 return get_prototype_for_type(js, T_FUNC); 6319 6319 } 6320 6320 jsoff_t obj_off = (jsoff_t)vdata(l); 6321 - descriptor_entry_t *desc = lookup_descriptor(obj_off, ptr, plen); 6321 + descriptor_entry_t *desc = lookup_descriptor(js, obj_off, ptr, plen); 6322 6322 if (desc && (desc->has_getter || desc->has_setter)) { 6323 6323 jsval_t key = js_mkstr(js, ptr, plen); 6324 6324 return mkpropref(obj_off, (jsoff_t)vdata(key)); ··· 6392 6392 6393 6393 if (t == T_ARR && !is_proxy(js, l) && plen > 0 && (ptr[0] < '0' || ptr[0] > '9')) { 6394 6394 jsoff_t obj_off = (jsoff_t)vdata(l); 6395 - descriptor_entry_t *desc = lookup_descriptor(obj_off, ptr, plen); 6395 + descriptor_entry_t *desc = lookup_descriptor(js, obj_off, ptr, plen); 6396 6396 if (desc) { 6397 6397 jsval_t key = js_mkstr(js, ptr, plen); 6398 6398 return mkpropref(obj_off, (jsoff_t)vdata(key)); ··· 9764 9764 return js_false; 9765 9765 } 9766 9766 9767 - descriptor_entry_t *desc = lookup_descriptor(obj_off, key_str, len); 9767 + descriptor_entry_t *desc = lookup_descriptor(js, obj_off, key_str, len); 9768 9768 if (desc && !desc->configurable) { 9769 9769 if (js->flags & F_STRICT) return js_mkerr_typed(js, JS_ERR_TYPE, "cannot delete non-configurable property"); 9770 9770 return js_false; ··· 11050 11050 } 11051 11051 11052 11052 if (!skip) { 11053 - descriptor_entry_t *desc = lookup_descriptor(cur_obj_off, key, klen); 11053 + descriptor_entry_t *desc = lookup_descriptor(js, cur_obj_off, key, klen); 11054 11054 if (desc && !desc->enumerable) skip = true; 11055 11055 } 11056 11056 ··· 15175 15175 } 15176 15176 15177 15177 bool should_include = true; 15178 - descriptor_entry_t *desc = lookup_descriptor(obj_off, key, klen); 15178 + descriptor_entry_t *desc = lookup_descriptor(js, obj_off, key, klen); 15179 15179 if (desc) should_include = desc->enumerable; 15180 15180 15181 15181 if (should_include) { ··· 15612 15612 15613 15613 bool should_copy = true; 15614 15614 jsoff_t src_obj_off = (jsoff_t)vdata(src_obj); 15615 - descriptor_entry_t *desc = lookup_descriptor(src_obj_off, key, klen); 15616 - if (desc) { 15617 - should_copy = desc->enumerable; 15618 - } 15615 + 15616 + descriptor_entry_t *desc = lookup_descriptor(js, src_obj_off, key, klen); 15617 + if (desc) should_copy = desc->enumerable; 15619 15618 15620 15619 if (should_copy) { 15621 15620 jsval_t key_str = js_mkstr(js, key, klen); ··· 15799 15798 jsval_t as_obj = (t == T_OBJ) ? obj : mkval(T_OBJ, vdata(obj)); 15800 15799 15801 15800 jsoff_t obj_off = (jsoff_t)vdata(as_obj); 15802 - descriptor_entry_t *desc = lookup_descriptor(obj_off, key_str, key_len); 15801 + descriptor_entry_t *desc = lookup_descriptor(js, obj_off, key_str, key_len); 15803 15802 15804 15803 jsoff_t prop_off = lkp(js, as_obj, key_str, key_len); 15805 15804 if (prop_off == 0 && !desc) { ··· 16045 16044 if (off == 0) return mkval(T_BOOL, 0); 16046 16045 16047 16046 jsoff_t obj_off = (jsoff_t)vdata(as_obj); 16048 - descriptor_entry_t *desc = lookup_descriptor(obj_off, key_str, key_len); 16047 + descriptor_entry_t *desc = lookup_descriptor(js, obj_off, key_str, key_len); 16049 16048 if (desc) { 16050 16049 return mkval(T_BOOL, desc->enumerable ? 1 : 0); 16051 16050 } ··· 22405 22404 ant_arena_free(js->mem, js->max_size); 22406 22405 free(js); 22407 22406 } 22407 + 22408 + destroy_runtime(js); 22408 22409 } 22409 22410 22410 22411 inline double js_getnum(jsval_t value) { return tod(value); } ··· 22482 22483 if (prop_off == 0) return true; 22483 22484 if (is_nonconfig_prop(js, prop_off)) return false; 22484 22485 22485 - descriptor_entry_t *desc = lookup_descriptor(obj_off, key, len); 22486 + descriptor_entry_t *desc = lookup_descriptor(js, obj_off, key, len); 22486 22487 if (desc && !desc->configurable) return false; 22487 22488 22488 22489 jsoff_t first_prop = loadoff(js, obj_off) & ~(3U | FLAGMASK); ··· 23354 23355 .getter = 0, .setter = 0, 23355 23356 }; 23356 23357 23357 - static descriptor_entry_t *lookup_descriptor(jsoff_t obj_off, const char *key, size_t klen) { 23358 + static descriptor_entry_t *lookup_descriptor(struct js *js, jsoff_t obj_off, const char *key, size_t klen) { 23358 23359 if (klen == 6 23359 23360 && memcmp(key, "length", 6) == 0 23360 - && rt && rt->js 23361 - && is_arr_off(rt->js, obj_off) 23361 + && is_arr_off(js, obj_off) 23362 23362 ) return &arr_length_desc; 23363 23363 23364 23364 descriptor_entry_t *entry = NULL;
+9 -5
src/runtime.c
··· 73 73 return dest; 74 74 } 75 75 76 + size_t code_arena_get_memory(void) { 77 + size_t total = 0; 78 + for (code_block_t *b = code_arena_head; b; b = b->next) 79 + total += sizeof(code_block_t) + b->capacity; 80 + return total; 81 + } 82 + 76 83 void code_arena_reset(void) { 77 84 intern_entry_t *entry, *tmp; 78 85 HASH_ITER(hh, code_interns, entry, tmp) { ··· 92 99 code_arena_current = NULL; 93 100 } 94 101 95 - size_t code_arena_get_memory(void) { 96 - size_t total = 0; 97 - for (code_block_t *b = code_arena_head; b; b = b->next) 98 - total += sizeof(code_block_t) + b->capacity; 99 - return total; 102 + void destroy_runtime(struct js *js) { 103 + if (rt->js == js) memset(&runtime, 0, sizeof(runtime)); 100 104 } 101 105 102 106 struct ant_runtime *ant_runtime_init(ant_t *js, int argc, char **argv, struct arg_file *ls_p) {