summary refs log tree commit diff stats
path: root/compiler/vmgen.nim
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2013-08-11 18:48:33 +0200
committerAraq <rumpf_a@web.de>2013-08-11 18:48:33 +0200
commitd18c82a9ef1647c6f56e393df959ed5ec370e77c (patch)
treebfcc855cdf1d4a940355b6f557e48eec9f500533 /compiler/vmgen.nim
parenta294d45fd67cebec8dd0efc43417fdc2ad1030dc (diff)
downloadNim-d18c82a9ef1647c6f56e393df959ed5ec370e77c.tar.gz
new VM: preparations for evalMacroCall
Diffstat (limited to 'compiler/vmgen.nim')
-rw-r--r--compiler/vmgen.nim22
1 files changed, 16 insertions, 6 deletions
diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim
index 016cfc96c..f7df31c0c 100644
--- a/compiler/vmgen.nim
+++ b/compiler/vmgen.nim
@@ -674,26 +674,27 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest) =
     genUnaryABC(c, n, dest, opcParseStmtToAst)
   of mExpandToAst:
     InternalError(n.info, "cannot generate code for: " & $m)
-  of mTypeTrait: InternalError(n.info, "cannot generate code for: " & $m)
-  of mIs: InternalError(n.info, "cannot generate code for: " & $m)
+  of mTypeTrait: 
+    
+    InternalError(n.info, "cannot generate code for: " & $m)
+  of mIs:
+    InternalError(n.info, "cannot generate code for: " & $m)
   of mSlurp: genUnaryABC(c, n, dest, opcSlurp)
   of mStaticExec: genBinaryABC(c, n, dest, opcGorge)
   of mNLen: genUnaryABI(c, n, dest, opcLenSeq)
   of mNChild: genBinaryABC(c, n, dest, opcNChild)
-  of mNSetChild:
+  of mNSetChild, mNDel:
     unused(n, dest)
     var
       tmp1 = c.genx(n.sons[1])
       tmp2 = c.genx(n.sons[2])
       tmp3 = c.genx(n.sons[3])
-    c.gABC(n, opcNSetChild, tmp1, tmp2, tmp3)
+    c.gABC(n, if m == mNSetChild: opcNSetChild else: opcNDel, tmp1, tmp2, tmp3)
     c.freeTemp(tmp1)
     c.freeTemp(tmp2)
     c.freeTemp(tmp3)
   of mNAdd: genBinaryABC(c, n, dest, opcNAdd)
   of mNAddMultiple: genBinaryABC(c, n, dest, opcNAddMultiple)
-  of mNDel:
-    InternalError(n.info, "cannot generate code for: " & $m)
   of mNKind: genUnaryABC(c, n, dest, opcNKind)
   of mNIntVal: genUnaryABC(c, n, dest, opcNIntVal)
   of mNFloatVal: genUnaryABC(c, n, dest, opcNFloatVal)
@@ -740,6 +741,7 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest) =
   of mNCallSite:
     if dest < 0: dest = c.getTemp(n.typ)
     c.gABC(n, opcCallSite, dest)
+  of mNGenSym: genBinaryABC(c, n, dest, opcGenSym)
   of mMinI, mMaxI, mMinI64, mMaxI64, mAbsF64, mMinF64, mMaxF64, mAbsI, mAbsI64:
     c.genCall(n, dest)
   else:
@@ -1166,6 +1168,14 @@ proc genStmt*(c: PCtx; n: PNode): int =
   c.gABC(n, opcEof)
   InternalAssert d < 0
 
+proc genExpr*(c: PCtx; n: PNode): int =
+  c.removeLastEof
+  result = c.code.len
+  var d: TDest = -1
+  c.gen(n, d)
+  InternalAssert d >= 0
+  c.gABC(n, opcEof, d)
+
 proc genParams(c: PCtx; params: PNode) =
   # res.sym.position is already 0
   c.prc.slots[0] = (inUse: true, kind: slotFixedVar)