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/vm.c | |
parent | c2803db010ab575e9387e4eaf2f8090b083b3c5f (diff) | |
download | micropython-6ce427755112c28f8a7efab65d329205d833f623.tar.gz micropython-6ce427755112c28f8a7efab65d329205d833f623.zip |
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/vm.c')
-rw-r--r-- | py/vm.c | 24 |
1 files changed, 8 insertions, 16 deletions
@@ -252,25 +252,21 @@ dispatch_loop: break; case MP_BC_LOAD_FAST_0: - PUSH(fastn[0]); - break; + obj1 = fastn[0]; + goto load_check; case MP_BC_LOAD_FAST_1: - PUSH(fastn[-1]); - break; + obj1 = fastn[-1]; + goto load_check; case MP_BC_LOAD_FAST_2: - PUSH(fastn[-2]); - break; + obj1 = fastn[-2]; + goto load_check; case MP_BC_LOAD_FAST_N: DECODE_UINT; - PUSH(fastn[-unum]); - break; - - case MP_BC_LOAD_FAST_CHECKED: - DECODE_UINT; obj1 = fastn[-unum]; + load_check: if (obj1 == MP_OBJ_NULL) { local_name_error: nlr_raise(mp_obj_new_exception_msg(&mp_type_NameError, "local variable referenced before assignment")); @@ -281,11 +277,7 @@ dispatch_loop: case MP_BC_LOAD_DEREF: DECODE_UINT; obj1 = mp_obj_cell_get(fastn[-unum]); - if (obj1 == MP_OBJ_NULL) { - goto local_name_error; - } - PUSH(obj1); - break; + goto load_check; case MP_BC_LOAD_NAME: DECODE_QSTR; |