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.

proper repl filename + improved strObj

+70 -21
+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.1.0.4') 77 + version_conf.set('ANT_VERSION', '0.1.0.5') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+64 -20
src/ant.c
··· 1015 1015 1016 1016 static jsoff_t vstr(struct js *js, jsval_t value, jsoff_t *len); 1017 1017 static size_t strstring(struct js *js, jsval_t value, char *buf, size_t len); 1018 + static size_t strkey(struct js *js, jsval_t value, char *buf, size_t len); 1018 1019 1019 1020 static bool is_valid_identifier(const char *str, jsoff_t slen) { 1020 1021 if (slen == 0) return false; ··· 1036 1037 return strstring(js, value, buf, len); 1037 1038 } 1038 1039 1040 + static size_t print_prototype(struct js *js, jsval_t proto_val, char *buf, size_t len, bool *first) { 1041 + size_t n = 0; 1042 + bool has_proto_props = false; 1043 + jsoff_t proto_next = loadoff(js, (jsoff_t) vdata(proto_val)) & ~(3U | CONSTMASK); 1044 + 1045 + while (proto_next < js->brk && proto_next != 0) { 1046 + jsoff_t pkoff = loadoff(js, proto_next + (jsoff_t) sizeof(proto_next)); 1047 + jsoff_t pklen = offtolen(loadoff(js, pkoff)); 1048 + const char *pkstr = (const char *) &js->mem[pkoff + sizeof(jsoff_t)]; 1049 + 1050 + if (!streq(pkstr, pklen, "__proto__", 9) && !streq(pkstr, pklen, "constructor", 11) && !streq(pkstr, pklen, "@@toStringTag", 13) && !streq(pkstr, pklen, "__getter", 8)) { 1051 + has_proto_props = true; 1052 + break; 1053 + } 1054 + proto_next = loadoff(js, proto_next) & ~(3U | CONSTMASK); 1055 + } 1056 + 1057 + if (!*first) n += cpy(buf + n, len - n, ",\n", 2); 1058 + *first = false; 1059 + n += add_indent(buf + n, len - n, stringify_indent); 1060 + 1061 + if (has_proto_props) { 1062 + n += cpy(buf + n, len - n, "[Prototype]: {\n", 15); 1063 + stringify_indent++; 1064 + 1065 + bool proto_first = true; 1066 + proto_next = loadoff(js, (jsoff_t) vdata(proto_val)) & ~(3U | CONSTMASK); 1067 + while (proto_next < js->brk && proto_next != 0) { 1068 + jsoff_t pkoff = loadoff(js, proto_next + (jsoff_t) sizeof(proto_next)); 1069 + jsval_t pval = loadval(js, proto_next + (jsoff_t) (sizeof(proto_next) + sizeof(pkoff))); 1070 + 1071 + jsoff_t pklen = offtolen(loadoff(js, pkoff)); 1072 + const char *pkstr = (const char *) &js->mem[pkoff + sizeof(jsoff_t)]; 1073 + 1074 + if (!streq(pkstr, pklen, "__proto__", 9) && !streq(pkstr, pklen, "constructor", 11) && !streq(pkstr, pklen, "@@toStringTag", 13) && !streq(pkstr, pklen, "__getter", 8)) { 1075 + if (!proto_first) n += cpy(buf + n, len - n, ",\n", 2); 1076 + proto_first = false; 1077 + n += add_indent(buf + n, len - n, stringify_indent); 1078 + n += strkey(js, mkval(T_STR, pkoff), buf + n, len - n); 1079 + n += cpy(buf + n, len - n, ": ", 2); 1080 + n += tostr(js, pval, buf + n, len - n); 1081 + } 1082 + proto_next = loadoff(js, proto_next) & ~(3U | CONSTMASK); 1083 + } 1084 + 1085 + stringify_indent--; 1086 + n += cpy(buf + n, len - n, "\n", 1); 1087 + n += add_indent(buf + n, len - n, stringify_indent); 1088 + n += cpy(buf + n, len - n, "}", 1); 1089 + } else { 1090 + n += cpy(buf + n, len - n, "[Prototype]: {}", 15); 1091 + } 1092 + 1093 + return n; 1094 + } 1095 + 1039 1096 static size_t strobj(struct js *js, jsval_t obj, char *buf, size_t len) { 1040 1097 jsoff_t time_off = lkp(js, obj, "__time", 6); 1041 1098 if (time_off != 0) return strdate(js, obj, buf, len); ··· 1084 1141 n += tostr(js, val, buf + n, len - n); 1085 1142 } 1086 1143 next = loadoff(js, next) & ~(3U | CONSTMASK); 1144 + } 1145 + 1146 + jsoff_t proto_off = lkp(js, obj, "__proto__", 9); 1147 + if (proto_off != 0) { 1148 + jsval_t proto_val = resolveprop(js, mkval(T_PROP, proto_off)); 1149 + if (vtype(proto_val) == T_OBJ) n += print_prototype(js, proto_val, buf + n, len - n, &first); 1087 1150 } 1088 1151 1089 1152 stringify_indent--; ··· 1175 1238 jsoff_t proto_off = lkp(js, func_obj, "prototype", 9); 1176 1239 if (proto_off != 0) { 1177 1240 jsval_t proto_val = resolveprop(js, mkval(T_PROP, proto_off)); 1178 - if (vtype(proto_val) == T_OBJ) { 1179 - jsoff_t proto_next = loadoff(js, (jsoff_t) vdata(proto_val)) & ~(3U | CONSTMASK); 1180 - while (proto_next < js->brk && proto_next != 0) { 1181 - jsoff_t pkoff = loadoff(js, proto_next + (jsoff_t) sizeof(proto_next)); 1182 - jsval_t pval = loadval(js, proto_next + (jsoff_t) (sizeof(proto_next) + sizeof(pkoff))); 1183 - 1184 - jsoff_t pklen = offtolen(loadoff(js, pkoff)); 1185 - const char *pkstr = (const char *) &js->mem[pkoff + sizeof(jsoff_t)]; 1186 - 1187 - if (!is_internal_prop(pkstr, pklen) && !streq(pkstr, pklen, "name", 4) && !streq(pkstr, pklen, "@@toStringTag", 13) && !streq(pkstr, pklen, "__getter", 8)) { 1188 - if (!first) n += cpy(buf + n, len - n, ",\n", 2); 1189 - first = false; 1190 - n += add_indent(buf + n, len - n, stringify_indent); 1191 - n += strkey(js, mkval(T_STR, pkoff), buf + n, len - n); 1192 - n += cpy(buf + n, len - n, ": ", 2); 1193 - n += tostr(js, pval, buf + n, len - n); 1194 - } 1195 - proto_next = loadoff(js, proto_next) & ~(3U | CONSTMASK); 1196 - } 1197 - } 1241 + if (vtype(proto_val) == T_OBJ) n += print_prototype(js, proto_val, buf + n, len - n, &first); 1198 1242 } 1199 1243 1200 1244 stringify_indent--;
+2
src/main.c
··· 38 38 size_t len = strlen(script); 39 39 40 40 js_set_filename(js, "[eval]"); 41 + js_setup_import_meta(js, "[eval]"); 42 + 41 43 js_mkscope(js); 42 44 js_protect_init_memory(js); 43 45
+3
src/repl.c
··· 193 193 void ant_repl_run() { 194 194 struct js *js = rt->js; 195 195 196 + js_set_filename(js, "[repl]"); 197 + js_setup_import_meta(js, "[repl]"); 198 + 196 199 js_mkscope(js); 197 200 js_protect_init_memory(js); 198 201