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 ArrayBuffer in toString conversion

+75 -27
+29 -1
src/ant.c
··· 48 48 #include "modules/child_process.h" 49 49 #include "modules/readline.h" 50 50 #include "modules/json.h" 51 + #include "modules/buffer.h" 51 52 #include "esm/remote.h" 52 53 53 54 #define CORO_MALLOC(size) calloc(1, size) ··· 1703 1704 1704 1705 const char *tostring_tag_key = get_toStringTag_sym_key(); 1705 1706 jsoff_t tag_off = lkp_proto(js, obj, tostring_tag_key, strlen(tostring_tag_key)); 1706 - bool is_map = false, is_set = false; 1707 + bool is_map = false, is_set = false, is_arraybuffer = false; 1707 1708 jsoff_t tlen = 0, toff = 0; 1708 1709 const char *tag_str = NULL; 1709 1710 int prop_count = 0; ··· 1718 1719 tag_str = (const char *) &js->mem[toff]; 1719 1720 is_map = (tlen == 3 && memcmp(tag_str, "Map", 3) == 0); 1720 1721 is_set = (tlen == 3 && memcmp(tag_str, "Set", 3) == 0); 1722 + is_arraybuffer = (tlen >= 11 && memcmp(tag_str + tlen - 11, "ArrayBuffer", 11) == 0); 1723 + 1724 + if (is_arraybuffer) { 1725 + jsval_t buf_val = js_get_slot(js, obj, SLOT_BUFFER); 1726 + if (vtype(buf_val) == T_NUM) { 1727 + ArrayBufferData *ab_data = (ArrayBufferData *)(uintptr_t)tod(buf_val); 1728 + size_t bytelen = ab_data ? ab_data->length : 0; 1729 + 1730 + n += cpy(buf + n, len - n, tag_str, tlen); 1731 + n += cpy(buf + n, len - n, " {\n", 3); 1732 + n += cpy(buf + n, len - n, " [Uint8Contents]: <", 20); 1733 + 1734 + if (ab_data && ab_data->data && bytelen > 0) { 1735 + for (size_t i = 0; i < bytelen; i++) { 1736 + if (i > 0) n += cpy(buf + n, len - n, " ", 1); 1737 + n += (size_t) snprintf(buf + n, len - n, "%02x", ab_data->data[i]); 1738 + } 1739 + } 1740 + 1741 + n += cpy(buf + n, len - n, ">,\n", 3); 1742 + n += cpy(buf + n, len - n, " [byteLength]: ", 16); 1743 + n += (size_t) snprintf(buf + n, len - n, "%zu", bytelen); 1744 + n += cpy(buf + n, len - n, "\n}", 2); 1745 + pop_stringify(); 1746 + return n; 1747 + } 1748 + } 1721 1749 1722 1750 if (is_map) { 1723 1751 jsval_t map_val = js_get_slot(js, obj, SLOT_MAP);
+28 -16
src/modules/buffer.c
··· 179 179 } 180 180 181 181 jsval_t obj = js_mkobj(js); 182 - js_set(js, obj, "_arraybuffer_data", js_mknum((double)(uintptr_t)data)); 183 - js_set(js, obj, "byteLength", js_mknum((double)length)); 184 - js_set(js, obj, "slice", js_mkfun(js_arraybuffer_slice)); 182 + jsval_t proto = js_get_ctor_proto(js, "ArrayBuffer", 11); 183 + 184 + if (js_type(proto) == JS_OBJ) js_set_proto(js, obj, proto); 185 + js_set_slot(js, obj, SLOT_BUFFER, ANT_PTR(data)); 186 + js_set(js, obj, "byteLength", js_mknum(length)); 185 187 186 188 return obj; 187 189 } ··· 189 191 // ArrayBuffer.prototype.slice(begin, end) 190 192 static jsval_t js_arraybuffer_slice(struct js *js, jsval_t *args, int nargs) { 191 193 jsval_t this_val = js_getthis(js); 192 - jsval_t data_val = js_get(js, this_val, "_arraybuffer_data"); 194 + jsval_t data_val = js_get_slot(js, this_val, SLOT_BUFFER); 193 195 194 196 if (js_type(data_val) != JS_NUM) { 195 197 return js_mkerr(js, "Not an ArrayBuffer"); ··· 217 219 memcpy(new_data->data, data->data + begin, new_length); 218 220 219 221 jsval_t new_obj = js_mkobj(js); 220 - js_set(js, new_obj, "_arraybuffer_data", js_mknum((double)(uintptr_t)new_data)); 221 - js_set(js, new_obj, "byteLength", js_mknum((double)new_length)); 222 - js_set(js, new_obj, "slice", js_mkfun(js_arraybuffer_slice)); 222 + jsval_t proto = js_get_ctor_proto(js, "ArrayBuffer", 11); 223 + 224 + if (js_type(proto) == JS_OBJ) js_set_proto(js, new_obj, proto); 225 + js_set_slot(js, new_obj, SLOT_BUFFER, ANT_PTR(new_data)); 226 + js_set(js, new_obj, "byteLength", js_mknum(new_length)); 223 227 224 228 return new_obj; 225 229 } ··· 343 347 return create_typed_array(js, type, buffer, 0, length, type_name); 344 348 } 345 349 346 - jsval_t buffer_data_val = js_get(js, args[0], "_arraybuffer_data"); 350 + jsval_t buffer_data_val = js_get_slot(js, args[0], SLOT_BUFFER); 347 351 if (js_type(buffer_data_val) == JS_NUM) { 348 352 ArrayBufferData *buffer = (ArrayBufferData *)(uintptr_t)js_getnum(buffer_data_val); 349 353 size_t byte_offset = 0; ··· 551 555 return js_mkerr(js, "DataView requires an ArrayBuffer"); 552 556 } 553 557 554 - jsval_t buffer_data_val = js_get(js, args[0], "_arraybuffer_data"); 558 + jsval_t buffer_data_val = js_get_slot(js, args[0], SLOT_BUFFER); 555 559 if (js_type(buffer_data_val) != JS_NUM) { 556 560 return js_mkerr(js, "First argument must be an ArrayBuffer"); 557 561 } ··· 908 912 } 909 913 910 914 jsval_t obj = js_mkobj(js); 911 - js_set(js, obj, "_arraybuffer_data", js_mknum((double)(uintptr_t)data)); 912 - js_set(js, obj, "_shared", js_mktrue()); 913 - js_set(js, obj, "byteLength", js_mknum((double)length)); 914 - js_set(js, obj, "slice", js_mkfun(js_arraybuffer_slice)); 915 + jsval_t proto = js_get_ctor_proto(js, "SharedArrayBuffer", 17); 916 + 917 + if (js_type(proto) == JS_OBJ) js_set_proto(js, obj, proto); 918 + js_set_slot(js, obj, SLOT_BUFFER, ANT_PTR(data)); 919 + js_set(js, obj, "byteLength", js_mknum(length)); 915 920 916 921 return obj; 917 922 } ··· 922 927 923 928 jsval_t arraybuffer_ctor_obj = js_mkobj(js); 924 929 jsval_t arraybuffer_proto = js_mkobj(js); 930 + 925 931 js_set(js, arraybuffer_proto, "slice", js_mkfun(js_arraybuffer_slice)); 932 + js_set(js, arraybuffer_proto, get_toStringTag_sym_key(), js_mkstr(js, "ArrayBuffer", 11)); 933 + 926 934 js_set_slot(js, arraybuffer_ctor_obj, SLOT_CFUNC, js_mkfun(js_arraybuffer_constructor)); 927 935 js_setprop(js, arraybuffer_ctor_obj, js_mkstr(js, "prototype", 9), arraybuffer_proto); 928 936 js_set(js, glob, "ArrayBuffer", js_obj_to_func(arraybuffer_ctor_obj)); ··· 961 969 js_set(js, dataview_constructor, "prototype", dataview_proto); 962 970 js_set(js, glob, "DataView", dataview_constructor); 963 971 964 - jsval_t sharedarraybuffer_constructor = js_mkfun(js_sharedarraybuffer_constructor); 972 + jsval_t sharedarraybuffer_ctor_obj = js_mkobj(js); 965 973 jsval_t sharedarraybuffer_proto = js_mkobj(js); 974 + 966 975 js_set(js, sharedarraybuffer_proto, "slice", js_mkfun(js_arraybuffer_slice)); 967 - js_set(js, sharedarraybuffer_constructor, "prototype", sharedarraybuffer_proto); 968 - js_set(js, glob, "SharedArrayBuffer", sharedarraybuffer_constructor); 976 + js_set(js, sharedarraybuffer_proto, get_toStringTag_sym_key(), js_mkstr(js, "SharedArrayBuffer", 17)); 977 + 978 + js_set_slot(js, sharedarraybuffer_ctor_obj, SLOT_CFUNC, js_mkfun(js_sharedarraybuffer_constructor)); 979 + js_setprop(js, sharedarraybuffer_ctor_obj, js_mkstr(js, "prototype", 9), sharedarraybuffer_proto); 980 + js_set(js, glob, "SharedArrayBuffer", js_obj_to_func(sharedarraybuffer_ctor_obj)); 969 981 970 982 jsval_t buffer_obj = js_mkobj(js); 971 983 js_set(js, buffer_obj, "from", js_mkfun(js_buffer_from));
+15 -3
src/modules/io.c
··· 28 28 #define JSON_FUNC "\x1b[36m" 29 29 #define JSON_TAG "\x1b[34m" 30 30 #define JSON_REF "\x1b[90m" 31 + #define JSON_WHITE "\x1b[97m" 31 32 32 33 static void io_putc(int c, FILE *stream) { fputc(c, stream); } 33 34 static void io_puts(const char *s, FILE *stream) { fputs(s, stream); } ··· 114 115 io_puts(ANSI_RESET, stream); goto next; 115 116 116 117 #define EMIT_TYPE(tag, len, color) \ 117 - if (memcmp(p, tag, len) == 0) { \ 118 + if (!(is_key && brace_depth > 0) && memcmp(p, tag, len) == 0) { \ 118 119 io_puts(color, stream); io_puts(tag, stream); io_puts(ANSI_RESET, stream); \ 119 120 p += len; goto next; \ 120 121 } ··· 167 168 lbrack: 168 169 switch (p[1]) { 169 170 case 'A': if (memcmp(p + 2, "syncFunction", 7) == 0) { EMIT_UNTIL(']', JSON_FUNC) } break; 171 + case 'b': if (memcmp(p + 2, "yteLength]", 10) == 0) { EMIT_UNTIL(']', JSON_STRING) } break; 170 172 case 'F': if (memcmp(p + 2, "unction", 7) == 0) { EMIT_UNTIL(']', JSON_FUNC) } break; 171 173 case 'n': if (memcmp(p + 2, "ative code]", 11) == 0) { EMIT_UNTIL(']', JSON_FUNC) } break; 172 174 case 'C': if (memcmp(p + 2, "ircular", 7) == 0) { EMIT_UNTIL(']', JSON_REF) } break; ··· 174 176 case 'S': if (memcmp(p + 2, "etter]", 6) == 0) { EMIT_UNTIL(']', JSON_FUNC) } break; 175 177 case 'O': if (memcmp(p + 2, "bject: null prototype]", 22) == 0) { EMIT_UNTIL(']', JSON_TAG) } break; 176 178 case 'M': if (memcmp(p + 2, "odule]", 6) == 0) { EMIT_UNTIL(']', JSON_TAG) } break; 179 + case 'U': if (memcmp(p + 2, "int8Contents]", 13) == 0) { EMIT_UNTIL(']', JSON_FUNC) } break; 177 180 case 'P': if (memcmp(p + 2, "romise]", 7) == 0) { EMIT_UNTIL(']', JSON_TAG) } break; 178 181 } 179 182 io_puts(JSON_BRACE, stream); io_putc(*p++, stream); io_puts(ANSI_RESET, stream); ··· 212 215 if (memcmp(p, "<ref", 4) == 0) { EMIT_UNTIL('>', JSON_REF) } 213 216 if (memcmp(p, "<pen", 4) == 0) { is_key = false; EMIT_UNTIL('>', ANSI_CYAN) } 214 217 if (memcmp(p, "<rej", 4) == 0) { is_key = false; EMIT_UNTIL('>', ANSI_CYAN) } 218 + 219 + if (p[1] == '>' || (isxdigit((unsigned char)p[1]) && isxdigit((unsigned char)p[2]))) { 220 + io_puts(JSON_BRACE, stream); io_putc(*p++, stream); 221 + io_puts(JSON_WHITE, stream); 222 + while (*p && *p != '>') io_putc(*p++, stream); 223 + io_puts(ANSI_RESET, stream); 224 + if (*p == '>') { io_puts(JSON_BRACE, stream); io_putc(*p++, stream); io_puts(ANSI_RESET, stream); } 225 + goto next; 226 + } 227 + 215 228 io_puts(JSON_BRACE, stream); io_putc(*p++, stream); io_puts(ANSI_RESET, stream); 216 229 goto next; 217 230 ··· 225 238 226 239 EMIT_TYPE("Map", 3, JSON_STRING) 227 240 EMIT_TYPE("Set", 3, JSON_STRING) 228 - EMIT_TYPE("ArrayBuffer", 11, JSON_STRING) 229 - 241 + 230 242 KEYWORD("true", JSON_BOOL) 231 243 KEYWORD("false", JSON_BOOL) 232 244 KEYWORD("null", JSON_NULL)
+2 -6
src/modules/symbol.c
··· 189 189 190 190 jsval_t map_ctor = js_get(js, js_glob(js), "Map"); 191 191 jsval_t map_proto = js_get(js, map_ctor, "prototype"); 192 - if (js_type(map_proto) == JS_OBJ) { 193 - js_set(js, map_proto, g_toStringTag_sym_key, js_mkstr(js, "Map", 3)); 194 - } 192 + js_set(js, map_proto, g_toStringTag_sym_key, js_mkstr(js, "Map", 3)); 195 193 196 194 jsval_t set_ctor = js_get(js, js_glob(js), "Set"); 197 195 jsval_t set_proto = js_get(js, set_ctor, "prototype"); 198 - if (js_type(set_proto) == JS_OBJ) { 199 - js_set(js, set_proto, g_toStringTag_sym_key, js_mkstr(js, "Set", 3)); 200 - } 196 + js_set(js, set_proto, g_toStringTag_sym_key, js_mkstr(js, "Set", 3)); 201 197 }
+1 -1
src/modules/textcodec.c
··· 100 100 return js_mkstr(js, (const char *)data, len); 101 101 } 102 102 103 - jsval_t ab_data_val = js_get(js, args[0], "_arraybuffer_data"); 103 + jsval_t ab_data_val = js_get_slot(js, args[0], SLOT_BUFFER); 104 104 if (js_type(ab_data_val) == JS_NUM) { 105 105 ArrayBufferData *ab_data = (ArrayBufferData *)(uintptr_t)js_getnum(ab_data_val); 106 106 if (!ab_data || !ab_data->data) return js_mkstr(js, "", 0);