summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2017-05-01 09:30:56 +0200
committerAndreas Rumpf <rumpf_a@web.de>2017-05-01 09:30:56 +0200
commit56a5c249c95950e7c064f4d2b660de6fc1fb5674 (patch)
tree61d9339a65435011716383db18a920419fbd5af7
parent3d34a9f6d34809a481024a687ed5f4d712a9b961 (diff)
downloadNim-56a5c249c95950e7c064f4d2b660de6fc1fb5674.tar.gz
JS codegen: produce better code for constant sets
-rw-r--r--compiler/jsgen.nim10
-rw-r--r--lib/system/jssys.nim2
2 files changed, 9 insertions, 3 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/lib/system/jssys.nim b/lib/system/jssys.nim
index 9ef4a02f2..8a81a550a 100644
--- a/lib/system/jssys.nim
+++ b/lib/system/jssys.nim
@@ -172,7 +172,7 @@ proc raiseIndexError() {.compilerproc, noreturn.} =
 proc raiseFieldError(f: string) {.compilerproc, noreturn.} =
   raise newException(FieldError, f & " is not accessible")
 
-proc SetConstr() {.varargs, asmNoStackFrame, compilerproc.} =
+proc setConstr() {.varargs, asmNoStackFrame, compilerproc.} =
   when defined(nimphp):
     asm """
       $args = func_get_args();