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 toStringTag in for-in loop

+22 -36
+22 -36
src/ant.c
··· 1603 1603 jsoff_t pklen = offtolen(loadoff(js, pkoff)); 1604 1604 const char *pkstr = (const char *) &js->mem[pkoff + sizeof(jsoff_t)]; 1605 1605 1606 - const char *tag_key2 = get_toStringTag_sym_key(); 1607 - size_t tag_key_len2 = strlen(tag_key2); 1608 - if (!streq(pkstr, pklen, STR_PROTO, STR_PROTO_LEN) && !streq(pkstr, pklen, "constructor", 11) && !streq(pkstr, pklen, tag_key2, tag_key_len2)) { 1606 + const char *tag_key = get_toStringTag_sym_key(); 1607 + size_t tag_key_len = strlen(tag_key); 1608 + if ( 1609 + !streq(pkstr, pklen, STR_PROTO, STR_PROTO_LEN) && 1610 + !streq(pkstr, pklen, "constructor", 11) && 1611 + !streq(pkstr, pklen, tag_key, tag_key_len) 1612 + ) { 1609 1613 if (!proto_first) n += cpy(buf + n, len - n, ",\n", 2); 1610 1614 proto_first = false; 1611 1615 n += add_indent(buf + n, len - n, stringify_indent); ··· 1644 1648 1645 1649 const char *key = (char *) &js->mem[koff + sizeof(koff)]; 1646 1650 const char *tag_sym_key = get_toStringTag_sym_key(); 1647 - bool should_hide = streq(key, klen, tag_sym_key, strlen(tag_sym_key)); 1651 + bool should_hide = streq(key, klen, STR_PROTO, STR_PROTO_LEN) || streq(key, klen, tag_sym_key, strlen(tag_sym_key)); 1648 1652 1649 1653 if (!should_hide) { 1650 1654 descriptor_entry_t *desc = lookup_descriptor(obj_off, key, klen); ··· 1880 1884 1881 1885 const char *key = (char *) &js->mem[koff + sizeof(koff)]; 1882 1886 const char *tag_sym_key = get_toStringTag_sym_key(); 1883 - bool should_hide = streq(key, klen, tag_sym_key, strlen(tag_sym_key)); 1887 + bool should_hide = streq(key, klen, STR_PROTO, STR_PROTO_LEN) || streq(key, klen, tag_sym_key, strlen(tag_sym_key)); 1884 1888 1885 1889 if (!should_hide) { 1886 1890 descriptor_entry_t *desc = lookup_descriptor(obj_off, key, klen); ··· 9732 9736 static bool for_in_should_skip_key(struct js *js, jsval_t obj, const char *key, jsoff_t klen) { 9733 9737 if (streq(key, klen, STR_PROTO, STR_PROTO_LEN)) return true; 9734 9738 9739 + const char *tag_sym_key = get_toStringTag_sym_key(); 9740 + if (streq(key, klen, tag_sym_key, strlen(tag_sym_key))) return true; 9741 + 9735 9742 jsoff_t obj_off = (jsoff_t)vdata(obj); 9736 9743 descriptor_entry_t *desc = lookup_descriptor(obj_off, key, klen); 9737 9744 if (desc && !desc->enumerable) return true; ··· 10051 10058 10052 10059 jsoff_t koff = loadoff(js, prop_off + (jsoff_t) sizeof(prop_off)); 10053 10060 jsoff_t klen = offtolen(loadoff(js, koff)); 10054 - const char *key = (char *) &js->mem[koff + sizeof(koff)]; 10055 10061 10056 - bool should_skip = streq(key, klen, STR_PROTO, STR_PROTO_LEN); 10057 - 10058 - if (!should_skip && klen > 7 && key[0] == '_' && key[1] == '_' && 10059 - key[2] == 'd' && key[3] == 'e' && key[4] == 's' && key[5] == 'c' && key[6] == '_') { 10060 - should_skip = true; 10061 - } 10062 + const char *key = (char *) &js->mem[koff + sizeof(koff)]; 10063 + const char *tag_sym_key = get_toStringTag_sym_key(); 10064 + bool should_skip = streq(key, klen, STR_PROTO, STR_PROTO_LEN) || streq(key, klen, tag_sym_key, strlen(tag_sym_key)); 10062 10065 10063 10066 if (!should_skip) { 10064 10067 jsoff_t iter_obj_off = (jsoff_t)vdata(iter_obj); 10065 10068 descriptor_entry_t *desc = lookup_descriptor(iter_obj_off, key, klen); 10066 - if (desc && !desc->enumerable) { 10067 - should_skip = true; 10068 - } 10069 + if (desc && !desc->enumerable) should_skip = true; 10069 10070 } 10070 10071 10071 10072 if (!should_skip) { 10072 10073 jsval_t key_str = js_mkstr(js, key, klen); 10073 - 10074 10074 const char *var_name = &js->code[var_name_off]; 10075 10075 jsoff_t existing = lkp_scope(js, js->scope, var_name, var_name_len); 10076 - if (existing > 0) { 10077 - saveval(js, existing + sizeof(jsoff_t) * 2, key_str); 10078 - } else { 10076 + 10077 + if (existing > 0) saveval(js, existing + sizeof(jsoff_t) * 2, key_str); else { 10079 10078 jsval_t x = mkprop(js, js->scope, js_mkstr(js, var_name, var_name_len), key_str, is_const_var ? CONSTMASK : 0); 10080 - if (is_err(x)) { 10081 - res = x; 10082 - goto done; 10083 - } 10079 + if (is_err(x)) { res = x; goto done; } 10084 10080 } 10085 10081 10086 10082 js->pos = body_start; 10087 10083 js->consumed = 1; 10088 10084 js->flags = (flags & ~F_NOEXEC) | F_LOOP; 10089 10085 v = js_block_or_stmt(js); 10090 - if (is_err(v)) { 10091 - res = v; 10092 - goto done; 10093 - } 10086 + if (is_err(v)) { res = v; goto done; } 10094 10087 10095 10088 if (label_flags & F_CONTINUE_LABEL) { 10096 10089 if (is_this_loop_continue_target(marker_index)) { 10097 10090 clear_continue_label(); 10098 10091 js->flags &= ~(F_BREAK | F_NOEXEC); 10099 - } else { 10100 - js->flags |= F_BREAK; 10101 - break; 10102 - } 10092 + } else { js->flags |= F_BREAK; break; } 10103 10093 } 10104 10094 10105 10095 if (js->flags & F_BREAK) break; 10106 - 10107 - if (js->flags & F_RETURN) { 10108 - res = v; 10109 - goto done; 10110 - } 10096 + if (js->flags & F_RETURN) { res = v; goto done; } 10111 10097 } 10112 10098 10113 10099 prop_off = loadoff(js, prop_off) & ~(3U | FLAGMASK);