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 support for special objects (array) in JSON module

+12 -11
+4 -2
include/internal.h
··· 85 85 86 86 #define TYPE_FLAG(t) (1u << (t)) 87 87 88 + #define T_SPECIAL_OBJECT_MASK (TYPE_FLAG(T_OBJ) | TYPE_FLAG(T_ARR)) 88 89 #define T_NEEDS_PROTO_FALLBACK (TYPE_FLAG(T_FUNC) | TYPE_FLAG(T_ARR) | TYPE_FLAG(T_PROMISE)) 89 90 #define T_OBJECT_MASK (TYPE_FLAG(T_OBJ) | TYPE_FLAG(T_ARR) | TYPE_FLAG(T_FUNC) | TYPE_FLAG(T_PROMISE)) 90 91 #define T_NON_NUMERIC_MASK (TYPE_FLAG(T_STR) | TYPE_FLAG(T_ARR) | TYPE_FLAG(T_FUNC) | TYPE_FLAG(T_CFUNC) | TYPE_FLAG(T_OBJ)) ··· 103 104 jsval_t mkval(uint8_t type, uint64_t data); 104 105 jsval_t resolveprop(struct js *js, jsval_t v); 105 106 106 - #define is_non_numeric(v) ((1u << vtype(v)) & T_NON_NUMERIC_MASK) 107 - #define is_object_type(v) ((1u << vtype(v)) & T_OBJECT_MASK) 107 + #define is_non_numeric(v) ((1u << vtype(v)) & T_NON_NUMERIC_MASK) 108 + #define is_object_type(v) ((1u << vtype(v)) & T_OBJECT_MASK) 109 + #define is_special_object(v) ((1u << vtype(v)) & T_SPECIAL_OBJECT_MASK) 108 110 109 111 static inline bool is_err(jsval_t v) { 110 112 return vtype(v) == T_ERR;
+8 -9
src/modules/json.c
··· 109 109 110 110 static int should_skip_prop(struct js *js, const char *key, size_t key_len, jsval_t value) { 111 111 if (is_internal_prop(key, (jsoff_t)key_len)) return 1; 112 - if (vtype(value) != T_OBJ) return 0; 112 + if (!is_special_object(value)) return 0; 113 113 return vtype(js_get_slot(js, value, SLOT_CODE)) == T_CFUNC; 114 114 } 115 115 ··· 152 152 } 153 153 154 154 static int is_key_in_replacer_arr(struct js *js, json_cycle_ctx *ctx, const char *key, size_t key_len) { 155 - if (vtype(ctx->replacer_arr) != T_OBJ) return 1; 155 + if (!is_special_object(ctx->replacer_arr)) return 1; 156 156 157 157 for (int i = 0; i < ctx->replacer_arr_len; i++) { 158 158 char idxstr[32]; ··· 179 179 int type = vtype(val); 180 180 yyjson_mut_val *result = NULL; 181 181 182 - if (type == T_OBJ) { 182 + if (is_special_object(val)) { 183 183 jsval_t toJSON = js_get(js, val, "toJSON"); 184 184 if (vtype(toJSON) == T_FUNC) { 185 185 jsval_t r = js_call(js, toJSON, &val, 1); ··· 212 212 return yyjson_mut_strncpy(doc, str, len); 213 213 } 214 214 215 - case T_OBJ: break; 215 + case T_OBJ: 216 + case T_ARR: break; 216 217 default: return yyjson_mut_null(doc); 217 218 } 218 219 ··· 298 299 static jsval_t apply_reviver(struct js *js, jsval_t holder, const char *key, jsval_t reviver) { 299 300 jsval_t val = js_get(js, holder, key); 300 301 301 - if (vtype(val) == T_OBJ) { 302 + if (is_special_object(val)) { 302 303 jsval_t len_val = js_get(js, val, "length"); 303 304 if (vtype(len_val) == T_NUM) { 304 305 int length = (int)js_getnum(len_val); ··· 403 404 404 405 if (nargs >= 2) { 405 406 jsval_t replacer = args[1]; 406 - int replacer_type = vtype(replacer); 407 - 408 - if (replacer_type == T_FUNC) { 407 + if (vtype(replacer) == T_FUNC) { 409 408 ctx.replacer_func = replacer; 410 - } else if (replacer_type == T_OBJ) { 409 + } else if (is_special_object(replacer)) { 411 410 jsval_t len_val = js_get(js, replacer, "length"); 412 411 if (vtype(len_val) == T_NUM) { 413 412 ctx.replacer_arr = replacer;