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.

make __proto__ fully internal

+47 -31
+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.27') 77 + version_conf.set('ANT_VERSION', '0.0.7.28') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+46 -30
src/ant.c
··· 859 859 860 860 while (next < js->brk && next != 0) { 861 861 jsoff_t koff = loadoff(js, next + (jsoff_t) sizeof(next)); 862 - jsval_t val = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); 863 - n += cpy(buf + n, len - n, ",", n == 1 ? 0 : 1); 864 - n += tostr(js, mkval(T_STR, koff), buf + n, len - n); 865 - n += cpy(buf + n, len - n, ":", 1); 866 - n += tostr(js, val, buf + n, len - n); 862 + jsoff_t klen = offtolen(loadoff(js, koff)); 863 + const char *key = (char *) &js->mem[koff + sizeof(koff)]; 864 + if (!streq(key, klen, "__proto__", 9)) { 865 + jsval_t val = loadval(js, next + (jsoff_t) (sizeof(next) + sizeof(koff))); 866 + n += cpy(buf + n, len - n, ",", n == 1 ? 0 : 1); 867 + n += tostr(js, mkval(T_STR, koff), buf + n, len - n); 868 + n += cpy(buf + n, len - n, ":", 1); 869 + n += tostr(js, val, buf + n, len - n); 870 + } 867 871 next = loadoff(js, next) & ~(3U | CONSTMASK); 868 872 } 869 873 ··· 1711 1715 jsoff_t koff = (jsoff_t) vdata(k); 1712 1716 jsoff_t klen = offtolen(loadoff(js, koff)); 1713 1717 const char *key = (char *) &js->mem[koff + sizeof(jsoff_t)]; 1718 + if (streq(key, klen, "__proto__", 9)) { 1719 + return js_mkerr(js, "cannot assign to __proto__"); 1720 + } 1714 1721 jsoff_t existing = lkp(js, obj, key, klen); 1715 1722 if (existing > 0) { 1716 1723 if (is_const_prop(js, existing)) { ··· 2326 2333 2327 2334 jsval_t as_obj = (t == T_OBJ) ? obj : mkval(T_OBJ, vdata(obj)); 2328 2335 jsval_t key = js_mkstr(js, "__proto__", 9); 2329 - setprop(js, as_obj, key, proto); 2336 + jsoff_t existing = lkp(js, as_obj, "__proto__", 9); 2337 + if (existing > 0) { 2338 + saveval(js, existing + sizeof(jsoff_t) * 2, proto); 2339 + } else { 2340 + mkprop(js, as_obj, key, proto, false); 2341 + } 2330 2342 } 2331 2343 2332 2344 static jsval_t get_ctor_proto(struct js *js, const char *name, size_t len) { ··· 5068 5080 while (prop_off < js->brk && prop_off != 0) { 5069 5081 jsoff_t koff = loadoff(js, prop_off + (jsoff_t) sizeof(prop_off)); 5070 5082 jsoff_t klen = offtolen(loadoff(js, koff)); 5071 - jsval_t key_str = js_mkstr(js, (char *) &js->mem[koff + sizeof(koff)], klen); 5083 + const char *key = (char *) &js->mem[koff + sizeof(koff)]; 5072 5084 5073 - const char *var_name = &js->code[var_name_off]; 5074 - jsoff_t existing = lkp(js, js->scope, var_name, var_name_len); 5075 - if (existing > 0) { 5076 - saveval(js, existing + sizeof(jsoff_t) * 2, key_str); 5077 - } else { 5078 - jsval_t x = mkprop(js, js->scope, js_mkstr(js, var_name, var_name_len), key_str, is_const_var); 5079 - if (is_err(x)) { 5080 - res = x; 5085 + if (!streq(key, klen, "__proto__", 9)) { 5086 + jsval_t key_str = js_mkstr(js, key, klen); 5087 + 5088 + const char *var_name = &js->code[var_name_off]; 5089 + jsoff_t existing = lkp(js, js->scope, var_name, var_name_len); 5090 + if (existing > 0) { 5091 + saveval(js, existing + sizeof(jsoff_t) * 2, key_str); 5092 + } else { 5093 + jsval_t x = mkprop(js, js->scope, js_mkstr(js, var_name, var_name_len), key_str, is_const_var); 5094 + if (is_err(x)) { 5095 + res = x; 5096 + goto done; 5097 + } 5098 + } 5099 + 5100 + js->pos = body_start; 5101 + js->consumed = 1; 5102 + js->flags = (flags & ~F_NOEXEC) | F_LOOP; 5103 + v = js_block_or_stmt(js); 5104 + if (is_err(v)) { 5105 + res = v; 5081 5106 goto done; 5082 5107 } 5083 - } 5084 - 5085 - js->pos = body_start; 5086 - js->consumed = 1; 5087 - js->flags = (flags & ~F_NOEXEC) | F_LOOP; 5088 - v = js_block_or_stmt(js); 5089 - if (is_err(v)) { 5090 - res = v; 5091 - goto done; 5092 - } 5093 - 5094 - if (js->flags & F_BREAK) break; 5095 - if (js->flags & F_RETURN) { 5096 - res = v; 5097 - goto done; 5108 + 5109 + if (js->flags & F_BREAK) break; 5110 + if (js->flags & F_RETURN) { 5111 + res = v; 5112 + goto done; 5113 + } 5098 5114 } 5099 5115 5100 5116 prop_off = loadoff(js, prop_off) & ~(3U | CONSTMASK);