|
1 | 1 | #!/usr/bin/env python3 |
2 | 2 | import io |
| 3 | +import sys |
3 | 4 | import unittest |
4 | 5 | import contextlib |
5 | 6 | from bytecode import (Label, Compare, SetLineno, Instr, |
@@ -221,60 +222,108 @@ def test_from_bytecode_loop(self): |
221 | 222 | # break |
222 | 223 | # continue |
223 | 224 |
|
224 | | - label_loop_start = Label() |
225 | | - label_loop_exit = Label() |
226 | | - label_loop_end = Label() |
| 225 | + if sys.version_info < (3, 8): |
| 226 | + label_loop_start = Label() |
| 227 | + label_loop_exit = Label() |
| 228 | + label_loop_end = Label() |
227 | 229 |
|
228 | | - code = Bytecode() |
229 | | - code.extend((Instr('SETUP_LOOP', label_loop_end, lineno=1), |
230 | | - Instr('LOAD_CONST', (1, 2, 3), lineno=1), |
231 | | - Instr('GET_ITER', lineno=1), |
232 | | - |
233 | | - label_loop_start, |
234 | | - Instr('FOR_ITER', label_loop_exit, lineno=1), |
235 | | - Instr('STORE_NAME', 'x', lineno=1), |
236 | | - Instr('LOAD_NAME', 'x', lineno=2), |
237 | | - Instr('LOAD_CONST', 2, lineno=2), |
238 | | - Instr('COMPARE_OP', Compare.EQ, lineno=2), |
239 | | - Instr('POP_JUMP_IF_FALSE', label_loop_start, lineno=2), |
240 | | - Instr('BREAK_LOOP', lineno=3), |
241 | | - Instr('JUMP_ABSOLUTE', label_loop_start, lineno=4), |
242 | | - |
243 | | - Instr('JUMP_ABSOLUTE', label_loop_start, lineno=4), |
244 | | - |
245 | | - label_loop_exit, |
246 | | - Instr('POP_BLOCK', lineno=4), |
247 | | - |
248 | | - label_loop_end, |
249 | | - Instr('LOAD_CONST', None, lineno=4), |
250 | | - Instr('RETURN_VALUE', lineno=4), |
251 | | - )) |
252 | | - blocks = ControlFlowGraph.from_bytecode(code) |
| 230 | + code = Bytecode() |
| 231 | + code.extend((Instr('SETUP_LOOP', label_loop_end, lineno=1), |
| 232 | + Instr('LOAD_CONST', (1, 2, 3), lineno=1), |
| 233 | + Instr('GET_ITER', lineno=1), |
| 234 | + |
| 235 | + label_loop_start, |
| 236 | + Instr('FOR_ITER', label_loop_exit, lineno=1), |
| 237 | + Instr('STORE_NAME', 'x', lineno=1), |
| 238 | + Instr('LOAD_NAME', 'x', lineno=2), |
| 239 | + Instr('LOAD_CONST', 2, lineno=2), |
| 240 | + Instr('COMPARE_OP', Compare.EQ, lineno=2), |
| 241 | + Instr('POP_JUMP_IF_FALSE', label_loop_start, lineno=2), |
| 242 | + Instr('BREAK_LOOP', lineno=3), |
| 243 | + Instr('JUMP_ABSOLUTE', label_loop_start, lineno=4), |
| 244 | + |
| 245 | + Instr('JUMP_ABSOLUTE', label_loop_start, lineno=4), |
| 246 | + |
| 247 | + label_loop_exit, |
| 248 | + Instr('POP_BLOCK', lineno=4), |
| 249 | + |
| 250 | + label_loop_end, |
| 251 | + Instr('LOAD_CONST', None, lineno=4), |
| 252 | + Instr('RETURN_VALUE', lineno=4), |
| 253 | + )) |
| 254 | + blocks = ControlFlowGraph.from_bytecode(code) |
| 255 | + |
| 256 | + expected = [[Instr('SETUP_LOOP', blocks[8], lineno=1)], |
| 257 | + |
| 258 | + [Instr('LOAD_CONST', (1, 2, 3), lineno=1), |
| 259 | + Instr('GET_ITER', lineno=1)], |
| 260 | + |
| 261 | + [Instr('FOR_ITER', blocks[7], lineno=1)], |
| 262 | + |
| 263 | + [Instr('STORE_NAME', 'x', lineno=1), |
| 264 | + Instr('LOAD_NAME', 'x', lineno=2), |
| 265 | + Instr('LOAD_CONST', 2, lineno=2), |
| 266 | + Instr('COMPARE_OP', Compare.EQ, lineno=2), |
| 267 | + Instr('POP_JUMP_IF_FALSE', blocks[2], lineno=2)], |
253 | 268 |
|
254 | | - expected = [[Instr('SETUP_LOOP', blocks[8], lineno=1)], |
| 269 | + [Instr('BREAK_LOOP', lineno=3)], |
255 | 270 |
|
256 | | - [Instr('LOAD_CONST', (1, 2, 3), lineno=1), |
257 | | - Instr('GET_ITER', lineno=1)], |
| 271 | + [Instr('JUMP_ABSOLUTE', blocks[2], lineno=4)], |
| 272 | + |
| 273 | + [Instr('JUMP_ABSOLUTE', blocks[2], lineno=4)], |
| 274 | + |
| 275 | + [Instr('POP_BLOCK', lineno=4)], |
| 276 | + |
| 277 | + [Instr('LOAD_CONST', None, lineno=4), |
| 278 | + Instr('RETURN_VALUE', lineno=4)]] |
| 279 | + self.assertBlocksEqual(blocks, *expected) |
| 280 | + else: |
| 281 | + label_loop_start = Label() |
| 282 | + label_loop_exit = Label() |
| 283 | + |
| 284 | + code = Bytecode() |
| 285 | + code.extend((Instr('LOAD_CONST', (1, 2, 3), lineno=1), |
| 286 | + Instr('GET_ITER', lineno=1), |
| 287 | + |
| 288 | + label_loop_start, |
| 289 | + Instr('FOR_ITER', label_loop_exit, lineno=1), |
| 290 | + Instr('STORE_NAME', 'x', lineno=1), |
| 291 | + Instr('LOAD_NAME', 'x', lineno=2), |
| 292 | + Instr('LOAD_CONST', 2, lineno=2), |
| 293 | + Instr('COMPARE_OP', Compare.EQ, lineno=2), |
| 294 | + Instr('POP_JUMP_IF_FALSE', label_loop_start, lineno=2), |
| 295 | + Instr('JUMP_ABSOLUTE', label_loop_exit, lineno=3), |
| 296 | + |
| 297 | + Instr('JUMP_ABSOLUTE', label_loop_start, lineno=4), |
| 298 | + |
| 299 | + Instr('JUMP_ABSOLUTE', label_loop_start, lineno=4), |
| 300 | + |
| 301 | + label_loop_exit, |
| 302 | + Instr('LOAD_CONST', None, lineno=4), |
| 303 | + Instr('RETURN_VALUE', lineno=4), |
| 304 | + )) |
| 305 | + blocks = ControlFlowGraph.from_bytecode(code) |
258 | 306 |
|
259 | | - [Instr('FOR_ITER', blocks[7], lineno=1)], |
| 307 | + expected = [[Instr('LOAD_CONST', (1, 2, 3), lineno=1), |
| 308 | + Instr('GET_ITER', lineno=1)], |
260 | 309 |
|
261 | | - [Instr('STORE_NAME', 'x', lineno=1), |
262 | | - Instr('LOAD_NAME', 'x', lineno=2), |
263 | | - Instr('LOAD_CONST', 2, lineno=2), |
264 | | - Instr('COMPARE_OP', Compare.EQ, lineno=2), |
265 | | - Instr('POP_JUMP_IF_FALSE', blocks[2], lineno=2)], |
| 310 | + [Instr('FOR_ITER', blocks[6], lineno=1)], |
266 | 311 |
|
267 | | - [Instr('BREAK_LOOP', lineno=3)], |
| 312 | + [Instr('STORE_NAME', 'x', lineno=1), |
| 313 | + Instr('LOAD_NAME', 'x', lineno=2), |
| 314 | + Instr('LOAD_CONST', 2, lineno=2), |
| 315 | + Instr('COMPARE_OP', Compare.EQ, lineno=2), |
| 316 | + Instr('POP_JUMP_IF_FALSE', blocks[1], lineno=2)], |
268 | 317 |
|
269 | | - [Instr('JUMP_ABSOLUTE', blocks[2], lineno=4)], |
| 318 | + [Instr('JUMP_ABSOLUTE', blocks[6], lineno=3)], |
270 | 319 |
|
271 | | - [Instr('JUMP_ABSOLUTE', blocks[2], lineno=4)], |
| 320 | + [Instr('JUMP_ABSOLUTE', blocks[1], lineno=4)], |
272 | 321 |
|
273 | | - [Instr('POP_BLOCK', lineno=4)], |
| 322 | + [Instr('JUMP_ABSOLUTE', blocks[1], lineno=4)], |
274 | 323 |
|
275 | | - [Instr('LOAD_CONST', None, lineno=4), |
276 | | - Instr('RETURN_VALUE', lineno=4)]] |
277 | | - self.assertBlocksEqual(blocks, *expected) |
| 324 | + [Instr('LOAD_CONST', None, lineno=4), |
| 325 | + Instr('RETURN_VALUE', lineno=4)]] |
| 326 | + self.assertBlocksEqual(blocks, *expected) |
278 | 327 |
|
279 | 328 |
|
280 | 329 | class BytecodeBlocksFunctionalTests(TestCase): |
|
0 commit comments