test that functions that do not need a closure know they do not need it
authorStefan Behnel <scoder@users.berlios.de>
Thu, 25 Nov 2010 14:54:32 +0000 (15:54 +0100)
committerStefan Behnel <scoder@users.berlios.de>
Thu, 25 Nov 2010 14:54:32 +0000 (15:54 +0100)
tests/run/closures_T82.pyx

index cb7f9c1cd01e44313db449a5e751a2caf5dceb87..cbb0a4dfad09457d07425d96cd4b26d694e48e99 100644 (file)
@@ -1,4 +1,6 @@
 
+cimport cython
+
 def add_n(int n):
     """
     >>> f = add_n(3)
@@ -185,6 +187,12 @@ def more_inner_funcs(x):
         return f(a_f), g(b_g), h(b_h)
     return resolve
 
+
+@cython.test_assert_path_exists("//DefNode//DefNode//DefNode//DefNode",
+                                "//DefNode[@needs_outer_scope = False]", # deep_inner()
+                                "//DefNode//DefNode//DefNode//DefNode[@needs_closure = False]", # h()
+                                )
+@cython.test_fail_if_path_exists("//DefNode//DefNode[@needs_outer_scope = False]")
 def deep_inner():
     """
     >>> deep_inner()()
@@ -199,6 +207,12 @@ def deep_inner():
         return g()
     return f()
 
+
+@cython.test_assert_path_exists("//DefNode//DefNode//DefNode",
+                                "//DefNode//DefNode//DefNode[@needs_outer_scope = False]",  # a()
+                                "//DefNode//DefNode//DefNode[@needs_closure = False]", # a(), g(), h()
+                                )
+@cython.test_fail_if_path_exists("//DefNode//DefNode//DefNode[@needs_closure = True]") # a(), g(), h()
 def deep_inner_sibling():
     """
     >>> deep_inner_sibling()()
@@ -206,8 +220,10 @@ def deep_inner_sibling():
     """
     cdef int x = 1
     def f():
+        def a():
+            return 1
         def g():
-            return x+1
+            return x+a()
         def h():
             return g()
         return h