diff options
author | Araq <rumpf_a@web.de> | 2017-05-09 17:26:54 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2017-05-09 17:26:54 +0200 |
commit | ae7fd0fcedd5db50142c6d76fc3b9c3e6dfa3ad7 (patch) | |
tree | 2f2a4de9e6041950cae0b66217660ceee24f07a1 /compiler | |
parent | 79b12faf9ec63d04a7b3a58134e27b4ffb60bcaf (diff) | |
parent | fa3436fb657141127038d88431b4aad113c27cf6 (diff) | |
download | Nim-ae7fd0fcedd5db50142c6d76fc3b9c3e6dfa3ad7.tar.gz |
Merge branch 'devel' of github.com:nim-lang/Nim into devel
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/jsgen.nim | 10 | ||||
-rw-r--r-- | compiler/trees.nim | 2 | ||||
-rw-r--r-- | compiler/vm.nim | 10 |
3 files changed, 18 insertions, 4 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index ad988d1b0..eb3fb9f47 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -1864,8 +1864,8 @@ proc genMagic(p: PProc, n: PNode, r: var TCompRes) = proc genSetConstr(p: PProc, n: PNode, r: var TCompRes) = var a, b: TCompRes - useMagic(p, "SetConstr") - r.res = rope("SetConstr(") + useMagic(p, "setConstr") + r.res = rope("setConstr(") r.kind = resExpr for i in countup(0, sonsLen(n) - 1): if i > 0: add(r.res, ", ") @@ -1878,6 +1878,12 @@ proc genSetConstr(p: PProc, n: PNode, r: var TCompRes) = gen(p, it, a) add(r.res, a.res) add(r.res, ")") + # emit better code for constant sets: + if p.target == targetJS and isDeepConstExpr(n): + inc(p.g.unique) + let tmp = rope("ConstSet") & rope(p.g.unique) + addf(p.g.constants, "var $1 = $2;$n", [tmp, r.res]) + r.res = tmp proc genArrayConstr(p: PProc, n: PNode, r: var TCompRes) = var a: TCompRes diff --git a/compiler/trees.nim b/compiler/trees.nim index 424fba14c..8f0af89d3 100644 --- a/compiler/trees.nim +++ b/compiler/trees.nim @@ -96,7 +96,7 @@ proc isDeepConstExpr*(n: PNode): bool = result = true of nkExprEqExpr, nkExprColonExpr, nkHiddenStdConv, nkHiddenSubConv: result = isDeepConstExpr(n.sons[1]) - of nkCurly, nkBracket, nkPar, nkObjConstr, nkClosure: + of nkCurly, nkBracket, nkPar, nkObjConstr, nkClosure, nkRange: for i in ord(n.kind == nkObjConstr) .. <n.len: if not isDeepConstExpr(n.sons[i]): return false if n.typ.isNil: result = true diff --git a/compiler/vm.nim b/compiler/vm.nim index 6a9545193..3c475cf57 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -1651,8 +1651,16 @@ proc evalMacroCall*(module: PSym; cache: IdentCache, n, nOrig: PNode, for i in 0 .. <gp.len: if sfImmediate notin sym.flags: let idx = sym.typ.len + i - tos.slots[idx] = setupMacroParam(n.sons[idx], gp[i].sym.typ) + if idx < n.len: + tos.slots[idx] = setupMacroParam(n.sons[idx], gp[i].sym.typ) + else: + dec(evalMacroCounter) + c.callsite = nil + localError(n.info, "expected " & $gp.len & + " generic parameter(s)") elif gp[i].sym.typ.kind in {tyStatic, tyTypeDesc}: + dec(evalMacroCounter) + c.callsite = nil globalError(n.info, "static[T] or typedesc nor supported for .immediate macros") # temporary storage: #for i in L .. <maxSlots: tos.slots[i] = newNode(nkEmpty) |