From 7e4a2b0edca2953ae3dd19f9ad554739a9174c81 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sat, 7 Jun 2014 23:22:41 +0300 Subject: [PATCH 1/3] py: Add generic mp_not_implemented() func to use instead of assert(). Benefits: won't crash baremetal targets, will provide Python source location when not implemented feature used (it will no longer provide C source location, but just grep for error message). --- py/emitglue.c | 4 +++- py/runtime.c | 4 ++++ py/runtime.h | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/py/emitglue.c b/py/emitglue.c index a89ef6766a..732e4b5500 100644 --- a/py/emitglue.c +++ b/py/emitglue.c @@ -120,7 +120,9 @@ mp_obj_t mp_make_function_from_raw_code(mp_raw_code_t *rc, mp_obj_t def_args, mp assert(def_args == MP_OBJ_NULL || MP_OBJ_IS_TYPE(def_args, &mp_type_tuple)); // TODO implement default kw args - assert(def_kw_args == MP_OBJ_NULL); + if (def_kw_args != MP_OBJ_NULL) { + mp_not_implemented("Default values for kw-only args"); + } // make the function, depending on the raw code kind mp_obj_t fun; diff --git a/py/runtime.c b/py/runtime.c index cdbf99d4a5..179b48d327 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -1150,6 +1150,10 @@ void *m_malloc_fail(int num_bytes) { nlr_raise((mp_obj_t)&mp_const_MemoryError_obj); } +NORETURN void mp_not_implemented(const char *msg) { + nlr_raise(mp_obj_new_exception_msg(&mp_type_NotImplementedError, msg)); +} + // these must correspond to the respective enum void *const mp_fun_table[MP_F_NUMBER_OF] = { mp_load_const_int, diff --git a/py/runtime.h b/py/runtime.h index dbd413180b..fb61c01dd1 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -112,6 +112,9 @@ mp_obj_t mp_import_name(qstr name, mp_obj_t fromlist, mp_obj_t level); mp_obj_t mp_import_from(mp_obj_t module, qstr name); void mp_import_all(mp_obj_t module); +// Raise NotImplementedError with given message +NORETURN void mp_not_implemented(const char *msg); + extern struct _mp_obj_list_t mp_sys_path_obj; extern struct _mp_obj_list_t mp_sys_argv_obj; #define mp_sys_path ((mp_obj_t)&mp_sys_path_obj) From b9b9354e6c0cefff071be0bc4e195eb80f1f1d96 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sat, 7 Jun 2014 23:40:04 +0300 Subject: [PATCH 2/3] modsys: Add optional support for sys.platform. Ports which wants to have it, should define MICROPY_PY_SYS_PLATFORM to a string value they need. --- py/modsys.c | 6 ++++++ py/qstrdefs.h | 3 +++ unix/mpconfigport.h | 1 + 3 files changed, 10 insertions(+) diff --git a/py/modsys.c b/py/modsys.c index 738758bdf4..a99db1b7f8 100644 --- a/py/modsys.c +++ b/py/modsys.c @@ -51,6 +51,9 @@ mp_obj_list_t mp_sys_argv_obj; STATIC const mp_obj_tuple_t mp_sys_version_info_obj = {{&mp_type_tuple}, 3, {I(3), I(4), I(0)}}; #undef I STATIC const MP_DEFINE_STR_OBJ(version_obj, "3.4.0"); +#ifdef MICROPY_PY_SYS_PLATFORM +STATIC const MP_DEFINE_STR_OBJ(platform_obj, MICROPY_PY_SYS_PLATFORM); +#endif STATIC const mp_map_elem_t mp_module_sys_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_sys) }, @@ -59,6 +62,9 @@ STATIC const mp_map_elem_t mp_module_sys_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_argv), (mp_obj_t)&mp_sys_argv_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_version), (mp_obj_t)&version_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_version_info), (mp_obj_t)&mp_sys_version_info_obj }, +#ifdef MICROPY_PY_SYS_PLATFORM + { MP_OBJ_NEW_QSTR(MP_QSTR_platform), (mp_obj_t)&platform_obj }, +#endif #if MP_ENDIANNESS_LITTLE { MP_OBJ_NEW_QSTR(MP_QSTR_byteorder), MP_OBJ_NEW_QSTR(MP_QSTR_little) }, #else diff --git a/py/qstrdefs.h b/py/qstrdefs.h index 69182f2809..ae358b99af 100644 --- a/py/qstrdefs.h +++ b/py/qstrdefs.h @@ -343,6 +343,9 @@ Q(byteorder) Q(big) Q(exit) Q(little) +#ifdef MICROPY_PY_SYS_PLATFORM +Q(platform) +#endif Q(stdin) Q(stdout) Q(stderr) diff --git a/unix/mpconfigport.h b/unix/mpconfigport.h index ace7a419b4..bf2cf73efd 100644 --- a/unix/mpconfigport.h +++ b/unix/mpconfigport.h @@ -43,6 +43,7 @@ #define MICROPY_OPT_COMPUTED_GOTO (1) #define MICROPY_PY_BUILTINS_FROZENSET (1) #define MICROPY_PY_SYS_EXIT (1) +#define MICROPY_PY_SYS_PLATFORM "linux" #define MICROPY_PY_SYS_STDFILES (1) #define MICROPY_PY_CMATH (1) #define MICROPY_PY_IO_FILEIO (1) From 5473f743f37e12921f4acb11fa84fe0d2b9d0650 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sun, 8 Jun 2014 00:01:46 +0300 Subject: [PATCH 3/3] objtype: Enable __lt__ method support for instances. --- py/objtype.c | 6 +++--- py/qstrdefs.h | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/py/objtype.c b/py/objtype.c index dfe5eaa8f0..0d6674c33d 100644 --- a/py/objtype.c +++ b/py/objtype.c @@ -336,9 +336,9 @@ STATIC const qstr binary_op_method_name[] = { MP_BINARY_OP_INPLACE_FLOOR_DIVIDE, MP_BINARY_OP_INPLACE_TRUE_DIVIDE, MP_BINARY_OP_INPLACE_MODULO, - MP_BINARY_OP_INPLACE_POWER, - MP_BINARY_OP_LESS, - MP_BINARY_OP_MORE, + MP_BINARY_OP_INPLACE_POWER,*/ + [MP_BINARY_OP_LESS] = MP_QSTR___lt__, + /*MP_BINARY_OP_MORE, MP_BINARY_OP_EQUAL, MP_BINARY_OP_LESS_EQUAL, MP_BINARY_OP_MORE_EQUAL, diff --git a/py/qstrdefs.h b/py/qstrdefs.h index ae358b99af..521d4399a5 100644 --- a/py/qstrdefs.h +++ b/py/qstrdefs.h @@ -60,6 +60,7 @@ Q(__str__) Q(__getattr__) Q(__del__) Q(__call__) +Q(__lt__) Q(micropython) Q(bytecode)