summaryrefslogtreecommitdiffstatshomepage
path: root/py/vm.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-04-12 18:20:40 +0100
committerDamien George <damien.p.george@gmail.com>2014-04-12 18:20:40 +0100
commit6ce427755112c28f8a7efab65d329205d833f623 (patch)
tree47b3b292e4472cc15996b745202dd98133e89feb /py/vm.c
parentc2803db010ab575e9387e4eaf2f8090b083b3c5f (diff)
downloadmicropython-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.c24
1 files changed, 8 insertions, 16 deletions
diff --git a/py/vm.c b/py/vm.c
index 1ea0c5eaa1..f62cb2d7b1 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -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;