summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorZahary Karadjov <zahary@gmail.com>2014-03-09 17:06:29 +0200
committerZahary Karadjov <zahary@gmail.com>2014-03-09 17:06:29 +0200
commiteebe0035b5d16d82a3806ff6c3d29935e771226b (patch)
tree3670b901a7ec5d1b8a040a31c3a4b2be676309c3
parent1793a0b5cefda62d49d584bd12cc1fc6a40f1438 (diff)
downloadNim-eebe0035b5d16d82a3806ff6c3d29935e771226b.tar.gz
teach opcLdObj about nkExprColonExpr
-rw-r--r--compiler/vm.nim4
-rw-r--r--tests/static/tstaticparammacro.nim52
-rw-r--r--tests/vm/tstaticprintseq.nim36
3 files changed, 73 insertions, 19 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim
index f9b143bce..2a80106a5 100644
--- a/compiler/vm.nim
+++ b/compiler/vm.nim
@@ -425,7 +425,9 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
       decodeBC(rkNode)
       let src = regs[rb].node
       if src.kind notin {nkEmpty..nkNilLit}:
-        regs[ra].node = src.sons[rc]
+        let n = src.sons[rc]
+        regs[ra].node = if n.kind == nkExprColonExpr: n[1]
+                        else: n
       else:
         stackTrace(c, tos, pc, errIndexOutOfBounds)
     of opcWrObj:
diff --git a/tests/static/tstaticparammacro.nim b/tests/static/tstaticparammacro.nim
new file mode 100644
index 000000000..7fb9e2014
--- /dev/null
+++ b/tests/static/tstaticparammacro.nim
@@ -0,0 +1,52 @@
+discard """
+  msg: '''letters
+aa
+bb
+numbers
+11
+22
+AST a 
+[(11, 22), (33, 44)]
+AST b 
+(e: [55, 66], f: [77, 88])
+55
+'''
+"""
+
+import macros
+
+type
+  TConfig = tuple
+    letters: seq[string]
+    numbers:seq[int]
+
+const data: Tconfig = (@["aa", "bb"], @[11, 22])
+
+macro mymacro(data: static[TConfig]): stmt =
+  echo "letters"
+  for s in items(data.letters):
+    echo s
+  echo "numbers"
+  for n in items(data.numbers):
+    echo n
+
+mymacro(data)
+
+type
+  Ta = seq[tuple[c:int, d:int]]
+  Tb = tuple[e:seq[int], f:seq[int]]
+
+const
+  a : Ta = @[(11, 22), (33, 44)]
+  b : Tb = (@[55,66], @[77, 88])
+
+macro mA(data: static[Ta]): stmt =
+  echo "AST a \n", repr(data)
+
+macro mB(data: static[Tb]): stmt =
+  echo "AST b \n", repr(data)
+  echo data.e[0]
+
+mA(a)
+mB(b)
+
diff --git a/tests/vm/tstaticprintseq.nim b/tests/vm/tstaticprintseq.nim
index f7ed1e2bb..4575f3af1 100644
--- a/tests/vm/tstaticprintseq.nim
+++ b/tests/vm/tstaticprintseq.nim
@@ -10,28 +10,31 @@ discard """
 3
 1
 2
-3'''
+3
+aa
+bb
+aa
+bb'''
 """
 
-when false:
-  const s = @[1,2,3]
+const s = @[1,2,3]
 
-  macro foo: stmt =
-    for e in s:
-      echo e
+macro foo: stmt =
+  for e in s:
+    echo e
 
-  foo()
+foo()
 
-  static:
-    for e in s:
-      echo e
+static:
+  for e in s:
+    echo e
 
-  macro bar(x: static[seq[int]]): stmt =
-    for e in x:
-      echo e
+macro bar(x: static[seq[int]]): stmt =
+  for e in x:
+    echo e
 
-  bar s
-  bar(@[1, 2, 3])
+bar s
+bar(@[1, 2, 3])
 
 type
   TData = tuple
@@ -41,9 +44,6 @@ type
 const data: TData = (@["aa", "bb"], @[11, 22])
 
 static:
-  for x in data.letters:
-    echo x
-
   var m = data
   for x in m.letters:
     echo x