···12821282static jsval_t reject_coroutine_wrapper(struct js *js, jsval_t *args, int nargs);
1283128312841284static size_t cpy(char *dst, size_t dstlen, const char *src, size_t srclen) {
12851285- if (dstlen == 0) return 0;
12851285+ if (dstlen == 0) return srclen;
12861286 size_t len = srclen < dstlen - 1 ? srclen : dstlen - 1;
12871287 memcpy(dst, src, len); dst[len] = '\0';
12881288- return len;
12881288+ return srclen;
12891289}
12901290+12911291+#define REMAIN(n, len) ((n) >= (len) ? 0 : (len) - (n))
1290129212911293static inline size_t uint_to_str(char *buf, size_t bufsize, uint64_t val) {
12921294 if (bufsize == 0) return 0;
···14611463}
1462146414631465static size_t add_indent(char *buf, size_t len, int level) {
14661466+ size_t wanted = (size_t)(level * 2);
14641467 size_t n = 0;
14651468 for (int i = 0; i < level * 2 && n < len; i++) {
14661469 buf[n++] = ' ';
14671470 }
14681468- return n;
14711471+ return wanted;
14691472}
1470147314711474static inline jsoff_t get_prop_koff(struct js *js, jsoff_t prop) {
···15881591 size_t n = 0;
1589159215901593 if (class_name) {
15911591- n += cpy(buf + n, len - n, class_name, class_len);
15921592- n += (size_t) snprintf(buf + n, len - n, "(%u) ", (unsigned) length);
15941594+ n += cpy(buf + n, REMAIN(n, len), class_name, class_len);
15951595+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "(%u) ", (unsigned) length);
15931596 }
1594159715951598 if (length == 0) {
15961596- n += cpy(buf + n, len - n, "[]", 2);
15991599+ n += cpy(buf + n, REMAIN(n, len), "[]", 2);
15971600 pop_stringify();
15981601 return n;
15991602 }
1600160316011601- n += cpy(buf + n, len - n, inline_mode ? "[ " : "[\n", 2);
16041604+ n += cpy(buf + n, REMAIN(n, len), inline_mode ? "[ " : "[\n", 2);
16021605 if (!inline_mode) stringify_indent++;
1603160616041607 for (jsoff_t i = 0; i < length; i++) {
16051605- if (i > 0) n += cpy(buf + n, len - n, inline_mode ? ", " : ",\n", 2);
16061606- if (!inline_mode) n += add_indent(buf + n, len - n, stringify_indent);
16081608+ if (i > 0) n += cpy(buf + n, REMAIN(n, len), inline_mode ? ", " : ",\n", 2);
16091609+ if (!inline_mode) n += add_indent(buf + n, REMAIN(n, len), stringify_indent);
1607161016081611 char idx[16];
16091612 snprintf(idx, sizeof(idx), "%u", (unsigned) i);
···16191622 found = true; break;
16201623 }
16211624 }
16221622- n += found ? tostr(js, val, buf + n, len - n) : cpy(buf + n, len - n, "undefined", 9);
16251625+ n += found ? tostr(js, val, buf + n, REMAIN(n, len)) : cpy(buf + n, REMAIN(n, len), "undefined", 9);
16231626 }
1624162716251628 for (jsoff_t p = first; p < js->brk && p != 0; p = next_prop(loadoff(js, p))) {
···16301633 get_prop_key(js, p, &key, &klen);
16311634 if (streq(key, klen, "length", 6) || is_array_index(key, klen)) continue;
1632163516331633- n += cpy(buf + n, len - n, inline_mode ? ", " : ",\n", 2);
16341634- if (!inline_mode) n += add_indent(buf + n, len - n, stringify_indent);
16351635- n += cpy(buf + n, len - n, key, klen);
16361636- n += cpy(buf + n, len - n, ": ", 2);
16371637- n += tostr(js, get_prop_val(js, p), buf + n, len - n);
16361636+ n += cpy(buf + n, REMAIN(n, len), inline_mode ? ", " : ",\n", 2);
16371637+ if (!inline_mode) n += add_indent(buf + n, REMAIN(n, len), stringify_indent);
16381638+ n += cpy(buf + n, REMAIN(n, len), key, klen);
16391639+ n += cpy(buf + n, REMAIN(n, len), ": ", 2);
16401640+ n += tostr(js, get_prop_val(js, p), buf + n, REMAIN(n, len));
16381641 }
1639164216401643 if (!inline_mode) {
16411644 stringify_indent--;
16421642- n += cpy(buf + n, len - n, "\n", 1);
16431643- n += add_indent(buf + n, len - n, stringify_indent);
16451645+ n += cpy(buf + n, REMAIN(n, len), "\n", 1);
16461646+ n += add_indent(buf + n, REMAIN(n, len), stringify_indent);
16441647 }
1645164816461646- n += cpy(buf + n, len - n, inline_mode ? " ]" : "]", inline_mode ? 2 : 1);
16491649+ n += cpy(buf + n, REMAIN(n, len), inline_mode ? " ]" : "]", inline_mode ? 2 : 1);
16471650 pop_stringify();
16481651 return n;
16491652}
···16691672 }
1670167316711674 for (jsoff_t i = 0; i < length; i++) {
16721672- if (i > 0) n += cpy(buf + n, len - n, ",", 1);
16751675+ if (i > 0) n += cpy(buf + n, REMAIN(n, len), ",", 1);
16731676 char idx[16];
16741677 snprintf(idx, sizeof(idx), "%u", (unsigned) i);
16751678 jsoff_t idxlen = (jsoff_t) strlen(idx);
···16921695 uint8_t vt = vtype(val);
16931696 if (vt == T_STR) {
16941697 jsoff_t slen, soff = vstr(js, val, &slen);
16951695- n += cpy(buf + n, len - n, (const char *)&js->mem[soff], slen);
16961696- } else if (vt != T_UNDEF && vt != T_NULL) n += tostr(js, val, buf + n, len - n);
16981698+ n += cpy(buf + n, REMAIN(n, len), (const char *)&js->mem[soff], slen);
16991699+ } else if (vt != T_UNDEF && vt != T_NULL) n += tostr(js, val, buf + n, REMAIN(n, len));
16971700 }
16981701 }
16991702···17471750 const char *sym_desc = get_symbol_description_from_key(str, slen);
17481751 if (sym_desc) {
17491752 size_t n = 0;
17501750- n += cpy(buf + n, len - n, "[", 1);
17511751- n += cpy(buf + n, len - n, sym_desc, strlen(sym_desc));
17521752- n += cpy(buf + n, len - n, "]", 1);
17531753+ n += cpy(buf + n, REMAIN(n, len), "[", 1);
17541754+ n += cpy(buf + n, REMAIN(n, len), sym_desc, strlen(sym_desc));
17551755+ n += cpy(buf + n, REMAIN(n, len), "]", 1);
17531756 return n;
17541757 }
17551758···18161819 size_t n = 0;
18171820 int self_ref = get_self_ref(obj);
18181821 if (self_ref) {
18191819- n += (size_t) snprintf(buf + n, len - n, "<ref *%d> ", self_ref);
18221822+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "<ref *%d> ", self_ref);
18201823 }
1821182418221825 const char *tostring_tag_key = get_toStringTag_sym_key();
···18641867 type_len = 10;
18651868 }
1866186918671867- n += cpy(buf + n, len - n, type_name, type_len);
18681868- n += (size_t) snprintf(buf + n, len - n, "(%zu) ", ta->length);
18691869- n += cpy(buf + n, len - n, "[ ", 2);
18701870+ n += cpy(buf + n, REMAIN(n, len), type_name, type_len);
18711871+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "(%zu) ", ta->length);
18721872+ n += cpy(buf + n, REMAIN(n, len), "[ ", 2);
1870187318711874 uint8_t *data = ta->buffer->data + ta->byte_offset;
1872187518731876 for (size_t i = 0; i < ta->length && i < 100; i++) {
18741874- if (i > 0) n += cpy(buf + n, len - n, ", ", 2);
18771877+ if (i > 0) n += cpy(buf + n, REMAIN(n, len), ", ", 2);
1875187818761879 switch (ta->type) {
18771880 case TYPED_ARRAY_INT8:
18781878- n += (size_t) snprintf(buf + n, len - n, "%d", (int)((int8_t*)data)[i]);
18811881+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%d", (int)((int8_t*)data)[i]);
18791882 break;
18801883 case TYPED_ARRAY_UINT8:
18811884 case TYPED_ARRAY_UINT8_CLAMPED:
18821882- n += (size_t) snprintf(buf + n, len - n, "%u", (unsigned)data[i]);
18851885+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%u", (unsigned)data[i]);
18831886 break;
18841887 case TYPED_ARRAY_INT16:
18851885- n += (size_t) snprintf(buf + n, len - n, "%d", (int)((int16_t*)data)[i]);
18881888+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%d", (int)((int16_t*)data)[i]);
18861889 break;
18871890 case TYPED_ARRAY_UINT16:
18881888- n += (size_t) snprintf(buf + n, len - n, "%u", (unsigned)((uint16_t*)data)[i]);
18911891+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%u", (unsigned)((uint16_t*)data)[i]);
18891892 break;
18901893 case TYPED_ARRAY_INT32:
18911891- n += (size_t) snprintf(buf + n, len - n, "%d", ((int32_t*)data)[i]);
18941894+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%d", ((int32_t*)data)[i]);
18921895 break;
18931896 case TYPED_ARRAY_UINT32:
18941894- n += (size_t) snprintf(buf + n, len - n, "%u", ((uint32_t*)data)[i]);
18971897+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%u", ((uint32_t*)data)[i]);
18951898 break;
18961899 case TYPED_ARRAY_FLOAT32:
18971897- n += (size_t) snprintf(buf + n, len - n, "%g", (double)((float*)data)[i]);
19001900+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%g", (double)((float*)data)[i]);
18981901 break;
18991902 case TYPED_ARRAY_FLOAT64:
19001900- n += (size_t) snprintf(buf + n, len - n, "%g", ((double*)data)[i]);
19031903+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%g", ((double*)data)[i]);
19011904 break;
19021905 case TYPED_ARRAY_BIGINT64:
19031903- n += (size_t) snprintf(buf + n, len - n, "%lldn", (long long)((int64_t*)data)[i]);
19061906+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%lldn", (long long)((int64_t*)data)[i]);
19041907 break;
19051908 case TYPED_ARRAY_BIGUINT64:
19061906- n += (size_t) snprintf(buf + n, len - n, "%llun", (unsigned long long)((uint64_t*)data)[i]);
19091909+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%llun", (unsigned long long)((uint64_t*)data)[i]);
19071910 break;
19081911 default:
19091909- n += (size_t) snprintf(buf + n, len - n, "%u", (unsigned)data[i]);
19121912+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%u", (unsigned)data[i]);
19101913 break;
19111914 }
19121915 }
1913191619141914- if (ta->length > 100) n += cpy(buf + n, len - n, ", ...", 5);
19151915- n += cpy(buf + n, len - n, " ]", 2);
19171917+ if (ta->length > 100) n += cpy(buf + n, REMAIN(n, len), ", ...", 5);
19181918+ n += cpy(buf + n, REMAIN(n, len), " ]", 2);
19161919 pop_stringify();
19171920 return n;
19181921 }
···19241927 ArrayBufferData *ab_data = (ArrayBufferData *)(uintptr_t)tod(buf_val);
19251928 size_t bytelen = ab_data ? ab_data->length : 0;
1926192919271927- n += cpy(buf + n, len - n, tag_str, tlen);
19281928- n += cpy(buf + n, len - n, " {\n", 3);
19291929- n += cpy(buf + n, len - n, " [Uint8Contents]: <", 20);
19301930+ n += cpy(buf + n, REMAIN(n, len), tag_str, tlen);
19311931+ n += cpy(buf + n, REMAIN(n, len), " {\n", 3);
19321932+ n += cpy(buf + n, REMAIN(n, len), " [Uint8Contents]: <", 20);
1930193319311934 if (ab_data && ab_data->data && bytelen > 0) {
19321935 for (size_t i = 0; i < bytelen; i++) {
19331933- if (i > 0) n += cpy(buf + n, len - n, " ", 1);
19341934- n += (size_t) snprintf(buf + n, len - n, "%02x", ab_data->data[i]);
19361936+ if (i > 0) n += cpy(buf + n, REMAIN(n, len), " ", 1);
19371937+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%02x", ab_data->data[i]);
19351938 }
19361939 }
1937194019381938- n += cpy(buf + n, len - n, ">,\n", 3);
19391939- n += cpy(buf + n, len - n, " [byteLength]: ", 16);
19401940- n += (size_t) snprintf(buf + n, len - n, "%zu", bytelen);
19411941- n += cpy(buf + n, len - n, "\n}", 2);
19411941+ n += cpy(buf + n, REMAIN(n, len), ">,\n", 3);
19421942+ n += cpy(buf + n, REMAIN(n, len), " [byteLength]: ", 16);
19431943+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%zu", bytelen);
19441944+ n += cpy(buf + n, REMAIN(n, len), "\n}", 2);
19421945 pop_stringify();
19431946 return n;
19441947 }
···19501953 if (js_type(dv_data_val) == JS_NUM) {
19511954 DataViewData *dv = (DataViewData *)(uintptr_t)tod(dv_data_val);
19521955 if (dv && dv->buffer) {
19531953- n += cpy(buf + n, len - n, "DataView {\n", 11);
19541954- n += cpy(buf + n, len - n, " [byteLength]: ", 16);
19551955- n += (size_t) snprintf(buf + n, len - n, "%zu", dv->byte_length);
19561956- n += cpy(buf + n, len - n, ",\n", 2);
19571957- n += cpy(buf + n, len - n, " [byteOffset]: ", 16);
19581958- n += (size_t) snprintf(buf + n, len - n, "%zu", dv->byte_offset);
19591959- n += cpy(buf + n, len - n, ",\n", 2);
19601960- n += cpy(buf + n, len - n, " [buffer]: ArrayBuffer {\n", 26);
19611961- n += cpy(buf + n, len - n, " [Uint8Contents]: <", 22);
19561956+ n += cpy(buf + n, REMAIN(n, len), "DataView {\n", 11);
19571957+ n += cpy(buf + n, REMAIN(n, len), " [byteLength]: ", 16);
19581958+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%zu", dv->byte_length);
19591959+ n += cpy(buf + n, REMAIN(n, len), ",\n", 2);
19601960+ n += cpy(buf + n, REMAIN(n, len), " [byteOffset]: ", 16);
19611961+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%zu", dv->byte_offset);
19621962+ n += cpy(buf + n, REMAIN(n, len), ",\n", 2);
19631963+ n += cpy(buf + n, REMAIN(n, len), " [buffer]: ArrayBuffer {\n", 26);
19641964+ n += cpy(buf + n, REMAIN(n, len), " [Uint8Contents]: <", 22);
1962196519631966 if (dv->buffer->data && dv->buffer->length > 0) {
19641967 for (size_t i = 0; i < dv->buffer->length; i++) {
19651965- if (i > 0) n += cpy(buf + n, len - n, " ", 1);
19661966- n += (size_t) snprintf(buf + n, len - n, "%02x", dv->buffer->data[i]);
19681968+ if (i > 0) n += cpy(buf + n, REMAIN(n, len), " ", 1);
19691969+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%02x", dv->buffer->data[i]);
19671970 }
19681971 }
1969197219701970- n += cpy(buf + n, len - n, ">,\n", 3);
19711971- n += cpy(buf + n, len - n, " [byteLength]: ", 18);
19721972- n += (size_t) snprintf(buf + n, len - n, "%zu", dv->buffer->length);
19731973- n += cpy(buf + n, len - n, "\n }\n}", 6);
19731973+ n += cpy(buf + n, REMAIN(n, len), ">,\n", 3);
19741974+ n += cpy(buf + n, REMAIN(n, len), " [byteLength]: ", 18);
19751975+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%zu", dv->buffer->length);
19761976+ n += cpy(buf + n, REMAIN(n, len), "\n }\n}", 6);
19741977 pop_stringify();
19751978 return n;
19761979 }
···19821985 if (vtype(map_val) == T_UNDEF) goto print_tagged_object;
1983198619841987 map_entry_t **map_ptr = (map_entry_t**)(size_t)tod(map_val);
19851985- n += cpy(buf + n, len - n, "Map(", 4);
19881988+ n += cpy(buf + n, REMAIN(n, len), "Map(", 4);
1986198919871990 unsigned int count = 0;
19881991 if (map_ptr && *map_ptr) count = HASH_COUNT(*map_ptr);
19891989- n += (size_t) snprintf(buf + n, len - n, "%u", count);
19901990- n += cpy(buf + n, len - n, ") ", 2);
19921992+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%u", count);
19931993+ n += cpy(buf + n, REMAIN(n, len), ") ", 2);
1991199419921995 if (count == 0) {
19931993- n += cpy(buf + n, len - n, "{}", 2);
19961996+ n += cpy(buf + n, REMAIN(n, len), "{}", 2);
19941997 } else {
19951995- n += cpy(buf + n, len - n, "{\n", 2);
19981998+ n += cpy(buf + n, REMAIN(n, len), "{\n", 2);
19961999 stringify_indent++;
19972000 bool first = true;
19982001 if (map_ptr && *map_ptr) {
19992002 map_entry_t *entry, *tmp;
20002003 HASH_ITER(hh, *map_ptr, entry, tmp) {
20012001- if (!first) n += cpy(buf + n, len - n, ",\n", 2);
20042004+ if (!first) n += cpy(buf + n, REMAIN(n, len), ",\n", 2);
20022005 first = false;
20032003- n += add_indent(buf + n, len - n, stringify_indent);
20062006+ n += add_indent(buf + n, REMAIN(n, len), stringify_indent);
2004200720052008 size_t key_len = strlen(entry->key);
20062006- n += cpy(buf + n, len - n, "'", 1);
20072007- n += cpy(buf + n, len - n, entry->key, key_len);
20082008- n += cpy(buf + n, len - n, "'", 1);
20092009- n += cpy(buf + n, len - n, " => ", 4);
20102010- n += tostr(js, entry->value, buf + n, len - n);
20092009+ n += cpy(buf + n, REMAIN(n, len), "'", 1);
20102010+ n += cpy(buf + n, REMAIN(n, len), entry->key, key_len);
20112011+ n += cpy(buf + n, REMAIN(n, len), "'", 1);
20122012+ n += cpy(buf + n, REMAIN(n, len), " => ", 4);
20132013+ n += tostr(js, entry->value, buf + n, REMAIN(n, len));
20112014 }
20122015 }
20132016 stringify_indent--;
20142014- n += cpy(buf + n, len - n, "\n", 1);
20152015- n += add_indent(buf + n, len - n, stringify_indent);
20162016- n += cpy(buf + n, len - n, "}", 1);
20172017+ n += cpy(buf + n, REMAIN(n, len), "\n", 1);
20182018+ n += add_indent(buf + n, REMAIN(n, len), stringify_indent);
20192019+ n += cpy(buf + n, REMAIN(n, len), "}", 1);
20172020 }
20182021 pop_stringify();
20192022 return n;
···20242027 if (vtype(set_val) == T_UNDEF) goto print_tagged_object;
2025202820262029 set_entry_t **set_ptr = (set_entry_t**)(size_t)tod(set_val);
20272027- n += cpy(buf + n, len - n, "Set(", 4);
20302030+ n += cpy(buf + n, REMAIN(n, len), "Set(", 4);
2028203120292032 unsigned int count = 0;
20302033 if (set_ptr && *set_ptr) count = HASH_COUNT(*set_ptr);
20312031- n += (size_t) snprintf(buf + n, len - n, "%u", count);
20322032- n += cpy(buf + n, len - n, ") ", 2);
20342034+ n += (size_t) snprintf(buf + n, REMAIN(n, len), "%u", count);
20352035+ n += cpy(buf + n, REMAIN(n, len), ") ", 2);
2033203620342037 if (count == 0) {
20352035- n += cpy(buf + n, len - n, "{}", 2);
20382038+ n += cpy(buf + n, REMAIN(n, len), "{}", 2);
20362039 } else {
20372037- n += cpy(buf + n, len - n, "{\n", 2);
20402040+ n += cpy(buf + n, REMAIN(n, len), "{\n", 2);
20382041 stringify_indent++;
20392042 bool first = true;
20402043 if (set_ptr && *set_ptr) {
20412044 set_entry_t *entry, *tmp;
20422045 HASH_ITER(hh, *set_ptr, entry, tmp) {
20432043- if (!first) n += cpy(buf + n, len - n, ",\n", 2);
20462046+ if (!first) n += cpy(buf + n, REMAIN(n, len), ",\n", 2);
20442047 first = false;
20452045- n += add_indent(buf + n, len - n, stringify_indent);
20462046- n += tostr(js, entry->value, buf + n, len - n);
20482048+ n += add_indent(buf + n, REMAIN(n, len), stringify_indent);
20492049+ n += tostr(js, entry->value, buf + n, REMAIN(n, len));
20472050 }
20482051 }
20492052 stringify_indent--;
20502050- n += cpy(buf + n, len - n, "\n", 1);
20512051- n += add_indent(buf + n, len - n, stringify_indent);
20522052- n += cpy(buf + n, len - n, "}", 1);
20532053+ n += cpy(buf + n, REMAIN(n, len), "\n", 1);
20542054+ n += add_indent(buf + n, REMAIN(n, len), stringify_indent);
20552055+ n += cpy(buf + n, REMAIN(n, len), "}", 1);
20532056 }
20542057 pop_stringify();
20552058 return n;
20562059 }
2057206020582061print_tagged_object:
20592059- n += cpy(buf + n, len - n, "Object [", 8);
20602060- n += cpy(buf + n, len - n, (const char *) &js->mem[toff], tlen);
20612061- n += cpy(buf + n, len - n, "] {\n", 4);
20622062+ n += cpy(buf + n, REMAIN(n, len), "Object [", 8);
20632063+ n += cpy(buf + n, REMAIN(n, len), (const char *) &js->mem[toff], tlen);
20642064+ n += cpy(buf + n, REMAIN(n, len), "] {\n", 4);
20622065 goto continue_object_print;
2063206620642067print_plain_object:
···2085208820862089 if (prop_count == 0) {
20872090 if (is_null_proto) {
20882088- n += cpy(buf + n, len - n, "[Object: null prototype] {}", 27);
20912091+ n += cpy(buf + n, REMAIN(n, len), "[Object: null prototype] {}", 27);
20892092 } else if (class_name && class_name_len > 0) {
20902090- n += cpy(buf + n, len - n, class_name, class_name_len);
20932093+ n += cpy(buf + n, REMAIN(n, len), class_name, class_name_len);
20912094 if (proto_is_null_proto) {
20922092- n += cpy(buf + n, len - n, " <[Object: null prototype] {}> {}", 33);
20932093- } else n += cpy(buf + n, len - n, " {}", 3);
20952095+ n += cpy(buf + n, REMAIN(n, len), " <[Object: null prototype] {}> {}", 33);
20962096+ } else n += cpy(buf + n, REMAIN(n, len), " {}", 3);
20942097 } else if (proto_is_null_proto) {
20952095- n += cpy(buf + n, len - n, "<[Object: null prototype] {}> {}", 32);
20962096- } else n += cpy(buf + n, len - n, "{}", 2);
20982098+ n += cpy(buf + n, REMAIN(n, len), "<[Object: null prototype] {}> {}", 32);
20992099+ } else n += cpy(buf + n, REMAIN(n, len), "{}", 2);
20972100 pop_stringify();
20982101 return n;
20992102 }
2100210321012104 if (is_null_proto) {
21022102- n += cpy(buf + n, len - n, "[Object: null prototype] ", 25);
21052105+ n += cpy(buf + n, REMAIN(n, len), "[Object: null prototype] ", 25);
21032106 } else if (class_name && class_name_len > 0) {
21042104- n += cpy(buf + n, len - n, class_name, class_name_len);
21072107+ n += cpy(buf + n, REMAIN(n, len), class_name, class_name_len);
21052108 if (proto_is_null_proto) {
21062106- n += cpy(buf + n, len - n, " <[Object: null prototype] {}> ", 31);
21072107- } else n += cpy(buf + n, len - n, " ", 1);
21092109+ n += cpy(buf + n, REMAIN(n, len), " <[Object: null prototype] {}> ", 31);
21102110+ } else n += cpy(buf + n, REMAIN(n, len), " ", 1);
21082111 } else if (proto_is_null_proto) {
21092109- n += cpy(buf + n, len - n, "<[Object: null prototype] {}> ", 30);
21122112+ n += cpy(buf + n, REMAIN(n, len), "<[Object: null prototype] {}> ", 30);
21102113 }
2111211421122112- n += cpy(buf + n, len - n, inline_mode ? "{ " : "{\n", 2);
21152115+ n += cpy(buf + n, REMAIN(n, len), inline_mode ? "{ " : "{\n", 2);
2113211621142117continue_object_print:;
21152118···21562159 const char *key = (char *) &js->mem[koff + sizeof(koff)];
21572160 jsval_t val = loadval(js, prop + (jsoff_t) (sizeof(prop) + sizeof(koff)));
2158216121592159- if (!first) n += cpy(buf + n, len - n, inline_mode ? ", " : ",\n", 2);
21622162+ if (!first) n += cpy(buf + n, REMAIN(n, len), inline_mode ? ", " : ",\n", 2);
21602163 first = false;
21612161- if (!inline_mode) n += add_indent(buf + n, len - n, stringify_indent);
21642164+ if (!inline_mode) n += add_indent(buf + n, REMAIN(n, len), stringify_indent);
2162216521632166 bool is_special_global = false;
21642167 if (vtype(val) == T_UNDEF && streq(key, klen, "undefined", 9)) {
···21712174 }
2172217521732176 if (is_special_global) {
21742174- n += tostr(js, val, buf + n, len - n);
21772177+ n += tostr(js, val, buf + n, REMAIN(n, len));
21752178 } else {
21762176- n += strkey(js, mkval(T_STR, koff), buf + n, len - n);
21772177- n += cpy(buf + n, len - n, ": ", 2);
21782178- n += tostr(js, val, buf + n, len - n);
21792179+ n += strkey(js, mkval(T_STR, koff), buf + n, REMAIN(n, len));
21802180+ n += cpy(buf + n, REMAIN(n, len), ": ", 2);
21812181+ n += tostr(js, val, buf + n, REMAIN(n, len));
21792182 }
21802183 }
21812184 free(prop_offsets);
···21862189 if (!desc->enumerable) continue;
21872190 if (!desc->has_getter && !desc->has_setter) continue;
2188219121892189- if (!first) n += cpy(buf + n, len - n, inline_mode ? ", " : ",\n", 2);
21922192+ if (!first) n += cpy(buf + n, REMAIN(n, len), inline_mode ? ", " : ",\n", 2);
21902193 first = false;
21912191- if (!inline_mode) n += add_indent(buf + n, len - n, stringify_indent);
21922192- n += cpy(buf + n, len - n, desc->prop_name, desc->prop_len);
21932193- n += cpy(buf + n, len - n, ": ", 2);
21942194+ if (!inline_mode) n += add_indent(buf + n, REMAIN(n, len), stringify_indent);
21952195+ n += cpy(buf + n, REMAIN(n, len), desc->prop_name, desc->prop_len);
21962196+ n += cpy(buf + n, REMAIN(n, len), ": ", 2);
2194219721952198 if (desc->has_getter && desc->has_setter) {
21962196- n += cpy(buf + n, len - n, "[Getter/Setter]", 15);
21992199+ n += cpy(buf + n, REMAIN(n, len), "[Getter/Setter]", 15);
21972200 } else if (desc->has_getter) {
21982198- n += cpy(buf + n, len - n, "[Getter]", 8);
21992199- } else n += cpy(buf + n, len - n, "[Setter]", 8);
22012201+ n += cpy(buf + n, REMAIN(n, len), "[Getter]", 8);
22022202+ } else n += cpy(buf + n, REMAIN(n, len), "[Setter]", 8);
22002203 }
2201220422022205 if (!inline_mode) stringify_indent--;
22032206 if (inline_mode) {
22042204- n += cpy(buf + n, len - n, " }", 2);
22072207+ n += cpy(buf + n, REMAIN(n, len), " }", 2);
22052208 } else {
22062206- if (!first) n += cpy(buf + n, len - n, "\n", 1);
22072207- n += add_indent(buf + n, len - n, stringify_indent);
22082208- n += cpy(buf + n, len - n, "}", 1);
22092209+ if (!first) n += cpy(buf + n, REMAIN(n, len), "\n", 1);
22102210+ n += add_indent(buf + n, REMAIN(n, len), stringify_indent);
22112211+ n += cpy(buf + n, REMAIN(n, len), "}", 1);
22092212 }
22102213 pop_stringify();
22112214 return n;
···22462249 double iv;
22472250 double frac = modf(adv, &iv);
22482251 if (frac == 0.0 && adv < 9007199254740992.0) {
22492249- return (size_t) snprintf(buf, len, "%.0f", dv);
22522252+ int result = snprintf(temp, sizeof(temp), "%.0f", dv);
22532253+ fix_exponent(temp, (size_t)result);
22542254+ return cpy(buf, len, temp, strlen(temp));
22502255 }
2251225622522257 for (int prec = 1; prec <= 17; prec++) {
22532258 int n = snprintf(temp, sizeof(temp), "%.*g", prec, dv);
22542259 double parsed = strtod(temp, NULL);
22552260 if (parsed == dv) {
22562256- size_t result = (size_t)snprintf(buf, len, "%s", temp);
22572257- return fix_exponent(buf, result);
22612261+ fix_exponent(temp, (size_t)n);
22622262+ return cpy(buf, len, temp, strlen(temp));
22582263 }
22592264 (void)n;
22602265 }
2261226622622262- size_t result = (size_t)snprintf(buf, len, "%.17g", dv);
22632263- return fix_exponent(buf, result);
22672267+ int result = snprintf(temp, sizeof(temp), "%.17g", dv);
22682268+ fix_exponent(temp, (size_t)result);
22692269+ return cpy(buf, len, temp, strlen(temp));
22642270}
2265227122662272static jsoff_t vstr(struct js *js, jsval_t value, jsoff_t *len) {
···22732279 jsoff_t slen, off = vstr(js, value, &slen);
22742280 const char *str = (const char *) &js->mem[off];
22752281 size_t n = 0;
22762276- n += cpy(buf + n, len - n, "'", 1);
22822282+ n += cpy(buf + n, REMAIN(n, len), "'", 1);
22772283 for (jsoff_t i = 0; i < slen && n < len - 1; i++) {
22782284 char c = str[i];
22792279- if (c == '\n') { n += cpy(buf + n, len - n, "\\n", 2); }
22802280- else if (c == '\r') { n += cpy(buf + n, len - n, "\\r", 2); }
22812281- else if (c == '\t') { n += cpy(buf + n, len - n, "\\t", 2); }
22822282- else if (c == '\\') { n += cpy(buf + n, len - n, "\\\\", 2); }
22832283- else if (c == '\'') { n += cpy(buf + n, len - n, "\\'", 2); }
22852285+ if (c == '\n') { n += cpy(buf + n, REMAIN(n, len), "\\n", 2); }
22862286+ else if (c == '\r') { n += cpy(buf + n, REMAIN(n, len), "\\r", 2); }
22872287+ else if (c == '\t') { n += cpy(buf + n, REMAIN(n, len), "\\t", 2); }
22882288+ else if (c == '\\') { n += cpy(buf + n, REMAIN(n, len), "\\\\", 2); }
22892289+ else if (c == '\'') { n += cpy(buf + n, REMAIN(n, len), "\\'", 2); }
22842290 else { if (n < len) buf[n++] = c; }
22852291 }
22862286- n += cpy(buf + n, len - n, "'", 1);
22922292+ n += cpy(buf + n, REMAIN(n, len), "'", 1);
2287229322882294 return n;
22892295}
···23472353 if (vtype(builtin_slot) == T_NUM) {
23482354 if (name && name_len > 0) {
23492355 size_t n = cpy(buf, len, fmt->prefix, fmt->prefix_len);
23502350- n += cpy(buf + n, len - n, name, name_len);
23512351- n += cpy(buf + n, len - n, "]", 1);
23562356+ n += cpy(buf + n, REMAIN(n, len), name, name_len);
23572357+ n += cpy(buf + n, REMAIN(n, len), "]", 1);
23522358 return n;
23532359 }
23542360 return cpy(buf, len, fmt->anon, fmt->anon_len);
···2361236723622368 if (name && name_len > 0) {
23632369 n = cpy(buf, len, fmt->prefix, fmt->prefix_len);
23642364- n += cpy(buf + n, len - n, name, name_len);
23652365- n += cpy(buf + n, len - n, "]", 1);
23702370+ n += cpy(buf + n, REMAIN(n, len), name, name_len);
23712371+ n += cpy(buf + n, REMAIN(n, len), "]", 1);
23662372 } else {
23672373 n = cpy(buf, len, fmt->anon, fmt->anon_len);
23682374 }
···23832389 jsoff_t ctor_name_len = 0;
23842390 const char *ctor_name = get_func_name(js, ctor, &ctor_name_len);
23852391 if (ctor_name && ctor_name_len > 0) {
23862386- n += cpy(buf + n, len - n, " ", 1);
23872387- n += cpy(buf + n, len - n, ctor_name, ctor_name_len);
23922392+ n += cpy(buf + n, REMAIN(n, len), " ", 1);
23932393+ n += cpy(buf + n, REMAIN(n, len), ctor_name, ctor_name_len);
23882394 }
23892395 return n;
23902396 }
2391239723922398 if (name && name_len > 0) {
23932399 size_t n = cpy(buf, len, fmt->prefix, fmt->prefix_len);
23942394- n += cpy(buf + n, len - n, name, name_len);
23952395- n += cpy(buf + n, len - n, "]", 1);
24002400+ n += cpy(buf + n, REMAIN(n, len), name, name_len);
24012401+ n += cpy(buf + n, REMAIN(n, len), "]", 1);
23962402 return n;
23972403 }
23982404···24082414}
2409241524102416static void get_error_line(const char *code, jsoff_t clen, jsoff_t pos, char *buf, size_t bufsize, int *line_start_col) {
24172417+ if (!code || bufsize == 0) {
24182418+ if (bufsize > 0) buf[0] = '\0';
24192419+ if (line_start_col) *line_start_col = 1;
24202420+ return;
24212421+ }
24222422+24232423+ if (pos > clen) pos = clen;
24242424+24252425+ if (clen == 0) {
24262426+ buf[0] = '\0';
24272427+ if (line_start_col) *line_start_col = 1;
24282428+ return;
24292429+ }
24302430+24112431 jsoff_t line_start = pos;
24122432 while (line_start > 0 && code[line_start - 1] != '\n') {
24132433 line_start--;
···31103130 size_t dlen;
31113131 const char *digits = bigint_digits(js, value, &dlen);
31123132 size_t n = 0;
31133113- if (neg) n += cpy(buf + n, len - n, "-", 1);
31143114- n += cpy(buf + n, len - n, digits, dlen);
31333133+ if (neg) n += cpy(buf + n, REMAIN(n, len), "-", 1);
31343134+ n += cpy(buf + n, REMAIN(n, len), digits, dlen);
31153135 return n;
31163136}
31173137