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 iterator hooks

+16 -4
+16 -4
src/modules/symbol.c
··· 74 74 return js->sym.iterator_proto; 75 75 } 76 76 77 + static inline ant_value_t iter_get_element(ant_t *js, ant_value_t obj, uint32_t idx) { 78 + if (vtype(obj) == T_ARR) return js_arr_get(js, obj, (ant_offset_t)idx); 79 + char buf[16]; snprintf(buf, sizeof(buf), "%u", idx); 80 + return js_get(js, obj, buf); 81 + } 82 + 83 + static inline ant_offset_t iter_get_length(ant_t *js, ant_value_t obj) { 84 + if (vtype(obj) == T_ARR) return js_arr_len(js, obj); 85 + ant_value_t v = js_get(js, obj, "length"); 86 + return (vtype(v) == T_NUM) ? (ant_offset_t)js_getnum(v) : 0; 87 + } 88 + 77 89 static bool advance_array(ant_t *js, js_iter_t *it, ant_value_t *out) { 78 90 ant_value_t iter = it->iterator; 79 91 ant_value_t array = js_get_slot(iter, SLOT_DATA); 80 92 ant_value_t state_v = js_get_slot(iter, SLOT_ITER_STATE); 81 - 93 + 82 94 uint32_t state = (vtype(state_v) == T_NUM) ? (uint32_t)js_getnum(state_v) : 0; 83 95 uint32_t kind = ITER_STATE_KIND(state); 84 96 uint32_t idx = ITER_STATE_INDEX(state); 85 - ant_offset_t len = js_arr_len(js, array); 97 + ant_offset_t len = iter_get_length(js, array); 86 98 if (idx >= (uint32_t)len) return false; 87 99 88 100 switch (kind) { ··· 92 104 case ARR_ITER_ENTRIES: { 93 105 ant_value_t pair = js_mkarr(js); 94 106 js_arr_push(js, pair, js_mknum((double)idx)); 95 - js_arr_push(js, pair, js_arr_get(js, array, (ant_offset_t)idx)); 107 + js_arr_push(js, pair, iter_get_element(js, array, idx)); 96 108 *out = pair; 97 109 break; 98 110 } 99 111 default: 100 - *out = js_arr_get(js, array, (ant_offset_t)idx); 112 + *out = iter_get_element(js, array, idx); 101 113 break; 102 114 } 103 115