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.

add coroutine-aware stack overflow detection and clearer error messages

+18 -7
+15 -7
src/ant.c
··· 712 712 } 713 713 714 714 static inline bool js_stack_overflow(struct js *js) { 715 + volatile char marker; 716 + uintptr_t curr = (uintptr_t)▮ 717 + 718 + mco_coro *coro = mco_running(); 719 + if (coro != NULL) { 720 + uintptr_t stack_top = (uintptr_t)coro->stack_base + coro->stack_size; 721 + size_t limit = coro->stack_size / 2; 722 + size_t used = (stack_top > curr) ? (stack_top - curr) : (curr - stack_top); 723 + return used > limit; 724 + } 725 + 715 726 if (js->stack_limit == 0 || js->cstk == NULL) return false; 716 - volatile char marker; 717 727 uintptr_t base = (uintptr_t)js->cstk; 718 - uintptr_t curr = (uintptr_t)▮ 719 728 size_t used = (base > curr) ? (base - curr) : (curr - base); 720 729 return used > js->stack_limit; 721 730 } ··· 6981 6990 } 6982 6991 6983 6992 static jsval_t do_call_op(struct js *js, jsval_t func, jsval_t args) { 6984 - if (js_stack_overflow(js)) return js_mkerr_typed(js, JS_ERR_RANGE | JS_ERR_NO_STACK, "stack overflow"); 6993 + if (js_stack_overflow(js)) { 6994 + return js_mkerr_typed(js, JS_ERR_RANGE | JS_ERR_NO_STACK, "Maximum call stack size exceeded"); 6995 + } 6985 6996 6986 6997 if (vtype(args) != T_CODEREF) return js_mkerr(js, "bad call"); 6987 6998 if (vtype(func) != T_FUNC && vtype(func) != T_CFUNC && vtype(func) != T_FFI) return js_mkerr(js, "calling non-function"); ··· 22778 22789 22779 22790 js->owns_mem = true; 22780 22791 js->max_size = (jsoff_t) max_size; 22781 - 22782 - volatile char stack_base; 22783 - js->cstk = (void *)&stack_base; 22784 - 22792 + 22785 22793 return js; 22786 22794 } 22787 22795
+3
src/main.c
··· 212 212 arg_freetable(argtable, ARGTABLE_COUNT); 213 213 return EXIT_FAILURE; 214 214 } 215 + 216 + volatile char stack_base; 215 217 218 + js_setstackbase(js, (void *)&stack_base); 216 219 ant_runtime_init(js, argc, argv, localstorage_file); 217 220 218 221 init_symbol_module();