diff --git a/modules/rhino1.7.3/src/main/java/com/script/CompiledScript.kt b/modules/rhino1.7.3/src/main/java/com/script/CompiledScript.kt index e4c752e09323..5205d3733084 100644 --- a/modules/rhino1.7.3/src/main/java/com/script/CompiledScript.kt +++ b/modules/rhino1.7.3/src/main/java/com/script/CompiledScript.kt @@ -4,6 +4,7 @@ package com.script import org.mozilla.javascript.Scriptable +import kotlin.coroutines.CoroutineContext abstract class CompiledScript { @@ -15,6 +16,9 @@ abstract class CompiledScript { @Throws(ScriptException::class) abstract fun eval(scope: Scriptable): Any? + @Throws(ScriptException::class) + abstract fun eval(scope: Scriptable, coroutineContext: CoroutineContext?): Any? + @Throws(ScriptException::class) abstract suspend fun evalSuspend(scope: Scriptable): Any? diff --git a/modules/rhino1.7.3/src/main/java/com/script/rhino/RhinoCompiledScript.kt b/modules/rhino1.7.3/src/main/java/com/script/rhino/RhinoCompiledScript.kt index b617ff2316f3..fb495b4b0685 100644 --- a/modules/rhino1.7.3/src/main/java/com/script/rhino/RhinoCompiledScript.kt +++ b/modules/rhino1.7.3/src/main/java/com/script/rhino/RhinoCompiledScript.kt @@ -33,6 +33,7 @@ import kotlinx.coroutines.withContext import org.mozilla.javascript.* import java.io.IOException import kotlin.coroutines.Continuation +import kotlin.coroutines.CoroutineContext import kotlin.coroutines.intrinsics.suspendCoroutineUninterceptedOrReturn /** @@ -96,6 +97,31 @@ internal class RhinoCompiledScript( return result } + override fun eval(scope: Scriptable, coroutineContext: CoroutineContext?): Any? { + val cx = Context.enter() + if (cx is RhinoContext) { + cx.coroutineContext = coroutineContext + } + val result: Any? + try { + val ret = script.exec(cx, scope) + result = engine.unwrapReturnValue(ret) + } catch (re: RhinoException) { + val line = if (re.lineNumber() == 0) -1 else re.lineNumber() + val msg: String = if (re is JavaScriptException) { + re.value.toString() + } else { + re.toString() + } + val se = ScriptException(msg, re.sourceName(), line) + se.initCause(re) + throw se + } finally { + Context.exit() + } + return result + } + override suspend fun evalSuspend(scope: Scriptable): Any? { val cx = Context.enter() var ret: Any?