Improve JSR-223 engine diagnostics
also abstract invoke wrapper creation
This commit is contained in:
+20
-11
@@ -53,18 +53,15 @@ abstract class KotlinJsr223JvmScriptEngineBase(protected val myFactory: ScriptEn
|
|||||||
createState()
|
createState()
|
||||||
}) as IReplStageState<*>
|
}) as IReplStageState<*>
|
||||||
|
|
||||||
|
open fun getInvokeWrapper(context: ScriptContext): InvokeWrapper? = null
|
||||||
|
|
||||||
open fun overrideScriptArgs(context: ScriptContext): ScriptArgsWithTypes? = null
|
open fun overrideScriptArgs(context: ScriptContext): ScriptArgsWithTypes? = null
|
||||||
|
|
||||||
open fun compileAndEval(script: String, context: ScriptContext): Any? {
|
open fun compileAndEval(script: String, context: ScriptContext): Any? {
|
||||||
val codeLine = nextCodeLine(context, script)
|
val codeLine = nextCodeLine(context, script)
|
||||||
val state = getCurrentState(context)
|
val state = getCurrentState(context)
|
||||||
val result = replEvaluator.compileAndEval(state, codeLine, scriptArgs = overrideScriptArgs(context))
|
return asJsr223EvalResult {
|
||||||
return when (result) {
|
replEvaluator.compileAndEval(state, codeLine, overrideScriptArgs(context), getInvokeWrapper(context))
|
||||||
is ReplEvalResult.ValueResult -> result.value
|
|
||||||
is ReplEvalResult.UnitResult -> null
|
|
||||||
is ReplEvalResult.Error -> throw ScriptException(result.message)
|
|
||||||
is ReplEvalResult.Incomplete -> throw ScriptException("error: incomplete code")
|
|
||||||
is ReplEvalResult.HistoryMismatch -> throw ScriptException("Repl history mismatch at line: ${result.lineNo}")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,17 +80,29 @@ abstract class KotlinJsr223JvmScriptEngineBase(protected val myFactory: ScriptEn
|
|||||||
|
|
||||||
open fun eval(compiledScript: CompiledKotlinScript, context: ScriptContext): Any? {
|
open fun eval(compiledScript: CompiledKotlinScript, context: ScriptContext): Any? {
|
||||||
val state = getCurrentState(context)
|
val state = getCurrentState(context)
|
||||||
val result = try {
|
return asJsr223EvalResult {
|
||||||
replEvaluator.eval(state, compiledScript.compiledData, scriptArgs = overrideScriptArgs(context))
|
replEvaluator.eval(state, compiledScript.compiledData, overrideScriptArgs(context), getInvokeWrapper(context))
|
||||||
}
|
}
|
||||||
catch (e: Exception) {
|
}
|
||||||
|
|
||||||
|
private fun asJsr223EvalResult(body: () -> ReplEvalResult): Any? {
|
||||||
|
val result = try {
|
||||||
|
body()
|
||||||
|
} catch (e: Exception) {
|
||||||
throw ScriptException(e)
|
throw ScriptException(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
return when (result) {
|
return when (result) {
|
||||||
is ReplEvalResult.ValueResult -> result.value
|
is ReplEvalResult.ValueResult -> result.value
|
||||||
is ReplEvalResult.UnitResult -> null
|
is ReplEvalResult.UnitResult -> null
|
||||||
is ReplEvalResult.Error -> throw ScriptException(result.message)
|
is ReplEvalResult.Error ->
|
||||||
|
when {
|
||||||
|
result is ReplEvalResult.Error.Runtime && result.cause != null ->
|
||||||
|
throw ScriptException(result.cause)
|
||||||
|
result is ReplEvalResult.Error.CompileTime && result.location != null ->
|
||||||
|
throw ScriptException(result.message, result.location.path, result.location.line, result.location.column)
|
||||||
|
else -> throw ScriptException(result.message)
|
||||||
|
}
|
||||||
is ReplEvalResult.Incomplete -> throw ScriptException("error: incomplete code")
|
is ReplEvalResult.Incomplete -> throw ScriptException("error: incomplete code")
|
||||||
is ReplEvalResult.HistoryMismatch -> throw ScriptException("Repl history mismatch at line: ${result.lineNo}")
|
is ReplEvalResult.HistoryMismatch -> throw ScriptException("Repl history mismatch at line: ${result.lineNo}")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user