diff options
author | Damien George <damien.p.george@gmail.com> | 2014-01-18 23:24:36 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-01-18 23:24:36 +0000 |
commit | 08335004cfe95048ee06134a3e49b9fb75639139 (patch) | |
tree | 7518a854012938fd70c57b3571a630a142b84f28 /py/objgenerator.c | |
parent | aefe79880f8c5f66132673ccc9be27d2ca29005b (diff) |
Add source file name and line number to error messages.
Byte code has a map from byte-code offset to source-code line number,
used to give better error messages.
Diffstat (limited to 'py/objgenerator.c')
-rw-r--r-- | py/objgenerator.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/py/objgenerator.c b/py/objgenerator.c index d58480f9e..2e8bd3d32 100644 --- a/py/objgenerator.c +++ b/py/objgenerator.c @@ -58,6 +58,7 @@ mp_obj_t mp_obj_new_gen_wrap(uint n_locals, uint n_stack, mp_obj_t fun) { typedef struct _mp_obj_gen_instance_t { mp_obj_base_t base; + const byte *code_info; const byte *ip; mp_obj_t *sp; uint n_state; @@ -74,7 +75,7 @@ mp_obj_t gen_instance_getiter(mp_obj_t self_in) { mp_obj_t gen_instance_iternext(mp_obj_t self_in) { mp_obj_gen_instance_t *self = self_in; - bool yield = mp_execute_byte_code_2(&self->ip, &self->state[self->n_state - 1], &self->sp); + bool yield = mp_execute_byte_code_2(self->code_info, &self->ip, &self->state[self->n_state - 1], &self->sp); if (yield) { return *self->sp; } else { @@ -98,6 +99,7 @@ const mp_obj_type_t gen_instance_type = { mp_obj_t mp_obj_new_gen_instance(const byte *bytecode, uint n_state, int n_args, const mp_obj_t *args) { mp_obj_gen_instance_t *o = m_new_obj_var(mp_obj_gen_instance_t, mp_obj_t, n_state); o->base.type = &gen_instance_type; + o->code_info = bytecode; o->ip = bytecode; o->sp = &o->state[0] - 1; // sp points to top of stack, which starts off 1 below the state o->n_state = n_state; @@ -111,6 +113,10 @@ mp_obj_t mp_obj_new_gen_instance(const byte *bytecode, uint n_state, int n_args, // prelude for making cells (closed over variables) // for now we just make sure there are no cells variables // need to work out how to implement closed over variables in generators + + // get code info size + machine_uint_t code_info_size = bytecode[0] | (bytecode[1] << 8) | (bytecode[2] << 16) | (bytecode[3] << 24); + o->ip += code_info_size; assert(o->ip[0] == 0); o->ip += 1; |