blob: e0fdee3349893e7bba6d078e68467810b7766277 [file] [log] [blame]
Antoine Pitrou99614052014-05-23 11:46:03 +02001import math
Benjamin Petersond73aca72015-04-21 12:05:19 -04002import os
Raymond Hettinger8a99b502003-06-23 13:36:57 +00003import unittest
Raymond Hettinger8a99b502003-06-23 13:36:57 +00004import sys
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005import _ast
Benjamin Petersond73aca72015-04-21 12:05:19 -04006import tempfile
Benjamin Peterson43b06862011-05-27 09:08:01 -05007import types
Berker Peksag076dbd02015-05-06 07:01:52 +03008from test import support
9from test.support import script_helper
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000010
Raymond Hettinger8a99b502003-06-23 13:36:57 +000011class TestSpecifics(unittest.TestCase):
Jeremy Hylton778e2652001-11-09 19:50:08 +000012
Meador Ingefa21bf02012-01-19 01:08:41 -060013 def compile_single(self, source):
14 compile(source, "<single>", "single")
15
16 def assertInvalidSingle(self, source):
17 self.assertRaises(SyntaxError, self.compile_single, source)
18
Benjamin Petersonaeaa5922009-11-13 00:17:59 +000019 def test_no_ending_newline(self):
20 compile("hi", "<test>", "exec")
21 compile("hi\r", "<test>", "exec")
22
23 def test_empty(self):
24 compile("", "<test>", "exec")
25
26 def test_other_newlines(self):
27 compile("\r\n", "<test>", "exec")
28 compile("\r", "<test>", "exec")
29 compile("hi\r\nstuff\r\ndef f():\n pass\r", "<test>", "exec")
30 compile("this_is\rreally_old_mac\rdef f():\n pass", "<test>", "exec")
31
Raymond Hettinger8a99b502003-06-23 13:36:57 +000032 def test_debug_assignment(self):
33 # catch assignments to __debug__
34 self.assertRaises(SyntaxError, compile, '__debug__ = 1', '?', 'single')
Georg Brandl1a3284e2007-12-02 09:40:06 +000035 import builtins
36 prev = builtins.__debug__
37 setattr(builtins, '__debug__', 'sure')
38 setattr(builtins, '__debug__', prev)
Jeremy Hylton778e2652001-11-09 19:50:08 +000039
Raymond Hettinger8a99b502003-06-23 13:36:57 +000040 def test_argument_handling(self):
41 # detect duplicate positional and keyword arguments
42 self.assertRaises(SyntaxError, eval, 'lambda a,a:0')
43 self.assertRaises(SyntaxError, eval, 'lambda a,a=1:0')
44 self.assertRaises(SyntaxError, eval, 'lambda a=1,a=1:0')
Benjamin Petersonec19d952008-06-30 15:01:21 +000045 self.assertRaises(SyntaxError, exec, 'def f(a, a): pass')
46 self.assertRaises(SyntaxError, exec, 'def f(a = 0, a = 1): pass')
47 self.assertRaises(SyntaxError, exec, 'def f(a): global a; a = 1')
Jeremy Hylton778e2652001-11-09 19:50:08 +000048
Raymond Hettinger8a99b502003-06-23 13:36:57 +000049 def test_syntax_error(self):
50 self.assertRaises(SyntaxError, compile, "1+*3", "filename", "exec")
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000051
Guido van Rossumcd16bf62007-06-13 18:07:49 +000052 def test_none_keyword_arg(self):
53 self.assertRaises(SyntaxError, compile, "f(None=1)", "<string>", "exec")
54
Raymond Hettinger8a99b502003-06-23 13:36:57 +000055 def test_duplicate_global_local(self):
Benjamin Petersonec19d952008-06-30 15:01:21 +000056 self.assertRaises(SyntaxError, exec, 'def f(a): global a; a = 1')
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000057
Raymond Hettinger66bd2332004-08-02 08:30:07 +000058 def test_exec_with_general_mapping_for_locals(self):
59
60 class M:
61 "Test mapping interface versus possible calls from eval()."
62 def __getitem__(self, key):
63 if key == 'a':
64 return 12
65 raise KeyError
66 def __setitem__(self, key, value):
67 self.results = (key, value)
Guido van Rossum63eecc72007-02-22 23:55:25 +000068 def keys(self):
69 return list('xyz')
Raymond Hettinger66bd2332004-08-02 08:30:07 +000070
71 m = M()
72 g = globals()
Georg Brandl7cae87c2006-09-06 06:51:57 +000073 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000074 self.assertEqual(m.results, ('z', 12))
75 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000076 exec('z = b', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000077 except NameError:
78 pass
79 else:
80 self.fail('Did not detect a KeyError')
Georg Brandl7cae87c2006-09-06 06:51:57 +000081 exec('z = dir()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000082 self.assertEqual(m.results, ('z', list('xyz')))
Georg Brandl7cae87c2006-09-06 06:51:57 +000083 exec('z = globals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000084 self.assertEqual(m.results, ('z', g))
Georg Brandl7cae87c2006-09-06 06:51:57 +000085 exec('z = locals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000086 self.assertEqual(m.results, ('z', m))
Benjamin Petersonec19d952008-06-30 15:01:21 +000087 self.assertRaises(TypeError, exec, 'z = b', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000088
89 class A:
90 "Non-mapping"
91 pass
92 m = A()
Benjamin Petersonec19d952008-06-30 15:01:21 +000093 self.assertRaises(TypeError, exec, 'z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000094
95 # Verify that dict subclasses work as well
96 class D(dict):
97 def __getitem__(self, key):
98 if key == 'a':
99 return 12
100 return dict.__getitem__(self, key)
101 d = D()
Georg Brandl7cae87c2006-09-06 06:51:57 +0000102 exec('z = a', g, d)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000103 self.assertEqual(d['z'], 12)
104
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000105 def test_extended_arg(self):
106 longexpr = 'x = x or ' + '-x' * 2500
Georg Brandl7cae87c2006-09-06 06:51:57 +0000107 g = {}
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000108 code = '''
109def f(x):
110 %s
111 %s
112 %s
113 %s
114 %s
115 %s
116 %s
117 %s
118 %s
119 %s
120 # the expressions above have no effect, x == argument
121 while x:
122 x -= 1
123 # EXTENDED_ARG/JUMP_ABSOLUTE here
124 return x
125''' % ((longexpr,)*10)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000126 exec(code, g)
127 self.assertEqual(g['f'](5), 0)
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000128
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000129 def test_argument_order(self):
Benjamin Petersonec19d952008-06-30 15:01:21 +0000130 self.assertRaises(SyntaxError, exec, 'def f(a=1, b): pass')
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000131
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000132 def test_float_literals(self):
133 # testing bad float literals
134 self.assertRaises(SyntaxError, eval, "2e")
135 self.assertRaises(SyntaxError, eval, "2.0e+")
136 self.assertRaises(SyntaxError, eval, "1e-")
137 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000138
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000139 def test_indentation(self):
140 # testing compile() of indented block w/o trailing newline"
141 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000142if 1:
143 if 2:
144 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000145 compile(s, "<string>", "exec")
146
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000147 # This test is probably specific to CPython and may not generalize
148 # to other implementations. We are trying to ensure that when
149 # the first line of code starts after 256, correct line numbers
150 # in tracebacks are still produced.
151 def test_leading_newlines(self):
152 s256 = "".join(["\n"] * 256 + ["spam"])
153 co = compile(s256, 'fn', 'exec')
154 self.assertEqual(co.co_firstlineno, 257)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000155 self.assertEqual(co.co_lnotab, bytes())
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000156
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000157 def test_literals_with_leading_zeroes(self):
158 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000159 "080000000000000", "000000000000009", "000000000000008",
160 "0b42", "0BADCAFE", "0o123456789", "0b1.1", "0o4.2",
161 "0b101j2", "0o153j2", "0b100e1", "0o777e1", "0777",
162 "000777", "000000000000007"]:
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000163 self.assertRaises(SyntaxError, eval, arg)
164
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000165 self.assertEqual(eval("0xff"), 255)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000166 self.assertEqual(eval("0777."), 777)
167 self.assertEqual(eval("0777.0"), 777)
168 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
169 self.assertEqual(eval("0777e1"), 7770)
170 self.assertEqual(eval("0e0"), 0)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000171 self.assertEqual(eval("0000e-012"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000172 self.assertEqual(eval("09.5"), 9.5)
173 self.assertEqual(eval("0777j"), 777j)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000174 self.assertEqual(eval("000"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000175 self.assertEqual(eval("00j"), 0j)
176 self.assertEqual(eval("00.0"), 0)
177 self.assertEqual(eval("0e3"), 0)
178 self.assertEqual(eval("090000000000000."), 90000000000000.)
179 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
180 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
181 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
182 self.assertEqual(eval("090000000000000j"), 90000000000000j)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000183 self.assertEqual(eval("000000000000008."), 8.)
184 self.assertEqual(eval("000000000000009."), 9.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000185 self.assertEqual(eval("0b101010"), 42)
186 self.assertEqual(eval("-0b000000000010"), -2)
187 self.assertEqual(eval("0o777"), 511)
188 self.assertEqual(eval("-0o0000010"), -8)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000189
190 def test_unary_minus(self):
191 # Verify treatment of unary minus on negative numbers SF bug #660455
Christian Heimesa37d4c62007-12-04 23:02:19 +0000192 if sys.maxsize == 2147483647:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000193 # 32-bit machine
194 all_one_bits = '0xffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000195 self.assertEqual(eval(all_one_bits), 4294967295)
196 self.assertEqual(eval("-" + all_one_bits), -4294967295)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000197 elif sys.maxsize == 9223372036854775807:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000198 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000199 all_one_bits = '0xffffffffffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000200 self.assertEqual(eval(all_one_bits), 18446744073709551615)
201 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000202 else:
203 self.fail("How many bits *does* this machine have???")
Ezio Melotti42da6632011-03-15 05:18:48 +0200204 # Verify treatment of constant folding on -(sys.maxsize+1)
Serhiy Storchaka95949422013-08-27 19:40:23 +0300205 # i.e. -2147483648 on 32 bit platforms. Should return int.
Ezio Melottie9615932010-01-24 19:26:24 +0000206 self.assertIsInstance(eval("%s" % (-sys.maxsize - 1)), int)
207 self.assertIsInstance(eval("%s" % (-sys.maxsize - 2)), int)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000208
Christian Heimesa37d4c62007-12-04 23:02:19 +0000209 if sys.maxsize == 9223372036854775807:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000210 def test_32_63_bit_values(self):
211 a = +4294967296 # 1 << 32
212 b = -4294967296 # 1 << 32
213 c = +281474976710656 # 1 << 48
214 d = -281474976710656 # 1 << 48
215 e = +4611686018427387904 # 1 << 62
216 f = -4611686018427387904 # 1 << 62
217 g = +9223372036854775807 # 1 << 63 - 1
218 h = -9223372036854775807 # 1 << 63 - 1
219
Neal Norwitz221085d2007-02-25 20:55:47 +0000220 for variable in self.test_32_63_bit_values.__code__.co_consts:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000221 if variable is not None:
Ezio Melottie9615932010-01-24 19:26:24 +0000222 self.assertIsInstance(variable, int)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000223
224 def test_sequence_unpacking_error(self):
225 # Verify sequence packing/unpacking with "or". SF bug #757818
226 i,j = (1, -1) or (-1, 1)
227 self.assertEqual(i, 1)
228 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000229
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000230 def test_none_assignment(self):
231 stmts = [
232 'None = 0',
233 'None += 0',
234 '__builtins__.None = 0',
235 'def None(): pass',
236 'class None: pass',
237 '(a, None) = 0, 0',
238 'for None in range(10): pass',
239 'def f(None): pass',
Benjamin Peterson78565b22009-06-28 19:19:51 +0000240 'import None',
241 'import x as None',
242 'from x import None',
243 'from x import y as None'
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000244 ]
245 for stmt in stmts:
246 stmt += "\n"
247 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
248 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000249
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000250 def test_import(self):
251 succeed = [
252 'import sys',
253 'import os, sys',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000254 'import os as bar',
255 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000256 'from __future__ import nested_scopes, generators',
257 'from __future__ import (nested_scopes,\ngenerators)',
258 'from __future__ import (nested_scopes,\ngenerators,)',
259 'from sys import stdin, stderr, stdout',
260 'from sys import (stdin, stderr,\nstdout)',
261 'from sys import (stdin, stderr,\nstdout,)',
262 'from sys import (stdin\n, stderr, stdout)',
263 'from sys import (stdin\n, stderr, stdout,)',
264 'from sys import stdin as si, stdout as so, stderr as se',
265 'from sys import (stdin as si, stdout as so, stderr as se)',
266 'from sys import (stdin as si, stdout as so, stderr as se,)',
267 ]
268 fail = [
269 'import (os, sys)',
270 'import (os), (sys)',
271 'import ((os), (sys))',
272 'import (sys',
273 'import sys)',
274 'import (os,)',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000275 'import os As bar',
276 'import os.path a bar',
277 'from sys import stdin As stdout',
278 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000279 'from (sys) import stdin',
280 'from __future__ import (nested_scopes',
281 'from __future__ import nested_scopes)',
282 'from __future__ import nested_scopes,\ngenerators',
283 'from sys import (stdin',
284 'from sys import stdin)',
285 'from sys import stdin, stdout,\nstderr',
286 'from sys import stdin si',
287 'from sys import stdin,'
288 'from sys import (*)',
289 'from sys import (stdin,, stdout, stderr)',
290 'from sys import (stdin, stdout),',
291 ]
292 for stmt in succeed:
293 compile(stmt, 'tmp', 'exec')
294 for stmt in fail:
295 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
296
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000297 def test_for_distinct_code_objects(self):
298 # SF bug 1048870
299 def f():
300 f1 = lambda x=1: x
301 f2 = lambda x=2: x
302 return f1, f2
303 f1, f2 = f()
Neal Norwitz221085d2007-02-25 20:55:47 +0000304 self.assertNotEqual(id(f1.__code__), id(f2.__code__))
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000305
Benjamin Petersone6dd2cb2010-03-17 20:56:58 +0000306 def test_lambda_doc(self):
307 l = lambda: "foo"
308 self.assertIsNone(l.__doc__)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000309
Serhiy Storchaka607cb9c2014-09-05 11:00:56 +0300310 def test_encoding(self):
311 code = b'# -*- coding: badencoding -*-\npass\n'
312 self.assertRaises(SyntaxError, compile, code, 'tmp', 'exec')
313 code = '# -*- coding: badencoding -*-\n"\xc2\xa4"\n'
314 compile(code, 'tmp', 'exec')
315 self.assertEqual(eval(code), '\xc2\xa4')
316 code = '"\xc2\xa4"\n'
317 self.assertEqual(eval(code), '\xc2\xa4')
318 code = b'"\xc2\xa4"\n'
319 self.assertEqual(eval(code), '\xa4')
320 code = b'# -*- coding: latin1 -*-\n"\xc2\xa4"\n'
321 self.assertEqual(eval(code), '\xc2\xa4')
322 code = b'# -*- coding: utf-8 -*-\n"\xc2\xa4"\n'
323 self.assertEqual(eval(code), '\xa4')
324 code = b'# -*- coding: iso8859-15 -*-\n"\xc2\xa4"\n'
325 self.assertEqual(eval(code), '\xc2\u20ac')
326 code = '"""\\\n# -*- coding: iso8859-15 -*-\n\xc2\xa4"""\n'
327 self.assertEqual(eval(code), '# -*- coding: iso8859-15 -*-\n\xc2\xa4')
328 code = b'"""\\\n# -*- coding: iso8859-15 -*-\n\xc2\xa4"""\n'
329 self.assertEqual(eval(code), '# -*- coding: iso8859-15 -*-\n\xa4')
Benjamin Peterson5d2ad252010-03-17 20:57:32 +0000330
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000331 def test_subscripts(self):
332 # SF bug 1448804
333 # Class to make testing subscript results easy
334 class str_map(object):
335 def __init__(self):
336 self.data = {}
337 def __getitem__(self, key):
338 return self.data[str(key)]
339 def __setitem__(self, key, value):
340 self.data[str(key)] = value
341 def __delitem__(self, key):
342 del self.data[str(key)]
343 def __contains__(self, key):
344 return str(key) in self.data
345 d = str_map()
346 # Index
347 d[1] = 1
348 self.assertEqual(d[1], 1)
349 d[1] += 1
350 self.assertEqual(d[1], 2)
351 del d[1]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000352 self.assertNotIn(1, d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000353 # Tuple of indices
354 d[1, 1] = 1
355 self.assertEqual(d[1, 1], 1)
356 d[1, 1] += 1
357 self.assertEqual(d[1, 1], 2)
358 del d[1, 1]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000359 self.assertNotIn((1, 1), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000360 # Simple slice
361 d[1:2] = 1
362 self.assertEqual(d[1:2], 1)
363 d[1:2] += 1
364 self.assertEqual(d[1:2], 2)
365 del d[1:2]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000366 self.assertNotIn(slice(1, 2), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000367 # Tuple of simple slices
368 d[1:2, 1:2] = 1
369 self.assertEqual(d[1:2, 1:2], 1)
370 d[1:2, 1:2] += 1
371 self.assertEqual(d[1:2, 1:2], 2)
372 del d[1:2, 1:2]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000373 self.assertNotIn((slice(1, 2), slice(1, 2)), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000374 # Extended slice
375 d[1:2:3] = 1
376 self.assertEqual(d[1:2:3], 1)
377 d[1:2:3] += 1
378 self.assertEqual(d[1:2:3], 2)
379 del d[1:2:3]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000380 self.assertNotIn(slice(1, 2, 3), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000381 # Tuple of extended slices
382 d[1:2:3, 1:2:3] = 1
383 self.assertEqual(d[1:2:3, 1:2:3], 1)
384 d[1:2:3, 1:2:3] += 1
385 self.assertEqual(d[1:2:3, 1:2:3], 2)
386 del d[1:2:3, 1:2:3]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000387 self.assertNotIn((slice(1, 2, 3), slice(1, 2, 3)), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000388 # Ellipsis
389 d[...] = 1
390 self.assertEqual(d[...], 1)
391 d[...] += 1
392 self.assertEqual(d[...], 2)
393 del d[...]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000394 self.assertNotIn(Ellipsis, d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000395 # Tuple of Ellipses
396 d[..., ...] = 1
397 self.assertEqual(d[..., ...], 1)
398 d[..., ...] += 1
399 self.assertEqual(d[..., ...], 2)
400 del d[..., ...]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000401 self.assertNotIn((Ellipsis, Ellipsis), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000402
Guido van Rossum0240b922007-02-26 21:23:50 +0000403 def test_annotation_limit(self):
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000404 # 16 bits are available for # of annotations, but only 8 bits are
405 # available for the parameter count, hence 255
Guido van Rossum0240b922007-02-26 21:23:50 +0000406 # is the max. Ensure the result of too many annotations is a
407 # SyntaxError.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000408 s = "def f(%s): pass"
409 s %= ', '.join('a%d:%d' % (i,i) for i in range(256))
Guido van Rossum0240b922007-02-26 21:23:50 +0000410 self.assertRaises(SyntaxError, compile, s, '?', 'exec')
411 # Test that the max # of annotations compiles.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000412 s = "def f(%s): pass"
413 s %= ', '.join('a%d:%d' % (i,i) for i in range(255))
Guido van Rossum0240b922007-02-26 21:23:50 +0000414 compile(s, '?', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000415
416 def test_mangling(self):
417 class A:
418 def f():
419 __mangled = 1
420 __not_mangled__ = 2
421 import __mangled_mod
422 import __package__.module
423
Benjamin Peterson577473f2010-01-19 00:09:57 +0000424 self.assertIn("_A__mangled", A.f.__code__.co_varnames)
425 self.assertIn("__not_mangled__", A.f.__code__.co_varnames)
426 self.assertIn("_A__mangled_mod", A.f.__code__.co_varnames)
427 self.assertIn("__package__", A.f.__code__.co_varnames)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000428
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000429 def test_compile_ast(self):
430 fname = __file__
Brett Cannonf299abd2015-04-13 14:21:02 -0400431 if fname.lower().endswith('pyc'):
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000432 fname = fname[:-1]
433 with open(fname, 'r') as f:
434 fcontents = f.read()
435 sample_code = [
436 ['<assign>', 'x = 5'],
437 ['<ifblock>', """if True:\n pass\n"""],
438 ['<forblock>', """for n in [1, 2, 3]:\n print(n)\n"""],
439 ['<deffunc>', """def foo():\n pass\nfoo()\n"""],
440 [fname, fcontents],
441 ]
442
443 for fname, code in sample_code:
444 co1 = compile(code, '%s1' % fname, 'exec')
445 ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000446 self.assertTrue(type(ast) == _ast.Module)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000447 co2 = compile(ast, '%s3' % fname, 'exec')
448 self.assertEqual(co1, co2)
Neal Norwitzdb4115f2008-03-31 04:20:05 +0000449 # the code object's filename comes from the second compilation step
450 self.assertEqual(co2.co_filename, '%s3' % fname)
451
452 # raise exception when node type doesn't match with compile mode
453 co1 = compile('print(1)', '<string>', 'exec', _ast.PyCF_ONLY_AST)
454 self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')
455
456 # raise exception when node type is no start node
457 self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')
458
459 # raise exception when node has invalid children
460 ast = _ast.Module()
461 ast.body = [_ast.BoolOp()]
462 self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000463
Benjamin Petersonee853392015-05-28 14:30:26 -0500464 def test_dict_evaluation_order(self):
465 i = 0
466
467 def f():
468 nonlocal i
469 i += 1
470 return i
471
472 d = {f(): f(), f(): f()}
473 self.assertEqual(d, {1: 2, 3: 4})
474
Benjamin Peterson43b06862011-05-27 09:08:01 -0500475 @support.cpython_only
476 def test_same_filename_used(self):
477 s = """def f(): pass\ndef g(): pass"""
478 c = compile(s, "myfile", "exec")
479 for obj in c.co_consts:
480 if isinstance(obj, types.CodeType):
481 self.assertIs(obj.co_filename, c.co_filename)
482
Meador Ingefa21bf02012-01-19 01:08:41 -0600483 def test_single_statement(self):
484 self.compile_single("1 + 2")
485 self.compile_single("\n1 + 2")
486 self.compile_single("1 + 2\n")
487 self.compile_single("1 + 2\n\n")
488 self.compile_single("1 + 2\t\t\n")
489 self.compile_single("1 + 2\t\t\n ")
490 self.compile_single("1 + 2 # one plus two")
491 self.compile_single("1; 2")
492 self.compile_single("import sys; sys")
493 self.compile_single("def f():\n pass")
494 self.compile_single("while False:\n pass")
495 self.compile_single("if x:\n f(x)")
496 self.compile_single("if x:\n f(x)\nelse:\n g(x)")
497 self.compile_single("class T:\n pass")
498
499 def test_bad_single_statement(self):
500 self.assertInvalidSingle('1\n2')
501 self.assertInvalidSingle('def f(): pass')
502 self.assertInvalidSingle('a = 13\nb = 187')
503 self.assertInvalidSingle('del x\ndel y')
504 self.assertInvalidSingle('f()\ng()')
Benjamin Petersoncff92372012-01-19 17:46:13 -0500505 self.assertInvalidSingle('f()\n# blah\nblah()')
506 self.assertInvalidSingle('f()\nxy # blah\nblah()')
Benjamin Peterson77fc1f32012-01-20 11:01:06 -0500507 self.assertInvalidSingle('x = 5 # comment\nx = 6\n')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000508
Benjamin Petersond73aca72015-04-21 12:05:19 -0400509 def test_particularly_evil_undecodable(self):
510 # Issue 24022
511 src = b'0000\x00\n00000000000\n\x00\n\x9e\n'
512 with tempfile.TemporaryDirectory() as tmpd:
513 fn = os.path.join(tmpd, "bad.py")
514 with open(fn, "wb") as fp:
515 fp.write(src)
516 res = script_helper.run_python_until_end(fn)[0]
517 self.assertIn(b"Non-UTF-8", res.err)
518
Serhiy Storchaka0d441112015-11-14 15:10:35 +0200519 def test_yet_more_evil_still_undecodable(self):
520 # Issue #25388
521 src = b"#\x00\n#\xfd\n"
522 with tempfile.TemporaryDirectory() as tmpd:
523 fn = os.path.join(tmpd, "bad.py")
524 with open(fn, "wb") as fp:
525 fp.write(src)
526 res = script_helper.run_python_until_end(fn)[0]
527 self.assertIn(b"Non-UTF-8", res.err)
528
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000529 @support.cpython_only
530 def test_compiler_recursion_limit(self):
531 # Expected limit is sys.getrecursionlimit() * the scaling factor
532 # in symtable.c (currently 3)
533 # We expect to fail *at* that limit, because we use up some of
534 # the stack depth limit in the test suite code
535 # So we check the expected limit and 75% of that
536 # XXX (ncoghlan): duplicating the scaling factor here is a little
537 # ugly. Perhaps it should be exposed somewhere...
538 fail_depth = sys.getrecursionlimit() * 3
539 success_depth = int(fail_depth * 0.75)
540
541 def check_limit(prefix, repeated):
542 expect_ok = prefix + repeated * success_depth
543 self.compile_single(expect_ok)
544 broken = prefix + repeated * fail_depth
545 details = "Compiling ({!r} + {!r} * {})".format(
546 prefix, repeated, fail_depth)
Yury Selivanovf488fb42015-07-03 01:04:23 -0400547 with self.assertRaises(RecursionError, msg=details):
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000548 self.compile_single(broken)
549
550 check_limit("a", "()")
551 check_limit("a", ".b")
552 check_limit("a", "[0]")
553 check_limit("a", "*a")
554
Martin Pantereeb896c2015-11-07 02:32:21 +0000555 def test_null_terminated(self):
556 # The source code is null-terminated internally, but bytes-like
557 # objects are accepted, which could be not terminated.
Martin Panterd61d8602015-11-08 11:09:13 +0000558 with self.assertRaisesRegex(ValueError, "cannot contain null"):
Martin Pantereeb896c2015-11-07 02:32:21 +0000559 compile("123\x00", "<dummy>", "eval")
Martin Panterd61d8602015-11-08 11:09:13 +0000560 with self.assertRaisesRegex(ValueError, "cannot contain null"):
Martin Pantereeb896c2015-11-07 02:32:21 +0000561 compile(memoryview(b"123\x00"), "<dummy>", "eval")
562 code = compile(memoryview(b"123\x00")[1:-1], "<dummy>", "eval")
563 self.assertEqual(eval(code), 23)
564 code = compile(memoryview(b"1234")[1:-1], "<dummy>", "eval")
565 self.assertEqual(eval(code), 23)
566 code = compile(memoryview(b"$23$")[1:-1], "<dummy>", "eval")
567 self.assertEqual(eval(code), 23)
568
569 # Also test when eval() and exec() do the compilation step
570 self.assertEqual(eval(memoryview(b"1234")[1:-1]), 23)
571 namespace = dict()
572 exec(memoryview(b"ax = 123")[1:-1], namespace)
573 self.assertEqual(namespace['x'], 12)
574
Victor Stinnerefb24132016-01-22 12:33:12 +0100575 def check_constant(self, func, expected):
576 for const in func.__code__.co_consts:
577 if repr(const) == repr(expected):
578 break
579 else:
580 self.fail("unable to find constant %r in %r"
581 % (expected, func.__code__.co_consts))
582
583 # Merging equal constants is not a strict requirement for the Python
584 # semantics, it's a more an implementation detail.
585 @support.cpython_only
586 def test_merge_constants(self):
587 # Issue #25843: compile() must merge constants which are equal
588 # and have the same type.
589
590 def check_same_constant(const):
591 ns = {}
592 code = "f1, f2 = lambda: %r, lambda: %r" % (const, const)
593 exec(code, ns)
594 f1 = ns['f1']
595 f2 = ns['f2']
596 self.assertIs(f1.__code__, f2.__code__)
597 self.check_constant(f1, const)
598 self.assertEqual(repr(f1()), repr(const))
599
600 check_same_constant(None)
601 check_same_constant(0)
602 check_same_constant(0.0)
603 check_same_constant(b'abc')
604 check_same_constant('abc')
605
606 # Note: "lambda: ..." emits "LOAD_CONST Ellipsis",
607 # whereas "lambda: Ellipsis" emits "LOAD_GLOBAL Ellipsis"
608 f1, f2 = lambda: ..., lambda: ...
609 self.assertIs(f1.__code__, f2.__code__)
610 self.check_constant(f1, Ellipsis)
611 self.assertEqual(repr(f1()), repr(Ellipsis))
612
613 # {0} is converted to a constant frozenset({0}) by the peephole
614 # optimizer
615 f1, f2 = lambda x: x in {0}, lambda x: x in {0}
616 self.assertIs(f1.__code__, f2.__code__)
617 self.check_constant(f1, frozenset({0}))
618 self.assertTrue(f1(0))
619
620 def test_dont_merge_constants(self):
621 # Issue #25843: compile() must not merge constants which are equal
622 # but have a different type.
623
624 def check_different_constants(const1, const2):
625 ns = {}
626 exec("f1, f2 = lambda: %r, lambda: %r" % (const1, const2), ns)
627 f1 = ns['f1']
628 f2 = ns['f2']
629 self.assertIsNot(f1.__code__, f2.__code__)
630 self.check_constant(f1, const1)
631 self.check_constant(f2, const2)
632 self.assertEqual(repr(f1()), repr(const1))
633 self.assertEqual(repr(f2()), repr(const2))
634
635 check_different_constants(0, 0.0)
636 check_different_constants(+0.0, -0.0)
637 check_different_constants((0,), (0.0,))
638
639 # check_different_constants() cannot be used because repr(-0j) is
640 # '(-0-0j)', but when '(-0-0j)' is evaluated to 0j: we loose the sign.
641 f1, f2 = lambda: +0.0j, lambda: -0.0j
642 self.assertIsNot(f1.__code__, f2.__code__)
643 self.check_constant(f1, +0.0j)
644 self.check_constant(f2, -0.0j)
645 self.assertEqual(repr(f1()), repr(+0.0j))
646 self.assertEqual(repr(f2()), repr(-0.0j))
647
648 # {0} is converted to a constant frozenset({0}) by the peephole
649 # optimizer
650 f1, f2 = lambda x: x in {0}, lambda x: x in {0.0}
651 self.assertIsNot(f1.__code__, f2.__code__)
652 self.check_constant(f1, frozenset({0}))
653 self.check_constant(f2, frozenset({0.0}))
654 self.assertTrue(f1(0))
655 self.assertTrue(f2(0.0))
656
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000657
Antoine Pitrou99614052014-05-23 11:46:03 +0200658class TestStackSize(unittest.TestCase):
659 # These tests check that the computed stack size for a code object
660 # stays within reasonable bounds (see issue #21523 for an example
661 # dysfunction).
662 N = 100
663
664 def check_stack_size(self, code):
665 # To assert that the alleged stack size is not O(N), we
666 # check that it is smaller than log(N).
667 if isinstance(code, str):
668 code = compile(code, "<foo>", "single")
669 max_size = math.ceil(math.log(len(code.co_code)))
670 self.assertLessEqual(code.co_stacksize, max_size)
671
672 def test_and(self):
673 self.check_stack_size("x and " * self.N + "x")
674
675 def test_or(self):
676 self.check_stack_size("x or " * self.N + "x")
677
678 def test_and_or(self):
679 self.check_stack_size("x and x or " * self.N + "x")
680
681 def test_chained_comparison(self):
682 self.check_stack_size("x < " * self.N + "x")
683
684 def test_if_else(self):
685 self.check_stack_size("x if x else " * self.N + "x")
686
687 def test_binop(self):
688 self.check_stack_size("x + " * self.N + "x")
689
690 def test_func_and(self):
691 code = "def f(x):\n"
692 code += " x and x\n" * self.N
693 self.check_stack_size(code)
694
Tim Petersd507dab2001-08-30 20:51:59 +0000695
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000696if __name__ == "__main__":
Antoine Pitrou99614052014-05-23 11:46:03 +0200697 unittest.main()