This commit is contained in:
Horis 2024-03-08 10:02:18 +08:00
parent f3be1c36b8
commit 274ce5a6ea
2 changed files with 30 additions and 0 deletions

View File

@ -4,6 +4,7 @@
package com.script package com.script
import org.mozilla.javascript.Scriptable import org.mozilla.javascript.Scriptable
import kotlin.coroutines.CoroutineContext
abstract class CompiledScript { abstract class CompiledScript {
@ -15,6 +16,9 @@ abstract class CompiledScript {
@Throws(ScriptException::class) @Throws(ScriptException::class)
abstract fun eval(scope: Scriptable): Any? abstract fun eval(scope: Scriptable): Any?
@Throws(ScriptException::class)
abstract fun eval(scope: Scriptable, coroutineContext: CoroutineContext?): Any?
@Throws(ScriptException::class) @Throws(ScriptException::class)
abstract suspend fun evalSuspend(scope: Scriptable): Any? abstract suspend fun evalSuspend(scope: Scriptable): Any?

View File

@ -33,6 +33,7 @@ import kotlinx.coroutines.withContext
import org.mozilla.javascript.* import org.mozilla.javascript.*
import java.io.IOException import java.io.IOException
import kotlin.coroutines.Continuation import kotlin.coroutines.Continuation
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.intrinsics.suspendCoroutineUninterceptedOrReturn import kotlin.coroutines.intrinsics.suspendCoroutineUninterceptedOrReturn
/** /**
@ -96,6 +97,31 @@ internal class RhinoCompiledScript(
return result 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? { override suspend fun evalSuspend(scope: Scriptable): Any? {
val cx = Context.enter() val cx = Context.enter()
var ret: Any? var ret: Any?