diff -r b26d07812a8e Doc/library/dis.rst
--- a/Doc/library/dis.rst Wed May 25 20:35:44 2016 +0300
+++ b/Doc/library/dis.rst Thu May 26 14:07:27 2016 +0300
@@ -31,9 +31,9 @@ the following command can be used to dis
>>> dis.dis(myfunc)
2 0 LOAD_GLOBAL 0 (len)
- 2 LOAD_FAST 0 (alist)
- 4 CALL_FUNCTION 1
- 6 RETURN_VALUE
+ 1 LOAD_FAST 0 (alist)
+ 2 CALL_FUNCTION 1
+ 3 RETURN_VALUE
(The "2" is a line number).
diff -r b26d07812a8e Include/code.h
--- a/Include/code.h Wed May 25 20:35:44 2016 +0300
+++ b/Include/code.h Thu May 26 14:07:27 2016 +0300
@@ -7,6 +7,19 @@
extern "C" {
#endif
+#if SIZEOF_SHORT == 2
+typedef unsigned short _Py_CODEUNIT;
+#else
+#error "Could not find a proper typedef for _Py_CODEUNIT"
+#endif
+#ifdef WORDS_BIGENDIAN
+#define _Py_OPCODE(word) ((word) >> 8)
+#define _Py_OPARG(word) ((word) & 255)
+#else
+#define _Py_OPCODE(word) ((word) & 255)
+#define _Py_OPARG(word) ((word) >> 8)
+#endif
+
/* Bytecode object */
typedef struct {
PyObject_HEAD
diff -r b26d07812a8e Lib/asyncio/coroutines.py
--- a/Lib/asyncio/coroutines.py Wed May 25 20:35:44 2016 +0300
+++ b/Lib/asyncio/coroutines.py Thu May 26 14:07:27 2016 +0300
@@ -113,7 +113,7 @@ class CoroWrapper:
frame = sys._getframe()
caller = frame.f_back
assert caller.f_lasti >= 0
- if caller.f_code.co_code[caller.f_lasti] != _YIELD_FROM:
+ if caller.f_code.co_code[2*caller.f_lasti] != _YIELD_FROM:
value = value[0]
return self.gen.send(value)
else:
diff -r b26d07812a8e Lib/dis.py
--- a/Lib/dis.py Wed May 25 20:35:44 2016 +0300
+++ b/Lib/dis.py Thu May 26 14:07:27 2016 +0300
@@ -304,7 +304,7 @@ def _get_instructions_bytes(code, varnam
elif op in hasname:
argval, argrepr = _get_name_info(arg, names)
elif op in hasjrel:
- argval = offset + 2 + arg
+ argval = offset + 1 + arg
argrepr = "to " + repr(argval)
elif op in haslocal:
argval, argrepr = _get_name_info(arg, varnames)
@@ -359,7 +359,7 @@ def _unpack_opargs(code):
extended_arg = (arg << 8) if op == EXTENDED_ARG else 0
else:
arg = None
- yield (i, op, arg)
+ yield (i//2, op, arg)
def findlabels(code):
"""Detect all offsets in a byte code which are jump targets.
@@ -371,7 +371,7 @@ def findlabels(code):
for offset, op, arg in _unpack_opargs(code):
if arg is not None:
if op in hasjrel:
- label = offset + 2 + arg
+ label = offset + 1 + arg
elif op in hasjabs:
label = arg
else:
diff -r b26d07812a8e Lib/importlib/_bootstrap_external.py
--- a/Lib/importlib/_bootstrap_external.py Wed May 25 20:35:44 2016 +0300
+++ b/Lib/importlib/_bootstrap_external.py Thu May 26 14:07:27 2016 +0300
@@ -226,6 +226,7 @@ def _write_atomic(path, data, mode=0o666
# Python 3.6a0 3360 (add FORMAT_VALUE opcode #25483
# Python 3.6a0 3361 (lineno delta of code.co_lnotab becomes signed)
# Python 3.6a0 3370 (16 bit wordcode)
+# Python 3.6a0 3371 (word jump offsets)
#
# MAGIC must change whenever the bytecode emitted by the compiler may no
# longer be understood by older implementations of the eval loop (usually
@@ -234,7 +235,7 @@ def _write_atomic(path, data, mode=0o666
# Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array
# in PC/launcher.c must also be updated.
-MAGIC_NUMBER = (3370).to_bytes(2, 'little') + b'\r\n'
+MAGIC_NUMBER = (3371).to_bytes(2, 'little') + b'\r\n'
_RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c
_PYCACHE = '__pycache__'
diff -r b26d07812a8e Lib/test/test_dis.py
--- a/Lib/test/test_dis.py Wed May 25 20:35:44 2016 +0300
+++ b/Lib/test/test_dis.py Thu May 26 14:07:27 2016 +0300
@@ -40,41 +40,41 @@ class _C:
dis_c_instance_method = """\
%3d 0 LOAD_FAST 1 (x)
- 2 LOAD_CONST 1 (1)
- 4 COMPARE_OP 2 (==)
- 6 LOAD_FAST 0 (self)
- 8 STORE_ATTR 0 (x)
- 10 LOAD_CONST 0 (None)
- 12 RETURN_VALUE
+ 1 LOAD_CONST 1 (1)
+ 2 COMPARE_OP 2 (==)
+ 3 LOAD_FAST 0 (self)
+ 4 STORE_ATTR 0 (x)
+ 5 LOAD_CONST 0 (None)
+ 6 RETURN_VALUE
""" % (_C.__init__.__code__.co_firstlineno + 1,)
dis_c_instance_method_bytes = """\
0 LOAD_FAST 1 (1)
- 2 LOAD_CONST 1 (1)
- 4 COMPARE_OP 2 (==)
- 6 LOAD_FAST 0 (0)
- 8 STORE_ATTR 0 (0)
- 10 LOAD_CONST 0 (0)
- 12 RETURN_VALUE
+ 1 LOAD_CONST 1 (1)
+ 2 COMPARE_OP 2 (==)
+ 3 LOAD_FAST 0 (0)
+ 4 STORE_ATTR 0 (0)
+ 5 LOAD_CONST 0 (0)
+ 6 RETURN_VALUE
"""
dis_c_class_method = """\
%3d 0 LOAD_FAST 1 (x)
- 2 LOAD_CONST 1 (1)
- 4 COMPARE_OP 2 (==)
- 6 LOAD_FAST 0 (cls)
- 8 STORE_ATTR 0 (x)
- 10 LOAD_CONST 0 (None)
- 12 RETURN_VALUE
+ 1 LOAD_CONST 1 (1)
+ 2 COMPARE_OP 2 (==)
+ 3 LOAD_FAST 0 (cls)
+ 4 STORE_ATTR 0 (x)
+ 5 LOAD_CONST 0 (None)
+ 6 RETURN_VALUE
""" % (_C.cm.__code__.co_firstlineno + 2,)
dis_c_static_method = """\
%3d 0 LOAD_FAST 0 (x)
- 2 LOAD_CONST 1 (1)
- 4 COMPARE_OP 2 (==)
- 6 STORE_FAST 0 (x)
- 8 LOAD_CONST 0 (None)
- 10 RETURN_VALUE
+ 1 LOAD_CONST 1 (1)
+ 2 COMPARE_OP 2 (==)
+ 3 STORE_FAST 0 (x)
+ 4 LOAD_CONST 0 (None)
+ 5 RETURN_VALUE
""" % (_C.sm.__code__.co_firstlineno + 2,)
# Class disassembling info has an extra newline at end.
@@ -95,23 +95,23 @@ def _f(a):
dis_f = """\
%3d 0 LOAD_GLOBAL 0 (print)
- 2 LOAD_FAST 0 (a)
- 4 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
- 6 POP_TOP
+ 1 LOAD_FAST 0 (a)
+ 2 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
+ 3 POP_TOP
-%3d 8 LOAD_CONST 1 (1)
- 10 RETURN_VALUE
+%3d 4 LOAD_CONST 1 (1)
+ 5 RETURN_VALUE
""" % (_f.__code__.co_firstlineno + 1,
_f.__code__.co_firstlineno + 2)
dis_f_co_code = """\
0 LOAD_GLOBAL 0 (0)
- 2 LOAD_FAST 0 (0)
- 4 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
- 6 POP_TOP
- 8 LOAD_CONST 1 (1)
- 10 RETURN_VALUE
+ 1 LOAD_FAST 0 (0)
+ 2 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
+ 3 POP_TOP
+ 4 LOAD_CONST 1 (1)
+ 5 RETURN_VALUE
"""
@@ -121,20 +121,20 @@ def bug708901():
pass
dis_bug708901 = """\
-%3d 0 SETUP_LOOP 18 (to 20)
- 2 LOAD_GLOBAL 0 (range)
- 4 LOAD_CONST 1 (1)
+%3d 0 SETUP_LOOP 9 (to 10)
+ 1 LOAD_GLOBAL 0 (range)
+ 2 LOAD_CONST 1 (1)
-%3d 6 LOAD_CONST 2 (10)
- 8 CALL_FUNCTION 2 (2 positional, 0 keyword pair)
- 10 GET_ITER
- >> 12 FOR_ITER 4 (to 18)
- 14 STORE_FAST 0 (res)
+%3d 3 LOAD_CONST 2 (10)
+ 4 CALL_FUNCTION 2 (2 positional, 0 keyword pair)
+ 5 GET_ITER
+ >> 6 FOR_ITER 2 (to 9)
+ 7 STORE_FAST 0 (res)
-%3d 16 JUMP_ABSOLUTE 12
- >> 18 POP_BLOCK
- >> 20 LOAD_CONST 0 (None)
- 22 RETURN_VALUE
+%3d 8 JUMP_ABSOLUTE 6
+ >> 9 POP_BLOCK
+ >> 10 LOAD_CONST 0 (None)
+ 11 RETURN_VALUE
""" % (bug708901.__code__.co_firstlineno + 1,
bug708901.__code__.co_firstlineno + 2,
bug708901.__code__.co_firstlineno + 3)
@@ -147,22 +147,22 @@ def bug1333982(x=[]):
dis_bug1333982 = """\
%3d 0 LOAD_CONST 1 (0)
- 2 POP_JUMP_IF_TRUE 26
- 4 LOAD_GLOBAL 0 (AssertionError)
- 6 LOAD_CONST 2 ( at 0x..., file "%s", line %d>)
- 8 LOAD_CONST 3 ('bug1333982..')
- 10 MAKE_FUNCTION 0
- 12 LOAD_FAST 0 (x)
- 14 GET_ITER
- 16 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
+ 1 POP_JUMP_IF_TRUE 13
+ 2 LOAD_GLOBAL 0 (AssertionError)
+ 3 LOAD_CONST 2 ( at 0x..., file "%s", line %d>)
+ 4 LOAD_CONST 3 ('bug1333982..')
+ 5 MAKE_FUNCTION 0
+ 6 LOAD_FAST 0 (x)
+ 7 GET_ITER
+ 8 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
-%3d 18 LOAD_CONST 4 (1)
- 20 BINARY_ADD
- 22 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
- 24 RAISE_VARARGS 1
+%3d 9 LOAD_CONST 4 (1)
+ 10 BINARY_ADD
+ 11 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
+ 12 RAISE_VARARGS 1
-%3d >> 26 LOAD_CONST 0 (None)
- 28 RETURN_VALUE
+%3d >> 13 LOAD_CONST 0 (None)
+ 14 RETURN_VALUE
""" % (bug1333982.__code__.co_firstlineno + 1,
__file__,
bug1333982.__code__.co_firstlineno + 1,
@@ -171,19 +171,19 @@ dis_bug1333982 = """\
_BIG_LINENO_FORMAT = """\
%3d 0 LOAD_GLOBAL 0 (spam)
- 2 POP_TOP
- 4 LOAD_CONST 0 (None)
- 6 RETURN_VALUE
+ 1 POP_TOP
+ 2 LOAD_CONST 0 (None)
+ 3 RETURN_VALUE
"""
dis_module_expected_results = """\
Disassembly of f:
4 0 LOAD_CONST 0 (None)
- 2 RETURN_VALUE
+ 1 RETURN_VALUE
Disassembly of g:
5 0 LOAD_CONST 0 (None)
- 2 RETURN_VALUE
+ 1 RETURN_VALUE
"""
@@ -191,20 +191,20 @@ expr_str = "x + 1"
dis_expr_str = """\
1 0 LOAD_NAME 0 (x)
- 2 LOAD_CONST 0 (1)
- 4 BINARY_ADD
- 6 RETURN_VALUE
+ 1 LOAD_CONST 0 (1)
+ 2 BINARY_ADD
+ 3 RETURN_VALUE
"""
simple_stmt_str = "x = x + 1"
dis_simple_stmt_str = """\
1 0 LOAD_NAME 0 (x)
- 2 LOAD_CONST 0 (1)
- 4 BINARY_ADD
- 6 STORE_NAME 0 (x)
- 8 LOAD_CONST 1 (None)
- 10 RETURN_VALUE
+ 1 LOAD_CONST 0 (1)
+ 2 BINARY_ADD
+ 3 STORE_NAME 0 (x)
+ 4 LOAD_CONST 1 (None)
+ 5 RETURN_VALUE
"""
compound_stmt_str = """\
@@ -215,54 +215,54 @@ while 1:
dis_compound_stmt_str = """\
1 0 LOAD_CONST 0 (0)
- 2 STORE_NAME 0 (x)
+ 1 STORE_NAME 0 (x)
- 2 4 SETUP_LOOP 12 (to 18)
+ 2 2 SETUP_LOOP 6 (to 9)
- 3 >> 6 LOAD_NAME 0 (x)
- 8 LOAD_CONST 1 (1)
- 10 INPLACE_ADD
- 12 STORE_NAME 0 (x)
- 14 JUMP_ABSOLUTE 6
- 16 POP_BLOCK
- >> 18 LOAD_CONST 2 (None)
- 20 RETURN_VALUE
+ 3 >> 3 LOAD_NAME 0 (x)
+ 4 LOAD_CONST 1 (1)
+ 5 INPLACE_ADD
+ 6 STORE_NAME 0 (x)
+ 7 JUMP_ABSOLUTE 3
+ 8 POP_BLOCK
+ >> 9 LOAD_CONST 2 (None)
+ 10 RETURN_VALUE
"""
dis_traceback = """\
-%3d 0 SETUP_EXCEPT 12 (to 14)
+%3d 0 SETUP_EXCEPT 6 (to 7)
-%3d 2 LOAD_CONST 1 (1)
- 4 LOAD_CONST 2 (0)
- --> 6 BINARY_TRUE_DIVIDE
- 8 POP_TOP
- 10 POP_BLOCK
- 12 JUMP_FORWARD 40 (to 54)
+%3d 1 LOAD_CONST 1 (1)
+ 2 LOAD_CONST 2 (0)
+ --> 3 BINARY_TRUE_DIVIDE
+ 4 POP_TOP
+ 5 POP_BLOCK
+ 6 JUMP_FORWARD 20 (to 27)
-%3d >> 14 DUP_TOP
- 16 LOAD_GLOBAL 0 (Exception)
- 18 COMPARE_OP 10 (exception match)
- 20 POP_JUMP_IF_FALSE 52
- 22 POP_TOP
- 24 STORE_FAST 0 (e)
- 26 POP_TOP
- 28 SETUP_FINALLY 12 (to 42)
+%3d >> 7 DUP_TOP
+ 8 LOAD_GLOBAL 0 (Exception)
+ 9 COMPARE_OP 10 (exception match)
+ 10 POP_JUMP_IF_FALSE 26
+ 11 POP_TOP
+ 12 STORE_FAST 0 (e)
+ 13 POP_TOP
+ 14 SETUP_FINALLY 6 (to 21)
-%3d 30 LOAD_FAST 0 (e)
- 32 LOAD_ATTR 1 (__traceback__)
- 34 STORE_FAST 1 (tb)
- 36 POP_BLOCK
- 38 POP_EXCEPT
- 40 LOAD_CONST 0 (None)
- >> 42 LOAD_CONST 0 (None)
- 44 STORE_FAST 0 (e)
- 46 DELETE_FAST 0 (e)
- 48 END_FINALLY
- 50 JUMP_FORWARD 2 (to 54)
- >> 52 END_FINALLY
+%3d 15 LOAD_FAST 0 (e)
+ 16 LOAD_ATTR 1 (__traceback__)
+ 17 STORE_FAST 1 (tb)
+ 18 POP_BLOCK
+ 19 POP_EXCEPT
+ 20 LOAD_CONST 0 (None)
+ >> 21 LOAD_CONST 0 (None)
+ 22 STORE_FAST 0 (e)
+ 23 DELETE_FAST 0 (e)
+ 24 END_FINALLY
+ 25 JUMP_FORWARD 1 (to 27)
+ >> 26 END_FINALLY
-%3d >> 54 LOAD_FAST 1 (tb)
- 56 RETURN_VALUE
+%3d >> 27 LOAD_FAST 1 (tb)
+ 28 RETURN_VALUE
""" % (TRACEBACK_CODE.co_firstlineno + 1,
TRACEBACK_CODE.co_firstlineno + 2,
TRACEBACK_CODE.co_firstlineno + 3,
@@ -273,6 +273,7 @@ def _g(x):
yield x
class DisTests(unittest.TestCase):
+ maxDiff=99999
def get_disassembly(self, func, lasti=-1, wrapper=True):
# We want to test the default printing behaviour, not the file arg
@@ -650,170 +651,170 @@ expected_jumpy_line = 1
Instruction = dis.Instruction
expected_opinfo_outer = [
Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=3, argrepr='3', offset=0, starts_line=2, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=2, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CLOSURE', opcode=135, arg=0, argval='a', argrepr='a', offset=4, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CLOSURE', opcode=135, arg=1, argval='b', argrepr='b', offset=6, starts_line=None, is_jump_target=False),
- Instruction(opname='BUILD_TUPLE', opcode=102, arg=2, argval=2, argrepr='', offset=8, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=code_object_f, argrepr=repr(code_object_f), offset=10, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='outer..f', argrepr="'outer..f'", offset=12, starts_line=None, is_jump_target=False),
- Instruction(opname='MAKE_CLOSURE', opcode=134, arg=2, argval=2, argrepr='', offset=14, starts_line=None, is_jump_target=False),
- Instruction(opname='STORE_FAST', opcode=125, arg=2, argval='f', argrepr='f', offset=16, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=18, starts_line=7, is_jump_target=False),
- Instruction(opname='LOAD_DEREF', opcode=136, arg=0, argval='a', argrepr='a', offset=20, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_DEREF', opcode=136, arg=1, argval='b', argrepr='b', offset=22, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval='', argrepr="''", offset=24, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval=1, argrepr='1', offset=26, starts_line=None, is_jump_target=False),
- Instruction(opname='BUILD_LIST', opcode=103, arg=0, argval=0, argrepr='', offset=28, starts_line=None, is_jump_target=False),
- Instruction(opname='BUILD_MAP', opcode=105, arg=0, argval=0, argrepr='', offset=30, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval='Hello world!', argrepr="'Hello world!'", offset=32, starts_line=None, is_jump_target=False),
- Instruction(opname='CALL_FUNCTION', opcode=131, arg=7, argval=7, argrepr='7 positional, 0 keyword pair', offset=34, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=36, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='f', argrepr='f', offset=38, starts_line=8, is_jump_target=False),
- Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=40, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=1, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CLOSURE', opcode=135, arg=0, argval='a', argrepr='a', offset=2, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CLOSURE', opcode=135, arg=1, argval='b', argrepr='b', offset=3, starts_line=None, is_jump_target=False),
+ Instruction(opname='BUILD_TUPLE', opcode=102, arg=2, argval=2, argrepr='', offset=4, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=code_object_f, argrepr=repr(code_object_f), offset=5, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='outer..f', argrepr="'outer..f'", offset=6, starts_line=None, is_jump_target=False),
+ Instruction(opname='MAKE_CLOSURE', opcode=134, arg=2, argval=2, argrepr='', offset=7, starts_line=None, is_jump_target=False),
+ Instruction(opname='STORE_FAST', opcode=125, arg=2, argval='f', argrepr='f', offset=8, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=9, starts_line=7, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=0, argval='a', argrepr='a', offset=10, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=1, argval='b', argrepr='b', offset=11, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval='', argrepr="''", offset=12, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval=1, argrepr='1', offset=13, starts_line=None, is_jump_target=False),
+ Instruction(opname='BUILD_LIST', opcode=103, arg=0, argval=0, argrepr='', offset=14, starts_line=None, is_jump_target=False),
+ Instruction(opname='BUILD_MAP', opcode=105, arg=0, argval=0, argrepr='', offset=15, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval='Hello world!', argrepr="'Hello world!'", offset=16, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=7, argval=7, argrepr='7 positional, 0 keyword pair', offset=17, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=18, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='f', argrepr='f', offset=19, starts_line=8, is_jump_target=False),
+ Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=20, starts_line=None, is_jump_target=False),
]
expected_opinfo_f = [
Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=5, argrepr='5', offset=0, starts_line=3, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=6, argrepr='6', offset=2, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CLOSURE', opcode=135, arg=2, argval='a', argrepr='a', offset=4, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CLOSURE', opcode=135, arg=3, argval='b', argrepr='b', offset=6, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CLOSURE', opcode=135, arg=0, argval='c', argrepr='c', offset=8, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CLOSURE', opcode=135, arg=1, argval='d', argrepr='d', offset=10, starts_line=None, is_jump_target=False),
- Instruction(opname='BUILD_TUPLE', opcode=102, arg=4, argval=4, argrepr='', offset=12, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=code_object_inner, argrepr=repr(code_object_inner), offset=14, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='outer..f..inner', argrepr="'outer..f..inner'", offset=16, starts_line=None, is_jump_target=False),
- Instruction(opname='MAKE_CLOSURE', opcode=134, arg=2, argval=2, argrepr='', offset=18, starts_line=None, is_jump_target=False),
- Instruction(opname='STORE_FAST', opcode=125, arg=2, argval='inner', argrepr='inner', offset=20, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=22, starts_line=5, is_jump_target=False),
- Instruction(opname='LOAD_DEREF', opcode=136, arg=2, argval='a', argrepr='a', offset=24, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_DEREF', opcode=136, arg=3, argval='b', argrepr='b', offset=26, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_DEREF', opcode=136, arg=0, argval='c', argrepr='c', offset=28, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_DEREF', opcode=136, arg=1, argval='d', argrepr='d', offset=30, starts_line=None, is_jump_target=False),
- Instruction(opname='CALL_FUNCTION', opcode=131, arg=4, argval=4, argrepr='4 positional, 0 keyword pair', offset=32, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=34, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='inner', argrepr='inner', offset=36, starts_line=6, is_jump_target=False),
- Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=38, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=6, argrepr='6', offset=1, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CLOSURE', opcode=135, arg=2, argval='a', argrepr='a', offset=2, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CLOSURE', opcode=135, arg=3, argval='b', argrepr='b', offset=3, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CLOSURE', opcode=135, arg=0, argval='c', argrepr='c', offset=4, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CLOSURE', opcode=135, arg=1, argval='d', argrepr='d', offset=5, starts_line=None, is_jump_target=False),
+ Instruction(opname='BUILD_TUPLE', opcode=102, arg=4, argval=4, argrepr='', offset=6, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=code_object_inner, argrepr=repr(code_object_inner), offset=7, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='outer..f..inner', argrepr="'outer..f..inner'", offset=8, starts_line=None, is_jump_target=False),
+ Instruction(opname='MAKE_CLOSURE', opcode=134, arg=2, argval=2, argrepr='', offset=9, starts_line=None, is_jump_target=False),
+ Instruction(opname='STORE_FAST', opcode=125, arg=2, argval='inner', argrepr='inner', offset=10, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=11, starts_line=5, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=2, argval='a', argrepr='a', offset=12, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=3, argval='b', argrepr='b', offset=13, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=0, argval='c', argrepr='c', offset=14, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=1, argval='d', argrepr='d', offset=15, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=4, argval=4, argrepr='4 positional, 0 keyword pair', offset=16, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=17, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='inner', argrepr='inner', offset=18, starts_line=6, is_jump_target=False),
+ Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=19, starts_line=None, is_jump_target=False),
]
expected_opinfo_inner = [
Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=0, starts_line=4, is_jump_target=False),
- Instruction(opname='LOAD_DEREF', opcode=136, arg=0, argval='a', argrepr='a', offset=2, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_DEREF', opcode=136, arg=1, argval='b', argrepr='b', offset=4, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_DEREF', opcode=136, arg=2, argval='c', argrepr='c', offset=6, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_DEREF', opcode=136, arg=3, argval='d', argrepr='d', offset=8, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='e', argrepr='e', offset=10, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_FAST', opcode=124, arg=1, argval='f', argrepr='f', offset=12, starts_line=None, is_jump_target=False),
- Instruction(opname='CALL_FUNCTION', opcode=131, arg=6, argval=6, argrepr='6 positional, 0 keyword pair', offset=14, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=16, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=18, starts_line=None, is_jump_target=False),
- Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=20, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=0, argval='a', argrepr='a', offset=1, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=1, argval='b', argrepr='b', offset=2, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=2, argval='c', argrepr='c', offset=3, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=3, argval='d', argrepr='d', offset=4, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='e', argrepr='e', offset=5, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=1, argval='f', argrepr='f', offset=6, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=6, argval=6, argrepr='6 positional, 0 keyword pair', offset=7, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=8, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=9, starts_line=None, is_jump_target=False),
+ Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=10, starts_line=None, is_jump_target=False),
]
expected_opinfo_jumpy = [
- Instruction(opname='SETUP_LOOP', opcode=120, arg=52, argval=54, argrepr='to 54', offset=0, starts_line=3, is_jump_target=False),
- Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='range', argrepr='range', offset=2, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=10, argrepr='10', offset=4, starts_line=None, is_jump_target=False),
- Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=6, starts_line=None, is_jump_target=False),
- Instruction(opname='GET_ITER', opcode=68, arg=None, argval=None, argrepr='', offset=8, starts_line=None, is_jump_target=False),
- Instruction(opname='FOR_ITER', opcode=93, arg=32, argval=44, argrepr='to 44', offset=10, starts_line=None, is_jump_target=True),
- Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=12, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=14, starts_line=4, is_jump_target=False),
- Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=16, starts_line=None, is_jump_target=False),
- Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=18, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=20, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=22, starts_line=5, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=24, starts_line=None, is_jump_target=False),
- Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=26, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=32, argval=32, argrepr='', offset=28, starts_line=None, is_jump_target=False),
- Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=10, argval=10, argrepr='', offset=30, starts_line=6, is_jump_target=False),
- Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=32, starts_line=7, is_jump_target=True),
- Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=34, starts_line=None, is_jump_target=False),
- Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=36, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=10, argval=10, argrepr='', offset=38, starts_line=None, is_jump_target=False),
- Instruction(opname='BREAK_LOOP', opcode=80, arg=None, argval=None, argrepr='', offset=40, starts_line=8, is_jump_target=False),
- Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=10, argval=10, argrepr='', offset=42, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=44, starts_line=None, is_jump_target=True),
- Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=46, starts_line=10, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=48, starts_line=None, is_jump_target=False),
- Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=50, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=52, starts_line=None, is_jump_target=False),
- Instruction(opname='SETUP_LOOP', opcode=120, arg=52, argval=108, argrepr='to 108', offset=54, starts_line=11, is_jump_target=True),
- Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=56, starts_line=None, is_jump_target=True),
- Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=98, argval=98, argrepr='', offset=58, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=60, starts_line=12, is_jump_target=False),
- Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=62, starts_line=None, is_jump_target=False),
- Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=64, starts_line=None, is_jump_target=False),
+ Instruction(opname='SETUP_LOOP', opcode=120, arg=26, argval=27, argrepr='to 27', offset=0, starts_line=3, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='range', argrepr='range', offset=1, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=10, argrepr='10', offset=2, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=3, starts_line=None, is_jump_target=False),
+ Instruction(opname='GET_ITER', opcode=68, arg=None, argval=None, argrepr='', offset=4, starts_line=None, is_jump_target=False),
+ Instruction(opname='FOR_ITER', opcode=93, arg=16, argval=22, argrepr='to 22', offset=5, starts_line=None, is_jump_target=True),
+ Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=6, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=7, starts_line=4, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=8, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=9, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=10, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=11, starts_line=5, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=12, starts_line=None, is_jump_target=False),
+ Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=13, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=16, argval=16, argrepr='', offset=14, starts_line=None, is_jump_target=False),
+ Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=5, argval=5, argrepr='', offset=15, starts_line=6, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=16, starts_line=7, is_jump_target=True),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=17, starts_line=None, is_jump_target=False),
+ Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=18, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=21, argval=21, argrepr='', offset=19, starts_line=None, is_jump_target=False),
+ Instruction(opname='BREAK_LOOP', opcode=80, arg=None, argval=None, argrepr='', offset=20, starts_line=8, is_jump_target=False),
+ Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=5, argval=5, argrepr='', offset=21, starts_line=None, is_jump_target=True),
+ Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=22, starts_line=None, is_jump_target=True),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=23, starts_line=10, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=24, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=25, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=26, starts_line=None, is_jump_target=False),
+ Instruction(opname='SETUP_LOOP', opcode=120, arg=26, argval=54, argrepr='to 54', offset=27, starts_line=11, is_jump_target=True),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=28, starts_line=None, is_jump_target=True),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=49, argval=49, argrepr='', offset=29, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=30, starts_line=12, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=31, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=32, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=33, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=34, starts_line=13, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=35, starts_line=None, is_jump_target=False),
+ Instruction(opname='INPLACE_SUBTRACT', opcode=56, arg=None, argval=None, argrepr='', offset=36, starts_line=None, is_jump_target=False),
+ Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=37, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=38, starts_line=14, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=39, starts_line=None, is_jump_target=False),
+ Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=40, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=43, argval=43, argrepr='', offset=41, starts_line=None, is_jump_target=False),
+ Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=28, argval=28, argrepr='', offset=42, starts_line=15, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=43, starts_line=16, is_jump_target=True),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=44, starts_line=None, is_jump_target=False),
+ Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=45, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=48, argval=48, argrepr='', offset=46, starts_line=None, is_jump_target=False),
+ Instruction(opname='BREAK_LOOP', opcode=80, arg=None, argval=None, argrepr='', offset=47, starts_line=17, is_jump_target=False),
+ Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=28, argval=28, argrepr='', offset=48, starts_line=None, is_jump_target=True),
+ Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=49, starts_line=None, is_jump_target=True),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=50, starts_line=19, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=51, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=52, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=53, starts_line=None, is_jump_target=False),
+ Instruction(opname='SETUP_FINALLY', opcode=122, arg=35, argval=90, argrepr='to 90', offset=54, starts_line=20, is_jump_target=True),
+ Instruction(opname='SETUP_EXCEPT', opcode=121, arg=6, argval=62, argrepr='to 62', offset=55, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=56, starts_line=21, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=57, starts_line=None, is_jump_target=False),
+ Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=58, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=59, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False),
+ Instruction(opname='JUMP_FORWARD', opcode=110, arg=14, argval=76, argrepr='to 76', offset=61, starts_line=None, is_jump_target=False),
+ Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=62, starts_line=22, is_jump_target=True),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=63, starts_line=None, is_jump_target=False),
+ Instruction(opname='COMPARE_OP', opcode=107, arg=10, argval='exception match', argrepr='exception match', offset=64, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=75, argval=75, argrepr='', offset=65, starts_line=None, is_jump_target=False),
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=66, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=68, starts_line=13, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=70, starts_line=None, is_jump_target=False),
- Instruction(opname='INPLACE_SUBTRACT', opcode=56, arg=None, argval=None, argrepr='', offset=72, starts_line=None, is_jump_target=False),
- Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=74, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=76, starts_line=14, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=78, starts_line=None, is_jump_target=False),
- Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=80, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=86, argval=86, argrepr='', offset=82, starts_line=None, is_jump_target=False),
- Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=56, argval=56, argrepr='', offset=84, starts_line=15, is_jump_target=False),
- Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=86, starts_line=16, is_jump_target=True),
- Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=88, starts_line=None, is_jump_target=False),
- Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=90, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=56, argval=56, argrepr='', offset=92, starts_line=None, is_jump_target=False),
- Instruction(opname='BREAK_LOOP', opcode=80, arg=None, argval=None, argrepr='', offset=94, starts_line=17, is_jump_target=False),
- Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=56, argval=56, argrepr='', offset=96, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=98, starts_line=None, is_jump_target=True),
- Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=100, starts_line=19, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=102, starts_line=None, is_jump_target=False),
- Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=104, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=106, starts_line=None, is_jump_target=False),
- Instruction(opname='SETUP_FINALLY', opcode=122, arg=70, argval=180, argrepr='to 180', offset=108, starts_line=20, is_jump_target=True),
- Instruction(opname='SETUP_EXCEPT', opcode=121, arg=12, argval=124, argrepr='to 124', offset=110, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=112, starts_line=21, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=114, starts_line=None, is_jump_target=False),
- Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=116, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=118, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=120, starts_line=None, is_jump_target=False),
- Instruction(opname='JUMP_FORWARD', opcode=110, arg=28, argval=152, argrepr='to 152', offset=122, starts_line=None, is_jump_target=False),
- Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=124, starts_line=22, is_jump_target=True),
- Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=126, starts_line=None, is_jump_target=False),
- Instruction(opname='COMPARE_OP', opcode=107, arg=10, argval='exception match', argrepr='exception match', offset=128, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=150, argval=150, argrepr='', offset=130, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=132, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=134, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=136, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=138, starts_line=23, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=140, starts_line=None, is_jump_target=False),
- Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=142, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=144, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=146, starts_line=None, is_jump_target=False),
- Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=176, argrepr='to 176', offset=148, starts_line=None, is_jump_target=False),
- Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=150, starts_line=None, is_jump_target=True),
- Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=152, starts_line=25, is_jump_target=True),
- Instruction(opname='SETUP_WITH', opcode=143, arg=14, argval=170, argrepr='to 170', offset=154, starts_line=None, is_jump_target=False),
- Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=156, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=158, starts_line=26, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=160, starts_line=None, is_jump_target=False),
- Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=162, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=166, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=168, starts_line=None, is_jump_target=False),
- Instruction(opname='WITH_CLEANUP_START', opcode=81, arg=None, argval=None, argrepr='', offset=170, starts_line=None, is_jump_target=True),
- Instruction(opname='WITH_CLEANUP_FINISH', opcode=82, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=False),
- Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=174, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=176, starts_line=None, is_jump_target=True),
- Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=178, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=180, starts_line=28, is_jump_target=True),
- Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=182, starts_line=None, is_jump_target=False),
- Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=184, starts_line=None, is_jump_target=False),
- Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False),
- Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=188, starts_line=None, is_jump_target=False),
- Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=190, starts_line=None, is_jump_target=False),
- Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=192, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=67, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=68, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=69, starts_line=23, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=70, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=71, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=72, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=73, starts_line=None, is_jump_target=False),
+ Instruction(opname='JUMP_FORWARD', opcode=110, arg=13, argval=88, argrepr='to 88', offset=74, starts_line=None, is_jump_target=False),
+ Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=75, starts_line=None, is_jump_target=True),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=76, starts_line=25, is_jump_target=True),
+ Instruction(opname='SETUP_WITH', opcode=143, arg=7, argval=85, argrepr='to 85', offset=77, starts_line=None, is_jump_target=False),
+ Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=78, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=79, starts_line=26, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=80, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=81, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=82, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=83, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=84, starts_line=None, is_jump_target=False),
+ Instruction(opname='WITH_CLEANUP_START', opcode=81, arg=None, argval=None, argrepr='', offset=85, starts_line=None, is_jump_target=True),
+ Instruction(opname='WITH_CLEANUP_FINISH', opcode=82, arg=None, argval=None, argrepr='', offset=86, starts_line=None, is_jump_target=False),
+ Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=87, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=88, starts_line=None, is_jump_target=True),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=89, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=90, starts_line=28, is_jump_target=True),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=91, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=92, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=93, starts_line=None, is_jump_target=False),
+ Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=94, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=95, starts_line=None, is_jump_target=False),
+ Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=96, starts_line=None, is_jump_target=False),
]
# One last piece of inspect fodder to check the default line number handling
def simple(): pass
expected_opinfo_simple = [
Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=0, starts_line=simple.__code__.co_firstlineno, is_jump_target=False),
- Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=2, starts_line=None, is_jump_target=False)
+ Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=1, starts_line=None, is_jump_target=False)
]
@@ -850,6 +851,7 @@ class InstructionTests(BytecodeTestCase)
# get_instructions has its own tests above, so can rely on it to validate
# the object oriented API
class BytecodeTests(unittest.TestCase):
+ maxDiff=99999
def test_instantiation(self):
# Test with function, method, code string and code object
for obj in [_f, _C(1).__init__, "a=1", _f.__code__]:
diff -r b26d07812a8e Objects/frameobject.c
--- a/Objects/frameobject.c Wed May 25 20:35:44 2016 +0300
+++ b/Objects/frameobject.c Thu May 26 14:07:27 2016 +0300
@@ -65,9 +65,9 @@ frame_setlineno(PyFrameObject *f, PyObje
int overflow;
int new_lasti = 0; /* The new value of f_lasti */
int new_iblock = 0; /* The new value of f_iblock */
- unsigned char *code = NULL; /* The bytecode for the frame... */
+ const _Py_CODEUNIT *code = NULL; /* The bytecode for the frame... */
Py_ssize_t code_len = 0; /* ...and its length */
- unsigned char *lnotab = NULL; /* Iterating over co_lnotab */
+ const unsigned char *lnotab = NULL; /* Iterating over co_lnotab */
Py_ssize_t lnotab_len = 0; /* (ditto) */
int offset = 0; /* (ditto) */
int line = 0; /* (ditto) */
@@ -155,7 +155,8 @@ frame_setlineno(PyFrameObject *f, PyObje
}
/* We're now ready to look at the bytecode. */
- PyBytes_AsStringAndSize(f->f_code->co_code, (char **)&code, &code_len);
+ code = (_Py_CODEUNIT *)PyBytes_AS_STRING(f->f_code->co_code);
+ code_len = PyBytes_GET_SIZE(f->f_code->co_code) / 2;
min_addr = Py_MIN(new_lasti, f->f_lasti);
max_addr = Py_MAX(new_lasti, f->f_lasti);
@@ -169,7 +170,8 @@ frame_setlineno(PyFrameObject *f, PyObje
* cases (AFAIK) where a line's code can start with DUP_TOP or
* POP_TOP, but if any ever appear, they'll be subject to the same
* restriction (but with a different error message). */
- if (code[new_lasti] == DUP_TOP || code[new_lasti] == POP_TOP) {
+ if (_Py_OPCODE(code[new_lasti]) == DUP_TOP ||
+ _Py_OPCODE(code[new_lasti]) == POP_TOP) {
PyErr_SetString(PyExc_ValueError,
"can't jump to 'except' line as there's no exception");
return -1;
@@ -189,8 +191,8 @@ frame_setlineno(PyFrameObject *f, PyObje
memset(blockstack, '\0', sizeof(blockstack));
memset(in_finally, '\0', sizeof(in_finally));
blockstack_top = 0;
- for (addr = 0; addr < code_len; addr += 2) {
- unsigned char op = code[addr];
+ for (addr = 0; addr < code_len; addr++) {
+ unsigned char op = _Py_OPCODE(code[addr]);
switch (op) {
case SETUP_LOOP:
case SETUP_EXCEPT:
@@ -203,7 +205,7 @@ frame_setlineno(PyFrameObject *f, PyObje
case POP_BLOCK:
assert(blockstack_top > 0);
- setup_op = code[blockstack[blockstack_top-1]];
+ setup_op = _Py_OPCODE(code[blockstack[blockstack_top-1]]);
if (setup_op == SETUP_FINALLY || setup_op == SETUP_WITH
|| setup_op == SETUP_ASYNC_WITH) {
in_finally[blockstack_top-1] = 1;
@@ -219,7 +221,7 @@ frame_setlineno(PyFrameObject *f, PyObje
* 'finally' block. (If blockstack_top is 0, we must
* be seeing such an END_FINALLY.) */
if (blockstack_top > 0) {
- setup_op = code[blockstack[blockstack_top-1]];
+ setup_op = _Py_OPCODE(code[blockstack[blockstack_top-1]]);
if (setup_op == SETUP_FINALLY || setup_op == SETUP_WITH
|| setup_op == SETUP_ASYNC_WITH) {
blockstack_top--;
@@ -273,8 +275,8 @@ frame_setlineno(PyFrameObject *f, PyObje
* can tell whether the jump goes into any blocks without coming out
* again - in that case we raise an exception below. */
delta_iblock = 0;
- for (addr = min_addr; addr < max_addr; addr += 2) {
- unsigned char op = code[addr];
+ for (addr = min_addr; addr < max_addr; addr++) {
+ unsigned char op = _Py_OPCODE(code[addr]);
switch (op) {
case SETUP_LOOP:
case SETUP_EXCEPT:
diff -r b26d07812a8e Objects/genobject.c
--- a/Objects/genobject.c Wed May 25 20:35:44 2016 +0300
+++ b/Objects/genobject.c Thu May 26 14:07:27 2016 +0300
@@ -275,9 +275,9 @@ PyObject *
if (f && f->f_stacktop) {
PyObject *bytecode = f->f_code->co_code;
- unsigned char *code = (unsigned char *)PyBytes_AS_STRING(bytecode);
+ const _Py_CODEUNIT *code = (_Py_CODEUNIT *)PyBytes_AS_STRING(bytecode);
- if (code[f->f_lasti + 2] != YIELD_FROM)
+ if (_Py_OPCODE(code[f->f_lasti]) != YIELD_FROM)
return NULL;
yf = f->f_stacktop[-1];
Py_INCREF(yf);
@@ -376,7 +376,7 @@ gen_throw(PyGenObject *gen, PyObject *ar
assert(ret == yf);
Py_DECREF(ret);
/* Termination repetition of YIELD_FROM */
- gen->gi_frame->f_lasti += 2;
+ gen->gi_frame->f_lasti++;
if (_PyGen_FetchStopIterationValue(&val) == 0) {
ret = gen_send_ex(gen, val, 0, 0);
Py_DECREF(val);
diff -r b26d07812a8e Python/ceval.c
--- a/Python/ceval.c Wed May 25 20:35:44 2016 +0300
+++ b/Python/ceval.c Thu May 26 14:07:27 2016 +0300
@@ -144,7 +144,7 @@ static int import_all_from(PyObject *, P
static void format_exc_check_arg(PyObject *, const char *, PyObject *);
static void format_exc_unbound(PyCodeObject *co, int oparg);
static PyObject * unicode_concatenate(PyObject *, PyObject *,
- PyFrameObject *, const unsigned short *);
+ PyFrameObject *, const _Py_CODEUNIT *);
static PyObject * special_lookup(PyObject *, _Py_Identifier *);
#define NAME_ERROR_MSG \
@@ -800,7 +800,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
int lastopcode = 0;
#endif
PyObject **stack_pointer; /* Next free slot in value stack */
- const unsigned short *next_instr;
+ const _Py_CODEUNIT *next_instr;
int opcode; /* Current opcode */
int oparg; /* Current opcode argument, if any */
enum why_code why; /* Reason for block stack unwind */
@@ -818,7 +818,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
time it is tested. */
int instr_ub = -1, instr_lb = 0, instr_prev = -1;
- const unsigned short *first_instr;
+ const _Py_CODEUNIT *first_instr;
PyObject *names;
PyObject *consts;
@@ -979,23 +979,16 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
/* Code access macros */
-#ifdef WORDS_BIGENDIAN
- #define OPCODE(word) ((word) >> 8)
- #define OPARG(word) ((word) & 255)
-#else
- #define OPCODE(word) ((word) & 255)
- #define OPARG(word) ((word) >> 8)
-#endif
/* The integer overflow is checked by an assertion below. */
-#define INSTR_OFFSET() (2*(int)(next_instr - first_instr))
+#define INSTR_OFFSET() ((int)(next_instr - first_instr))
#define NEXTOPARG() do { \
- unsigned short word = *next_instr; \
- opcode = OPCODE(word); \
- oparg = OPARG(word); \
+ _Py_CODEUNIT word = *next_instr; \
+ opcode = _Py_OPCODE(word); \
+ oparg = _Py_OPARG(word); \
next_instr++; \
} while (0)
-#define JUMPTO(x) (next_instr = first_instr + (x)/2)
-#define JUMPBY(x) (next_instr += (x)/2)
+#define JUMPTO(x) (next_instr = first_instr + (x))
+#define JUMPBY(x) (next_instr += (x))
/* OpCode prediction macros
Some opcodes tend to come in pairs thus making it possible to
@@ -1029,10 +1022,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
#else
#define PREDICT(op) \
do{ \
- unsigned short word = *next_instr; \
- opcode = OPCODE(word); \
+ _Py_CODEUNIT word = *next_instr; \
+ opcode = _Py_OPCODE(word); \
if (opcode == op){ \
- oparg = OPARG(word); \
+ oparg = _Py_OPARG(word); \
next_instr++; \
goto PRED_##op; \
} \
@@ -1169,9 +1162,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
freevars = f->f_localsplus + co->co_nlocals;
assert(PyBytes_Check(co->co_code));
assert(PyBytes_GET_SIZE(co->co_code) <= INT_MAX);
- assert(PyBytes_GET_SIZE(co->co_code) % 2 == 0);
- assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), 2));
- first_instr = (unsigned short*) PyBytes_AS_STRING(co->co_code);
+ assert(PyBytes_GET_SIZE(co->co_code) % sizeof(_Py_CODEUNIT) == 0);
+ assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(co->co_code), sizeof(_Py_CODEUNIT)));
+ first_instr = (_Py_CODEUNIT*) PyBytes_AS_STRING(co->co_code);
/*
f->f_lasti refers to the index of the last instruction,
unless it's -1 in which case next_instr should be first_instr.
@@ -1187,11 +1180,8 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
FOR_ITER is effectively a single opcode and f->f_lasti will point
to the beginning of the combined pair.)
*/
- next_instr = first_instr;
- if (f->f_lasti >= 0) {
- assert(f->f_lasti % 2 == 0);
- next_instr += f->f_lasti/2 + 1;
- }
+ assert(f->f_lasti >= -1);
+ next_instr = first_instr + f->f_lasti + 1;
stack_pointer = f->f_stacktop;
assert(stack_pointer != NULL);
f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
@@ -1255,7 +1245,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
Py_MakePendingCalls() above. */
if (_Py_atomic_load_relaxed(&eval_breaker)) {
- if (OPCODE(*next_instr) == SETUP_FINALLY) {
+ if (_Py_OPCODE(*next_instr) == SETUP_FINALLY) {
/* Make the last opcode before
a try: finally: block uninterruptible. */
goto fast_next_opcode;
@@ -2077,7 +2067,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
f->f_stacktop = stack_pointer;
why = WHY_YIELD;
/* and repeat... */
- f->f_lasti -= 2;
+ f->f_lasti--;
goto fast_yield;
}
@@ -5303,7 +5293,7 @@ format_exc_unbound(PyCodeObject *co, int
static PyObject *
unicode_concatenate(PyObject *v, PyObject *w,
- PyFrameObject *f, const unsigned short *next_instr)
+ PyFrameObject *f, const _Py_CODEUNIT *next_instr)
{
PyObject *res;
if (Py_REFCNT(v) == 2) {
diff -r b26d07812a8e Python/compile.c
--- a/Python/compile.c Wed May 25 20:35:44 2016 +0300
+++ b/Python/compile.c Thu May 26 14:07:27 2016 +0300
@@ -4527,21 +4527,21 @@ assemble_emit(struct assembler *a, struc
{
int size, arg = 0;
Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
- char *code;
+ _Py_CODEUNIT *code;
arg = i->i_oparg;
size = instrsize(arg);
if (i->i_lineno && !assemble_lnotab(a, i))
return 0;
- if (a->a_offset + size >= len) {
+ if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
if (len > PY_SSIZE_T_MAX / 2)
return 0;
- if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
+ if (_PyBytes_Resize(&a->a_bytecode, len * sizeof(_Py_CODEUNIT)) < 0)
return 0;
}
- code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
+ code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
a->a_offset += size;
- write_op_arg((unsigned char*)code, i->i_opcode, arg, size);
+ write_op_arg(code, i->i_opcode, arg, size);
return 1;
}
@@ -4819,7 +4819,7 @@ assemble(struct compiler *c, int addNone
if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
goto error;
- if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0)
+ if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0)
goto error;
co = makecode(c, &a);
diff -r b26d07812a8e Python/peephole.c
--- a/Python/peephole.c Wed May 25 20:35:44 2016 +0300
+++ b/Python/peephole.c Thu May 26 14:07:27 2016 +0300
@@ -17,7 +17,7 @@
|| op==POP_JUMP_IF_FALSE || op==POP_JUMP_IF_TRUE \
|| op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP)
#define JUMPS_ON_TRUE(op) (op==POP_JUMP_IF_TRUE || op==JUMP_IF_TRUE_OR_POP)
-#define GETJUMPTGT(arr, i) (get_arg(arr, i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+2))
+#define GETJUMPTGT(arr, i) (get_arg(arr, i) + (ABSOLUTE_JUMP(_Py_OPCODE(arr[i])) ? 0 : i+1))
#define ISBASICBLOCK(blocks, start, end) \
(blocks[start]==blocks[end])
@@ -40,7 +40,7 @@
#define CONST_STACK_PUSH_OP(i) do { \
PyObject *_x; \
- assert(codestr[i] == LOAD_CONST); \
+ assert(_Py_OPCODE(codestr[i]) == LOAD_CONST); \
assert(PyList_GET_SIZE(consts) > (Py_ssize_t)get_arg(codestr, i)); \
_x = PyList_GET_ITEM(consts, get_arg(codestr, i)); \
if (++const_stack_top >= const_stack_size) { \
@@ -72,33 +72,33 @@
Callers are responsible to check CONST_STACK_LEN beforehand.
*/
static Py_ssize_t
-lastn_const_start(unsigned char *codestr, Py_ssize_t i, Py_ssize_t n)
+lastn_const_start(const _Py_CODEUNIT *codestr, Py_ssize_t i, Py_ssize_t n)
{
- assert(n > 0 && (i&1) == 0);
+ assert(n > 0);
for (;;) {
- i -= 2;
+ i--;
assert(i >= 0);
- if (codestr[i] == LOAD_CONST) {
+ if (_Py_OPCODE(codestr[i]) == LOAD_CONST) {
if (!--n) {
- while (i > 0 && codestr[i-2] == EXTENDED_ARG) {
- i -= 2;
+ while (i > 0 && _Py_OPCODE(codestr[i-1]) == EXTENDED_ARG) {
+ i--;
}
return i;
}
}
else {
- assert(codestr[i] == NOP || codestr[i] == EXTENDED_ARG);
+ assert(_Py_OPCODE(codestr[i]) == NOP ||
+ _Py_OPCODE(codestr[i]) == EXTENDED_ARG);
}
}
}
/* Scans through EXTENDED ARGs, seeking the index of the effective opcode */
static Py_ssize_t
-find_op(unsigned char *codestr, Py_ssize_t i)
+find_op(const _Py_CODEUNIT *codestr, Py_ssize_t i)
{
- assert((i&1) == 0);
- while (codestr[i] == EXTENDED_ARG) {
- i += 2;
+ while (_Py_OPCODE(codestr[i]) == EXTENDED_ARG) {
+ i++;
}
return i;
}
@@ -106,27 +106,34 @@ find_op(unsigned char *codestr, Py_ssize
/* Given the index of the effective opcode,
scan back to construct the oparg with EXTENDED_ARG */
static unsigned int
-get_arg(unsigned char *codestr, Py_ssize_t i)
+get_arg(const _Py_CODEUNIT *codestr, Py_ssize_t i)
{
- unsigned int oparg = codestr[i+1];
- assert((i&1) == 0);
- if (i >= 2 && codestr[i-2] == EXTENDED_ARG) {
- oparg |= codestr[i-1] << 8;
- if (i >= 4 && codestr[i-4] == EXTENDED_ARG) {
- oparg |= codestr[i-3] << 16;
- if (i >= 6 && codestr[i-6] == EXTENDED_ARG) {
- oparg |= codestr[i-5] << 24;
+ _Py_CODEUNIT word;
+ unsigned int oparg = _Py_OPARG(codestr[i]);
+ if (i >= 1 && _Py_OPCODE(word = codestr[i-1]) == EXTENDED_ARG) {
+ oparg |= _Py_OPARG(word) << 8;
+ if (i >= 2 && _Py_OPCODE(word = codestr[i-2]) == EXTENDED_ARG) {
+ oparg |= _Py_OPARG(word) << 16;
+ if (i >= 3 && _Py_OPCODE(word = codestr[i-3]) == EXTENDED_ARG) {
+ oparg |= _Py_OPARG(word) << 24;
}
}
}
return oparg;
}
+/* Fill the region with NOPs. */
+static void
+fill_nops(_Py_CODEUNIT *codestr, Py_ssize_t start, Py_ssize_t end)
+{
+ memset(codestr + start, NOP, (end - start) * sizeof(_Py_CODEUNIT));
+}
+
/* Given the index of the effective opcode,
attempt to replace the argument, taking into account EXTENDED_ARG.
Returns -1 on failure, or the new op index on success */
static Py_ssize_t
-set_arg(unsigned char *codestr, Py_ssize_t i, unsigned int oparg)
+set_arg(_Py_CODEUNIT *codestr, Py_ssize_t i, unsigned int oparg)
{
unsigned int curarg = get_arg(codestr, i);
int curilen, newilen;
@@ -138,8 +145,8 @@ set_arg(unsigned char *codestr, Py_ssize
return -1;
}
- write_op_arg(codestr + i + 2 - curilen, codestr[i], oparg, newilen);
- memset(codestr + i + 2 - curilen + newilen, NOP, curilen - newilen);
+ write_op_arg(codestr + i + 1 - curilen, _Py_OPCODE(codestr[i]), oparg, newilen);
+ fill_nops(codestr, i + 1 - curilen + newilen, i + 1);
return i-curilen+newilen;
}
@@ -147,17 +154,16 @@ set_arg(unsigned char *codestr, Py_ssize
Preceding memory in the region is overwritten with NOPs.
Returns -1 on failure, op index on success */
static Py_ssize_t
-copy_op_arg(unsigned char *codestr, Py_ssize_t i, unsigned char op,
+copy_op_arg(_Py_CODEUNIT *codestr, Py_ssize_t i, unsigned char op,
unsigned int oparg, Py_ssize_t maxi)
{
int ilen = instrsize(oparg);
- assert((i&1) == 0);
if (i + ilen > maxi) {
return -1;
}
write_op_arg(codestr + maxi - ilen, op, oparg, ilen);
- memset(codestr + i, NOP, maxi - i - ilen);
- return maxi - 2;
+ fill_nops(codestr, i, maxi - ilen);
+ return maxi - 1;
}
/* Replace LOAD_CONST c1, LOAD_CONST c2 ... LOAD_CONST cn, BUILD_TUPLE n
@@ -170,7 +176,7 @@ copy_op_arg(unsigned char *codestr, Py_s
test; for BUILD_SET it assembles a frozenset rather than a tuple.
*/
static Py_ssize_t
-fold_tuple_on_constants(unsigned char *codestr, Py_ssize_t c_start,
+fold_tuple_on_constants(_Py_CODEUNIT *codestr, Py_ssize_t c_start,
Py_ssize_t opcode_end, unsigned char opcode,
PyObject *consts, PyObject **objs, int n)
{
@@ -222,7 +228,7 @@ fold_tuple_on_constants(unsigned char *c
becoming large in the presence of code like: (None,)*1000.
*/
static Py_ssize_t
-fold_binops_on_constants(unsigned char *codestr, Py_ssize_t c_start,
+fold_binops_on_constants(_Py_CODEUNIT *codestr, Py_ssize_t c_start,
Py_ssize_t opcode_end, unsigned char opcode,
PyObject *consts, PyObject **objs)
{
@@ -311,7 +317,7 @@ fold_binops_on_constants(unsigned char *
}
static Py_ssize_t
-fold_unaryops_on_constants(unsigned char *codestr, Py_ssize_t c_start,
+fold_unaryops_on_constants(_Py_CODEUNIT *codestr, Py_ssize_t c_start,
Py_ssize_t opcode_end, unsigned char opcode,
PyObject *consts, PyObject *v)
{
@@ -359,7 +365,7 @@ fold_unaryops_on_constants(unsigned char
}
static unsigned int *
-markblocks(unsigned char *code, Py_ssize_t len)
+markblocks(_Py_CODEUNIT *code, Py_ssize_t len)
{
unsigned int *blocks = PyMem_New(unsigned int, len);
int i, j, opcode, blockcnt = 0;
@@ -371,8 +377,8 @@ markblocks(unsigned char *code, Py_ssize
memset(blocks, 0, len*sizeof(int));
/* Mark labels in the first pass */
- for (i=0 ; i= 2 && codestr[op_start-2] == EXTENDED_ARG) {
- op_start -= 2;
+ while (op_start >= 1 && _Py_OPCODE(codestr[op_start-1]) == EXTENDED_ARG) {
+ op_start--;
}
- nexti = i + 2;
- while (nexti < codelen && codestr[nexti] == EXTENDED_ARG)
- nexti += 2;
- nextop = nexti < codelen ? codestr[nexti] : 0;
+ nexti = i + 1;
+ while (nexti < codelen && _Py_OPCODE(codestr[nexti]) == EXTENDED_ARG)
+ nexti++;
+ nextop = nexti < codelen ? _Py_OPCODE(codestr[nexti]) : 0;
if (!in_consts) {
CONST_STACK_RESET();
@@ -488,10 +496,10 @@ PyCode_Optimize(PyObject *code, PyObject
with POP_JUMP_IF_TRUE */
case UNARY_NOT:
if (nextop != POP_JUMP_IF_FALSE
- || !ISBASICBLOCK(blocks, op_start, i+2))
+ || !ISBASICBLOCK(blocks, op_start, i + 1))
break;
- memset(codestr + op_start, NOP, i - op_start + 2);
- codestr[nexti] = POP_JUMP_IF_TRUE;
+ fill_nops(codestr, op_start, i + 1);
+ codestr[nexti] = PACKOPARG(POP_JUMP_IF_TRUE, _Py_OPARG(codestr[nexti]));
break;
/* not a is b --> a is not b
@@ -503,10 +511,10 @@ PyCode_Optimize(PyObject *code, PyObject
j = get_arg(codestr, i);
if (j < 6 || j > 9 ||
nextop != UNARY_NOT ||
- !ISBASICBLOCK(blocks, op_start, i + 2))
+ !ISBASICBLOCK(blocks, op_start, i + 1))
break;
- codestr[i+1] = (j^1);
- memset(codestr + i + 2, NOP, nexti - i);
+ codestr[i] = PACKOPARG(opcode, j^1);
+ fill_nops(codestr, i + 1, nexti + 1);
break;
/* Skip over LOAD_CONST trueconst
@@ -515,10 +523,10 @@ PyCode_Optimize(PyObject *code, PyObject
case LOAD_CONST:
CONST_STACK_PUSH_OP(i);
if (nextop != POP_JUMP_IF_FALSE ||
- !ISBASICBLOCK(blocks, op_start, i + 2) ||
+ !ISBASICBLOCK(blocks, op_start, i + 1) ||
!PyObject_IsTrue(PyList_GET_ITEM(consts, get_arg(codestr, i))))
break;
- memset(codestr + op_start, NOP, nexti - op_start + 2);
+ fill_nops(codestr, op_start, nexti + 1);
CONST_STACK_POP(1);
break;
@@ -537,10 +545,10 @@ PyCode_Optimize(PyObject *code, PyObject
ISBASICBLOCK(blocks, h, op_start)) ||
((opcode == BUILD_LIST || opcode == BUILD_SET) &&
((nextop==COMPARE_OP &&
- (codestr[nexti+1]==6 ||
- codestr[nexti+1]==7)) ||
- nextop == GET_ITER) && ISBASICBLOCK(blocks, h, i + 2))) {
- h = fold_tuple_on_constants(codestr, h, i+2, opcode,
+ (_Py_OPARG(codestr[nexti]) == PyCmp_IN ||
+ _Py_OPARG(codestr[nexti]) == PyCmp_NOT_IN)) ||
+ nextop == GET_ITER) && ISBASICBLOCK(blocks, h, i + 1))) {
+ h = fold_tuple_on_constants(codestr, h, i + 1, opcode,
consts, CONST_STACK_LASTN(j), j);
if (h >= 0) {
CONST_STACK_POP(j);
@@ -550,23 +558,20 @@ PyCode_Optimize(PyObject *code, PyObject
}
}
if (nextop != UNPACK_SEQUENCE ||
- !ISBASICBLOCK(blocks, op_start, i + 2) ||
+ !ISBASICBLOCK(blocks, op_start, i + 1) ||
j != get_arg(codestr, nexti) ||
opcode == BUILD_SET)
break;
if (j < 2) {
- memset(codestr+op_start, NOP, nexti - op_start + 2);
+ fill_nops(codestr, op_start, nexti + 1);
} else if (j == 2) {
- codestr[op_start] = ROT_TWO;
- codestr[op_start + 1] = 0;
- memset(codestr + op_start + 2, NOP, nexti - op_start);
+ codestr[op_start] = PACKOPARG(ROT_TWO, 0);
+ fill_nops(codestr, op_start + 1, nexti + 1);
CONST_STACK_RESET();
} else if (j == 3) {
- codestr[op_start] = ROT_THREE;
- codestr[op_start + 1] = 0;
- codestr[op_start + 2] = ROT_TWO;
- codestr[op_start + 3] = 0;
- memset(codestr + op_start + 4, NOP, nexti - op_start - 2);
+ codestr[op_start] = PACKOPARG(ROT_THREE, 0);
+ codestr[op_start + 1] = PACKOPARG(ROT_TWO, 0);
+ fill_nops(codestr, op_start + 2, nexti + 1);
CONST_STACK_RESET();
}
break;
@@ -590,7 +595,7 @@ PyCode_Optimize(PyObject *code, PyObject
break;
h = lastn_const_start(codestr, op_start, 2);
if (ISBASICBLOCK(blocks, h, op_start)) {
- h = fold_binops_on_constants(codestr, h, i+2, opcode,
+ h = fold_binops_on_constants(codestr, h, i + 1, opcode,
consts, CONST_STACK_LASTN(2));
if (h >= 0) {
CONST_STACK_POP(2);
@@ -608,7 +613,7 @@ PyCode_Optimize(PyObject *code, PyObject
break;
h = lastn_const_start(codestr, op_start, 1);
if (ISBASICBLOCK(blocks, h, op_start)) {
- h = fold_unaryops_on_constants(codestr, h, i+2, opcode,
+ h = fold_unaryops_on_constants(codestr, h, i + 1, opcode,
consts, *CONST_STACK_LASTN(1));
if (h >= 0) {
CONST_STACK_POP(1);
@@ -628,15 +633,15 @@ PyCode_Optimize(PyObject *code, PyObject
x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_FALSE_OR_POP z
--> x:JUMP_IF_FALSE_OR_POP z
x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_TRUE_OR_POP z
- --> x:POP_JUMP_IF_FALSE y+2
- where y+2 is the instruction following the second test.
+ --> x:POP_JUMP_IF_FALSE y+1
+ where y+1 is the instruction following the second test.
*/
case JUMP_IF_FALSE_OR_POP:
case JUMP_IF_TRUE_OR_POP:
h = get_arg(codestr, i);
tgt = find_op(codestr, h);
- j = codestr[tgt];
+ j = _Py_OPCODE(codestr[tgt]);
if (CONDITIONAL_JUMP(j)) {
/* NOTE: all possible jumps here are
absolute! */
@@ -654,14 +659,14 @@ PyCode_Optimize(PyObject *code, PyObject
they're not taken (so change
the first jump to pop its
argument when it's taken). */
- h = set_arg(codestr, i, tgt + 2);
+ h = set_arg(codestr, i, tgt + 1);
j = opcode == JUMP_IF_TRUE_OR_POP ?
POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE;
}
if (h >= 0) {
nexti = h;
- codestr[nexti] = j;
+ codestr[nexti] = PACKOPARG(j, _Py_OPARG(codestr[nexti]));
break;
}
}
@@ -683,32 +688,31 @@ PyCode_Optimize(PyObject *code, PyObject
tgt = find_op(codestr, h);
/* Replace JUMP_* to a RETURN into just a RETURN */
if (UNCONDITIONAL_JUMP(opcode) &&
- codestr[tgt] == RETURN_VALUE) {
- codestr[op_start] = RETURN_VALUE;
- codestr[op_start + 1] = 0;
- memset(codestr + op_start + 2, NOP, i - op_start);
+ _Py_OPCODE(codestr[tgt]) == RETURN_VALUE) {
+ codestr[op_start] = PACKOPARG(RETURN_VALUE, 0);
+ fill_nops(codestr, op_start + 1, i + 1);
} else if (UNCONDITIONAL_JUMP(codestr[tgt])) {
j = GETJUMPTGT(codestr, tgt);
if (opcode == JUMP_FORWARD) { /* JMP_ABS can go backwards */
opcode = JUMP_ABSOLUTE;
} else if (!ABSOLUTE_JUMP(opcode)) {
- if ((Py_ssize_t)j < i + 2) {
+ if ((Py_ssize_t)j < i + 1) {
break; /* No backward relative jumps */
}
- j -= i + 2; /* Calc relative jump addr */
+ j -= i + 1; /* Calc relative jump addr */
}
- copy_op_arg(codestr, op_start, opcode, j, i+2);
+ copy_op_arg(codestr, op_start, opcode, j, i + 1);
}
break;
/* Remove unreachable ops after RETURN */
case RETURN_VALUE:
- h = i + 2;
- while (h + 2 < codelen && ISBASICBLOCK(blocks, i, h + 2)) {
- h += 2;
+ h = i + 1;
+ while (h + 1 < codelen && ISBASICBLOCK(blocks, i, h + 1)) {
+ h++;
}
- if (h > i + 2) {
- memset(codestr + i + 2, NOP, h - i);
+ if (h > i + 1) {
+ fill_nops(codestr, i + 1, h + 1);
nexti = find_op(codestr, h);
}
break;
@@ -716,19 +720,18 @@ PyCode_Optimize(PyObject *code, PyObject
}
/* Fixup lnotab */
- for (i=0, nops=0 ; i new code offset */
blocks[i] = i - nops;
- if (codestr[i] == NOP)
- nops += 2;
+ if (_Py_OPCODE(codestr[i]) == NOP)
+ nops++;
}
cum_orig_offset = 0;
last_offset = 0;
for (i=0 ; i < tabsiz ; i+=2) {
unsigned int offset_delta, new_offset;
cum_orig_offset += lnotab[i];
- assert((cum_orig_offset & 1) == 0);
new_offset = blocks[cum_orig_offset];
offset_delta = new_offset - last_offset;
assert(offset_delta <= 255);
@@ -737,13 +740,13 @@ PyCode_Optimize(PyObject *code, PyObject
}
/* Remove NOPs and fixup jump targets */
- for (op_start=0, i=0, h=0 ; i nexti)
goto exitUnchanged;
/* If instrsize(j) < nexti, we'll emit EXTENDED_ARG 0 */
@@ -777,7 +780,7 @@ PyCode_Optimize(PyObject *code, PyObject
CONST_STACK_DELETE();
PyMem_Free(blocks);
- code = PyBytes_FromStringAndSize((char *)codestr, h);
+ code = PyBytes_FromStringAndSize((char *)codestr, h * sizeof(_Py_CODEUNIT));
PyMem_Free(codestr);
return code;
diff -r b26d07812a8e Python/wordcode_helpers.h
--- a/Python/wordcode_helpers.h Wed May 25 20:35:44 2016 +0300
+++ b/Python/wordcode_helpers.h Thu May 26 14:07:27 2016 +0300
@@ -2,35 +2,38 @@
optimizer.
*/
-/* Minimum number of bytes necessary to encode instruction with EXTENDED_ARGs */
+#ifdef WORDS_BIGENDIAN
+#define PACKOPARG(opcode, oparg) ((unsigned short)(((opcode) << 8) | (oparg)))
+#else
+#define PACKOPARG(opcode, oparg) ((unsigned short)(((oparg) << 8) | (opcode)))
+#endif
+
+/* Minimum number of code units necessary to encode instruction with
+ EXTENDED_ARGs */
static int
instrsize(unsigned int oparg)
{
- return oparg <= 0xff ? 2 :
- oparg <= 0xffff ? 4 :
- oparg <= 0xffffff ? 6 :
- 8;
+ return oparg <= 0xff ? 1 :
+ oparg <= 0xffff ? 2 :
+ oparg <= 0xffffff ? 3 :
+ 4;
}
/* Spits out op/oparg pair using ilen bytes. codestr should be pointed at the
desired location of the first EXTENDED_ARG */
static void
-write_op_arg(unsigned char *codestr, unsigned char opcode,
+write_op_arg(unsigned short *codestr, unsigned char opcode,
unsigned int oparg, int ilen)
{
switch (ilen) {
- case 8:
- *codestr++ = EXTENDED_ARG;
- *codestr++ = (oparg >> 24) & 0xff;
- case 6:
- *codestr++ = EXTENDED_ARG;
- *codestr++ = (oparg >> 16) & 0xff;
case 4:
- *codestr++ = EXTENDED_ARG;
- *codestr++ = (oparg >> 8) & 0xff;
+ *codestr++ = PACKOPARG(EXTENDED_ARG, (oparg >> 24) & 0xff);
+ case 3:
+ *codestr++ = PACKOPARG(EXTENDED_ARG, (oparg >> 16) & 0xff);
case 2:
- *codestr++ = opcode;
- *codestr++ = oparg & 0xff;
+ *codestr++ = PACKOPARG(EXTENDED_ARG, (oparg >> 8) & 0xff);
+ case 1:
+ *codestr++ = PACKOPARG(opcode, oparg & 0xff);
break;
default:
assert(0);