Created
August 31, 2018 17:21
-
-
Save notro/e18fd3c43819e51f378ddc735c038c72 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/ports/atmel-samd/mpconfigport.h b/ports/atmel-samd/mpconfigport.h | |
index 576325461..bb86e060e 100644 | |
--- a/ports/atmel-samd/mpconfigport.h | |
+++ b/ports/atmel-samd/mpconfigport.h | |
@@ -21,7 +21,7 @@ | |
#define MICROPY_COMP_DOUBLE_TUPLE_ASSIGN (1) | |
#define MICROPY_COMP_TRIPLE_TUPLE_ASSIGN (1) | |
// Turn off for consistency | |
-#define MICROPY_CPYTHON_COMPAT (0) | |
+#define MICROPY_CPYTHON_COMPAT (1) | |
#define MICROPY_MEM_STATS (0) | |
#define MICROPY_DEBUG_PRINTERS (0) | |
#define MICROPY_ENABLE_GC (1) | |
@@ -54,6 +54,7 @@ | |
#define MICROPY_PY_ARRAY (1) | |
#define MICROPY_PY_ATTRTUPLE (1) | |
#define MICROPY_PY_COLLECTIONS (1) | |
+#define MICROPY_PY_COLLECTIONS_ORDEREDDICT (1) | |
#define MICROPY_PY_DESCRIPTORS (1) | |
#define MICROPY_PY_MATH (0) | |
#define MICROPY_PY_CMATH (0) | |
@@ -63,6 +64,7 @@ | |
#define MICROPY_PY_STRUCT (0) | |
#define MICROPY_PY_SYS (1) | |
#define MICROPY_PY_SYS_MAXSIZE (1) | |
+#define MICROPY_PY_SYS_EXC_INFO (1) | |
#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_FLOAT) | |
#define MICROPY_FLOAT_HIGH_QUALITY_HASH (1) | |
#define MICROPY_STREAMS_NON_BLOCK (1) | |
@@ -84,7 +86,7 @@ | |
#define MICROPY_VFS (1) | |
#define MICROPY_VFS_FAT (1) | |
#define MICROPY_PY_MACHINE (1) | |
-#define MICROPY_MODULE_WEAK_LINKS (0) | |
+#define MICROPY_MODULE_WEAK_LINKS (1) | |
#define MICROPY_REPL_AUTO_INDENT (1) | |
#define MICROPY_HW_ENABLE_DAC (1) | |
#define MICROPY_ENABLE_FINALISER (1) | |
@@ -282,6 +284,10 @@ extern const struct _mp_obj_module_t usb_hid_module; | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_supervisor), (mp_obj_t)&supervisor_module }, \ | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, \ | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_usb_hid),(mp_obj_t)&usb_hid_module }, | |
+ | |
+#define MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS \ | |
+ { MP_ROM_QSTR(MP_QSTR_collections), MP_ROM_PTR(&mp_module_collections) }, \ | |
+ | |
#else | |
#define MICROPY_PORT_BUILTIN_MODULES \ | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module }, \ | |
@@ -290,7 +296,7 @@ extern const struct _mp_obj_module_t usb_hid_module; | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_digitalio), (mp_obj_t)&digitalio_module }, \ | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_microcontroller), (mp_obj_t)µcontroller_module }, \ | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_neopixel_write),(mp_obj_t)&neopixel_write_module }, \ | |
- { MP_OBJ_NEW_QSTR(MP_QSTR_os), (mp_obj_t)&os_module }, \ | |
+ { MP_OBJ_NEW_QSTR(MP_QSTR__os), (mp_obj_t)&os_module }, \ | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_pulseio), (mp_obj_t)&pulseio_module }, \ | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_random), (mp_obj_t)&random_module }, \ | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_rtc), (mp_obj_t)&rtc_module }, \ | |
@@ -299,10 +305,18 @@ extern const struct _mp_obj_module_t usb_hid_module; | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_struct), (mp_obj_t)&struct_module }, \ | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_supervisor), (mp_obj_t)&supervisor_module }, \ | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_math), (mp_obj_t)&math_module }, \ | |
- { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, \ | |
+ { MP_OBJ_NEW_QSTR(MP_QSTR__time), (mp_obj_t)&time_module }, \ | |
{ MP_OBJ_NEW_QSTR(MP_QSTR_usb_hid),(mp_obj_t)&usb_hid_module }, \ | |
TOUCHIO_MODULE \ | |
EXTRA_BUILTIN_MODULES | |
+ | |
+#define MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS \ | |
+ { MP_ROM_QSTR(MP_QSTR_collections), MP_ROM_PTR(&mp_module_collections) }, \ | |
+ { MP_ROM_QSTR(MP_QSTR_os), MP_ROM_PTR(&os_module) }, \ | |
+ { MP_ROM_QSTR(MP_QSTR_re), MP_ROM_PTR(&mp_module_ure) }, \ | |
+ { MP_ROM_QSTR(MP_QSTR_sys), MP_ROM_PTR(&mp_module_sys) }, \ | |
+ { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, \ | |
+ | |
#endif | |
#define MICROPY_PORT_BUILTIN_DEBUG_MODULES \ | |
diff --git a/py/builtinimport.c b/py/builtinimport.c | |
old mode 100755 | |
new mode 100644 | |
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..7334a67cd 100644 | |
--- a/py/objboundmeth.c | |
+++ b/py/objboundmeth.c | |
@@ -103,6 +103,7 @@ STATIC const mp_obj_type_t mp_type_bound_meth = { | |
.print = bound_meth_print, | |
#endif | |
.call = bound_meth_call, | |
+ .unary_op = mp_generic_unary_op, | |
#if MICROPY_PY_FUNCTION_ATTRS | |
.attr = bound_meth_attr, | |
#endif | |
diff --git a/py/objclosure.c b/py/objclosure.c | |
index 4eb9eb8b8..b1fce3033 100644 | |
--- a/py/objclosure.c | |
+++ b/py/objclosure.c | |
@@ -85,6 +85,7 @@ const mp_obj_type_t closure_type = { | |
.print = closure_print, | |
#endif | |
.call = closure_call, | |
+ .unary_op = mp_generic_unary_op, | |
}; | |
mp_obj_t mp_obj_new_closure(mp_obj_t fun, size_t n_closed_over, const mp_obj_t *closed) { | |
diff --git a/py/objexcept.c b/py/objexcept.c | |
index 8bd6245a4..dd736074e 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,163 @@ void mp_obj_exception_get_traceback(mp_obj_t self_in, size_t *n, size_t **values | |
*values = self->traceback_data; | |
} | |
} | |
+ | |
+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, // T_INT | |
+ MP_QSTR_co_kwonlyargcount, // T_INT | |
+ MP_QSTR_co_nlocals, // T_INT | |
+ MP_QSTR_co_stacksize, // T_INT | |
+ MP_QSTR_co_flags, // T_INT | |
+ MP_QSTR_co_code, // T_OBJECT | |
+ MP_QSTR_co_consts, // T_OBJECT | |
+ MP_QSTR_co_names, // T_OBJECT | |
+ MP_QSTR_co_varnames, // T_OBJECT | |
+ MP_QSTR_co_freevars, // T_OBJECT | |
+ MP_QSTR_co_cellvars, // T_OBJECT | |
+ MP_QSTR_co_filename, // T_OBJECT | |
+ MP_QSTR_co_name, // T_OBJECT | |
+ MP_QSTR_co_firstlineno, // T_INT | |
+ MP_QSTR_co_lnotab, // T_OBJECT | |
+ }, | |
+}; | |
+ | |
+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); | |
+} | |
+ | |
+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, | |
+ }, | |
+}; | |
+ | |
+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); | |
+} | |
+ | |
+const mp_obj_namedtuple_type_t traceback_type_obj = { | |
+ .base = { | |
+ .base = { | |
+ .type = &mp_type_type | |
+ }, | |
+ .name = MP_QSTR_traceback, | |
+ .print = namedtuple_print, | |
+ //.make_new = struct_time_make_new, | |
+ .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, | |
+ }, | |
+}; | |
+ | |
+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; | |
+} | |
diff --git a/py/objmodule.c b/py/objmodule.c | |
index 828f556f3..8a8ec9855 100644 | |
--- a/py/objmodule.c | |
+++ b/py/objmodule.c | |
@@ -151,7 +151,7 @@ STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = { | |
{ MP_ROM_QSTR(MP_QSTR_uio), MP_ROM_PTR(&mp_module_io) }, | |
#endif | |
#if MICROPY_PY_COLLECTIONS | |
- { MP_ROM_QSTR(MP_QSTR_collections), MP_ROM_PTR(&mp_module_collections) }, | |
+ { MP_ROM_QSTR(MP_QSTR__collections), MP_ROM_PTR(&mp_module_collections) }, | |
#endif | |
#if MICROPY_PY_STRUCT | |
{ MP_ROM_QSTR(MP_QSTR_ustruct), MP_ROM_PTR(&mp_module_ustruct) }, | |
@@ -166,7 +166,7 @@ STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = { | |
#endif | |
#endif | |
#if MICROPY_PY_SYS | |
- { MP_ROM_QSTR(MP_QSTR_sys), MP_ROM_PTR(&mp_module_sys) }, | |
+ { MP_ROM_QSTR(MP_QSTR__sys), MP_ROM_PTR(&mp_module_sys) }, | |
#endif | |
#if MICROPY_PY_GC && MICROPY_ENABLE_GC | |
{ MP_ROM_QSTR(MP_QSTR_gc), MP_ROM_PTR(&mp_module_gc) }, |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment