diff options
author | Araq <rumpf_a@web.de> | 2014-03-26 01:00:34 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2014-03-26 01:00:34 +0100 |
commit | d15788d00a4007a80de4427f84129abe47fa4f11 (patch) | |
tree | 3dbe43bbca760f56bdb79c684f8d8af3bd60430f | |
parent | 9e66d988e7fc1f33b11a0b93be484361390bd095 (diff) | |
download | Nim-d15788d00a4007a80de4427f84129abe47fa4f11.tar.gz |
added #903 to the test suite
-rw-r--r-- | compiler/vm.nim | 6 | ||||
-rw-r--r-- | compiler/vmdef.nim | 1 | ||||
-rw-r--r-- | compiler/vmgen.nim | 2 | ||||
-rw-r--r-- | tests/vm/tcompiletimetable.nim | 27 | ||||
-rw-r--r-- | todo.txt | 2 |
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 |