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.

js_try_get source of truth

+24 -18
+22 -12
src/ant.c
··· 21606 21606 return false; 21607 21607 } 21608 21608 21609 - jsval_t js_get(struct js *js, jsval_t obj, const char *key) { 21609 + static bool js_try_get(struct js *js, jsval_t obj, const char *key, jsval_t *out) { 21610 21610 size_t key_len = strlen(key); 21611 21611 21612 21612 if (vtype(obj) == T_FUNC) { 21613 21613 jsval_t func_obj = mkval(T_OBJ, vdata(obj)); 21614 21614 jsoff_t off = lkp(js, func_obj, key, key_len); 21615 - return off == 0 ? js_mkundef() : resolveprop(js, mkval(T_PROP, off)); 21615 + if (off == 0) return false; 21616 + *out = resolveprop(js, mkval(T_PROP, off)); 21617 + return true; 21616 21618 } 21617 21619 21618 21620 if (vtype(obj) == T_ARR) { 21619 21621 jsval_t arr_obj = mkval(T_OBJ, vdata(obj)); 21620 21622 jsoff_t off = lkp(js, arr_obj, key, key_len); 21621 - return off == 0 ? js_mkundef() : resolveprop(js, mkval(T_PROP, off)); 21623 + if (off == 0) return false; 21624 + *out = resolveprop(js, mkval(T_PROP, off)); 21625 + return true; 21622 21626 } 21623 21627 21624 21628 uint8_t t = vtype(obj); 21625 21629 bool is_promise = (t == T_PROMISE); 21626 21630 if (is_promise) obj = mkval(T_OBJ, vdata(obj)); 21627 - else if (t != T_OBJ) return js_mkundef(); 21631 + else if (t != T_OBJ) return false; 21628 21632 jsoff_t off = lkp(js, obj, key, key_len); 21629 21633 21630 21634 if (off == 0) { 21631 21635 jsval_t result = try_dynamic_getter(js, obj, key, key_len); 21632 - if (vtype(result) != T_UNDEF) return result; 21636 + if (vtype(result) != T_UNDEF) { *out = result; return true; } 21633 21637 } 21634 21638 21635 21639 if (off == 0 && is_promise) { 21636 21640 jsval_t promise_proto = get_ctor_proto(js, "Promise", 7); 21637 21641 if (vtype(promise_proto) != T_UNDEF && vtype(promise_proto) != T_NULL) { 21638 21642 off = lkp(js, promise_proto, key, key_len); 21639 - if (off != 0) return resolveprop(js, mkval(T_PROP, off)); 21643 + if (off != 0) { *out = resolveprop(js, mkval(T_PROP, off)); return true; } 21640 21644 } 21641 21645 } 21642 21646 21643 - return off == 0 ? js_mkundef() : resolveprop(js, mkval(T_PROP, off)); 21647 + if (off == 0) return false; 21648 + *out = resolveprop(js, mkval(T_PROP, off)); 21649 + return true; 21650 + } 21651 + 21652 + jsval_t js_get(struct js *js, jsval_t obj, const char *key) { 21653 + jsval_t val; 21654 + if (js_try_get(js, obj, key, &val)) return val; 21655 + return js_mkundef(); 21644 21656 } 21645 21657 21646 21658 jsval_t js_getprop_proto(struct js *js, jsval_t obj, const char *key) { ··· 21650 21662 } 21651 21663 21652 21664 jsval_t js_getprop_fallback(struct js *js, jsval_t obj, const char *name) { 21653 - jsval_t val = js_get(js, obj, name); 21654 - if (vtype(val) == T_UNDEF) { 21655 - val = js_getprop_proto(js, obj, name); 21656 - } return val; 21665 + jsval_t val; 21666 + if (js_try_get(js, obj, name, &val)) return val; 21667 + return js_getprop_proto(js, obj, name); 21657 21668 } 21658 21669 21659 21670 typedef struct { ··· 21662 21673 } js_iter_ctx_t; 21663 21674 21664 21675 static iter_action_t js_iter_cb(struct js *js, jsval_t value, void *ctx, jsval_t *out) { 21665 - (void)out; 21666 21676 js_iter_ctx_t *ictx = (js_iter_ctx_t *)ctx; 21667 21677 return ictx->callback(js, value, ictx->udata) ? ITER_CONTINUE : ITER_BREAK; 21668 21678 }
+2 -6
src/modules/buffer.c
··· 530 530 if (byte_offset + length * element_size > buffer->length) { 531 531 return js_mkerr(js, "Invalid TypedArray length"); 532 532 } 533 - } else { 534 - length = (buffer->length - byte_offset) / element_size; 535 - } 533 + } else length = (buffer->length - byte_offset) / element_size; 536 534 537 535 return create_typed_array_with_buffer(js, type, buffer, byte_offset, length, type_name, args[0]); 538 536 } ··· 911 909 if (byte_offset + byte_length > buffer->length) { 912 910 return js_mkerr(js, "Invalid DataView length"); 913 911 } 914 - } else { 915 - byte_length = buffer->length - byte_offset; 916 - } 912 + } else byte_length = buffer->length - byte_offset; 917 913 918 914 DataViewData *dv_data = ta_arena_alloc(sizeof(DataViewData)); 919 915 if (!dv_data) return js_mkerr(js, "Failed to allocate DataView");