diff --git a/modules/rhino/src/main/java/com/script/rhino/RhinoCompiledScript.kt b/modules/rhino/src/main/java/com/script/rhino/RhinoCompiledScript.kt index 4758639f6..12fe9c91b 100644 --- a/modules/rhino/src/main/java/com/script/rhino/RhinoCompiledScript.kt +++ b/modules/rhino/src/main/java/com/script/rhino/RhinoCompiledScript.kt @@ -56,7 +56,12 @@ internal class RhinoCompiledScript( override fun eval(scope: Scriptable, coroutineContext: CoroutineContext?): Any? { val cx = Context.enter() as RhinoContext - cx.checkRecursive() + try { + cx.checkRecursive() + } catch (e: RhinoRecursionError) { + Context.exit() + throw e + } val previousCoroutineContext = cx.coroutineContext if (coroutineContext != null && coroutineContext[Job] != null) { cx.coroutineContext = coroutineContext @@ -88,6 +93,12 @@ internal class RhinoCompiledScript( override suspend fun evalSuspend(scope: Scriptable): Any? { val cx = Context.enter() as RhinoContext + try { + cx.checkRecursive() + } catch (e: RhinoRecursionError) { + Context.exit() + throw e + } var ret: Any? withContext(VMBridgeReflect.contextLocal.asContextElement()) { cx.allowScriptRun = true diff --git a/modules/rhino/src/main/java/com/script/rhino/RhinoScriptEngine.kt b/modules/rhino/src/main/java/com/script/rhino/RhinoScriptEngine.kt index b38cf723b..7ee6b6c48 100644 --- a/modules/rhino/src/main/java/com/script/rhino/RhinoScriptEngine.kt +++ b/modules/rhino/src/main/java/com/script/rhino/RhinoScriptEngine.kt @@ -91,7 +91,12 @@ object RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable { coroutineContext: CoroutineContext? ): Any? { val cx = Context.enter() as RhinoContext - cx.checkRecursive() + try { + cx.checkRecursive() + } catch (e: RhinoRecursionError) { + Context.exit() + throw e + } val previousCoroutineContext = cx.coroutineContext if (coroutineContext != null && coroutineContext[Job] != null) { cx.coroutineContext = coroutineContext @@ -127,7 +132,12 @@ object RhinoScriptEngine : AbstractScriptEngine(), Invocable, Compilable { @Throws(ContinuationPending::class) override suspend fun evalSuspend(reader: Reader, scope: Scriptable): Any? { val cx = Context.enter() as RhinoContext - cx.checkRecursive() + try { + cx.checkRecursive() + } catch (e: RhinoRecursionError) { + Context.exit() + throw e + } var ret: Any? withContext(VMBridgeReflect.contextLocal.asContextElement()) { cx.allowScriptRun = true