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.

migrate JSON to prototype

+75 -12
+6
include/ant.h
··· 54 54 void js_set(struct js *, jsval_t, const char *, jsval_t); 55 55 void js_merge_obj(struct js *, jsval_t dst, jsval_t src); 56 56 57 + jsval_t js_setprop(struct js *, jsval_t obj, jsval_t key, jsval_t val); 58 + void js_set_proto(struct js *, jsval_t obj, jsval_t proto); 59 + 60 + jsval_t js_get_proto(struct js *, jsval_t obj); 61 + jsval_t js_get_ctor_proto(struct js *, const char *name, size_t len); 62 + 57 63 int js_type(jsval_t val); 58 64 int js_getbool(jsval_t val); 59 65
+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.7.34') 77 + version_conf.set('ANT_VERSION', '0.0.7.35') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+53 -8
src/ant.c
··· 442 442 static jsval_t call_js_code_with_args(struct js *js, const char *fn, jsoff_t fnlen, jsval_t closure_scope, jsval_t *args, int nargs); 443 443 static jsval_t start_async_in_coroutine(struct js *js, const char *code, size_t code_len, jsval_t closure_scope, jsval_t *args, int nargs); 444 444 445 + jsval_t js_get_proto(struct js *js, jsval_t obj); 446 + void js_set_proto(struct js *js, jsval_t obj, jsval_t proto); 447 + jsval_t js_setprop(struct js *js, jsval_t obj, jsval_t k, jsval_t v); 448 + static jsoff_t lkp_proto(struct js *js, jsval_t obj, const char *key, size_t len); 449 + jsval_t js_get_ctor_proto(struct js *js, const char *name, size_t len); 450 + static jsval_t get_prototype_for_type(struct js *js, uint8_t type); 451 + 452 + // Backward compat aliases (defined after implementations below) 445 453 static jsval_t get_proto(struct js *js, jsval_t obj); 446 454 static void set_proto(struct js *js, jsval_t obj, jsval_t proto); 447 - static jsoff_t lkp_proto(struct js *js, jsval_t obj, const char *key, size_t len); 448 455 static jsval_t get_ctor_proto(struct js *js, const char *name, size_t len); 449 - static jsval_t get_prototype_for_type(struct js *js, uint8_t type); 456 + static jsval_t setprop(struct js *js, jsval_t obj, jsval_t k, jsval_t v); 450 457 451 458 static void free_coroutine(coroutine_t *coro); 452 459 static bool has_ready_coroutines(void); ··· 1718 1725 return mkentity(js, (b & ~(3U | CONSTMASK)) | T_PROP, buf, sizeof(buf)); 1719 1726 } 1720 1727 1721 - static jsval_t setprop(struct js *js, jsval_t obj, jsval_t k, jsval_t v) { 1728 + jsval_t js_setprop(struct js *js, jsval_t obj, jsval_t k, jsval_t v) { 1722 1729 jsoff_t koff = (jsoff_t) vdata(k); 1723 1730 jsoff_t klen = offtolen(loadoff(js, koff)); 1724 1731 const char *key = (char *) &js->mem[koff + sizeof(jsoff_t)]; ··· 1734 1741 return mkval(T_PROP, existing); 1735 1742 } 1736 1743 return mkprop(js, obj, k, v, false); 1744 + } 1745 + 1746 + static jsval_t setprop(struct js *js, jsval_t obj, jsval_t k, jsval_t v) { 1747 + return js_setprop(js, obj, k, v); 1737 1748 } 1738 1749 1739 1750 static inline jsoff_t esize(jsoff_t w) { ··· 2342 2353 return lkp_inline(js, obj, buf, len); 2343 2354 } 2344 2355 2345 - static jsval_t get_proto(struct js *js, jsval_t obj) { 2356 + jsval_t js_get_proto(struct js *js, jsval_t obj) { 2346 2357 uint8_t t = vtype(obj); 2347 2358 2348 2359 if (t != T_OBJ && t != T_ARR && t != T_FUNC) return js_mknull(); ··· 2360 2371 return (vt == T_OBJ || vt == T_ARR || vt == T_FUNC) ? val : js_mknull(); 2361 2372 } 2362 2373 2363 - static void set_proto(struct js *js, jsval_t obj, jsval_t proto) { 2374 + static jsval_t get_proto(struct js *js, jsval_t obj) { 2375 + return js_get_proto(js, obj); 2376 + } 2377 + 2378 + void js_set_proto(struct js *js, jsval_t obj, jsval_t proto) { 2364 2379 uint8_t t = vtype(obj); 2365 2380 if (t != T_OBJ && t != T_ARR && t != T_FUNC) return; 2366 2381 ··· 2374 2389 } 2375 2390 } 2376 2391 2377 - static jsval_t get_ctor_proto(struct js *js, const char *name, size_t len) { 2392 + static void set_proto(struct js *js, jsval_t obj, jsval_t proto) { 2393 + js_set_proto(js, obj, proto); 2394 + } 2395 + 2396 + jsval_t js_get_ctor_proto(struct js *js, const char *name, size_t len) { 2378 2397 jsoff_t ctor_off = lkp(js, js->scope, name, len); 2379 2398 2380 2399 if (ctor_off == 0 && global_scope_stack) { ··· 2398 2417 2399 2418 if (proto_off == 0) return js_mknull(); 2400 2419 return resolveprop(js, mkval(T_PROP, proto_off)); 2420 + } 2421 + 2422 + static jsval_t get_ctor_proto(struct js *js, const char *name, size_t len) { 2423 + return js_get_ctor_proto(js, name, len); 2401 2424 } 2402 2425 2403 2426 static jsval_t get_prototype_for_type(struct js *js, uint8_t type) { ··· 10560 10583 jsval_t js_getcurrentfunc(struct js *js) { return js->current_func; } 10561 10584 10562 10585 void js_set(struct js *js, jsval_t obj, const char *key, jsval_t val) { 10586 + size_t key_len = strlen(key); 10587 + 10563 10588 if (vtype(obj) == T_OBJ) { 10564 - setprop(js, obj, js_mkstr(js, key, strlen(key)), val); 10589 + jsoff_t existing = lkp(js, obj, key, key_len); 10590 + if (existing > 0) { 10591 + if (is_const_prop(js, existing)) { 10592 + js_mkerr(js, "assignment to constant"); 10593 + return; 10594 + } 10595 + saveval(js, existing + sizeof(jsoff_t) * 2, val); 10596 + } else { 10597 + jsval_t key_str = js_mkstr(js, key, key_len); 10598 + mkprop(js, obj, key_str, val, false); 10599 + } 10565 10600 } else if (vtype(obj) == T_FUNC) { 10566 10601 jsval_t func_obj = mkval(T_OBJ, vdata(obj)); 10567 - setprop(js, func_obj, js_mkstr(js, key, strlen(key)), val); 10602 + jsoff_t existing = lkp(js, func_obj, key, key_len); 10603 + if (existing > 0) { 10604 + if (is_const_prop(js, existing)) { 10605 + js_mkerr(js, "assignment to constant"); 10606 + return; 10607 + } 10608 + saveval(js, existing + sizeof(jsoff_t) * 2, val); 10609 + } else { 10610 + jsval_t key_str = js_mkstr(js, key, key_len); 10611 + mkprop(js, func_obj, key_str, val, false); 10612 + } 10568 10613 } 10569 10614 } 10570 10615
+15 -3
src/modules/json.c
··· 200 200 201 201 void init_json_module() { 202 202 struct js *js = rt->js; 203 + jsval_t glob = js_glob(js); 204 + 205 + jsval_t object_proto = js_get_ctor_proto(js, "Object", 6); 203 206 jsval_t json_obj = js_mkobj(js); 204 207 205 - js_set(js, js_glob(js), "JSON", json_obj); 206 - js_set(js, json_obj, "parse", js_mkfun(js_json_parse)); 207 - js_set(js, json_obj, "stringify", js_mkfun(js_json_stringify)); 208 + if (js_type(object_proto) == JS_PRIV) { 209 + js_set_proto(js, json_obj, object_proto); 210 + } 211 + 212 + jsval_t parse_key = js_mkstr(js, "parse", 5); 213 + jsval_t stringify_key = js_mkstr(js, "stringify", 9); 214 + 215 + js_setprop(js, json_obj, parse_key, js_mkfun(js_json_parse)); 216 + js_setprop(js, json_obj, stringify_key, js_mkfun(js_json_stringify)); 217 + 218 + jsval_t json_key = js_mkstr(js, "JSON", 4); 219 + js_setprop(js, glob, json_key, json_obj); 208 220 }