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.

make sure upvals are in vm stack before dropping

+20 -8
+7
include/silver/engine.h
··· 383 383 return frame && frame->func && frame->func->is_strict; 384 384 } 385 385 386 + static inline bool sv_slot_in_vm_stack(const sv_vm_t *vm, const ant_value_t *slot) { 387 + return 388 + vm && vm->stack && slot && 389 + slot >= vm->stack && 390 + slot < vm->stack + vm->stack_size; 391 + } 392 + 386 393 static inline bool sv_is_nullish_this(ant_value_t v) { 387 394 return 388 395 vtype(v) == T_UNDEF || vtype(v) == T_NULL ||
+7 -4
src/silver/engine.c
··· 70 70 if (new_size <= vm->stack_size) return false; 71 71 72 72 ant_value_t *old = vm->stack; 73 + int old_size = vm->stack_size; 74 + 73 75 ant_value_t *ns = realloc(vm->stack, (size_t)new_size * sizeof(ant_value_t)); 74 76 if (!ns) return false; 75 77 ··· 82 84 if (vm->frames[i].bp) vm->frames[i].bp += delta; 83 85 if (vm->frames[i].lp) vm->frames[i].lp += delta; 84 86 } 85 - for (sv_upvalue_t *uv = vm->open_upvalues; uv; uv = uv->next) { 86 - if (uv->location != &uv->closed) 87 - uv->location += delta; 88 - } 87 + for (sv_upvalue_t *uv = vm->open_upvalues; uv; uv = uv->next) if ( 88 + uv->location != &uv->closed && 89 + uv->location >= old && 90 + uv->location < old + old_size 91 + ) uv->location += delta; 89 92 } 90 93 91 94 return true;
+6 -4
src/silver/ops/exceptions.h
··· 26 26 sv_upvalue_t **pp = &vm->open_upvalues; 27 27 while (*pp) { 28 28 sv_upvalue_t *uv = *pp; 29 - if (uv->location >= slot) { 30 - uv->closed = *uv->location; 29 + ant_value_t *loc = uv->location; 30 + if (loc >= slot && sv_slot_in_vm_stack(vm, loc)) { 31 + uv->closed = *loc; 31 32 uv->location = &uv->closed; 32 33 *pp = uv->next; 33 - } else pp = &uv->next;} 34 - } 34 + } 35 + else pp = &uv->next; 36 + }} 35 37 36 38 static inline ant_value_t sv_op_throw(sv_vm_t *vm) { 37 39 return vm->stack[--vm->sp];