diff options
Diffstat (limited to 'tests/compilerapi')
-rw-r--r-- | tests/compilerapi/exposed.nim | 2 | ||||
-rw-r--r-- | tests/compilerapi/invalid.nim | 1 | ||||
-rw-r--r-- | tests/compilerapi/myscript.nim | 5 | ||||
-rw-r--r-- | tests/compilerapi/tcompilerapi.nim | 72 | ||||
-rw-r--r-- | tests/compilerapi/tcompilerapi.nim.cfg | 1 |
5 files changed, 65 insertions, 16 deletions
diff --git a/tests/compilerapi/exposed.nim b/tests/compilerapi/exposed.nim index 73becd93d..25a858ec9 100644 --- a/tests/compilerapi/exposed.nim +++ b/tests/compilerapi/exposed.nim @@ -1,3 +1,3 @@ proc addFloats*(x, y, z: float): float = - discard "implementation overriden by tcompilerapi.nim" + discard "implementation overridden by tcompilerapi.nim" diff --git a/tests/compilerapi/invalid.nim b/tests/compilerapi/invalid.nim new file mode 100644 index 000000000..3c9364402 --- /dev/null +++ b/tests/compilerapi/invalid.nim @@ -0,0 +1 @@ +noSuchProc() diff --git a/tests/compilerapi/myscript.nim b/tests/compilerapi/myscript.nim index 539b07de1..c5d9fe22a 100644 --- a/tests/compilerapi/myscript.nim +++ b/tests/compilerapi/myscript.nim @@ -1,7 +1,12 @@ import exposed +type NumberHolder = object + ival: int + fval: float + echo "top level statements are executed!" +echo NumberHolder(ival: 10, fval: 2.0) proc hostProgramRunsThis*(a, b: float): float = result = addFloats(a, b, 1.0) diff --git a/tests/compilerapi/tcompilerapi.nim b/tests/compilerapi/tcompilerapi.nim index 494765a8b..2d6cfa0ca 100644 --- a/tests/compilerapi/tcompilerapi.nim +++ b/tests/compilerapi/tcompilerapi.nim @@ -1,9 +1,11 @@ discard """ output: '''top level statements are executed! +(ival: 10, fval: 2.0) 2.0 my secret 11 12 +raising VMQuit ''' joinable: "false" """ @@ -11,33 +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)]) - intr.implementRoutine("*", "exposed", "addFloats", proc (a: VmArgs) = + result = createInterpreter(script, [std, parentDir(currentSourcePath), + std / "pure", std / "core"]) + +proc main() = + let i = initInterpreter("myscript.nim") + i.implementRoutine("nim", "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() @@ -45,10 +49,50 @@ block issue9180: proc evalString(code: string, moduleName = "script.nim") = let stream = llStreamOpen(code) let std = findNimStdLibCompileTime() - var intr = createInterpreter(moduleName, [std]) + var intr = createInterpreter(moduleName, [std, std / "pure", std / "core"]) intr.evalScript(stream) destroyInterpreter(intr) llStreamClose(stream) 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() + +block resetmacrocache: + let std = findNimStdLibCompileTime() + let intr = createInterpreter("script.nim", [std, std / "pure", std / "core"]) + proc evalString(intr: Interpreter; code: string) = + let stream = llStreamOpen(code) + intr.evalScript(stream) + llStreamClose(stream) + let code = """ +import std/[macrocache, macros] +static: + let counter = CacheCounter"valTest" + inc counter + assert counter.value == 1 + + const mySeq = CacheSeq"addTest" + mySeq.add(newLit(5)) + mySeq.add(newLit("hello ic")) + assert mySeq.len == 2 + + const mcTable = CacheTable"subTest" + mcTable["toAdd"] = newStmtList() #would crash if not empty + assert mcTable.len == 1 +""" + intr.evalString(code) + intr.evalString(code) + destroyInterpreter(intr) \ No newline at end of file diff --git a/tests/compilerapi/tcompilerapi.nim.cfg b/tests/compilerapi/tcompilerapi.nim.cfg deleted file mode 100644 index 08e3312be..000000000 --- a/tests/compilerapi/tcompilerapi.nim.cfg +++ /dev/null @@ -1 +0,0 @@ -define:nimOldCaseObjects |