blob: b4a52a53105eda18710abad8066262a1e53f1f1e [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):
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +0200404 # more than 255 annotations, should compile ok
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000405 s = "def f(%s): pass"
Serhiy Storchaka5bb8b912016-12-16 19:19:02 +0200406 s %= ', '.join('a%d:%d' % (i,i) for i in range(300))
Guido van Rossum0240b922007-02-26 21:23:50 +0000407 compile(s, '?', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000408
409 def test_mangling(self):
410 class A:
411 def f():
412 __mangled = 1
413 __not_mangled__ = 2
414 import __mangled_mod
415 import __package__.module
416
Benjamin Peterson577473f2010-01-19 00:09:57 +0000417 self.assertIn("_A__mangled", A.f.__code__.co_varnames)
418 self.assertIn("__not_mangled__", A.f.__code__.co_varnames)
419 self.assertIn("_A__mangled_mod", A.f.__code__.co_varnames)
420 self.assertIn("__package__", A.f.__code__.co_varnames)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000421
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000422 def test_compile_ast(self):
423 fname = __file__
Brett Cannonf299abd2015-04-13 14:21:02 -0400424 if fname.lower().endswith('pyc'):
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000425 fname = fname[:-1]
426 with open(fname, 'r') as f:
427 fcontents = f.read()
428 sample_code = [
429 ['<assign>', 'x = 5'],
430 ['<ifblock>', """if True:\n pass\n"""],
431 ['<forblock>', """for n in [1, 2, 3]:\n print(n)\n"""],
432 ['<deffunc>', """def foo():\n pass\nfoo()\n"""],
433 [fname, fcontents],
434 ]
435
436 for fname, code in sample_code:
437 co1 = compile(code, '%s1' % fname, 'exec')
438 ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000439 self.assertTrue(type(ast) == _ast.Module)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000440 co2 = compile(ast, '%s3' % fname, 'exec')
441 self.assertEqual(co1, co2)
Neal Norwitzdb4115f2008-03-31 04:20:05 +0000442 # the code object's filename comes from the second compilation step
443 self.assertEqual(co2.co_filename, '%s3' % fname)
444
445 # raise exception when node type doesn't match with compile mode
446 co1 = compile('print(1)', '<string>', 'exec', _ast.PyCF_ONLY_AST)
447 self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')
448
449 # raise exception when node type is no start node
450 self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')
451
452 # raise exception when node has invalid children
453 ast = _ast.Module()
454 ast.body = [_ast.BoolOp()]
455 self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000456
Benjamin Petersonee853392015-05-28 14:30:26 -0500457 def test_dict_evaluation_order(self):
458 i = 0
459
460 def f():
461 nonlocal i
462 i += 1
463 return i
464
465 d = {f(): f(), f(): f()}
466 self.assertEqual(d, {1: 2, 3: 4})
467
Serhiy Storchaka9305d832016-06-18 13:53:36 +0300468 def test_compile_filename(self):
Serhiy Storchakafebc3322016-08-06 23:29:29 +0300469 for filename in 'file.py', b'file.py':
Serhiy Storchaka9305d832016-06-18 13:53:36 +0300470 code = compile('pass', filename, 'exec')
471 self.assertEqual(code.co_filename, 'file.py')
Serhiy Storchakafebc3322016-08-06 23:29:29 +0300472 for filename in bytearray(b'file.py'), memoryview(b'file.py'):
473 with self.assertWarns(DeprecationWarning):
474 code = compile('pass', filename, 'exec')
475 self.assertEqual(code.co_filename, 'file.py')
Serhiy Storchaka9305d832016-06-18 13:53:36 +0300476 self.assertRaises(TypeError, compile, 'pass', list(b'file.py'), 'exec')
477
Benjamin Peterson43b06862011-05-27 09:08:01 -0500478 @support.cpython_only
479 def test_same_filename_used(self):
480 s = """def f(): pass\ndef g(): pass"""
481 c = compile(s, "myfile", "exec")
482 for obj in c.co_consts:
483 if isinstance(obj, types.CodeType):
484 self.assertIs(obj.co_filename, c.co_filename)
485
Meador Ingefa21bf02012-01-19 01:08:41 -0600486 def test_single_statement(self):
487 self.compile_single("1 + 2")
488 self.compile_single("\n1 + 2")
489 self.compile_single("1 + 2\n")
490 self.compile_single("1 + 2\n\n")
491 self.compile_single("1 + 2\t\t\n")
492 self.compile_single("1 + 2\t\t\n ")
493 self.compile_single("1 + 2 # one plus two")
494 self.compile_single("1; 2")
495 self.compile_single("import sys; sys")
496 self.compile_single("def f():\n pass")
497 self.compile_single("while False:\n pass")
498 self.compile_single("if x:\n f(x)")
499 self.compile_single("if x:\n f(x)\nelse:\n g(x)")
500 self.compile_single("class T:\n pass")
501
502 def test_bad_single_statement(self):
503 self.assertInvalidSingle('1\n2')
504 self.assertInvalidSingle('def f(): pass')
505 self.assertInvalidSingle('a = 13\nb = 187')
506 self.assertInvalidSingle('del x\ndel y')
507 self.assertInvalidSingle('f()\ng()')
Benjamin Petersoncff92372012-01-19 17:46:13 -0500508 self.assertInvalidSingle('f()\n# blah\nblah()')
509 self.assertInvalidSingle('f()\nxy # blah\nblah()')
Benjamin Peterson77fc1f32012-01-20 11:01:06 -0500510 self.assertInvalidSingle('x = 5 # comment\nx = 6\n')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000511
Benjamin Petersond73aca72015-04-21 12:05:19 -0400512 def test_particularly_evil_undecodable(self):
513 # Issue 24022
514 src = b'0000\x00\n00000000000\n\x00\n\x9e\n'
515 with tempfile.TemporaryDirectory() as tmpd:
516 fn = os.path.join(tmpd, "bad.py")
517 with open(fn, "wb") as fp:
518 fp.write(src)
519 res = script_helper.run_python_until_end(fn)[0]
520 self.assertIn(b"Non-UTF-8", res.err)
521
Serhiy Storchaka0d441112015-11-14 15:10:35 +0200522 def test_yet_more_evil_still_undecodable(self):
523 # Issue #25388
524 src = b"#\x00\n#\xfd\n"
525 with tempfile.TemporaryDirectory() as tmpd:
526 fn = os.path.join(tmpd, "bad.py")
527 with open(fn, "wb") as fp:
528 fp.write(src)
529 res = script_helper.run_python_until_end(fn)[0]
530 self.assertIn(b"Non-UTF-8", res.err)
531
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000532 @support.cpython_only
533 def test_compiler_recursion_limit(self):
534 # Expected limit is sys.getrecursionlimit() * the scaling factor
535 # in symtable.c (currently 3)
536 # We expect to fail *at* that limit, because we use up some of
537 # the stack depth limit in the test suite code
538 # So we check the expected limit and 75% of that
539 # XXX (ncoghlan): duplicating the scaling factor here is a little
540 # ugly. Perhaps it should be exposed somewhere...
541 fail_depth = sys.getrecursionlimit() * 3
542 success_depth = int(fail_depth * 0.75)
543
544 def check_limit(prefix, repeated):
545 expect_ok = prefix + repeated * success_depth
546 self.compile_single(expect_ok)
547 broken = prefix + repeated * fail_depth
548 details = "Compiling ({!r} + {!r} * {})".format(
549 prefix, repeated, fail_depth)
Yury Selivanovf488fb42015-07-03 01:04:23 -0400550 with self.assertRaises(RecursionError, msg=details):
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000551 self.compile_single(broken)
552
553 check_limit("a", "()")
554 check_limit("a", ".b")
555 check_limit("a", "[0]")
556 check_limit("a", "*a")
557
Martin Pantereeb896c2015-11-07 02:32:21 +0000558 def test_null_terminated(self):
559 # The source code is null-terminated internally, but bytes-like
560 # objects are accepted, which could be not terminated.
Martin Panterd61d8602015-11-08 11:09:13 +0000561 with self.assertRaisesRegex(ValueError, "cannot contain null"):
Martin Pantereeb896c2015-11-07 02:32:21 +0000562 compile("123\x00", "<dummy>", "eval")
Martin Panterd61d8602015-11-08 11:09:13 +0000563 with self.assertRaisesRegex(ValueError, "cannot contain null"):
Martin Pantereeb896c2015-11-07 02:32:21 +0000564 compile(memoryview(b"123\x00"), "<dummy>", "eval")
565 code = compile(memoryview(b"123\x00")[1:-1], "<dummy>", "eval")
566 self.assertEqual(eval(code), 23)
567 code = compile(memoryview(b"1234")[1:-1], "<dummy>", "eval")
568 self.assertEqual(eval(code), 23)
569 code = compile(memoryview(b"$23$")[1:-1], "<dummy>", "eval")
570 self.assertEqual(eval(code), 23)
571
572 # Also test when eval() and exec() do the compilation step
573 self.assertEqual(eval(memoryview(b"1234")[1:-1]), 23)
574 namespace = dict()
575 exec(memoryview(b"ax = 123")[1:-1], namespace)
576 self.assertEqual(namespace['x'], 12)
577
Victor Stinner3cdd5fb2016-01-22 12:33:12 +0100578 def check_constant(self, func, expected):
579 for const in func.__code__.co_consts:
580 if repr(const) == repr(expected):
581 break
582 else:
583 self.fail("unable to find constant %r in %r"
584 % (expected, func.__code__.co_consts))
585
586 # Merging equal constants is not a strict requirement for the Python
587 # semantics, it's a more an implementation detail.
588 @support.cpython_only
589 def test_merge_constants(self):
590 # Issue #25843: compile() must merge constants which are equal
591 # and have the same type.
592
593 def check_same_constant(const):
594 ns = {}
595 code = "f1, f2 = lambda: %r, lambda: %r" % (const, const)
596 exec(code, ns)
597 f1 = ns['f1']
598 f2 = ns['f2']
599 self.assertIs(f1.__code__, f2.__code__)
600 self.check_constant(f1, const)
601 self.assertEqual(repr(f1()), repr(const))
602
603 check_same_constant(None)
604 check_same_constant(0)
605 check_same_constant(0.0)
606 check_same_constant(b'abc')
607 check_same_constant('abc')
608
609 # Note: "lambda: ..." emits "LOAD_CONST Ellipsis",
610 # whereas "lambda: Ellipsis" emits "LOAD_GLOBAL Ellipsis"
611 f1, f2 = lambda: ..., lambda: ...
612 self.assertIs(f1.__code__, f2.__code__)
613 self.check_constant(f1, Ellipsis)
614 self.assertEqual(repr(f1()), repr(Ellipsis))
615
616 # {0} is converted to a constant frozenset({0}) by the peephole
617 # optimizer
618 f1, f2 = lambda x: x in {0}, lambda x: x in {0}
619 self.assertIs(f1.__code__, f2.__code__)
620 self.check_constant(f1, frozenset({0}))
621 self.assertTrue(f1(0))
622
623 def test_dont_merge_constants(self):
624 # Issue #25843: compile() must not merge constants which are equal
625 # but have a different type.
626
627 def check_different_constants(const1, const2):
628 ns = {}
629 exec("f1, f2 = lambda: %r, lambda: %r" % (const1, const2), ns)
630 f1 = ns['f1']
631 f2 = ns['f2']
632 self.assertIsNot(f1.__code__, f2.__code__)
Serhiy Storchaka713640c2017-01-24 20:49:26 +0200633 self.assertNotEqual(f1.__code__, f2.__code__)
Victor Stinner3cdd5fb2016-01-22 12:33:12 +0100634 self.check_constant(f1, const1)
635 self.check_constant(f2, const2)
636 self.assertEqual(repr(f1()), repr(const1))
637 self.assertEqual(repr(f2()), repr(const2))
638
639 check_different_constants(0, 0.0)
640 check_different_constants(+0.0, -0.0)
641 check_different_constants((0,), (0.0,))
Serhiy Storchaka713640c2017-01-24 20:49:26 +0200642 check_different_constants('a', b'a')
643 check_different_constants(('a',), (b'a',))
Victor Stinner3cdd5fb2016-01-22 12:33:12 +0100644
645 # check_different_constants() cannot be used because repr(-0j) is
646 # '(-0-0j)', but when '(-0-0j)' is evaluated to 0j: we loose the sign.
647 f1, f2 = lambda: +0.0j, lambda: -0.0j
648 self.assertIsNot(f1.__code__, f2.__code__)
649 self.check_constant(f1, +0.0j)
650 self.check_constant(f2, -0.0j)
651 self.assertEqual(repr(f1()), repr(+0.0j))
652 self.assertEqual(repr(f2()), repr(-0.0j))
653
654 # {0} is converted to a constant frozenset({0}) by the peephole
655 # optimizer
656 f1, f2 = lambda x: x in {0}, lambda x: x in {0.0}
657 self.assertIsNot(f1.__code__, f2.__code__)
658 self.check_constant(f1, frozenset({0}))
659 self.check_constant(f2, frozenset({0.0}))
660 self.assertTrue(f1(0))
661 self.assertTrue(f2(0.0))
662
Brett Cannona5711202016-09-06 19:36:01 -0700663 def test_path_like_objects(self):
664 # An implicit test for PyUnicode_FSDecoder().
665 class PathLike:
666 def __init__(self, path):
667 self._path = path
668 def __fspath__(self):
669 return self._path
670
671 compile("42", PathLike("test_compile_pathlike"), "single")
672
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000673
Antoine Pitrou99614052014-05-23 11:46:03 +0200674class TestStackSize(unittest.TestCase):
675 # These tests check that the computed stack size for a code object
676 # stays within reasonable bounds (see issue #21523 for an example
677 # dysfunction).
678 N = 100
679
680 def check_stack_size(self, code):
681 # To assert that the alleged stack size is not O(N), we
682 # check that it is smaller than log(N).
683 if isinstance(code, str):
684 code = compile(code, "<foo>", "single")
685 max_size = math.ceil(math.log(len(code.co_code)))
686 self.assertLessEqual(code.co_stacksize, max_size)
687
688 def test_and(self):
689 self.check_stack_size("x and " * self.N + "x")
690
691 def test_or(self):
692 self.check_stack_size("x or " * self.N + "x")
693
694 def test_and_or(self):
695 self.check_stack_size("x and x or " * self.N + "x")
696
697 def test_chained_comparison(self):
698 self.check_stack_size("x < " * self.N + "x")
699
700 def test_if_else(self):
701 self.check_stack_size("x if x else " * self.N + "x")
702
703 def test_binop(self):
704 self.check_stack_size("x + " * self.N + "x")
705
706 def test_func_and(self):
707 code = "def f(x):\n"
708 code += " x and x\n" * self.N
709 self.check_stack_size(code)
710
Tim Petersd507dab2001-08-30 20:51:59 +0000711
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000712if __name__ == "__main__":
Antoine Pitrou99614052014-05-23 11:46:03 +0200713 unittest.main()