diff options
| author | Damien George <damien.p.george@gmail.com> | 2014-04-12 18:20:40 +0100 |
|---|---|---|
| committer | Damien George <damien.p.george@gmail.com> | 2014-04-12 18:20:40 +0100 |
| commit | 6ce427755112c28f8a7efab65d329205d833f623 (patch) | |
| tree | 47b3b292e4472cc15996b745202dd98133e89feb /py/emitbc.c | |
| parent | c2803db010ab575e9387e4eaf2f8090b083b3c5f (diff) | |
py: Make all LOAD_FAST ops check for unbound local.
This is necessary to catch all cases where locals are referenced before
assignment. We still keep the _0, _1, _2 versions of LOAD_FAST to help
reduced the byte code size in RAM.
Addresses issue #457.
Diffstat (limited to 'py/emitbc.c')
| -rw-r--r-- | py/emitbc.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/py/emitbc.c b/py/emitbc.c index a1179a695..d1d59ef4a 100644 --- a/py/emitbc.c +++ b/py/emitbc.c @@ -413,17 +413,11 @@ STATIC void emit_bc_load_null(emit_t *emit) { STATIC void emit_bc_load_fast(emit_t *emit, qstr qstr, uint id_flags, int local_num) { assert(local_num >= 0); emit_bc_pre(emit, 1); - if (id_flags & ID_FLAG_IS_DELETED) { - // This local may be deleted, so need to do a checked load. - emit_write_byte_code_byte_uint(emit, MP_BC_LOAD_FAST_CHECKED, local_num); - } else { - // This local is never deleted, so can do a fast, uncheched load. - switch (local_num) { - case 0: emit_write_byte_code_byte(emit, MP_BC_LOAD_FAST_0); break; - case 1: emit_write_byte_code_byte(emit, MP_BC_LOAD_FAST_1); break; - case 2: emit_write_byte_code_byte(emit, MP_BC_LOAD_FAST_2); break; - default: emit_write_byte_code_byte_uint(emit, MP_BC_LOAD_FAST_N, local_num); break; - } + switch (local_num) { + case 0: emit_write_byte_code_byte(emit, MP_BC_LOAD_FAST_0); break; + case 1: emit_write_byte_code_byte(emit, MP_BC_LOAD_FAST_1); break; + case 2: emit_write_byte_code_byte(emit, MP_BC_LOAD_FAST_2); break; + default: emit_write_byte_code_byte_uint(emit, MP_BC_LOAD_FAST_N, local_num); break; } } |
