Commit 3a712b6e authored by Stefan Behnel's avatar Stefan Behnel

parse tree test assertions for optimisations on loops and comprehensions

parent 4dd72eb9
...@@ -15,11 +15,17 @@ True ...@@ -15,11 +15,17 @@ True
[(1, 'a'), (2, 'b'), (3, 'c')] [(1, 'a'), (2, 'b'), (3, 'c')]
""" """
cimport cython
def smoketest_dict(): def smoketest_dict():
return { x+2:x*2 return { x+2:x*2
for x in range(5) for x in range(5)
if x % 2 == 0 } if x % 2 == 0 }
@cython.testFailIfPathExists("//ComprehensionNode//ComprehensionAppendNode",
"//SimpleCallNode//ComprehensionNode")
@cython.testAssertPathExists("//ComprehensionNode",
"//ComprehensionNode//DictComprehensionAppendNode")
def smoketest_list(): def smoketest_list():
return dict([ (x+2,x*2) return dict([ (x+2,x*2)
for x in range(5) for x in range(5)
......
...@@ -63,20 +63,26 @@ __doc__ = u""" ...@@ -63,20 +63,26 @@ __doc__ = u"""
""" """
cimport cython
@cython.testFailIfPathExists("//SimpleCallNode//NameNode[@name = 'enumerate']")
def go_py_enumerate(): def go_py_enumerate():
for i,k in enumerate(range(1,5)): for i,k in enumerate(range(1,5)):
print i, k print i, k
@cython.testFailIfPathExists("//SimpleCallNode//NameNode[@name = 'enumerate']")
def go_c_enumerate(): def go_c_enumerate():
cdef int i,k cdef int i,k
for i,k in enumerate(range(1,5)): for i,k in enumerate(range(1,5)):
print i, k print i, k
@cython.testFailIfPathExists("//SimpleCallNode//NameNode[@name = 'enumerate']")
def go_c_enumerate_step(): def go_c_enumerate_step():
cdef int i,k cdef int i,k
for i,k in enumerate(range(1,7,2)): for i,k in enumerate(range(1,7,2)):
print i, k print i, k
@cython.testFailIfPathExists("//SimpleCallNode//NameNode[@name = 'enumerate']")
def py_enumerate_dict(dict d): def py_enumerate_dict(dict d):
cdef int i = 55 cdef int i = 55
k = 99 k = 99
...@@ -84,6 +90,7 @@ def py_enumerate_dict(dict d): ...@@ -84,6 +90,7 @@ def py_enumerate_dict(dict d):
print i, k print i, k
print u"::", i, k print u"::", i, k
@cython.testFailIfPathExists("//SimpleCallNode")
def py_enumerate_break(*t): def py_enumerate_break(*t):
i,k = 55,99 i,k = 55,99
for i,k in enumerate(t): for i,k in enumerate(t):
...@@ -91,6 +98,7 @@ def py_enumerate_break(*t): ...@@ -91,6 +98,7 @@ def py_enumerate_break(*t):
break break
print u"::", i, k print u"::", i, k
@cython.testFailIfPathExists("//SimpleCallNode")
def py_enumerate_return(*t): def py_enumerate_return(*t):
i,k = 55,99 i,k = 55,99
for i,k in enumerate(t): for i,k in enumerate(t):
...@@ -98,6 +106,7 @@ def py_enumerate_return(*t): ...@@ -98,6 +106,7 @@ def py_enumerate_return(*t):
return return
print u"::", i, k print u"::", i, k
@cython.testFailIfPathExists("//SimpleCallNode")
def py_enumerate_continue(*t): def py_enumerate_continue(*t):
i,k = 55,99 i,k = 55,99
for i,k in enumerate(t): for i,k in enumerate(t):
...@@ -105,20 +114,24 @@ def py_enumerate_continue(*t): ...@@ -105,20 +114,24 @@ def py_enumerate_continue(*t):
continue continue
print u"::", i, k print u"::", i, k
@cython.testFailIfPathExists("//SimpleCallNode//NameNode[@name = 'enumerate']")
def empty_c_enumerate(): def empty_c_enumerate():
cdef int i = 55, k = 99 cdef int i = 55, k = 99
for i,k in enumerate(range(0)): for i,k in enumerate(range(0)):
print i, k print i, k
return i, k return i, k
# not currently optimised
def single_target_enumerate(): def single_target_enumerate():
for t in enumerate(range(1,5)): for t in enumerate(range(1,5)):
print t[0], t[1] print t[0], t[1]
@cython.testFailIfPathExists("//SimpleCallNode//NameNode[@name = 'enumerate']")
def multi_enumerate(): def multi_enumerate():
for a,(b,(c,d)) in enumerate(enumerate(enumerate(range(1,5)))): for a,(b,(c,d)) in enumerate(enumerate(enumerate(range(1,5)))):
print a,b,c,d print a,b,c,d
@cython.testFailIfPathExists("//SimpleCallNode")
def multi_c_enumerate(): def multi_c_enumerate():
cdef int a,b,c,d cdef int a,b,c,d
for a,(b,(c,d)) in enumerate(enumerate(enumerate(range(1,5)))): for a,(b,(c,d)) in enumerate(enumerate(enumerate(range(1,5)))):
......
...@@ -13,6 +13,10 @@ __doc__ = u""" ...@@ -13,6 +13,10 @@ __doc__ = u"""
(2, 0) (2, 0)
""" """
cimport cython
@cython.testAssertPathExists("//ForFromStatNode")
@cython.testFailIfPathExists("//ForInStatNode")
def test_modify(): def test_modify():
cdef int i, n = 5 cdef int i, n = 5
for i in range(n): for i in range(n):
...@@ -21,6 +25,8 @@ def test_modify(): ...@@ -21,6 +25,8 @@ def test_modify():
print print
return i,n return i,n
@cython.testAssertPathExists("//ForFromStatNode")
@cython.testFailIfPathExists("//ForInStatNode")
def test_fix(): def test_fix():
cdef int i cdef int i
for i in range(5): for i in range(5):
...@@ -28,6 +34,8 @@ def test_fix(): ...@@ -28,6 +34,8 @@ def test_fix():
print print
return i return i
@cython.testAssertPathExists("//ForFromStatNode")
@cython.testFailIfPathExists("//ForInStatNode")
def test_break(): def test_break():
cdef int i, n = 5 cdef int i, n = 5
for i in range(n): for i in range(n):
...@@ -38,6 +46,8 @@ def test_break(): ...@@ -38,6 +46,8 @@ def test_break():
print print
return i,n return i,n
@cython.testAssertPathExists("//ForFromStatNode")
@cython.testFailIfPathExists("//ForInStatNode")
def test_return(): def test_return():
cdef int i, n = 5 cdef int i, n = 5
for i in range(n): for i in range(n):
......
...@@ -17,6 +17,8 @@ True ...@@ -17,6 +17,8 @@ True
[1, 2, 3] [1, 2, 3]
""" """
cimport cython
# Py2.3 doesn't have the set type, but Cython does :) # Py2.3 doesn't have the set type, but Cython does :)
_set = set _set = set
...@@ -25,6 +27,9 @@ def smoketest_set(): ...@@ -25,6 +27,9 @@ def smoketest_set():
for x in range(5) for x in range(5)
if x % 2 == 0 } if x % 2 == 0 }
@cython.testFailIfPathExists("//SimpleCallNode//ComprehensionNode")
@cython.testAssertPathExists("//ComprehensionNode",
"//ComprehensionNode//ComprehensionAppendNode")
def smoketest_list(): def smoketest_list():
return set([ x*2 return set([ x*2
for x in range(5) for x in range(5)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment