4
module_level_tuple = (1,2,3)
5
second_module_level_tuple = (1,2,3) # should be deduplicated to be the same as the first
6
string_module_level_tuple = ("1", "2")
7
string_module_level_tuple2 = ("1", "2")
9
def return_module_level_tuple():
11
>>> return_module_level_tuple()
14
return module_level_tuple
16
def test_deduplicated_tuples():
18
>>> test_deduplicated_tuples()
20
assert (module_level_tuple is second_module_level_tuple)
21
assert (module_level_tuple is (1,2,3)) # also deduplicated with a function tuple
22
assert (string_module_level_tuple is string_module_level_tuple2)
23
assert (string_module_level_tuple is ("1", "2"))
31
def test_deduplicated_args():
33
>>> test_deduplicated_args()
35
# This is a concern because in large modules *a lot* of similar code objects
36
# are generated often with the same argument names. Therefore it's worth ensuring that
37
# they are correctly deduplicated
39
check_identity_of_co_varnames = (
40
not hasattr(sys, "pypy_version_info") and # test doesn't work on PyPy (which is probably fair enough)
41
sys.version_info < (3, 11) # on Python 3.11 co_varnames returns a new, dynamically-calculated tuple
44
if check_identity_of_co_varnames:
45
assert func1.__code__.co_varnames is func2.__code__.co_varnames
47
@cython.test_assert_path_exists("//TupleNode",
48
"//TupleNode[@is_literal = true]")
49
@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
50
def return_empty_tuple():
52
>>> return_empty_tuple()
57
@cython.test_assert_path_exists("//TupleNode",
58
"//TupleNode[@is_literal = true]")
59
@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
60
def return_constant_tuple1():
62
>>> return_constant_tuple1()
67
@cython.test_assert_path_exists("//TupleNode",
68
"//TupleNode[@is_literal = true]")
69
@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
70
def return_folded_tuple():
72
>>> return_folded_tuple()
75
return (1, 1+1, 1+1+1)
77
@cython.test_assert_path_exists("//TupleNode",
78
"//TupleNode[@is_literal = true]")
79
@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
80
def return_nested_tuple():
82
>>> return_nested_tuple()
83
(1, (2, 3), (3, (4, 5), (2, 3, 2, 3)))
85
return (1, (2, 3), (3, (4, 5), (2, 3) * 2))
87
@cython.test_assert_path_exists("//TupleNode",
88
"//TupleNode[@is_literal = true]")
89
@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
98
@cython.test_assert_path_exists("//TupleNode",
99
"//TupleNode[@is_literal = true]")
100
@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
101
def return_constant_tuple2():
103
>>> return_constant_tuple2()
109
def return_multiplied_constant_tuple(n):
111
>>> tuples = return_multiplied_constant_tuple(2)
112
>>> type(tuples) is tuple
114
>>> for t in tuples: print(t)
118
(1, 2, 3, 1, 2, 3, 1, 2, 3)
121
((1, 2, 3, 1, 2, 3), (1, 2, 3), (1, 2, 3, 1, 2, 3))
130
((1, 2, 3) * n, (1, 2, 3), (1, 2, 3) * n),
134
@cython.test_assert_path_exists("//TupleNode",
135
"//TupleNode[@is_literal = true]")
136
@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
137
def return_constant_tuple_strings():
139
>>> return_constant_tuple_strings()
140
('tuple_1', 'bc', 'tuple_2')
142
return ('tuple_1', 'bc', 'tuple_2')
145
@cython.test_assert_path_exists("//TupleNode",
146
"//TupleNode[@is_literal = true]")
147
@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
148
def return_constant_tuples_string_types():
150
>>> a,b,c = return_constant_tuples_string_types()
158
return ('a', 'bc'), (u'a', u'bc'), (b'a', b'bc')
161
@cython.test_assert_path_exists("//ReturnStatNode//TupleNode",
162
"//ReturnStatNode//TupleNode[@is_literal = false]")
163
@cython.test_fail_if_path_exists("//ReturnStatNode//TupleNode[@is_literal = true]")
164
def return_nonconstant_tuple():
166
>>> return_nonconstant_tuple()
173
def constant_types_comparing_equal():
175
>>> constant_types_comparing_equal()
176
((False, False), (0, 0), (0.0, 0.0), (0, False), (False, 0.0), (0, 0.0))
178
bool_tuple= (False, False)
180
float_tuple = (0.0, 0.0)
181
int_bool = (0, False)
182
bool_float = (False, 0.0)
185
assert bool_tuple is (False, False)
186
assert int_tuple is (0, 0)
187
assert bool_tuple == int_tuple
188
assert bool_tuple is not int_tuple
189
assert float_tuple is (0., 0.)
190
assert float_tuple == int_tuple
191
assert float_tuple is not int_tuple
192
assert int_bool is (0, False)
193
assert int_bool == bool_tuple
194
assert int_bool is not bool_tuple
195
assert int_bool is not int_tuple
196
assert bool_float is (False, 0.)
197
assert bool_float == bool_tuple
198
assert bool_float is not bool_tuple
199
assert bool_float is not float_tuple
200
assert int_float is (0, 0.)
201
assert int_float == int_tuple
202
assert int_float is not int_tuple
203
assert int_float is not float_tuple
205
return bool_tuple, int_tuple, float_tuple, int_bool, bool_float, int_float