nimeval errorHook support (#15255)

This commit is contained in:
Scott Wadden
2020-09-07 15:05:07 -03:00
committed by GitHub
parent 0b74d26d0c
commit 098a8a7c52
3 changed files with 37 additions and 16 deletions

View File

@@ -0,0 +1 @@
noSuchProc()

View File

@@ -5,6 +5,7 @@ discard """
my secret
11
12
raising VMQuit
'''
joinable: "false"
"""
@@ -12,34 +13,35 @@ my secret
## Example program that demonstrates how to use the
## compiler as an API to embed into your own projects.
import "../../compiler" / [ast, vmdef, vm, nimeval, llstream]
import "../../compiler" / [ast, vmdef, vm, nimeval, llstream, lineinfos, options]
import std / [os]
proc main() =
proc initInterpreter(script: string): Interpreter =
let std = findNimStdLibCompileTime()
var intr = createInterpreter("myscript.nim", [std, parentDir(currentSourcePath),
result = createInterpreter(script , [std, parentDir(currentSourcePath),
std / "pure", std / "core"])
intr.implementRoutine("*", "exposed", "addFloats", proc (a: VmArgs) =
proc main() =
let i = initInterpreter("myscript.nim")
i.implementRoutine("*", "exposed", "addFloats", proc (a: VmArgs) =
setResult(a, getFloat(a, 0) + getFloat(a, 1) + getFloat(a, 2))
)
intr.evalScript()
let foreignProc = selectRoutine(intr, "hostProgramRunsThis")
i.evalScript()
let foreignProc = i.selectRoutine("hostProgramRunsThis")
if foreignProc == nil:
quit "script does not export a proc of the name: 'hostProgramRunsThis'"
let res = intr.callRoutine(foreignProc, [newFloatNode(nkFloatLit, 0.9),
newFloatNode(nkFloatLit, 0.1)])
let res = i.callRoutine(foreignProc, [newFloatNode(nkFloatLit, 0.9),
newFloatNode(nkFloatLit, 0.1)])
doAssert res.kind == nkFloatLit
echo res.floatVal
let foreignValue = selectUniqueSymbol(intr, "hostProgramWantsThis")
let foreignValue = i.selectUniqueSymbol("hostProgramWantsThis")
if foreignValue == nil:
quit "script does not export a global of the name: hostProgramWantsThis"
let val = intr.getGlobalValue(foreignValue)
let val = i.getGlobalValue(foreignValue)
doAssert val.kind in {nkStrLit..nkTripleStrLit}
echo val.strVal
destroyInterpreter(intr)
i.destroyInterpreter()
main()
@@ -54,3 +56,16 @@ block issue9180:
evalString("echo 10+1")
evalString("echo 10+2")
block error_hook:
type VMQuit = object of CatchableError
let i = initInterpreter("invalid.nim")
i.registerErrorHook proc(config: ConfigRef; info: TLineInfo; msg: string;
severity: Severity) {.gcsafe.} =
if severity == Error and config.errorCounter >= config.errorMax:
echo "raising VMQuit"
raise newException(VMQuit, "Script error")
doAssertRaises(VMQuit):
i.evalScript()