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.

Object/io cleanup

+130 -16
+1 -1
meson.build
··· 74 74 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 75 75 76 76 version_conf = configuration_data() 77 - version_conf.set('ANT_VERSION', '0.0.8.18') 77 + version_conf.set('ANT_VERSION', '0.0.8.19') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+102 -3
src/ant.c
··· 1115 1115 jsoff_t slen, off = vstr(js, value, &slen); 1116 1116 const char *str = (const char *) &js->mem[off]; 1117 1117 size_t n = 0; 1118 - n += cpy(buf + n, len - n, "\"", 1); 1118 + n += cpy(buf + n, len - n, "'", 1); 1119 1119 for (jsoff_t i = 0; i < slen && n < len - 1; i++) { 1120 1120 char c = str[i]; 1121 1121 if (c == '\n') { n += cpy(buf + n, len - n, "\\n", 2); } 1122 1122 else if (c == '\r') { n += cpy(buf + n, len - n, "\\r", 2); } 1123 1123 else if (c == '\t') { n += cpy(buf + n, len - n, "\\t", 2); } 1124 1124 else if (c == '\\') { n += cpy(buf + n, len - n, "\\\\", 2); } 1125 - else if (c == '"') { n += cpy(buf + n, len - n, "\\\"", 2); } 1125 + else if (c == '\'') { n += cpy(buf + n, len - n, "\\'", 2); } 1126 1126 else { if (n < len) buf[n++] = c; } 1127 1127 } 1128 - n += cpy(buf + n, len - n, "\"", 1); 1128 + n += cpy(buf + n, len - n, "'", 1); 1129 1129 1130 1130 return n; 1131 1131 } ··· 7955 7955 } 7956 7956 } 7957 7957 7958 + for (jsoff_t i = 0; i < idx / 2; i++) { 7959 + jsoff_t j = idx - 1 - i; 7960 + char istr[16], jstr[16]; 7961 + snprintf(istr, sizeof(istr), "%u", (unsigned) i); 7962 + snprintf(jstr, sizeof(jstr), "%u", (unsigned) j); 7963 + jsoff_t ioff = lkp(js, arr, istr, strlen(istr)); 7964 + jsoff_t joff = lkp(js, arr, jstr, strlen(jstr)); 7965 + jsval_t iv = loadval(js, ioff + sizeof(jsoff_t) * 2); 7966 + jsval_t jv = loadval(js, joff + sizeof(jsoff_t) * 2); 7967 + saveval(js, ioff + sizeof(jsoff_t) * 2, jv); 7968 + saveval(js, joff + sizeof(jsoff_t) * 2, iv); 7969 + } 7970 + 7958 7971 jsval_t len_key = js_mkstr(js, "length", 6); 7959 7972 jsval_t len_val = tov((double) idx); 7960 7973 setprop(js, arr, len_key, len_val); ··· 8006 8019 setprop(js, arr, idx_key, val); 8007 8020 idx++; 8008 8021 } 8022 + } 8023 + 8024 + for (jsoff_t i = 0; i < idx / 2; i++) { 8025 + jsoff_t j = idx - 1 - i; 8026 + char istr[16], jstr[16]; 8027 + snprintf(istr, sizeof(istr), "%u", (unsigned) i); 8028 + snprintf(jstr, sizeof(jstr), "%u", (unsigned) j); 8029 + jsoff_t ioff = lkp(js, arr, istr, strlen(istr)); 8030 + jsoff_t joff = lkp(js, arr, jstr, strlen(jstr)); 8031 + jsval_t iv = loadval(js, ioff + sizeof(jsoff_t) * 2); 8032 + jsval_t jv = loadval(js, joff + sizeof(jsoff_t) * 2); 8033 + saveval(js, ioff + sizeof(jsoff_t) * 2, jv); 8034 + saveval(js, joff + sizeof(jsoff_t) * 2, iv); 8035 + } 8036 + 8037 + jsval_t len_key = js_mkstr(js, "length", 6); 8038 + jsval_t len_val = tov((double) idx); 8039 + setprop(js, arr, len_key, len_val); 8040 + return mkval(T_ARR, vdata(arr)); 8041 + } 8042 + 8043 + static jsval_t builtin_object_entries(struct js *js, jsval_t *args, int nargs) { 8044 + if (nargs == 0) return mkarr(js); 8045 + jsval_t obj = args[0]; 8046 + 8047 + if (vtype(obj) != T_OBJ && vtype(obj) != T_ARR && vtype(obj) != T_FUNC) return mkarr(js); 8048 + if (vtype(obj) == T_FUNC) obj = mkval(T_OBJ, vdata(obj)); 8049 + 8050 + jsval_t arr = mkarr(js); 8051 + jsoff_t idx = 0; 8052 + jsoff_t next = loadoff(js, (jsoff_t) vdata(obj)) & ~(3U | CONSTMASK); 8053 + 8054 + while (next < js->brk && next != 0) { 8055 + jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 8056 + jsoff_t klen = offtolen(loadoff(js, koff)); 8057 + const char *key = (char *) &js->mem[koff + sizeof(koff)]; 8058 + jsval_t val = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); 8059 + 8060 + next = loadoff(js, next) & ~(3U | CONSTMASK); 8061 + 8062 + if (streq(key, klen, "__proto__", 9)) continue; 8063 + if (klen > 7 && memcmp(key, "__desc_", 7) == 0) continue; 8064 + 8065 + bool should_include = true; 8066 + char desc_key[128]; 8067 + snprintf(desc_key, sizeof(desc_key), "__desc_%.*s", (int)klen, key); 8068 + jsoff_t desc_off = lkp(js, obj, desc_key, strlen(desc_key)); 8069 + 8070 + if (desc_off != 0) { 8071 + jsval_t desc_obj = resolveprop(js, mkval(T_PROP, desc_off)); 8072 + if (vtype(desc_obj) == T_OBJ) { 8073 + jsoff_t enum_off = lkp(js, desc_obj, "enumerable", 10); 8074 + if (enum_off != 0) { 8075 + jsval_t enum_val = resolveprop(js, mkval(T_PROP, enum_off)); 8076 + should_include = js_truthy(js, enum_val); 8077 + } 8078 + } 8079 + } 8080 + 8081 + if (should_include) { 8082 + jsval_t pair = mkarr(js); 8083 + jsval_t key_val = js_mkstr(js, key, klen); 8084 + setprop(js, pair, js_mkstr(js, "0", 1), key_val); 8085 + setprop(js, pair, js_mkstr(js, "1", 1), val); 8086 + setprop(js, pair, js_mkstr(js, "length", 6), tov(2.0)); 8087 + 8088 + char idxstr[16]; 8089 + snprintf(idxstr, sizeof(idxstr), "%u", (unsigned) idx); 8090 + jsval_t idx_key = js_mkstr(js, idxstr, strlen(idxstr)); 8091 + setprop(js, arr, idx_key, mkval(T_ARR, vdata(pair))); 8092 + idx++; 8093 + } 8094 + } 8095 + 8096 + for (jsoff_t i = 0; i < idx / 2; i++) { 8097 + jsoff_t j = idx - 1 - i; 8098 + char istr[16], jstr[16]; 8099 + snprintf(istr, sizeof(istr), "%u", (unsigned) i); 8100 + snprintf(jstr, sizeof(jstr), "%u", (unsigned) j); 8101 + jsoff_t ioff = lkp(js, arr, istr, strlen(istr)); 8102 + jsoff_t joff = lkp(js, arr, jstr, strlen(jstr)); 8103 + jsval_t iv = loadval(js, ioff + sizeof(jsoff_t) * 2); 8104 + jsval_t jv = loadval(js, joff + sizeof(jsoff_t) * 2); 8105 + saveval(js, ioff + sizeof(jsoff_t) * 2, jv); 8106 + saveval(js, joff + sizeof(jsoff_t) * 2, iv); 8009 8107 } 8010 8108 8011 8109 jsval_t len_key = js_mkstr(js, "length", 6); ··· 11392 11490 setprop(js, obj_func_obj, js_mkstr(js, "__code", 6), js_mkstr(js, "__builtin_Object", 16)); 11393 11491 setprop(js, obj_func_obj, js_mkstr(js, "keys", 4), js_mkfun(builtin_object_keys)); 11394 11492 setprop(js, obj_func_obj, js_mkstr(js, "values", 6), js_mkfun(builtin_object_values)); 11493 + setprop(js, obj_func_obj, js_mkstr(js, "entries", 7), js_mkfun(builtin_object_entries)); 11395 11494 setprop(js, obj_func_obj, js_mkstr(js, "getPrototypeOf", 14), js_mkfun(builtin_object_getPrototypeOf)); 11396 11495 setprop(js, obj_func_obj, js_mkstr(js, "setPrototypeOf", 14), js_mkfun(builtin_object_setPrototypeOf)); 11397 11496 setprop(js, obj_func_obj, js_mkstr(js, "create", 6), js_mkfun(builtin_object_create));
+9 -4
src/main.c
··· 46 46 fprintf(stderr, "%s\n", js_str(js, result)); 47 47 js_result = EXIT_FAILURE; 48 48 } else if (print->count > 0) { 49 - const char *str = js_str(js, result); 50 - if (str && strcmp(str, "undefined") != 0) { 51 - print_value_colored(str, stdout); 52 - printf("\n"); 49 + if (js_type(result) == JS_STR) { 50 + char *str = js_getstr(js, result, NULL); 51 + if (str) printf("%s\n", str); 52 + } else { 53 + const char *str = js_str(js, result); 54 + if (str && strcmp(str, "undefined") != 0) { 55 + print_value_colored(str, stdout); 56 + printf("\n"); 57 + } 53 58 } 54 59 } 55 60
+18 -8
src/modules/io.c
··· 26 26 bool in_string = false; 27 27 bool is_key = true; 28 28 bool escape_next = false; 29 + char string_char = 0; 29 30 30 31 for (const char *p = json; *p; p++) { 31 32 if (escape_next) { ··· 40 41 continue; 41 42 } 42 43 43 - if (*p == '"') { 44 + if (*p == '\'' || *p == '"') { 44 45 if (!in_string) { 45 - fprintf(stream, "%s\"", is_key ? JSON_KEY : JSON_STRING); 46 + fprintf(stream, "%s%c", is_key ? JSON_KEY : JSON_STRING, *p); 46 47 in_string = true; 47 - } else { 48 - fprintf(stream, "\"%s", ANSI_RESET); 48 + string_char = *p; 49 + } else if (*p == string_char) { 50 + fprintf(stream, "%c%s", *p, ANSI_RESET); 49 51 in_string = false; 52 + string_char = 0; 53 + } else { 54 + fputc(*p, stream); 50 55 } 51 56 continue; 52 57 } ··· 115 120 bool escape_next = false; 116 121 bool is_key = true; 117 122 int bracket_depth = 0; 123 + char string_char = 0; 118 124 119 125 for (const char *p = str; *p; p++) { 120 126 if (escape_next) { ··· 129 135 continue; 130 136 } 131 137 132 - if (*p == '"') { 138 + if (*p == '\'' || *p == '"') { 133 139 if (!in_string) { 134 - fprintf(stream, "%s\"", is_key ? JSON_KEY : JSON_STRING); 140 + fprintf(stream, "%s%c", is_key ? JSON_KEY : JSON_STRING, *p); 135 141 in_string = true; 136 - } else { 137 - fprintf(stream, "\"%s", ANSI_RESET); 142 + string_char = *p; 143 + } else if (*p == string_char) { 144 + fprintf(stream, "%c%s", *p, ANSI_RESET); 138 145 in_string = false; 146 + string_char = 0; 147 + } else { 148 + fputc(*p, stream); 139 149 } 140 150 continue; 141 151 }