summary refs log tree commit diff stats
path: root/compiler/vm.nim
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2015-10-03 23:19:02 +0200
committerAraq <rumpf_a@web.de>2015-10-03 23:19:15 +0200
commita2c040e3bd2a34bff889c22e4fb098b95b45fe53 (patch)
treea2854a922d4cc350da72db37faec95558b4c6469 /compiler/vm.nim
parent28b1340f9494e70e81ae186de872df0be727f857 (diff)
downloadNim-a2c040e3bd2a34bff889c22e4fb098b95b45fe53.tar.gz
added undocumented exportNims pragma for Nimscript support
Diffstat (limited to 'compiler/vm.nim')
-rw-r--r--compiler/vm.nim25
1 files changed, 25 insertions, 0 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim
index ad4aa1017..ded66d3d0 100644
--- a/compiler/vm.nim
+++ b/compiler/vm.nim
@@ -1411,6 +1411,31 @@ proc execute(c: PCtx, start: int): PNode =
   newSeq(tos.slots, c.prc.maxSlots)
   result = rawExecute(c, start, tos).regToNode
 
+proc execProc*(c: PCtx; sym: PSym; args: openArray[PNode]): PNode =
+  if sym.kind in routineKinds:
+    if sym.typ.len-1 != args.len:
+      localError(sym.info,
+        "NimScript: expected $# arguments, but got $#" % [
+        $(sym.typ.len-1), $args.len])
+    else:
+      let start = genProc(c, sym)
+
+      var tos = PStackFrame(prc: sym, comesFrom: 0, next: nil)
+      let maxSlots = sym.offset
+      newSeq(tos.slots, maxSlots)
+
+      # setup parameters:
+      if not isEmptyType(sym.typ.sons[0]) or sym.kind == skMacro:
+        putIntoReg(tos.slots[0], getNullValue(sym.typ.sons[0], sym.info))
+      # XXX We could perform some type checking here.
+      for i in 1.. <sym.typ.len:
+        putIntoReg(tos.slots[i], args[i-1])
+
+      result = rawExecute(c, start, tos).regToNode
+  else:
+    localError(sym.info,
+      "NimScript: attempt to call non-routine: " & sym.name.s)
+
 proc evalStmt*(c: PCtx, n: PNode) =
   let n = transformExpr(c.module, n)
   let start = genStmt(c, n)