diff --git a/compiler/vm.nim b/compiler/vm.nim index 8fea6b293d..268289aca0 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 90ff8e29fb..d0c38a2ad4 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 59d3d24957..e627fee484 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 3b40add077..f1d3ecd4e0 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 129f15ebc5..91fa0cd6a6 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