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.

optimize property reference stack management

circular buffer
overflow checks

+42 -12
+6
include/internal.h
··· 106 106 #define JS_ERR_NO_STACK (1 << 8) 107 107 #define JS_DENSE_INITIAL_CAP 8 108 108 109 + #define PROPREF_STACK_SIZE 2048 110 + #define PRIM_PROPREF_STACK_SIZE 512 111 + 112 + #define MAX_STRINGIFY_DEPTH 64 113 + #define MAX_MULTIREF_OBJS 128 114 + 109 115 #define NANBOX_PREFIX 0x7FC0000000000000ULL 110 116 #define NANBOX_PREFIX_CHK 0x3FEULL 111 117 #define NANBOX_TYPE_SHIFT 48
+36 -12
src/ant.c
··· 493 493 } 494 494 495 495 static jsval_t mkpropref(jsoff_t obj_off, jsoff_t key_off) { 496 - if (obj_off <= PROPREF_SAFE_MASK && key_off <= PROPREF_SAFE_MASK) { 497 - return mkval(T_PROPREF, (obj_off & PROPREF_OFF_MASK) | ((jsval_t)(key_off & PROPREF_OFF_MASK) << PROPREF_KEY_SHIFT)); 498 - } 496 + if (obj_off <= PROPREF_SAFE_MASK && key_off <= PROPREF_SAFE_MASK) return mkval( 497 + T_PROPREF, (obj_off & PROPREF_OFF_MASK) | 498 + ((jsval_t)(key_off & PROPREF_OFF_MASK) << PROPREF_KEY_SHIFT) 499 + ); 499 500 500 501 if (!propref_stack) utarray_new(propref_stack, &propref_icd); 501 - if (utarray_len(propref_stack) > 1024) utarray_clear(propref_stack); 502 + 503 + static unsigned propref_next_slot = 0; 504 + static unsigned propref_high_water = 0; 505 + 506 + if (propref_next_slot == 0 && propref_high_water > 0) { 507 + assert(propref_high_water <= PROPREF_STACK_SIZE && "propref_stack overflow"); 508 + } 502 509 503 510 propref_data_t entry = { obj_off, key_off }; 504 - utarray_push_back(propref_stack, &entry); 505 - int idx = (int)utarray_len(propref_stack) - 1; 511 + 512 + if (propref_next_slot < utarray_len(propref_stack)) { 513 + propref_data_t *slot = (propref_data_t *)utarray_eltptr(propref_stack, propref_next_slot); 514 + *slot = entry; 515 + } else utarray_push_back(propref_stack, &entry); 516 + 517 + int idx = (int)propref_next_slot; 518 + propref_next_slot = (propref_next_slot + 1) % PROPREF_STACK_SIZE; 519 + if ((unsigned)idx > propref_high_water) propref_high_water = (unsigned)idx; 506 520 507 521 return mkval(T_PROPREF, PROPREF_STACK_FLAG | (uint64_t)idx); 508 522 } 509 523 510 524 static jsval_t mkprim_propref(jsval_t prim_val, jsoff_t key_off) { 511 525 if (!prim_propref_stack) utarray_new(prim_propref_stack, &prim_propref_icd); 512 - if (utarray_len(prim_propref_stack) > 256) utarray_clear(prim_propref_stack); 526 + 527 + static unsigned prim_propref_next_slot = 0; 528 + static unsigned prim_propref_high_water = 0; 529 + 530 + if (prim_propref_next_slot == 0 && prim_propref_high_water > 0) { 531 + assert(prim_propref_high_water <= PRIM_PROPREF_STACK_SIZE && "prim_propref_stack overflow"); 532 + } 513 533 514 534 prim_propref_data_t entry = { prim_val, key_off }; 515 - utarray_push_back(prim_propref_stack, &entry); 516 - int idx = (int)utarray_len(prim_propref_stack) - 1; 535 + 536 + if (prim_propref_next_slot < utarray_len(prim_propref_stack)) { 537 + prim_propref_data_t *slot = (prim_propref_data_t *)utarray_eltptr(prim_propref_stack, prim_propref_next_slot); 538 + *slot = entry; 539 + } else utarray_push_back(prim_propref_stack, &entry); 540 + 541 + int idx = (int)prim_propref_next_slot; 542 + prim_propref_next_slot = (prim_propref_next_slot + 1) % PRIM_PROPREF_STACK_SIZE; 543 + if ((unsigned)idx > prim_propref_high_water) prim_propref_high_water = (unsigned)idx; 517 544 518 545 return mkval(T_PROPREF, PROPREF_PRIM_FLAG | (uint64_t)idx); 519 546 } ··· 863 890 size_t len = uint_to_str(buf, sizeof(buf), value); 864 891 return js_mkbigint(js, buf, len, false); 865 892 } 866 - 867 - #define MAX_STRINGIFY_DEPTH 64 868 - #define MAX_MULTIREF_OBJS 128 869 893 870 894 static jsval_t stringify_stack[MAX_STRINGIFY_DEPTH]; 871 895 static int stringify_depth = 0;