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.
diff --git a/py/objgenerator.c b/py/objgenerator.c
index d58480f..2e8bd3d 100644
--- a/py/objgenerator.c
+++ b/py/objgenerator.c
@@ -58,6 +58,7 @@
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_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 @@
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 @@
// 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;