summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2014-03-26 01:00:34 +0100
committerAraq <rumpf_a@web.de>2014-03-26 01:00:34 +0100
commitd15788d00a4007a80de4427f84129abe47fa4f11 (patch)
tree3dbe43bbca760f56bdb79c684f8d8af3bd60430f
parent9e66d988e7fc1f33b11a0b93be484361390bd095 (diff)
downloadNim-d15788d00a4007a80de4427f84129abe47fa4f11.tar.gz
added #903 to the test suite
-rw-r--r--compiler/vm.nim6
-rw-r--r--compiler/vmdef.nim1
-rw-r--r--compiler/vmgen.nim2
-rw-r--r--tests/vm/tcompiletimetable.nim27
-rw-r--r--todo.txt2
5 files changed, 32 insertions, 6 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim
index 8fea6b293..268289aca 100644
--- a/compiler/vm.nim
+++ b/compiler/vm.nim
@@ -448,7 +448,7 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
         let n = src.sons[rc]
         regs[ra].node = n
       else:
-        stackTrace(c, tos, pc, errIndexOutOfBounds)
+        stackTrace(c, tos, pc, errNilAccess)
     of opcWrObj:
       # a.b = c
       decodeBC(rkNode)
@@ -902,6 +902,10 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
       let rb = instr.regBx - wordExcess - 1
       ensureKind(rkNode)
       regs[ra].node = c.globals.sons[rb]
+    of opcLdGlobalAddr:
+      let rb = instr.regBx - wordExcess - 1
+      ensureKind(rkNodeAddr)
+      regs[ra].nodeAddr = addr(c.globals.sons[rb])
     of opcRepr:
       decodeB(rkNode)
       createStr regs[ra]
diff --git a/compiler/vmdef.nim b/compiler/vmdef.nim
index 90ff8e29f..d0c38a2ad 100644
--- a/compiler/vmdef.nim
+++ b/compiler/vmdef.nim
@@ -126,6 +126,7 @@ type
     opcLdConst,   # dest = constants[Bx]
     opcAsgnConst, # dest = copy(constants[Bx])
     opcLdGlobal,  # dest = globals[Bx]
+    opcLdGlobalAddr, # dest = addr(globals[Bx])
 
     opcLdImmInt,  # dest = immediate value
     opcNBindSym,
diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim
index 59d3d2495..e627fee48 100644
--- a/compiler/vmgen.nim
+++ b/compiler/vmgen.nim
@@ -1614,7 +1614,7 @@ proc genProc(c: PCtx; s: PSym): int =
     c.gABC(body, opcEof, eofInstr.regA)
     c.optimizeJumps(result)
     s.offset = c.prc.maxSlots
-    #if s.name.s == "tupleUnpack":
+    #if s.name.s == "addStuff":
     #  echo renderTree(body)
     #  c.echoCode(result)
     c.prc = oldPrc
diff --git a/tests/vm/tcompiletimetable.nim b/tests/vm/tcompiletimetable.nim
index 3b40add07..f1d3ecd4e 100644
--- a/tests/vm/tcompiletimetable.nim
+++ b/tests/vm/tcompiletimetable.nim
@@ -12,13 +12,13 @@ import macros, tables
 var ZOOT{.compileTime.} = initTable[int, int](2)
 var iii {.compiletime.} = 1
 
-macro x:stmt=
+macro zoo:stmt=
   zoot[iii] = iii*2
   inc iii
   echo iii
 
-x
-x
+zoo
+zoo
 
 
 macro tupleUnpack: stmt =
@@ -27,3 +27,24 @@ macro tupleUnpack: stmt =
 
 tupleUnpack
 
+# bug #903
+
+import strtabs
+
+var x {.compileTime.}: PStringTable
+
+macro addStuff(stuff, body: expr): stmt {.immediate.} =
+  result = newNimNode(nnkStmtList)
+
+  if x.isNil:
+    x = newStringTable(modeStyleInsensitive)
+  x[$stuff] = ""
+
+macro dump(): stmt =
+  result = newNimNode(nnkStmtList)
+  for y in x.keys: echo "Got ", y
+
+addStuff("Hey"): echo "Hey"
+addStuff("Hi"): echo "Hi"
+dump()
+
diff --git a/todo.txt b/todo.txt
index 129f15ebc..91fa0cd6a 100644
--- a/todo.txt
+++ b/todo.txt
@@ -154,7 +154,7 @@ Optimizations
 =============
 
 - optimize 'if' with a constant condition --> necessary in frontend for better
-  dead code elimination
+  dead code elimination; also necessary to prevent  ``if c > 0: 1 div c``
 - escape analysis for string/seq seems to be easy to do too;
   even further write barrier specialization
 - inlining of first class functions