diff options
author | Araq <rumpf_a@web.de> | 2015-10-03 23:19:02 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2015-10-03 23:19:15 +0200 |
commit | a2c040e3bd2a34bff889c22e4fb098b95b45fe53 (patch) | |
tree | a2854a922d4cc350da72db37faec95558b4c6469 /compiler/vm.nim | |
parent | 28b1340f9494e70e81ae186de872df0be727f857 (diff) | |
download | Nim-a2c040e3bd2a34bff889c22e4fb098b95b45fe53.tar.gz |
added undocumented exportNims pragma for Nimscript support
Diffstat (limited to 'compiler/vm.nim')
-rw-r--r-- | compiler/vm.nim | 25 |
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) |