QuickJS 是如何避免死循环的?
造成死循环的场景
在引擎内部对外暴露的接口,类似 instanceOf / for...in / getter / construction / prototypeOf 这些函数会造成死循环。
内部在 JS_CallInternal 时也可能会造成死循环,所以需要在 op_code 可能会发生死循环的场景下会去判断,goto/if_true/if_false/
如何解决
在内部执行时会做一个计数,超过 JS_INTERRUPT_COUNTER_INIT 10000 次后会执行外部的通过 JS_SetInterruptHandler 传入的 interrupt_handler, 通过 interrupt_handler 的返回值来判断是否需要抛出异常