diff --git a/src/sbbs3/js_internal.c b/src/sbbs3/js_internal.c index 3483ec8e05ab7af85cb2dbb8e3e8fcafc37ebd0e..870343e8654454aa8b9d3acb083bcd4cc72b83fe 100644 --- a/src/sbbs3/js_internal.c +++ b/src/sbbs3/js_internal.c @@ -200,22 +200,29 @@ js_GenericBranchCallback(JSContext *cx, js_branch_t* branch) { branch->counter++; + /* Terminated? */ + if(branch->auto_terminate && + (branch->terminated!=NULL && *branch->terminated)) { + JS_ReportError(cx,"Terminated"); + branch->counter=0; + return(JS_FALSE); + } + /* Infinite loop? */ if(branch->limit && branch->counter > branch->limit) { JS_ReportError(cx,"Infinite loop (%lu branches) detected",branch->counter); branch->counter=0; return(JS_FALSE); } + /* Give up timeslices every once in a while */ if(branch->yield_interval && (branch->counter%branch->yield_interval)==0) YIELD(); + /* Periodic Garbage Collection */ if(branch->gc_interval && (branch->counter%branch->gc_interval)==0) JS_MaybeGC(cx), branch->gc_attempts++; - if(branch->terminated!=NULL && *branch->terminated) - return(JS_FALSE); - return(JS_TRUE); }