Skip to content

Instantly share code, notes, and snippets.

@notro
Created August 31, 2018 17:21
Show Gist options
  • Save notro/e18fd3c43819e51f378ddc735c038c72 to your computer and use it in GitHub Desktop.
Save notro/e18fd3c43819e51f378ddc735c038c72 to your computer and use it in GitHub Desktop.
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)&microcontroller_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