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.

better TypedArray performance

+41 -51
-3
include/modules/buffer.h
··· 1 1 #ifndef BUFFER_H 2 2 #define BUFFER_H 3 3 4 - #include "ant.h" 5 4 #include <stdint.h> 6 5 #include <stddef.h> 7 6 ··· 42 41 size_t byte_offset; 43 42 size_t byte_length; 44 43 } DataViewData; 45 - 46 - void sync_typedarray_indices(struct js *js, jsval_t obj, TypedArrayData *ta_data); 47 44 48 45 #endif
+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.2.1.13') 77 + version_conf.set('ANT_VERSION', '0.2.1.14') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+6
src/ant.c
··· 4783 4783 return accessor_result; 4784 4784 } 4785 4785 4786 + jsval_t dyn_result = try_dynamic_getter(js, obj, keystr, keylen); 4787 + if (vtype(dyn_result) != T_UNDEF) { 4788 + jsoff_t dyn_off = lkp(js, obj, keystr, keylen); 4789 + if (dyn_off != 0) return mkval(T_PROP, dyn_off); 4790 + } 4791 + 4786 4792 jsoff_t off = lkp_proto(js, obj, keystr, keylen); 4787 4793 if (off == 0) { 4788 4794 jsval_t key = js_mkstr(js, keystr, keylen);
+33 -40
src/modules/buffer.c
··· 194 194 return new_obj; 195 195 } 196 196 197 - void sync_typedarray_indices(struct js *js, jsval_t obj, TypedArrayData *ta_data) { 197 + static jsval_t typedarray_index_getter(struct js *js, jsval_t obj, const char *key, size_t key_len) { 198 + if (key_len == 0 || key_len > 15) return js_mkundef(); 199 + 200 + char *endptr; 201 + long index = strtol(key, &endptr, 10); 202 + if (endptr != key + key_len || index < 0) return js_mkundef(); 203 + 204 + jsval_t ta_data_val = js_get(js, obj, "_typedarray_data"); 205 + if (js_type(ta_data_val) != JS_NUM) return js_mkundef(); 206 + 207 + TypedArrayData *ta_data = (TypedArrayData *)(uintptr_t)js_getnum(ta_data_val); 208 + if (!ta_data || (size_t)index >= ta_data->length) return js_mkundef(); 209 + 198 210 uint8_t *data = ta_data->buffer->data + ta_data->byte_offset; 199 - size_t element_size = get_element_size(ta_data->type); 211 + double value; 212 + 213 + static const void *dispatch[] = { 214 + &&L_INT8, &&L_UINT8, &&L_UINT8, &&L_INT16, &&L_UINT16, 215 + &&L_INT32, &&L_UINT32, &&L_FLOAT32, &&L_FLOAT64, &&L_UNDEF, &&L_UNDEF 216 + }; 217 + 218 + if (ta_data->type > TYPED_ARRAY_BIGUINT64) goto L_UNDEF; 219 + goto *dispatch[ta_data->type]; 200 220 201 - for (size_t i = 0; i < ta_data->length; i++) { 202 - char key[16]; 203 - snprintf(key, sizeof(key), "%zu", i); 204 - 205 - double value = 0; 206 - switch (ta_data->type) { 207 - case TYPED_ARRAY_INT8: 208 - value = (double)((int8_t*)data)[i]; 209 - break; 210 - case TYPED_ARRAY_UINT8: 211 - case TYPED_ARRAY_UINT8_CLAMPED: 212 - value = (double)data[i]; 213 - break; 214 - case TYPED_ARRAY_INT16: 215 - value = (double)((int16_t*)(data))[i]; 216 - break; 217 - case TYPED_ARRAY_UINT16: 218 - value = (double)((uint16_t*)(data))[i]; 219 - break; 220 - case TYPED_ARRAY_INT32: 221 - value = (double)((int32_t*)(data))[i]; 222 - break; 223 - case TYPED_ARRAY_UINT32: 224 - value = (double)((uint32_t*)(data))[i]; 225 - break; 226 - case TYPED_ARRAY_FLOAT32: 227 - value = (double)((float*)(data))[i]; 228 - break; 229 - case TYPED_ARRAY_FLOAT64: 230 - value = ((double*)(data))[i]; 231 - break; 232 - default: 233 - value = (double)data[i * element_size]; 234 - break; 235 - } 236 - js_set(js, obj, key, js_mknum(value)); 237 - } 221 + L_INT8: value = (double)((int8_t*)data)[index]; goto L_DONE; 222 + L_UINT8: value = (double)data[index]; goto L_DONE; 223 + L_INT16: value = (double)((int16_t*)data)[index]; goto L_DONE; 224 + L_UINT16: value = (double)((uint16_t*)data)[index]; goto L_DONE; 225 + L_INT32: value = (double)((int32_t*)data)[index]; goto L_DONE; 226 + L_UINT32: value = (double)((uint32_t*)data)[index]; goto L_DONE; 227 + L_FLOAT32: value = (double)((float*)data)[index]; goto L_DONE; 228 + L_FLOAT64: value = ((double*)data)[index]; goto L_DONE; 229 + L_UNDEF: return js_mkundef(); 230 + L_DONE: return js_mknum(value); 238 231 } 239 232 240 233 static jsval_t create_typed_array(struct js *js, TypedArrayType type, ArrayBufferData *buffer, size_t byte_offset, size_t length, const char *type_name) { ··· 261 254 js_set(js, obj, "slice", js_mkfun(js_typedarray_slice)); 262 255 js_set(js, obj, "subarray", js_mkfun(js_typedarray_subarray)); 263 256 264 - sync_typedarray_indices(js, obj, ta_data); 257 + js_set_getter(js, obj, typedarray_index_getter); 265 258 266 259 return obj; 267 260 }
-2
src/modules/crypto.c
··· 158 158 uint8_t *ptr = ta_data->buffer->data + ta_data->byte_offset; 159 159 randombytes_buf(ptr, ta_data->byte_length); 160 160 161 - sync_typedarray_indices(js, args[0], ta_data); 162 - 163 161 return args[0]; 164 162 } 165 163
+1 -5
src/modules/textcodec.c
··· 32 32 jsval_t ta_data_val = js_get(js, arr, "_typedarray_data"); 33 33 if (js_type(ta_data_val) == JS_NUM) { 34 34 TypedArrayData *ta_data = (TypedArrayData *)(uintptr_t)js_getnum(ta_data_val); 35 - if (ta_data && ta_data->buffer && ta_data->buffer->data) { 36 - memcpy(ta_data->buffer->data, str, str_len); 37 - sync_typedarray_indices(js, arr, ta_data); 38 - } 35 + if (ta_data && ta_data->buffer && ta_data->buffer->data) memcpy(ta_data->buffer->data, str, str_len); 39 36 } 40 37 } 41 38 ··· 72 69 73 70 if (to_write > 0) { 74 71 memcpy(ta_data->buffer->data + ta_data->byte_offset, str, to_write); 75 - sync_typedarray_indices(js, args[1], ta_data); 76 72 } 77 73 78 74 jsval_t result = js_mkobj(js);