summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2018-11-07 14:12:22 -0500
committerDan Halbert <halbert@halwitz.org>2018-11-07 14:12:22 -0500
commit64d457dad9bb3843ee468136022996ecb91a98df (patch)
treec3bfee81668dbd842039c178222fda9df77a9b76 /py
parent4bc24c4f6084e414f0fb00299aae7d7cfdb76aba (diff)
parent283e07254e9eb50e52d6f07b7ac177feeef02d83 (diff)
bring bleio PR up to date
Diffstat (limited to 'py')
-rw-r--r--[-rwxr-xr-x]py/builtinimport.c10
-rw-r--r--py/mkenv.mk2
-rw-r--r--py/mkrules.mk2
-rw-r--r--py/modsys.c2
-rw-r--r--py/obj.h1
-rw-r--r--py/objboundmeth.c3
-rw-r--r--py/objexcept.c162
7 files changed, 173 insertions, 9 deletions
diff --git a/py/builtinimport.c b/py/builtinimport.c
index fee875b60..6ed0a7594 100755..100644
--- a/py/builtinimport.c
+++ b/py/builtinimport.c
@@ -155,11 +155,9 @@ STATIC void do_load_from_lexer(mp_obj_t module_obj, mp_lexer_t *lex) {
#endif
#if MICROPY_PERSISTENT_CODE_LOAD || MICROPY_MODULE_FROZEN_MPY
-STATIC void do_execute_raw_code(mp_obj_t module_obj, mp_raw_code_t *raw_code) {
+STATIC void do_execute_raw_code(mp_obj_t module_obj, mp_raw_code_t *raw_code, const char *filename) {
#if MICROPY_PY___FILE__
- // TODO
- //qstr source_name = lex->source_name;
- //mp_store_attr(module_obj, MP_QSTR___file__, MP_OBJ_NEW_QSTR(source_name));
+ mp_store_attr(module_obj, MP_QSTR___file__, MP_OBJ_NEW_QSTR(qstr_from_str(filename)));
#endif
// execute the module in its context
@@ -222,7 +220,7 @@ STATIC void do_load(mp_obj_t module_obj, vstr_t *file) {
// its data) in the list of frozen files, execute it.
#if MICROPY_MODULE_FROZEN_MPY
if (frozen_type == MP_FROZEN_MPY) {
- do_execute_raw_code(module_obj, modref);
+ do_execute_raw_code(module_obj, modref, file_str);
return;
}
#endif
@@ -235,7 +233,7 @@ STATIC void do_load(mp_obj_t module_obj, vstr_t *file) {
#if MICROPY_PERSISTENT_CODE_LOAD
if (file_str[file->len - 3] == 'm') {
mp_raw_code_t *raw_code = mp_raw_code_load_file(file_str);
- do_execute_raw_code(module_obj, raw_code);
+ do_execute_raw_code(module_obj, raw_code, file_str);
return;
}
#endif
diff --git a/py/mkenv.mk b/py/mkenv.mk
index facb8a3c2..b76dd60f8 100644
--- a/py/mkenv.mk
+++ b/py/mkenv.mk
@@ -72,7 +72,7 @@ endif
MAKE_FROZEN = $(PYTHON) $(TOP)/tools/make-frozen.py
MPY_CROSS = $(TOP)/mpy-cross/mpy-cross
-MPY_TOOL = $(PYTHON) $(TOP)/tools/mpy-tool.py
+MPY_TOOL = $(PYTHON3) $(TOP)/tools/mpy-tool.py
PREPROCESS_FROZEN_MODULES = PYTHONPATH=$(TOP)/tools/python-semver $(TOP)/tools/preprocess_frozen_modules.py
all:
diff --git a/py/mkrules.mk b/py/mkrules.mk
index e619f2bdd..aa94ba412 100644
--- a/py/mkrules.mk
+++ b/py/mkrules.mk
@@ -130,7 +130,7 @@ xargs -n1 "$(abspath $(MPY_CROSS))" $(MPY_CROSS_FLAGS)
# to build frozen_mpy.c from all .mpy files
# You need to define MPY_TOOL_LONGINT_IMPL in mpconfigport.mk
# if the default will not work (mpz is the default).
-$(BUILD)/frozen_mpy.c: $(BUILD)/frozen_mpy $(BUILD)/genhdr/qstrdefs.generated.h
+$(BUILD)/frozen_mpy.c: $(BUILD)/frozen_mpy $(BUILD)/genhdr/qstrdefs.generated.h $(TOP)/tools/mpy-tool.py
$(STEPECHO) "Creating $@"
$(Q)$(MPY_TOOL) $(MPY_TOOL_LONGINT_IMPL) -f -q $(BUILD)/genhdr/qstrdefs.preprocessed.h $(shell $(FIND) -L $(BUILD)/frozen_mpy -type f -name '*.mpy') > $@
endif
diff --git a/py/modsys.c b/py/modsys.c
index e32841923..68e048d91 100644
--- a/py/modsys.c
+++ b/py/modsys.c
@@ -135,7 +135,7 @@ STATIC mp_obj_t mp_sys_exc_info(void) {
t->items[0] = MP_OBJ_FROM_PTR(mp_obj_get_type(cur_exc));
t->items[1] = cur_exc;
- t->items[2] = mp_const_none;
+ t->items[2] = mp_obj_exception_get_traceback_obj(cur_exc);
return MP_OBJ_FROM_PTR(t);
}
MP_DEFINE_CONST_FUN_OBJ_0(mp_sys_exc_info_obj, mp_sys_exc_info);
diff --git a/py/obj.h b/py/obj.h
index 59cce0836..8b6772873 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -717,6 +717,7 @@ bool mp_obj_exception_match(mp_obj_t exc, mp_const_obj_t exc_type);
void mp_obj_exception_clear_traceback(mp_obj_t self_in);
void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, size_t line, qstr block);
void mp_obj_exception_get_traceback(mp_obj_t self_in, size_t *n, size_t **values);
+mp_obj_t mp_obj_exception_get_traceback_obj(mp_obj_t self_in);
mp_obj_t mp_obj_exception_get_value(mp_obj_t self_in);
mp_obj_t mp_obj_exception_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args);
mp_obj_t mp_alloc_emergency_exception_buf(mp_obj_t size_in);
diff --git a/py/objboundmeth.c b/py/objboundmeth.c
index b0df6a68a..a05680d41 100644
--- a/py/objboundmeth.c
+++ b/py/objboundmeth.c
@@ -92,6 +92,9 @@ STATIC void bound_meth_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
if (attr == MP_QSTR___name__) {
mp_obj_bound_meth_t *o = MP_OBJ_TO_PTR(self_in);
dest[0] = MP_OBJ_NEW_QSTR(mp_obj_fun_get_name(o->meth));
+ } else if (attr == MP_QSTR___func__) {
+ mp_obj_bound_meth_t *o = MP_OBJ_TO_PTR(self_in);
+ dest[0] = o->meth;
}
}
#endif
diff --git a/py/objexcept.c b/py/objexcept.c
index 8bd6245a4..1ddc2174e 100644
--- a/py/objexcept.c
+++ b/py/objexcept.c
@@ -30,6 +30,7 @@
#include <stdio.h>
#include "py/objlist.h"
+#include "py/objnamedtuple.h"
#include "py/objstr.h"
#include "py/objtuple.h"
#include "py/objtype.h"
@@ -531,3 +532,164 @@ void mp_obj_exception_get_traceback(mp_obj_t self_in, size_t *n, size_t **values
*values = self->traceback_data;
}
}
+
+#if MICROPY_PY_SYS_EXC_INFO
+STATIC const mp_obj_namedtuple_type_t code_type_obj = {
+ .base = {
+ .base = {
+ .type = &mp_type_type
+ },
+ .name = MP_QSTR_code,
+ .print = namedtuple_print,
+ .make_new = namedtuple_make_new,
+ .unary_op = mp_obj_tuple_unary_op,
+ .binary_op = mp_obj_tuple_binary_op,
+ .attr = namedtuple_attr,
+ .subscr = mp_obj_tuple_subscr,
+ .getiter = mp_obj_tuple_getiter,
+ .parent = &mp_type_tuple,
+ },
+ .n_fields = 15,
+ .fields = {
+ MP_QSTR_co_argcount,
+ MP_QSTR_co_kwonlyargcount,
+ MP_QSTR_co_nlocals,
+ MP_QSTR_co_stacksize,
+ MP_QSTR_co_flags,
+ MP_QSTR_co_code,
+ MP_QSTR_co_consts,
+ MP_QSTR_co_names,
+ MP_QSTR_co_varnames,
+ MP_QSTR_co_freevars,
+ MP_QSTR_co_cellvars,
+ MP_QSTR_co_filename,
+ MP_QSTR_co_name,
+ MP_QSTR_co_firstlineno,
+ MP_QSTR_co_lnotab,
+ },
+};
+
+STATIC mp_obj_t code_make_new(qstr file, qstr block) {
+ mp_obj_t elems[15] = {
+ mp_obj_new_int(0), // co_argcount
+ mp_obj_new_int(0), // co_kwonlyargcount
+ mp_obj_new_int(0), // co_nlocals
+ mp_obj_new_int(0), // co_stacksize
+ mp_obj_new_int(0), // co_flags
+ mp_obj_new_bytearray(0, NULL), // co_code
+ mp_obj_new_tuple(0, NULL), // co_consts
+ mp_obj_new_tuple(0, NULL), // co_names
+ mp_obj_new_tuple(0, NULL), // co_varnames
+ mp_obj_new_tuple(0, NULL), // co_freevars
+ mp_obj_new_tuple(0, NULL), // co_cellvars
+ MP_OBJ_NEW_QSTR(file), // co_filename
+ MP_OBJ_NEW_QSTR(block), // co_name
+ mp_obj_new_int(1), // co_firstlineno
+ mp_obj_new_bytearray(0, NULL), // co_lnotab
+ };
+
+ return namedtuple_make_new((const mp_obj_type_t*)&code_type_obj, 15, 0, elems);
+}
+
+STATIC const mp_obj_namedtuple_type_t frame_type_obj = {
+ .base = {
+ .base = {
+ .type = &mp_type_type
+ },
+ .name = MP_QSTR_frame,
+ .print = namedtuple_print,
+ .make_new = namedtuple_make_new,
+ .unary_op = mp_obj_tuple_unary_op,
+ .binary_op = mp_obj_tuple_binary_op,
+ .attr = namedtuple_attr,
+ .subscr = mp_obj_tuple_subscr,
+ .getiter = mp_obj_tuple_getiter,
+ .parent = &mp_type_tuple,
+ },
+ .n_fields = 8,
+ .fields = {
+ MP_QSTR_f_back,
+ MP_QSTR_f_builtins,
+ MP_QSTR_f_code,
+ MP_QSTR_f_globals,
+ MP_QSTR_f_lasti,
+ MP_QSTR_f_lineno,
+ MP_QSTR_f_locals,
+ MP_QSTR_f_trace,
+ },
+};
+
+STATIC mp_obj_t frame_make_new(mp_obj_t f_code, int f_lineno) {
+ mp_obj_t elems[8] = {
+ mp_const_none, // f_back
+ mp_obj_new_dict(0), // f_builtins
+ f_code, // f_code
+ mp_obj_new_dict(0), // f_globals
+ mp_obj_new_int(0), // f_lasti
+ mp_obj_new_int(f_lineno), // f_lineno
+ mp_obj_new_dict(0), // f_locals
+ mp_const_none, // f_trace
+ };
+
+ return namedtuple_make_new((const mp_obj_type_t*)&frame_type_obj, 8, 0, elems);
+}
+
+STATIC const mp_obj_namedtuple_type_t traceback_type_obj = {
+ .base = {
+ .base = {
+ .type = &mp_type_type
+ },
+ .name = MP_QSTR_traceback,
+ .print = namedtuple_print,
+ .make_new = namedtuple_make_new,
+ .unary_op = mp_obj_tuple_unary_op,
+ .binary_op = mp_obj_tuple_binary_op,
+ .attr = namedtuple_attr,
+ .subscr = mp_obj_tuple_subscr,
+ .getiter = mp_obj_tuple_getiter,
+ .parent = &mp_type_tuple,
+ },
+ .n_fields = 4,
+ .fields = {
+ MP_QSTR_tb_frame,
+ MP_QSTR_tb_lasti,
+ MP_QSTR_tb_lineno,
+ MP_QSTR_tb_next,
+ },
+};
+
+STATIC mp_obj_t traceback_from_values(size_t *values, mp_obj_t tb_next) {
+ int lineno = values[1];
+
+ mp_obj_t elems[4] = {
+ frame_make_new(code_make_new(values[0], values[2]), lineno),
+ mp_obj_new_int(0),
+ mp_obj_new_int(lineno),
+ tb_next,
+ };
+
+ return namedtuple_make_new((const mp_obj_type_t*)&traceback_type_obj, 4, 0, elems);
+};
+
+mp_obj_t mp_obj_exception_get_traceback_obj(mp_obj_t self_in) {
+ mp_obj_exception_t *self = MP_OBJ_TO_PTR(self_in);
+
+ if (!mp_obj_is_exception_instance(self)) {
+ return mp_const_none;
+ }
+
+ size_t n, *values;
+ mp_obj_exception_get_traceback(self, &n, &values);
+ if (n == 0) {
+ return mp_const_none;
+ }
+
+ mp_obj_t tb_next = mp_const_none;
+
+ for (size_t i = 0; i < n; i += 3) {
+ tb_next = traceback_from_values(&values[i], tb_next);
+ }
+
+ return tb_next;
+}
+#endif