summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2015-06-05 13:04:02 +0200
committerAndreas Rumpf <rumpf_a@web.de>2015-06-05 13:04:02 +0200
commit62376c065733340f5f62b58556e26e9b3ec5a2f0 (patch)
treed823b78700d3fd46d63d6f8b7af1bd6de244a81b
parentf8326ad4c047f5d45817d0424dfb0b17aa17b538 (diff)
parentc5f7d553e969bd90223570059c199c8459b16a54 (diff)
downloadNim-62376c065733340f5f62b58556e26e9b3ec5a2f0.tar.gz
Merge pull request #2824 from yglukhov/js-ct-lambda-lifting
Perform lambda lifting for compile-time stuff when targeting JS.
-rw-r--r--compiler/lambdalifting.nim6
-rw-r--r--lib/pure/unittest.nim9
-rw-r--r--tests/js/tunittests.nim5
3 files changed, 10 insertions, 10 deletions
diff --git a/compiler/lambdalifting.nim b/compiler/lambdalifting.nim
index c68bc352c..69b45c980 100644
--- a/compiler/lambdalifting.nim
+++ b/compiler/lambdalifting.nim
@@ -946,7 +946,11 @@ proc transformOuterProc(o: POuterContext, n: PNode; it: TIter): PNode =
 proc liftLambdas*(fn: PSym, body: PNode): PNode =
   # XXX gCmd == cmdCompileToJS does not suffice! The compiletime stuff needs
   # the transformation even when compiling to JS ...
-  if body.kind == nkEmpty or gCmd == cmdCompileToJS or
+
+  # However we can do lifting for the stuff which is *only* compiletime.
+  let isCompileTime = sfCompileTime in fn.flags or fn.kind == skMacro
+
+  if body.kind == nkEmpty or (gCmd == cmdCompileToJS and not isCompileTime) or
       fn.skipGenericOwner.kind != skModule:
     # ignore forward declaration:
     result = body
diff --git a/lib/pure/unittest.nim b/lib/pure/unittest.nim
index 092b1fba2..dbbd3cabc 100644
--- a/lib/pure/unittest.nim
+++ b/lib/pure/unittest.nim
@@ -99,8 +99,9 @@ template test*(name: expr, body: stmt): stmt {.immediate, dirty.} =
       body
 
     except:
-      checkpoint("Unhandled exception: " & getCurrentExceptionMsg())
-      echo getCurrentException().getStackTrace()
+      when not defined(js):
+        checkpoint("Unhandled exception: " & getCurrentExceptionMsg())
+        echo getCurrentException().getStackTrace()
       fail()
 
     finally:
@@ -114,9 +115,7 @@ proc checkpoint*(msg: string) =
 template fail* =
   bind checkpoints
   for msg in items(checkpoints):
-    # this used to be 'echo' which now breaks due to a bug. XXX will revisit
-    # this issue later.
-    stdout.writeln msg
+    echo msg
 
   when not defined(ECMAScript):
     if abortOnError: quit(1)
diff --git a/tests/js/tunittests.nim b/tests/js/tunittests.nim
index 8a264a5e0..4b09c99a9 100644
--- a/tests/js/tunittests.nim
+++ b/tests/js/tunittests.nim
@@ -1,10 +1,7 @@
 discard """
-  disabled: "true"
+  output: '''[OK] >:)'''
 """
 
-# Unittest uses lambdalifting at compile-time which we disable for the JS
-# codegen! So this cannot and will not work for quite some time.
-
 import unittest
 
 suite "Bacon":