summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--py/bc0.h1
-rw-r--r--py/compile.c27
-rw-r--r--py/emit.h4
-rw-r--r--py/emitbc.c8
-rw-r--r--py/emitcpy.c9
-rw-r--r--py/emitnative.c10
-rw-r--r--py/nativeglue.c1
-rw-r--r--py/runtime.c7
-rw-r--r--py/runtime.h4
-rw-r--r--py/runtime0.h1
-rw-r--r--py/showbc.c7
-rw-r--r--py/vm.c6
-rw-r--r--py/vmentrytable.h1
-rw-r--r--tests/cmdline/cmd_showbc.py.exp166
14 files changed, 111 insertions, 141 deletions
diff --git a/py/bc0.h b/py/bc0.h
index 0a2d9092f9..c5a3015541 100644
--- a/py/bc0.h
+++ b/py/bc0.h
@@ -33,7 +33,6 @@
#define MP_BC_LOAD_CONST_NONE (0x11)
#define MP_BC_LOAD_CONST_TRUE (0x12)
#define MP_BC_LOAD_CONST_SMALL_INT (0x14) // signed var-int
-#define MP_BC_LOAD_CONST_BYTES (0x15) // qstr
#define MP_BC_LOAD_CONST_STRING (0x16) // qstr
#define MP_BC_LOAD_CONST_OBJ (0x17) // ptr
#define MP_BC_LOAD_NULL (0x18)
diff --git a/py/compile.c b/py/compile.c
index 45217cfe99..141cd2db99 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -1078,7 +1078,7 @@ STATIC void compile_funcdef_param(compiler_t *comp, mp_parse_node_t pn) {
if (comp->have_star) {
comp->num_dict_params += 1;
#if MICROPY_EMIT_CPYTHON
- EMIT_ARG(load_const_str, MP_PARSE_NODE_LEAF_ARG(pn_id), false);
+ EMIT_ARG(load_const_str, MP_PARSE_NODE_LEAF_ARG(pn_id));
compile_node(comp, pn_equal);
#else
// in Micro Python we put the default dict parameters into a dictionary using the bytecode
@@ -1096,7 +1096,7 @@ STATIC void compile_funcdef_param(compiler_t *comp, mp_parse_node_t pn) {
// compile value then key, then store it to the dict
compile_node(comp, pn_equal);
- EMIT_ARG(load_const_str, MP_PARSE_NODE_LEAF_ARG(pn_id), false);
+ EMIT_ARG(load_const_str, MP_PARSE_NODE_LEAF_ARG(pn_id));
EMIT(store_map);
#endif
} else {
@@ -1178,7 +1178,7 @@ STATIC qstr compile_classdef_helper(compiler_t *comp, mp_parse_node_struct_t *pn
close_over_variables_etc(comp, cscope, 0, 0);
// get its name
- EMIT_ARG(load_const_str, cscope->simple_name, false);
+ EMIT_ARG(load_const_str, cscope->simple_name);
// nodes[1] has parent classes, if any
// empty parenthesis (eg class C():) gets here as an empty PN_classdef_2 and needs special handling
@@ -1553,7 +1553,7 @@ STATIC void compile_import_from(compiler_t *comp, mp_parse_node_struct_t *pns) {
#if MICROPY_EMIT_CPYTHON
EMIT_ARG(load_const_verbatim_strn, "('*',)", 6);
#else
- EMIT_ARG(load_const_str, MP_QSTR__star_, false);
+ EMIT_ARG(load_const_str, MP_QSTR__star_);
EMIT_ARG(build_tuple, 1);
#endif
@@ -1597,7 +1597,7 @@ STATIC void compile_import_from(compiler_t *comp, mp_parse_node_struct_t *pns) {
assert(MP_PARSE_NODE_IS_STRUCT_KIND(pn_nodes[i], PN_import_as_name));
mp_parse_node_struct_t *pns3 = (mp_parse_node_struct_t*)pn_nodes[i];
qstr id2 = MP_PARSE_NODE_LEAF_ARG(pns3->nodes[0]); // should be id
- EMIT_ARG(load_const_str, id2, false);
+ EMIT_ARG(load_const_str, id2);
}
EMIT_ARG(build_tuple, n);
#endif
@@ -2531,7 +2531,7 @@ STATIC void compile_trailer_paren_helper(compiler_t *comp, mp_parse_node_t pn_ar
compile_syntax_error(comp, (mp_parse_node_t)pns_arg, "LHS of keyword arg must be an id");
return;
}
- EMIT_ARG(load_const_str, MP_PARSE_NODE_LEAF_ARG(pns_arg->nodes[0]), false);
+ EMIT_ARG(load_const_str, MP_PARSE_NODE_LEAF_ARG(pns_arg->nodes[0]));
compile_node(comp, pns2->nodes[0]);
n_keyword += 1;
} else {
@@ -2979,8 +2979,17 @@ STATIC void compile_node(compiler_t *comp, mp_parse_node_t pn) {
mp_uint_t arg = MP_PARSE_NODE_LEAF_ARG(pn);
switch (MP_PARSE_NODE_LEAF_KIND(pn)) {
case MP_PARSE_NODE_ID: compile_load_id(comp, arg); break;
- case MP_PARSE_NODE_STRING: EMIT_ARG(load_const_str, arg, false); break;
- case MP_PARSE_NODE_BYTES: EMIT_ARG(load_const_str, arg, true); break;
+ case MP_PARSE_NODE_STRING: EMIT_ARG(load_const_str, arg); break;
+ case MP_PARSE_NODE_BYTES:
+ // only create and load the actual bytes object on the last pass
+ if (comp->pass != MP_PASS_EMIT) {
+ EMIT_ARG(load_const_obj, mp_const_none);
+ } else {
+ mp_uint_t len;
+ const byte *data = qstr_data(arg, &len);
+ EMIT_ARG(load_const_obj, mp_obj_new_bytes(data, len));
+ }
+ break;
case MP_PARSE_NODE_TOKEN: default:
if (arg == MP_TOKEN_NEWLINE) {
// this can occur when file_input lets through a NEWLINE (eg if file starts with a newline)
@@ -3367,7 +3376,7 @@ STATIC void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) {
compile_load_id(comp, MP_QSTR___name__);
compile_store_id(comp, MP_QSTR___module__);
- EMIT_ARG(load_const_str, MP_PARSE_NODE_LEAF_ARG(pns->nodes[0]), false); // 0 is class name
+ EMIT_ARG(load_const_str, MP_PARSE_NODE_LEAF_ARG(pns->nodes[0])); // 0 is class name
compile_store_id(comp, MP_QSTR___qualname__);
check_for_doc_string(comp, pns->nodes[2]);
diff --git a/py/emit.h b/py/emit.h
index 35ba08db9e..8b980c1023 100644
--- a/py/emit.h
+++ b/py/emit.h
@@ -84,7 +84,7 @@ typedef struct _emit_method_table_t {
void (*import_star)(emit_t *emit);
void (*load_const_tok)(emit_t *emit, mp_token_kind_t tok);
void (*load_const_small_int)(emit_t *emit, mp_int_t arg);
- void (*load_const_str)(emit_t *emit, qstr qst, bool bytes);
+ void (*load_const_str)(emit_t *emit, qstr qst);
void (*load_const_obj)(emit_t *emit, void *obj);
void (*load_null)(emit_t *emit);
void (*load_attr)(emit_t *emit, qstr qst);
@@ -212,7 +212,7 @@ void mp_emit_bc_import_from(emit_t *emit, qstr qst);
void mp_emit_bc_import_star(emit_t *emit);
void mp_emit_bc_load_const_tok(emit_t *emit, mp_token_kind_t tok);
void mp_emit_bc_load_const_small_int(emit_t *emit, mp_int_t arg);
-void mp_emit_bc_load_const_str(emit_t *emit, qstr qst, bool bytes);
+void mp_emit_bc_load_const_str(emit_t *emit, qstr qst);
void mp_emit_bc_load_const_obj(emit_t *emit, void *obj);
void mp_emit_bc_load_null(emit_t *emit);
void mp_emit_bc_load_attr(emit_t *emit, qstr qst);
diff --git a/py/emitbc.c b/py/emitbc.c
index f99e703220..fef9054c75 100644
--- a/py/emitbc.c
+++ b/py/emitbc.c
@@ -486,13 +486,9 @@ void mp_emit_bc_load_const_small_int(emit_t *emit, mp_int_t arg) {
}
}
-void mp_emit_bc_load_const_str(emit_t *emit, qstr qst, bool bytes) {
+void mp_emit_bc_load_const_str(emit_t *emit, qstr qst) {
emit_bc_pre(emit, 1);
- if (bytes) {
- emit_write_bytecode_byte_qstr(emit, MP_BC_LOAD_CONST_BYTES, qst);
- } else {
- emit_write_bytecode_byte_qstr(emit, MP_BC_LOAD_CONST_STRING, qst);
- }
+ emit_write_bytecode_byte_qstr(emit, MP_BC_LOAD_CONST_STRING, qst);
}
void mp_emit_bc_load_const_obj(emit_t *emit, void *obj) {
diff --git a/py/emitcpy.c b/py/emitcpy.c
index dc96c529fb..3bdec1716d 100644
--- a/py/emitcpy.c
+++ b/py/emitcpy.c
@@ -176,7 +176,7 @@ STATIC void emit_cpy_load_const_small_int(emit_t *emit, mp_int_t arg) {
}
}
-STATIC void print_quoted_str(qstr qst, bool bytes) {
+STATIC void print_quoted_str(qstr qst) {
const char *str = qstr_str(qst);
int len = strlen(str);
bool has_single_quote = false;
@@ -188,9 +188,6 @@ STATIC void print_quoted_str(qstr qst, bool bytes) {
has_double_quote = true;
}
}
- if (bytes) {
- printf("b");
- }
int quote_char = '\'';
if (has_single_quote && !has_double_quote) {
quote_char = '"';
@@ -213,11 +210,11 @@ STATIC void print_quoted_str(qstr qst, bool bytes) {
printf("%c", quote_char);
}
-STATIC void emit_cpy_load_const_str(emit_t *emit, qstr qst, bool bytes) {
+STATIC void emit_cpy_load_const_str(emit_t *emit, qstr qst) {
emit_pre(emit, 1, 3);
if (emit->pass == MP_PASS_EMIT) {
printf("LOAD_CONST ");
- print_quoted_str(qst, bytes);
+ print_quoted_str(qst);
printf("\n");
}
}
diff --git a/py/emitnative.c b/py/emitnative.c
index 974b8fc7b5..0d3f78da4e 100644
--- a/py/emitnative.c
+++ b/py/emitnative.c
@@ -167,7 +167,6 @@
STATIC byte mp_f_n_args[MP_F_NUMBER_OF] = {
[MP_F_CONVERT_OBJ_TO_NATIVE] = 2,
[MP_F_CONVERT_NATIVE_TO_OBJ] = 2,
- [MP_F_LOAD_CONST_BYTES] = 1,
[MP_F_LOAD_NAME] = 1,
[MP_F_LOAD_GLOBAL] = 1,
[MP_F_LOAD_BUILD_CLASS] = 0,
@@ -1295,7 +1294,7 @@ STATIC void emit_native_load_const_small_int(emit_t *emit, mp_int_t arg) {
}
}
-STATIC void emit_native_load_const_str(emit_t *emit, qstr qst, bool bytes) {
+STATIC void emit_native_load_const_str(emit_t *emit, qstr qst) {
emit_native_pre(emit);
// TODO: Eventually we want to be able to work with raw pointers in viper to
// do native array access. For now we just load them as any other object.
@@ -1308,12 +1307,7 @@ STATIC void emit_native_load_const_str(emit_t *emit, qstr qst, bool bytes) {
} else
*/
{
- if (bytes) {
- emit_call_with_imm_arg(emit, MP_F_LOAD_CONST_BYTES, qst, REG_ARG_1);
- emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET);
- } else {
- emit_post_push_imm(emit, VTYPE_PYOBJ, (mp_uint_t)MP_OBJ_NEW_QSTR(qst));
- }
+ emit_post_push_imm(emit, VTYPE_PYOBJ, (mp_uint_t)MP_OBJ_NEW_QSTR(qst));
}
}
diff --git a/py/nativeglue.c b/py/nativeglue.c
index 4252bb88cd..87213710cf 100644
--- a/py/nativeglue.c
+++ b/py/nativeglue.c
@@ -92,7 +92,6 @@ void mp_native_raise(mp_obj_t o) {
void *const mp_fun_table[MP_F_NUMBER_OF] = {
mp_convert_obj_to_native,
mp_convert_native_to_obj,
- mp_load_const_bytes,
mp_load_name,
mp_load_global,
mp_load_build_class,
diff --git a/py/runtime.c b/py/runtime.c
index 5fcfa6f905..fb592920b4 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -104,13 +104,6 @@ void mp_deinit(void) {
#endif
}
-mp_obj_t mp_load_const_bytes(qstr qst) {
- DEBUG_OP_printf("load b'%s'\n", qstr_str(qst));
- mp_uint_t len;
- const byte *data = qstr_data(qst, &len);
- return mp_obj_new_bytes(data, len);
-}
-
mp_obj_t mp_load_name(qstr qst) {
// logic: search locals, globals, builtins
DEBUG_OP_printf("load name %s\n", qstr_str(qst));
diff --git a/py/runtime.h b/py/runtime.h
index 419b1d059b..2282ea02cc 100644
--- a/py/runtime.h
+++ b/py/runtime.h
@@ -88,10 +88,6 @@ void mp_delete_global(qstr qst);
mp_obj_t mp_unary_op(mp_uint_t op, mp_obj_t arg);
mp_obj_t mp_binary_op(mp_uint_t op, mp_obj_t lhs, mp_obj_t rhs);
-mp_obj_t mp_load_const_int(qstr qst);
-mp_obj_t mp_load_const_dec(qstr qst);
-mp_obj_t mp_load_const_bytes(qstr qst);
-
mp_obj_t mp_call_function_0(mp_obj_t fun);
mp_obj_t mp_call_function_1(mp_obj_t fun, mp_obj_t arg);
mp_obj_t mp_call_function_2(mp_obj_t fun, mp_obj_t arg1, mp_obj_t arg2);
diff --git a/py/runtime0.h b/py/runtime0.h
index de637fb469..294c17bf62 100644
--- a/py/runtime0.h
+++ b/py/runtime0.h
@@ -109,7 +109,6 @@ typedef enum {
typedef enum {
MP_F_CONVERT_OBJ_TO_NATIVE = 0,
MP_F_CONVERT_NATIVE_TO_OBJ,
- MP_F_LOAD_CONST_BYTES,
MP_F_LOAD_NAME,
MP_F_LOAD_GLOBAL,
MP_F_LOAD_BUILD_CLASS,
diff --git a/py/showbc.c b/py/showbc.c
index e08140e6b6..2da8d3febe 100644
--- a/py/showbc.c
+++ b/py/showbc.c
@@ -155,11 +155,6 @@ const byte *mp_bytecode_print_str(const byte *ip) {
break;
}
- case MP_BC_LOAD_CONST_BYTES:
- DECODE_QSTR;
- printf("LOAD_CONST_BYTES %s", qstr_str(qst));
- break;
-
case MP_BC_LOAD_CONST_STRING:
DECODE_QSTR;
printf("LOAD_CONST_STRING '%s'", qstr_str(qst));
@@ -168,7 +163,7 @@ const byte *mp_bytecode_print_str(const byte *ip) {
case MP_BC_LOAD_CONST_OBJ:
DECODE_PTR;
printf("LOAD_CONST_OBJ %p=", (void*)unum);
- mp_obj_print((mp_obj_t)unum, PRINT_REPR);
+ mp_obj_print_helper(&mp_plat_print, (mp_obj_t)unum, PRINT_REPR);
break;
case MP_BC_LOAD_NULL:
diff --git a/py/vm.c b/py/vm.c
index 3423e9e5c5..08749af21b 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -205,12 +205,6 @@ dispatch_loop:
DISPATCH();
}
- ENTRY(MP_BC_LOAD_CONST_BYTES): {
- DECODE_QSTR;
- PUSH(mp_load_const_bytes(qst));
- DISPATCH();
- }
-
ENTRY(MP_BC_LOAD_CONST_STRING): {
DECODE_QSTR;
PUSH(MP_OBJ_NEW_QSTR(qst));
diff --git a/py/vmentrytable.h b/py/vmentrytable.h
index 413914b6ef..d71a8d4f6f 100644
--- a/py/vmentrytable.h
+++ b/py/vmentrytable.h
@@ -35,7 +35,6 @@ static void* entry_table[256] = {
[MP_BC_LOAD_CONST_NONE] = &&entry_MP_BC_LOAD_CONST_NONE,
[MP_BC_LOAD_CONST_TRUE] = &&entry_MP_BC_LOAD_CONST_TRUE,
[MP_BC_LOAD_CONST_SMALL_INT] = &&entry_MP_BC_LOAD_CONST_SMALL_INT,
- [MP_BC_LOAD_CONST_BYTES] = &&entry_MP_BC_LOAD_CONST_BYTES,
[MP_BC_LOAD_CONST_STRING] = &&entry_MP_BC_LOAD_CONST_STRING,
[MP_BC_LOAD_CONST_OBJ] = &&entry_MP_BC_LOAD_CONST_OBJ,
[MP_BC_LOAD_NULL] = &&entry_MP_BC_LOAD_NULL,
diff --git a/tests/cmdline/cmd_showbc.py.exp b/tests/cmdline/cmd_showbc.py.exp
index fc3d85f9da..10be688388 100644
--- a/tests/cmdline/cmd_showbc.py.exp
+++ b/tests/cmdline/cmd_showbc.py.exp
@@ -72,89 +72,89 @@ arg names:
43 STORE_FAST 3
44 LOAD_CONST_STRING 'a'
47 STORE_FAST 4
-48 LOAD_CONST_BYTES a
-51 STORE_FAST 5
-52 LOAD_CONST_SMALL_INT 1
-53 STORE_FAST 6
-54 LOAD_CONST_SMALL_INT 2
-55 STORE_FAST 7
-56 LOAD_FAST 0
-57 LOAD_DEREF 14
-59 BINARY_OP 5 __add__
-60 STORE_FAST 8
-61 LOAD_FAST 0
-62 UNARY_OP 4
-63 STORE_FAST 9
-64 LOAD_FAST 0
-65 UNARY_OP 0
-66 NOT
-67 STORE_FAST 10
-68 LOAD_FAST 0
-69 LOAD_DEREF 14
-71 DUP_TOP
-72 ROT_THREE
-73 BINARY_OP 27 __eq__
-74 JUMP_IF_FALSE_OR_POP 82
-77 LOAD_FAST 1
-78 BINARY_OP 27 __eq__
-79 JUMP 84
-82 ROT_TWO
-83 POP_TOP
-84 STORE_FAST 10
-85 LOAD_FAST 0
-86 LOAD_DEREF 14
-88 BINARY_OP 27 __eq__
-89 JUMP_IF_FALSE_OR_POP 96
-92 LOAD_DEREF 14
-94 LOAD_FAST 1
-95 BINARY_OP 27 __eq__
-96 UNARY_OP 0
-97 NOT
-98 STORE_FAST 10
-99 LOAD_DEREF 14
-101 LOAD_ATTR c (cache=0)
-105 STORE_FAST 11
-106 LOAD_FAST 11
-107 LOAD_DEREF 14
-109 STORE_ATTR c (cache=0)
-113 LOAD_DEREF 14
-115 LOAD_CONST_SMALL_INT 0
-116 LOAD_SUBSCR
-117 STORE_FAST 12
-118 LOAD_FAST 12
-119 LOAD_DEREF 14
-121 LOAD_CONST_SMALL_INT 0
-122 STORE_SUBSCR
-123 LOAD_DEREF 14
-125 LOAD_CONST_NONE
-126 LOAD_CONST_NONE
-127 BUILD_SLICE 2
-129 LOAD_SUBSCR
-130 STORE_FAST 0
-131 LOAD_FAST 1
-132 UNPACK_SEQUENCE 2
-134 STORE_FAST 0
-135 STORE_DEREF 14
-137 LOAD_DEREF 14
-139 LOAD_FAST 0
-140 ROT_TWO
-141 STORE_FAST 0
-142 STORE_DEREF 14
-144 LOAD_FAST 1
-145 LOAD_DEREF 14
-147 LOAD_FAST 0
-148 ROT_THREE
-149 ROT_TWO
-150 STORE_FAST 0
-151 STORE_DEREF 14
-153 STORE_FAST 1
-154 DELETE_FAST 0
-156 LOAD_FAST 0
-157 STORE_GLOBAL gl
-160 DELETE_GLOBAL gl
-163 LOAD_FAST 14
-164 LOAD_FAST 15
-165 MAKE_CLOSURE \.\+ 2
+48 LOAD_CONST_OBJ \.\+
+\\d\+ STORE_FAST 5
+\\d\+ LOAD_CONST_SMALL_INT 1
+\\d\+ STORE_FAST 6
+\\d\+ LOAD_CONST_SMALL_INT 2
+\\d\+ STORE_FAST 7
+\\d\+ LOAD_FAST 0
+\\d\+ LOAD_DEREF 14
+\\d\+ BINARY_OP 5 __add__
+\\d\+ STORE_FAST 8
+\\d\+ LOAD_FAST 0
+\\d\+ UNARY_OP 4
+\\d\+ STORE_FAST 9
+\\d\+ LOAD_FAST 0
+\\d\+ UNARY_OP 0
+\\d\+ NOT
+\\d\+ STORE_FAST 10
+\\d\+ LOAD_FAST 0
+\\d\+ LOAD_DEREF 14
+\\d\+ DUP_TOP
+\\d\+ ROT_THREE
+\\d\+ BINARY_OP 27 __eq__
+\\d\+ JUMP_IF_FALSE_OR_POP \\d\+
+\\d\+ LOAD_FAST 1
+\\d\+ BINARY_OP 27 __eq__
+\\d\+ JUMP \\d\+
+\\d\+ ROT_TWO
+\\d\+ POP_TOP
+\\d\+ STORE_FAST 10
+\\d\+ LOAD_FAST 0
+\\d\+ LOAD_DEREF 14
+\\d\+ BINARY_OP 27 __eq__
+\\d\+ JUMP_IF_FALSE_OR_POP \\d\+
+\\d\+ LOAD_DEREF 14
+\\d\+ LOAD_FAST 1
+\\d\+ BINARY_OP 27 __eq__
+\\d\+ UNARY_OP 0
+\\d\+ NOT
+\\d\+ STORE_FAST 10
+\\d\+ LOAD_DEREF 14
+\\d\+ LOAD_ATTR c (cache=0)
+\\d\+ STORE_FAST 11
+\\d\+ LOAD_FAST 11
+\\d\+ LOAD_DEREF 14
+\\d\+ STORE_ATTR c (cache=0)
+\\d\+ LOAD_DEREF 14
+\\d\+ LOAD_CONST_SMALL_INT 0
+\\d\+ LOAD_SUBSCR
+\\d\+ STORE_FAST 12
+\\d\+ LOAD_FAST 12
+\\d\+ LOAD_DEREF 14
+\\d\+ LOAD_CONST_SMALL_INT 0
+\\d\+ STORE_SUBSCR
+\\d\+ LOAD_DEREF 14
+\\d\+ LOAD_CONST_NONE
+\\d\+ LOAD_CONST_NONE
+\\d\+ BUILD_SLICE 2
+\\d\+ LOAD_SUBSCR
+\\d\+ STORE_FAST 0
+\\d\+ LOAD_FAST 1
+\\d\+ UNPACK_SEQUENCE 2
+\\d\+ STORE_FAST 0
+\\d\+ STORE_DEREF 14
+\\d\+ LOAD_DEREF 14
+\\d\+ LOAD_FAST 0
+\\d\+ ROT_TWO
+\\d\+ STORE_FAST 0
+\\d\+ STORE_DEREF 14
+\\d\+ LOAD_FAST 1
+\\d\+ LOAD_DEREF 14
+\\d\+ LOAD_FAST 0
+\\d\+ ROT_THREE
+\\d\+ ROT_TWO
+\\d\+ STORE_FAST 0
+\\d\+ STORE_DEREF 14
+\\d\+ STORE_FAST 1
+\\d\+ DELETE_FAST 0
+\\d\+ LOAD_FAST 0
+\\d\+ STORE_GLOBAL gl
+\\d\+ DELETE_GLOBAL gl
+\\d\+ LOAD_FAST 14
+\\d\+ LOAD_FAST 15
+\\d\+ MAKE_CLOSURE \.\+ 2
\\d\+ LOAD_FAST 2
\\d\+ GET_ITER
\\d\+ CALL_FUNCTION n=1 nkw=0