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.

reduce transient buffer usage

+93 -44
+93 -44
src/ant.c
··· 15102 15102 return tov((double)js_cfunc_length(cfunc)); 15103 15103 } 15104 15104 15105 - ant_value_t js_set_function_name(ant_t *js, ant_value_t fn, const char *name, size_t name_len) { 15105 + static ant_value_t js_define_function_name_value(ant_t *js, ant_value_t fn, ant_value_t name_val) { 15106 15106 ant_value_t fn_obj = js_as_obj(fn); 15107 15107 ant_object_t *ptr = js_obj_ptr(fn_obj); 15108 15108 15109 15109 if (!ptr) return js_mkundef(); 15110 + if (vtype(name_val) != T_STR) return js_mkerr(js, "function name must be a string"); 15111 + 15112 + const char *name_key = js->intern.name ? js->intern.name : intern_string("name", 4); 15113 + if (!name_key) return js_mkerr(js, "oom"); 15114 + 15115 + return mkprop_interned_exact( 15116 + js, fn_obj, name_key, name_val, 15117 + ANT_PROP_ATTR_CONFIGURABLE 15118 + ); 15119 + } 15120 + 15121 + static ant_value_t js_mkstr_concat2( 15122 + ant_t *js, 15123 + const char *left, size_t left_len, 15124 + const char *right, size_t right_len 15125 + ) { 15126 + if (!left) left_len = 0; 15127 + if (!right) right_len = 0; 15128 + 15129 + if (SIZE_MAX - left_len < right_len) return js_mkerr(js, "oom"); 15130 + size_t total = left_len + right_len; 15131 + ant_value_t out = js_mkstr(js, NULL, total); 15132 + if (is_err(out)) return out; 15133 + 15134 + ant_flat_string_t *flat = ant_str_flat_ptr(out); 15135 + if (!flat) return js_mkerr(js, "oom"); 15136 + if (left_len) memcpy(flat->bytes, left, left_len); 15137 + if (right_len) memcpy(flat->bytes + left_len, right, right_len); 15138 + 15139 + flat->bytes[total] = '\0'; 15140 + flat->is_ascii = str_detect_ascii_bytes(flat->bytes, total); 15141 + 15142 + return out; 15143 + } 15144 + 15145 + static ant_value_t js_mkstr_symbol_function_name( 15146 + ant_t *js, 15147 + const char *prefix, size_t prefix_len, 15148 + const char *desc 15149 + ) { 15150 + if (!prefix) prefix_len = 0; 15151 + if (!desc) return js_mkstr_concat2(js, prefix, prefix_len, "", 0); 15152 + 15153 + size_t desc_len = strlen(desc); 15154 + if (SIZE_MAX - prefix_len < desc_len || 15155 + SIZE_MAX - prefix_len - desc_len < 2) { 15156 + return js_mkerr(js, "oom"); 15157 + } 15158 + 15159 + size_t total = prefix_len + desc_len + 2; 15160 + ant_value_t out = js_mkstr(js, NULL, total); 15161 + if (is_err(out)) return out; 15162 + 15163 + ant_flat_string_t *flat = ant_str_flat_ptr(out); 15164 + if (!flat) return js_mkerr(js, "oom"); 15165 + if (prefix_len) memcpy(flat->bytes, prefix, prefix_len); 15166 + 15167 + flat->bytes[prefix_len] = '['; 15168 + memcpy(flat->bytes + prefix_len + 1, desc, desc_len); 15169 + 15170 + flat->bytes[total - 1] = ']'; 15171 + flat->bytes[total] = '\0'; 15172 + flat->is_ascii = str_detect_ascii_bytes(flat->bytes, total); 15173 + 15174 + return out; 15175 + } 15176 + 15177 + ant_value_t js_set_function_name(ant_t *js, ant_value_t fn, const char *name, size_t name_len) { 15110 15178 if (!name) { 15111 15179 name = ""; 15112 15180 name_len = 0; 15113 15181 } 15114 15182 15115 - const char *name_key = js->intern.name ? js->intern.name : intern_string("name", 4); 15116 - if (!name_key) return js_mkerr(js, "oom"); 15117 - 15118 15183 ant_value_t name_val = js_mkstr(js, name, name_len); 15119 15184 if (is_err(name_val)) return name_val; 15185 + return js_define_function_name_value(js, fn, name_val); 15186 + } 15120 15187 15121 - return mkprop_interned_exact( 15122 - js, fn_obj, name_key, name_val, 15123 - ANT_PROP_ATTR_CONFIGURABLE 15124 - ); 15188 + static ant_value_t js_set_function_name_value_prefixed( 15189 + ant_t *js, ant_value_t fn, 15190 + const char *prefix, size_t prefix_len, 15191 + ant_value_t name_val 15192 + ) { 15193 + if (!prefix || prefix_len == 0) 15194 + return js_define_function_name_value(js, fn, name_val); 15195 + 15196 + ant_offset_t name_len = 0; 15197 + ant_offset_t name_off = vstr(js, name_val, &name_len); 15198 + const char *name = (const char *)(uintptr_t)name_off; 15199 + 15200 + ant_value_t prefixed = js_mkstr_concat2(js, prefix, prefix_len, name, (size_t)name_len); 15201 + if (is_err(prefixed)) return prefixed; 15202 + return js_define_function_name_value(js, fn, prefixed); 15125 15203 } 15126 15204 15127 15205 ant_value_t js_set_function_name_prefixed( ··· 15131 15209 ) { 15132 15210 if (!prefix || prefix_len == 0) 15133 15211 return js_set_function_name(js, fn, name, name_len); 15134 - 15212 + 15135 15213 if (!name) { 15136 15214 name = ""; 15137 15215 name_len = 0; 15138 15216 } 15139 15217 15140 - char stack_buf[128]; 15141 - size_t total = prefix_len + name_len; 15142 - 15143 - char *buf = (total + 1 <= sizeof(stack_buf)) ? stack_buf : malloc(total + 1); 15144 - if (!buf) return js_mkerr(js, "oom"); 15145 - 15146 - memcpy(buf, prefix, prefix_len); 15147 - memcpy(buf + prefix_len, name, name_len); 15148 - buf[total] = '\0'; 15149 - 15150 - ant_value_t result = js_set_function_name(js, fn, buf, total); 15151 - if (buf != stack_buf) free(buf); 15152 - 15153 - return result; 15218 + ant_value_t prefixed = js_mkstr_concat2(js, prefix, prefix_len, name, name_len); 15219 + if (is_err(prefixed)) return prefixed; 15220 + return js_define_function_name_value(js, fn, prefixed); 15154 15221 } 15155 15222 15156 15223 ant_value_t js_set_function_name_from_key( ··· 15160 15227 ) { 15161 15228 if (vtype(key) == T_SYMBOL) { 15162 15229 const char *desc = js_sym_desc(key); 15163 - if (!desc) return js_set_function_name_prefixed(js, fn, prefix, prefix_len, "", 0); 15164 - 15165 - size_t desc_len = strlen(desc); 15166 - char stack_buf[128]; 15167 - 15168 - size_t bracketed_len = desc_len + 2; 15169 - char *buf = (bracketed_len + 1 <= sizeof(stack_buf)) ? stack_buf : malloc(bracketed_len + 1); 15170 - if (!buf) return js_mkerr(js, "oom"); 15171 - 15172 - buf[0] = '['; 15173 - memcpy(buf + 1, desc, desc_len); 15174 - buf[bracketed_len - 1] = ']'; 15175 - buf[bracketed_len] = '\0'; 15176 - 15177 - ant_value_t result = js_set_function_name_prefixed( 15178 - js, fn, prefix, prefix_len, 15179 - buf, bracketed_len 15180 - ); 15181 - 15182 - if (buf != stack_buf) free(buf); 15183 - return result; 15230 + ant_value_t symbol_name = js_mkstr_symbol_function_name(js, prefix, prefix_len, desc); 15231 + if (is_err(symbol_name)) return symbol_name; 15232 + return js_define_function_name_value(js, fn, symbol_name); 15184 15233 } 15185 15234 15186 15235 ant_value_t key_str = coerce_to_str(js, key);