diff options
author | Zahary Karadjov <zahary@gmail.com> | 2015-07-21 10:21:14 +0300 |
---|---|---|
committer | Zahary Karadjov <zahary@gmail.com> | 2015-08-02 23:58:22 +0300 |
commit | 02f97489b795cd33d49966e254b46fcc3f8072ba (patch) | |
tree | c2be27abe57fe3b0f1118f21065409abc9784629 /compiler/vm.nim | |
parent | 7af92708af94164cd1373be85a06dd4cc4e4439e (diff) | |
download | Nim-02f97489b795cd33d49966e254b46fcc3f8072ba.tar.gz |
fix #1858 again; restores the support for static macro params
Diffstat (limited to 'compiler/vm.nim')
-rw-r--r-- | compiler/vm.nim | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim index d7495d77f..fc63da1d4 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -1467,12 +1467,20 @@ proc evalStaticStmt*(module: PSym, e: PNode, prc: PSym) = proc setupCompileTimeVar*(module: PSym, n: PNode) = discard evalConstExprAux(module, nil, n, emStaticStmt) -proc setupMacroParam(x: PNode): PNode = - result = x - if result.kind in {nkHiddenSubConv, nkHiddenStdConv}: result = result.sons[1] - result = canonValue(result) - result.flags.incl nfIsRef - result.typ = x.typ +proc setupMacroParam(x: PNode, typ: PType): TFullReg = + case typ.kind + of tyStatic: + putIntoReg(result, x) + of tyTypeDesc: + putIntoReg(result, x) + else: + result.kind = rkNode + var n = x + if n.kind in {nkHiddenSubConv, nkHiddenStdConv}: n = n.sons[1] + n = n.canonValue + n.flags.incl nfIsRef + n.typ = x.typ + result.node = n var evalMacroCounter: int @@ -1508,10 +1516,16 @@ proc evalMacroCall*(module: PSym, n, nOrig: PNode, sym: PSym): PNode = # return value: tos.slots[0].kind = rkNode tos.slots[0].node = newNodeIT(nkEmpty, n.info, sym.typ.sons[0]) + # setup parameters: - for i in 1 .. < min(tos.slots.len, L): - tos.slots[i].kind = rkNode - tos.slots[i].node = setupMacroParam(n.sons[i]) + for i in 1.. <sym.typ.len: + tos.slots[i] = setupMacroParam(n.sons[i], sym.typ.sons[i]) + + let gp = sym.ast[genericParamsPos] + for i in 0 .. <gp.len: + let idx = sym.typ.len + i + tos.slots[idx] = setupMacroParam(n.sons[idx], gp[i].sym.typ) + # temporary storage: #for i in L .. <maxSlots: tos.slots[i] = newNode(nkEmpty) result = rawExecute(c, start, tos).regToNode |