diff options
| author | Damien <damien.p.george@gmail.com> | 2013-10-22 22:58:17 +0100 | 
|---|---|---|
| committer | Damien <damien.p.george@gmail.com> | 2013-10-22 22:58:17 +0100 | 
| commit | ec63cce470f943003c728fde049919dedd5b6a44 (patch) | |
| tree | b75142e32c60dba81a7b18ad6e5aa4a7b118922a /py | |
| parent | 92c06561a3e657924b77aa53725529daddafb343 (diff) | |
Add simple support for C modules.
Diffstat (limited to 'py')
| -rw-r--r-- | py/runtime.c | 18 | ||||
| -rw-r--r-- | py/runtime.h | 7 | 
2 files changed, 19 insertions, 6 deletions
| diff --git a/py/runtime.c b/py/runtime.c index a1c94930f..ce71025a8 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -1499,14 +1499,18 @@ no_attr:  void rt_store_attr(py_obj_t base, qstr attr, py_obj_t value) {      DEBUG_OP_printf("store attr %p.%s <- %p\n", base, qstr_str(attr), value); -    if (IS_O(base, O_OBJ)) { +    if (IS_O(base, O_CLASS)) { +        // TODO CPython allows STORE_ATTR to a class, but is this the correct implementation? +        py_obj_base_t *o = base; +        py_qstr_map_lookup(o->u_class.locals, attr, true)->value = value; +    } else if (IS_O(base, O_OBJ)) {          // logic: look in class locals (no add) then obj members (add) (TODO check this against CPython)          py_obj_base_t *o = base;          py_map_elem_t *elem = py_qstr_map_lookup(o->u_obj.class->u_class.locals, attr, false);          if (elem != NULL) {              elem->value = value;          } else { -            elem = py_qstr_map_lookup(o->u_obj.class->u_class.locals, attr, true)->value = value; +            py_qstr_map_lookup(o->u_obj.members, attr, true)->value = value;          }      } else {          printf("?AttributeError: '%s' object has no attribute '%s'\n", py_obj_get_type_str(base), qstr_str(attr)); @@ -1618,3 +1622,13 @@ void rt_f_vector(rt_fun_kind_t fun_kind) {      (rt_f_table[fun_kind])();  }  */ + +// temporary way of making C modules +// hack: use class to mimic a module + +py_obj_t py_module_new() { +    py_obj_base_t *o = m_new(py_obj_base_t, 1); +    o->kind = O_CLASS; +    o->u_class.locals = py_map_new(MAP_QSTR, 0); +    return o; +} diff --git a/py/runtime.h b/py/runtime.h index dc7ecc617..50de956b5 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -95,12 +95,10 @@ int rt_get_unique_code_id(bool is_main_module);  void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, int n_locals, int n_stack, bool is_generator);  void rt_assign_native_code(int unique_code_id, py_fun_t f, uint len, int n_args);  void rt_assign_inline_asm_code(int unique_code_id, py_fun_t f, uint len, int n_args); -py_fun_t rt_get_code(qstr id);  void py_obj_print(py_obj_t o);  int rt_is_true(py_obj_t arg);  int rt_get_int(py_obj_t arg);  py_obj_t rt_load_const_str(qstr qstr); -//py_obj_t rt_load_const_code(qstr qstr);  py_obj_t rt_load_name(qstr qstr);  py_obj_t rt_load_global(qstr qstr);  py_obj_t rt_load_build_class(); @@ -118,8 +116,6 @@ py_obj_t rt_call_function_0(py_obj_t fun);  py_obj_t rt_call_function_1(py_obj_t fun, py_obj_t arg);  py_obj_t rt_call_function_2(py_obj_t fun, py_obj_t arg1, py_obj_t arg2);  py_obj_t rt_call_function_n(py_obj_t fun, int n_args, const py_obj_t *args); -py_obj_t rt_call_method_1(py_obj_t fun, py_obj_t self); -py_obj_t rt_call_method_2(py_obj_t fun, py_obj_t self, py_obj_t arg);  py_obj_t rt_call_method_n(int n_args, const py_obj_t *args);  py_obj_t rt_build_tuple(int n_args, py_obj_t *items);  py_obj_t rt_build_list(int n_args, py_obj_t *items); @@ -134,3 +130,6 @@ void rt_store_attr(py_obj_t base, qstr attr, py_obj_t val);  void rt_store_subscr(py_obj_t base, py_obj_t index, py_obj_t val);  py_obj_t rt_getiter(py_obj_t o);  py_obj_t rt_iternext(py_obj_t o); + +// temporary way of making C modules +py_obj_t py_module_new(); | 
