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.

propref table for 24+ bits

+82 -11
+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.2.0') 77 + version_conf.set('ANT_VERSION', '0.2.2.1') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+59 -10
src/ant.c
··· 296 296 UT_hash_handle hh; 297 297 } descriptor_entry_t; 298 298 299 + typedef struct { 300 + jsoff_t obj_off; 301 + jsoff_t key_off; 302 + } propref_data_t; 303 + 304 + static const UT_icd propref_icd = { sizeof(propref_data_t), NULL, NULL, NULL }; 305 + static UT_array *propref_stack = NULL; 306 + 299 307 #define MAX_FUNC_PARAMS 64 300 308 301 309 typedef struct parsed_param { ··· 475 483 return (size_t)(v & NANBOX_DATA_MASK); 476 484 } 477 485 478 - static jsoff_t coderefoff(jsval_t v) { return v & 0xffffffU; } 479 - static jsoff_t codereflen(jsval_t v) { return (v >> 24U) & 0xffffffU; } 480 - static jsoff_t propref_obj(jsval_t v) { return v & 0xffffffU; } 481 - static jsoff_t propref_key(jsval_t v) { return (v >> 24U) & 0xffffffU; } 486 + #define PROPREF_STACK_FLAG 0x800000000000ULL 487 + #define PROPREF_INDEX_MASK 0x7FFFFFFFFFFFULL 488 + #define PROPREF_OFF_MASK 0xFFFFFFU 489 + #define PROPREF_PAYLOAD 0xFFFFFFULL 490 + #define PROPREF_KEY_SHIFT 24U 491 + 492 + static jsoff_t coderefoff(jsval_t v) { return v & PROPREF_OFF_MASK; } 493 + static jsoff_t codereflen(jsval_t v) { return (v >> 24U) & PROPREF_OFF_MASK; } 494 + 495 + static inline propref_data_t *propref_get_entry(jsval_t v) { 496 + uint64_t data = v & NANBOX_DATA_MASK; 497 + if (!(data & PROPREF_STACK_FLAG)) return NULL; 498 + 499 + int idx = (int)(data & PROPREF_INDEX_MASK); 500 + if (!propref_stack || idx < 0 || idx >= (int)utarray_len(propref_stack)) return NULL; 501 + 502 + return (propref_data_t *)utarray_eltptr(propref_stack, (unsigned)idx); 503 + } 504 + 505 + static jsoff_t propref_obj(jsval_t v) { 506 + propref_data_t *entry = propref_get_entry(v); 507 + if (entry) return entry->obj_off; 508 + 509 + uint64_t data = v & NANBOX_DATA_MASK; 510 + return (data & PROPREF_STACK_FLAG) ? 0 : (data & PROPREF_OFF_MASK); 511 + } 512 + 513 + static jsoff_t propref_key(jsval_t v) { 514 + propref_data_t *entry = propref_get_entry(v); 515 + if (entry) return entry->key_off; 516 + 517 + uint64_t data = v & NANBOX_DATA_MASK; 518 + return (data & PROPREF_STACK_FLAG) ? 0 : ((data >> PROPREF_KEY_SHIFT) & PROPREF_OFF_MASK); 519 + } 482 520 483 521 static jsoff_t offtolen(jsoff_t off) { return (off >> 2) - 1; } 484 522 static jsoff_t align32(jsoff_t v) { return ((v + 3) >> 2) << 2; } ··· 515 553 } 516 554 517 555 static jsval_t mkcoderef(jsval_t off, jsoff_t len) { 518 - return mkval(T_CODEREF, (off & 0xffffffU) | ((jsval_t)(len & 0xffffffU) << 24U)); 556 + return mkval(T_CODEREF, (off & PROPREF_OFF_MASK) | ((jsval_t)(len & PROPREF_OFF_MASK) << 24U)); 519 557 } 520 558 521 - static jsval_t mkpropref(jsoff_t obj_off, jsoff_t key_off) { 522 - return mkval(T_PROPREF, (obj_off & 0xffffffU) | ((jsval_t)(key_off & 0xffffffU) << 24U)); 559 + static jsval_t mkpropref(jsoff_t obj_off, jsoff_t key_off) { 560 + if (obj_off <= PROPREF_OFF_MASK && key_off <= PROPREF_OFF_MASK) { 561 + return mkval(T_PROPREF, (obj_off & PROPREF_OFF_MASK) | ((jsval_t)(key_off & PROPREF_OFF_MASK) << 24U)); 562 + } 563 + 564 + if (!propref_stack) utarray_new(propref_stack, &propref_icd); 565 + if (utarray_len(propref_stack) > 1024) utarray_clear(propref_stack); 566 + 567 + propref_data_t entry = { obj_off, key_off }; 568 + utarray_push_back(propref_stack, &entry); 569 + int idx = (int)utarray_len(propref_stack) - 1; 570 + 571 + return mkval(T_PROPREF, PROPREF_STACK_FLAG | (uint64_t)idx); 523 572 } 524 573 525 574 static bool is_err(jsval_t v) { ··· 3181 3230 jsval_t desc_str = js_mkstr(js, desc, strlen(desc)); 3182 3231 desc_off = (jsoff_t)vdata(desc_str); 3183 3232 } 3184 - uint64_t payload = ((id & 0xFFFFFFULL) << 24) | (desc_off & 0xFFFFFFULL); 3233 + uint64_t payload = ((id & PROPREF_PAYLOAD) << 24) | (desc_off & PROPREF_PAYLOAD); 3185 3234 return mkval(T_SYMBOL, payload); 3186 3235 } 3187 3236 ··· 3191 3240 } 3192 3241 3193 3242 static uint64_t sym_get_id(jsval_t v) { 3194 - return (vdata(v) >> 24) & 0xFFFFFFULL; 3243 + return (vdata(v) >> 24) & PROPREF_PAYLOAD; 3195 3244 } 3196 3245 3197 3246 static jsoff_t sym_get_desc_off(jsval_t v) { 3198 - return vdata(v) & 0xFFFFFFULL; 3247 + return vdata(v) & PROPREF_PAYLOAD; 3199 3248 } 3200 3249 3201 3250 static const char *sym_get_desc(struct js *js, jsval_t v) {
+11
tests/bench_dict.js
··· 1 + var arr = []; 2 + for (var i = 0; i < 1024; i++) arr.push(i); 3 + 4 + var start = Date.now(); 5 + var sum = 0; 6 + for (var i = 0; i < 100000; i++) { 7 + sum += arr[i % 1024]; 8 + } 9 + var end = Date.now(); 10 + console.log('100k regular array accesses:', end - start, 'ms'); 11 + console.log('sum:', sum);
+11
tests/bench_typedarr.js
··· 1 + var arr = new Uint32Array(0x1000 / 4); 2 + arr.fill(0x51515151); 3 + 4 + var start = Date.now(); 5 + var sum = 0; 6 + for (var i = 0; i < 100000; i++) { 7 + sum += arr[i % 1024]; 8 + } 9 + var end = Date.now(); 10 + console.log('100k typed array accesses:', end - start, 'ms'); 11 + console.log('sum:', sum);