From 76677270218fb5732296e4fe1a0acbe05c8f818c Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Tue, 5 May 2015 22:18:07 +0300 Subject: [PATCH] objsingleton: New home for Ellipsis and NotImplemented. Having NotImplemented as MP_OBJ_SENTINEL turned out to be problematic (it needs to be checked for in a lot of places, otherwise it'll crash as would pass MP_OBJ_IS_OBJ()), so made a proper singleton value like Ellipsis, both of them sharing the same type. --- py/modbuiltins.c | 2 +- py/obj.c | 8 ------- py/obj.h | 3 ++- py/objsingleton.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++ py/objslice.c | 21 ----------------- py/py.mk | 1 + 6 files changed, 61 insertions(+), 31 deletions(-) create mode 100644 py/objsingleton.c diff --git a/py/modbuiltins.c b/py/modbuiltins.c index 9b5bd4c5ed..1e91d43211 100644 --- a/py/modbuiltins.c +++ b/py/modbuiltins.c @@ -635,7 +635,7 @@ STATIC const mp_map_elem_t mp_module_builtins_globals_table[] = { // built-in objects { MP_OBJ_NEW_QSTR(MP_QSTR_Ellipsis), (mp_obj_t)&mp_const_ellipsis_obj }, #if MICROPY_PY_BUILTINS_NOTIMPLEMENTED - { MP_OBJ_NEW_QSTR(MP_QSTR_NotImplemented), MP_OBJ_SENTINEL }, + { MP_OBJ_NEW_QSTR(MP_QSTR_NotImplemented), (mp_obj_t)&mp_const_notimplemented_obj }, #endif // built-in user functions diff --git a/py/obj.c b/py/obj.c index 1928fad98f..81adbe3933 100644 --- a/py/obj.c +++ b/py/obj.c @@ -62,14 +62,6 @@ void mp_obj_print_helper(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t return; } #endif - - #if MICROPY_PY_BUILTINS_NOTIMPLEMENTED - if (o_in == MP_OBJ_SENTINEL) { - mp_printf(print, "%q", MP_QSTR_NotImplemented); - return; - } - #endif - mp_obj_type_t *type = mp_obj_get_type(o_in); if (type->print != NULL) { type->print((mp_print_t*)print, o_in, kind); diff --git a/py/obj.h b/py/obj.h index 11c0198bb9..c67c04a1e7 100644 --- a/py/obj.h +++ b/py/obj.h @@ -449,7 +449,8 @@ extern const struct _mp_obj_bool_t mp_const_false_obj; extern const struct _mp_obj_bool_t mp_const_true_obj; extern const struct _mp_obj_str_t mp_const_empty_bytes_obj; extern const struct _mp_obj_tuple_t mp_const_empty_tuple_obj; -extern const struct _mp_obj_ellipsis_t mp_const_ellipsis_obj; +extern const struct _mp_obj_singleton_t mp_const_ellipsis_obj; +extern const struct _mp_obj_singleton_t mp_const_notimplemented_obj; extern const struct _mp_obj_exception_t mp_const_MemoryError_obj; extern const struct _mp_obj_exception_t mp_const_GeneratorExit_obj; diff --git a/py/objsingleton.c b/py/objsingleton.c new file mode 100644 index 0000000000..23a5cd4d6e --- /dev/null +++ b/py/objsingleton.c @@ -0,0 +1,57 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2013, 2014 Damien P. George + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include + +#include "py/nlr.h" +#include "py/obj.h" +#include "py/runtime0.h" + +/******************************************************************************/ +/* singleton objects defined by Python */ + +typedef struct _mp_obj_singleton_t { + mp_obj_base_t base; + qstr name; +} mp_obj_singleton_t; + +STATIC void singleton_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { + (void)kind; + mp_obj_singleton_t *self = self_in; + mp_printf(print, "%q", self->name); +} + +const mp_obj_type_t mp_type_singleton = { + { &mp_type_type }, + .name = MP_QSTR_, + .print = singleton_print, +}; + +const mp_obj_singleton_t mp_const_ellipsis_obj = {{&mp_type_singleton}, MP_QSTR_Ellipsis}; +#if MICROPY_PY_BUILTINS_NOTIMPLEMENTED +const mp_obj_singleton_t mp_const_notimplemented_obj = {{&mp_type_singleton}, MP_QSTR_NotImplemented}; +#endif diff --git a/py/objslice.c b/py/objslice.c index 7983864b2c..5b99c992b6 100644 --- a/py/objslice.c +++ b/py/objslice.c @@ -31,27 +31,6 @@ #include "py/obj.h" #include "py/runtime0.h" -/******************************************************************************/ -/* ellipsis object, a singleton */ - -typedef struct _mp_obj_ellipsis_t { - mp_obj_base_t base; -} mp_obj_ellipsis_t; - -STATIC void ellipsis_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - (void)self_in; - (void)kind; - mp_print_str(print, "Ellipsis"); -} - -const mp_obj_type_t mp_type_ellipsis = { - { &mp_type_type }, - .name = MP_QSTR_Ellipsis, - .print = ellipsis_print, -}; - -const mp_obj_ellipsis_t mp_const_ellipsis_obj = {{&mp_type_ellipsis}}; - /******************************************************************************/ /* slice object */ diff --git a/py/py.mk b/py/py.mk index 5f9575d308..5ab2b3b138 100644 --- a/py/py.mk +++ b/py/py.mk @@ -82,6 +82,7 @@ PY_O_BASENAME = \ objrange.o \ objreversed.o \ objset.o \ + objsingleton.o \ objslice.o \ objstr.o \ objstrunicode.o \