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.

nitpick fixes

+67 -55
+55 -51
src/ant.c
··· 6637 6637 static jsval_t try_exotic_to_primitive(struct js *js, jsval_t value, int hint) { 6638 6638 const char *tp_key = get_toPrimitive_sym_key(); 6639 6639 if (!tp_key || !tp_key[0]) return mkval(T_UNDEF, 0); 6640 + size_t tp_key_len = strlen(tp_key); 6640 6641 6641 - jsoff_t tp_off = lkp(js, value, tp_key, strlen(tp_key)); 6642 - if (tp_off == 0) tp_off = lkp_proto(js, value, tp_key, strlen(tp_key)); 6642 + jsoff_t tp_off = lkp(js, value, tp_key, tp_key_len); 6643 + if (tp_off == 0) tp_off = lkp_proto(js, value, tp_key, tp_key_len); 6643 6644 if (tp_off == 0) return mkval(T_UNDEF, 0); 6644 6645 6645 6646 jsval_t tp_fn = resolveprop(js, mkval(T_PROP, tp_off)); ··· 6652 6653 6653 6654 const char *hint_str = hint == 1 ? "string" : (hint == 2 ? "number" : "default"); 6654 6655 jsval_t hint_arg = js_mkstr(js, hint_str, strlen(hint_str)); 6655 - jsval_t result = js_call_method(js, value, tp_key, strlen(tp_key), &hint_arg, 1); 6656 + jsval_t result = js_call_method(js, value, tp_key, tp_key_len, &hint_arg, 1); 6656 6657 6657 6658 if (is_err(result) || is_primitive(result)) return result; 6658 6659 return js_mkerr_typed(js, JS_ERR_TYPE, "Cannot convert object to primitive value"); ··· 12057 12058 12058 12059 size_t desc_len = strlen(desc); 12059 12060 size_t total = 7 + desc_len + 1; 12060 - char *buf = malloc(total + 1); 12061 + 12062 + char stack_buf[128]; 12063 + char *buf = (total + 1 <= sizeof(stack_buf)) ? stack_buf : malloc(total + 1); 12061 12064 if (!buf) return js_mkerr(js, "out of memory"); 12062 12065 12063 12066 memcpy(buf, "Symbol(", 7); ··· 12066 12069 buf[total] = '\0'; 12067 12070 12068 12071 jsval_t result = js_mkstr(js, buf, total); 12069 - free(buf); 12072 + if (buf != stack_buf) free(buf); 12070 12073 return result; 12071 12074 } 12072 12075 ··· 13363 13366 int offset_mins = (int)(labs(offset_sec) % 3600) / 60; 13364 13367 13365 13368 char tz[32], buf[80]; 13366 - strftime(tz, sizeof(tz), "%Z", tm_local); 13367 - strftime(buf, sizeof(buf), "%a %b %d %Y %H:%M:%S", tm_local); 13369 + strftime(tz, sizeof(tz), "%Z", &local_copy); 13370 + strftime(buf, sizeof(buf), "%a %b %d %Y %H:%M:%S", &local_copy); 13368 13371 size_t n = strlen(buf); 13369 13372 n += snprintf(buf + n, sizeof(buf) - n, " GMT%+03d%02d (%s)", offset_hours, offset_mins, tz); 13370 13373 return js_mkstr(js, buf, n); ··· 14047 14050 return tov(trunc(x)); 14048 14051 } 14049 14052 14053 + typedef jsval_t (*dynamic_kv_mapper_fn)( 14054 + struct js *js, 14055 + jsval_t key, 14056 + jsval_t val 14057 + ); 14058 + 14059 + static jsval_t iterate_dynamic_keys(struct js *js, jsval_t obj, dynamic_accessors_t *acc, dynamic_kv_mapper_fn mapper) { 14060 + jsval_t keys_arr = acc->keys(js, obj); 14061 + jsval_t arr = mkarr(js); 14062 + jsoff_t len = get_array_length(js, keys_arr); 14063 + 14064 + for (jsoff_t i = 0; i < len; i++) { 14065 + char idx_buf[16]; 14066 + size_t idx_len = uint_to_str(idx_buf, sizeof(idx_buf), (unsigned)i); 14067 + jsoff_t prop_off = lkp(js, keys_arr, idx_buf, idx_len); 14068 + if (!prop_off) continue; 14069 + jsval_t key_val = resolveprop(js, mkval(T_PROP, prop_off)); 14070 + if (vtype(key_val) != T_STR) continue; 14071 + jsoff_t klen; jsoff_t str_off = vstr(js, key_val, &klen); 14072 + const char *key = (const char *)&js->mem[str_off]; 14073 + jsval_t val = acc->getter(js, obj, key, klen); 14074 + js_arr_push(js, arr, mapper ? mapper(js, key_val, val) : val); 14075 + } 14076 + 14077 + return mkval(T_ARR, vdata(arr)); 14078 + } 14079 + 14050 14080 static jsval_t builtin_object_keys(struct js *js, jsval_t *args, int nargs) { 14051 14081 if (nargs == 0) return mkarr(js); 14052 14082 jsval_t obj = args[0]; ··· 14114 14144 jsoff_t obj_off = (jsoff_t)vdata(obj); 14115 14145 dynamic_accessors_t *acc = NULL; 14116 14146 HASH_FIND(hh, accessor_registry, &obj_off, sizeof(jsoff_t), acc); 14117 - if (acc && acc->keys && acc->getter) { 14118 - jsval_t keys_arr = acc->keys(js, obj); 14119 - jsval_t arr = mkarr(js); 14120 - jsoff_t len = get_array_length(js, keys_arr); 14121 - for (jsoff_t i = 0; i < len; i++) { 14122 - char idx_buf[16]; 14123 - size_t idx_len = uint_to_str(idx_buf, sizeof(idx_buf), (unsigned)i); 14124 - jsoff_t prop_off = lkp(js, keys_arr, idx_buf, idx_len); 14125 - if (!prop_off) continue; 14126 - jsval_t key_val = resolveprop(js, mkval(T_PROP, prop_off)); 14127 - if (vtype(key_val) != T_STR) continue; 14128 - jsoff_t klen; jsoff_t str_off = vstr(js, key_val, &klen); 14129 - const char *key = (const char *)&js->mem[str_off]; 14130 - jsval_t val = acc->getter(js, obj, key, klen); 14131 - js_arr_push(js, arr, val); 14132 - } 14133 - return mkval(T_ARR, vdata(arr)); 14134 - } 14147 + if (acc && acc->keys && acc->getter) return iterate_dynamic_keys(js, obj, acc, NULL); 14135 14148 14136 14149 jsval_t arr = mkarr(js); jsoff_t idx = 0; 14137 14150 jsoff_t next = loadoff(js, obj_off) & ~(3U | FLAGMASK); ··· 14166 14179 return mkval(T_ARR, vdata(arr)); 14167 14180 } 14168 14181 14182 + static jsval_t map_to_entry(struct js *js, jsval_t key, jsval_t val) { 14183 + jsval_t pair = mkarr(js); 14184 + js_mkprop_fast(js, pair, "0", 1, key); 14185 + js_mkprop_fast(js, pair, "1", 1, val); 14186 + js_mkprop_fast(js, pair, "length", 6, tov(2.0)); 14187 + return mkval(T_ARR, vdata(pair)); 14188 + } 14189 + 14169 14190 static jsval_t builtin_object_entries(struct js *js, jsval_t *args, int nargs) { 14170 14191 if (nargs == 0) return mkarr(js); 14171 14192 jsval_t obj = args[0]; ··· 14177 14198 dynamic_accessors_t *acc = NULL; 14178 14199 HASH_FIND(hh, accessor_registry, &obj_off, sizeof(jsoff_t), acc); 14179 14200 if (acc && acc->keys && acc->getter) { 14180 - jsval_t keys_arr = acc->keys(js, obj); 14181 - jsval_t arr = mkarr(js); 14182 - jsoff_t len = get_array_length(js, keys_arr); 14183 - for (jsoff_t i = 0; i < len; i++) { 14184 - char idx_buf[16]; 14185 - size_t idx_len = uint_to_str(idx_buf, sizeof(idx_buf), (unsigned)i); 14186 - jsoff_t prop_off = lkp(js, keys_arr, idx_buf, idx_len); 14187 - if (!prop_off) continue; 14188 - jsval_t key_val = resolveprop(js, mkval(T_PROP, prop_off)); 14189 - if (vtype(key_val) != T_STR) continue; 14190 - jsoff_t klen; 14191 - jsoff_t str_off = vstr(js, key_val, &klen); 14192 - const char *key = (const char *)&js->mem[str_off]; 14193 - jsval_t val = acc->getter(js, obj, key, klen); 14194 - jsval_t pair = mkarr(js); 14195 - js_mkprop_fast(js, pair, "0", 1, key_val); 14196 - js_mkprop_fast(js, pair, "1", 1, val); 14197 - js_mkprop_fast(js, pair, "length", 6, tov(2.0)); 14198 - js_arr_push(js, arr, mkval(T_ARR, vdata(pair))); 14199 - } 14200 - return mkval(T_ARR, vdata(arr)); 14201 + return iterate_dynamic_keys(js, obj, acc, map_to_entry); 14201 14202 } 14202 14203 14203 14204 jsval_t arr = mkarr(js); ··· 14214 14215 jsval_t val = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); 14215 14216 14216 14217 next = next_prop(header); 14217 - 14218 14218 if (is_internal_prop(key, klen)) continue; 14219 14219 14220 14220 bool should_include = true; ··· 14928 14928 14929 14929 if (klen >= 9 && memcmp(key, "__sym_", 6) == 0 && memcmp(key + klen - 2, "__", 2) == 0) { 14930 14930 uint64_t sym_id = 0; 14931 - for (const char *p = key + 6; *p >= '0' && *p <= '9'; p++) sym_id = sym_id * 10 + (uint64_t)(*p - '0'); 14931 + for (const char *p = key + 6; *p >= '0' && *p <= '9' && sym_id <= PROPREF_PAYLOAD / 10; p++) 14932 + sym_id = sym_id * 10 + (uint64_t)(*p - '0'); 14932 14933 char idxstr[16]; size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (unsigned)idx++); 14933 14934 js_mkprop_fast(js, arr, idxstr, idxlen, mkval(T_SYMBOL, (sym_id & PROPREF_PAYLOAD) << PROPREF_KEY_SHIFT)); 14934 14935 } ··· 22268 22269 jsoff_t js_loadoff(struct js *js, jsoff_t off) { return loadoff(js, off); } 22269 22270 22270 22271 void js_set_getter(struct js *js, jsval_t obj, js_getter_fn getter) { 22271 - if (vtype(obj) != T_OBJ) return; 22272 + if (!is_object_type(obj)) return; 22273 + if (vtype(obj) != T_OBJ) obj = mkval(T_OBJ, vdata(obj)); 22272 22274 jsoff_t obj_off = (jsoff_t)vdata(obj); 22273 22275 dynamic_accessors_t *entry = NULL; 22274 22276 HASH_FIND(hh, accessor_registry, &obj_off, sizeof(jsoff_t), entry); ··· 22285 22287 } 22286 22288 22287 22289 void js_set_setter(struct js *js, jsval_t obj, js_setter_fn setter) { 22288 - if (vtype(obj) != T_OBJ) return; 22290 + if (!is_object_type(obj)) return; 22291 + if (vtype(obj) != T_OBJ) obj = mkval(T_OBJ, vdata(obj)); 22289 22292 jsoff_t obj_off = (jsoff_t)vdata(obj); 22290 22293 dynamic_accessors_t *entry = NULL; 22291 22294 HASH_FIND(hh, accessor_registry, &obj_off, sizeof(jsoff_t), entry); ··· 22302 22305 } 22303 22306 22304 22307 void js_set_keys(struct js *js, jsval_t obj, js_keys_fn keys) { 22305 - if (vtype(obj) != T_OBJ) return; 22308 + if (!is_object_type(obj)) return; 22309 + if (vtype(obj) != T_OBJ) obj = mkval(T_OBJ, vdata(obj)); 22306 22310 jsoff_t obj_off = (jsoff_t)vdata(obj); 22307 22311 dynamic_accessors_t *entry = NULL; 22308 22312 HASH_FIND(hh, accessor_registry, &obj_off, sizeof(jsoff_t), entry);
+3 -2
src/modules/buffer.c
··· 527 527 528 528 if (nargs > 2 && vtype(args[2]) == T_NUM) { 529 529 length = (size_t)js_getnum(args[2]); 530 - if (byte_offset + length * element_size > buffer->length) { 530 + size_t available = buffer->length - byte_offset; 531 + if (length > available / element_size) { 531 532 return js_mkerr(js, "Invalid TypedArray length"); 532 533 } 533 534 } else length = (buffer->length - byte_offset) / element_size; ··· 906 907 907 908 if (nargs > 2 && vtype(args[2]) == T_NUM) { 908 909 byte_length = (size_t)js_getnum(args[2]); 909 - if (byte_offset + byte_length > buffer->length) { 910 + if (byte_length > buffer->length - byte_offset) { 910 911 return js_mkerr(js, "Invalid DataView length"); 911 912 } 912 913 } else byte_length = buffer->length - byte_offset;
+9 -2
src/modules/process.c
··· 1363 1363 return obj; 1364 1364 } 1365 1365 1366 - static jsval_t env_toString(ant_t *js, jsval_t *args, int nargs) { 1366 + static jsval_t env_toString(ant_t *js, jsval_t *args, int nargs) { 1367 1367 size_t buf_cap = 4096; 1368 1368 char *buf = malloc(buf_cap); 1369 + if (!buf) return js_mkstr(js, "", 0); 1369 1370 size_t pos = 0; 1370 1371 1371 1372 for (char **env = environ; *env != NULL; env++) { ··· 1374 1375 1375 1376 if (pos + entry_len + 2 >= buf_cap) { 1376 1377 buf_cap = buf_cap * 2 + entry_len; 1377 - buf = realloc(buf, buf_cap); 1378 + char *new_buf = realloc(buf, buf_cap); 1379 + if (!new_buf) { 1380 + buf[pos] = '\0'; 1381 + jsval_t ret = js_mkstr(js, buf, pos); 1382 + free(buf); return ret; 1383 + } 1384 + buf = new_buf; 1378 1385 } 1379 1386 1380 1387 if (pos > 0) buf[pos++] = '\n';