blob: 71301dcc4a0d5510e20b5b2a45aa5af09be0b6b3 [file] [log] [blame]
Damien George04b91472014-05-03 23:27:38 +01001/*
Alexander Steffen55f33242017-06-30 09:22:17 +02002 * This file is part of the MicroPython project, http://micropython.org/
Damien George04b91472014-05-03 23:27:38 +01003 *
4 * The MIT License (MIT)
5 *
6 * Copyright (c) 2013, 2014 Damien P. George
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 * THE SOFTWARE.
25 */
26
Damien George3ec0a1a2014-03-22 21:31:28 +000027#include <stdlib.h>
28
Damien George47b98092015-05-03 23:23:18 +010029#include "py/objtype.h"
Damien George50149a52015-01-20 14:11:27 +000030#include "py/runtime.h"
Damien George3ec0a1a2014-03-22 21:31:28 +000031
32typedef struct _mp_obj_object_t {
33 mp_obj_base_t base;
34} mp_obj_object_t;
35
Damien George5b3f0b72016-01-03 15:55:55 +000036STATIC mp_obj_t object_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
Damien Georgeff8dd3f2015-01-20 12:47:20 +000037 (void)args;
Damien George50149a52015-01-20 14:11:27 +000038 mp_arg_check_num(n_args, n_kw, 0, 0, false);
Damien George3ec0a1a2014-03-22 21:31:28 +000039 mp_obj_object_t *o = m_new_obj(mp_obj_object_t);
Damien George5b3f0b72016-01-03 15:55:55 +000040 o->base.type = type;
Damien George999cedb2015-11-27 17:01:44 +000041 return MP_OBJ_FROM_PTR(o);
Damien George3ec0a1a2014-03-22 21:31:28 +000042}
43
Paul Sokolovskya8408a82014-05-21 22:24:36 +030044#if MICROPY_CPYTHON_COMPAT
Paul Sokolovsky0c937fa2014-05-21 23:10:48 +030045STATIC mp_obj_t object___init__(mp_obj_t self) {
Damien Georgeff8dd3f2015-01-20 12:47:20 +000046 (void)self;
Paul Sokolovskya8408a82014-05-21 22:24:36 +030047 return mp_const_none;
48}
49STATIC MP_DEFINE_CONST_FUN_OBJ_1(object___init___obj, object___init__);
Paul Sokolovsky806ea1f2014-05-22 00:32:00 +030050
51STATIC mp_obj_t object___new__(mp_obj_t cls) {
Damien Georgeeee1e882019-01-30 18:49:52 +110052 if (!mp_obj_is_type(cls, &mp_type_type) || !mp_obj_is_instance_type((mp_obj_type_t*)MP_OBJ_TO_PTR(cls))) {
Yonatan Goldschmidt07ccb552019-12-09 18:31:35 +020053 mp_raise_TypeError("arg must be user-type");
Damien George47b98092015-05-03 23:23:18 +010054 }
Damien Georgec78ef922017-12-12 15:22:03 +110055 // This executes only "__new__" part of instance creation.
56 // TODO: This won't work well for classes with native bases.
57 // TODO: This is a hack, should be resolved along the lines of
58 // https://github.com/micropython/micropython/issues/606#issuecomment-43685883
59 const mp_obj_type_t *native_base;
60 return MP_OBJ_FROM_PTR(mp_obj_new_instance(MP_OBJ_TO_PTR(cls), &native_base));
Paul Sokolovsky806ea1f2014-05-22 00:32:00 +030061}
62STATIC MP_DEFINE_CONST_FUN_OBJ_1(object___new___fun_obj, object___new__);
Damien Georgecbf76742015-11-27 13:38:15 +000063STATIC MP_DEFINE_CONST_STATICMETHOD_OBJ(object___new___obj, MP_ROM_PTR(&object___new___fun_obj));
Paul Sokolovskya8408a82014-05-21 22:24:36 +030064
Yonatan Goldschmidt07ccb552019-12-09 18:31:35 +020065#if MICROPY_PY_DELATTR_SETATTR
66STATIC mp_obj_t object___setattr__(mp_obj_t self_in, mp_obj_t attr, mp_obj_t value) {
Damien George1f499ad2019-12-27 22:43:35 +110067 if (!mp_obj_is_instance_type(mp_obj_get_type(self_in))) {
Yonatan Goldschmidt07ccb552019-12-09 18:31:35 +020068 mp_raise_TypeError("arg must be user-type");
69 }
70
71 if (!mp_obj_is_str(attr)) {
72 mp_raise_TypeError(NULL);
73 }
74
75 mp_obj_instance_t *self = MP_OBJ_TO_PTR(self_in);
76 mp_map_lookup(&self->members, attr, MP_MAP_LOOKUP_ADD_IF_NOT_FOUND)->value = value;
77 return mp_const_none;
78}
79STATIC MP_DEFINE_CONST_FUN_OBJ_3(object___setattr___obj, object___setattr__);
Yonatan Goldschmidt42e45bd2019-12-10 12:05:22 +020080
81STATIC mp_obj_t object___delattr__(mp_obj_t self_in, mp_obj_t attr) {
Damien George1f499ad2019-12-27 22:43:35 +110082 if (!mp_obj_is_instance_type(mp_obj_get_type(self_in))) {
Yonatan Goldschmidt42e45bd2019-12-10 12:05:22 +020083 mp_raise_TypeError("arg must be user-type");
84 }
85
86 if (!mp_obj_is_str(attr)) {
87 mp_raise_TypeError(NULL);
88 }
89
90 mp_obj_instance_t *self = MP_OBJ_TO_PTR(self_in);
91 if (mp_map_lookup(&self->members, attr, MP_MAP_LOOKUP_REMOVE_IF_FOUND) == NULL) {
92 mp_raise_msg(&mp_type_AttributeError, "no such attribute");
93 }
94 return mp_const_none;
95}
96STATIC MP_DEFINE_CONST_FUN_OBJ_2(object___delattr___obj, object___delattr__);
Yonatan Goldschmidt07ccb552019-12-09 18:31:35 +020097#endif
98
Damien Georgecbf76742015-11-27 13:38:15 +000099STATIC const mp_rom_map_elem_t object_locals_dict_table[] = {
Paul Sokolovskya8408a82014-05-21 22:24:36 +0300100 #if MICROPY_CPYTHON_COMPAT
Damien Georgecbf76742015-11-27 13:38:15 +0000101 { MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&object___init___obj) },
Paul Sokolovskya8408a82014-05-21 22:24:36 +0300102 #endif
Paul Sokolovsky806ea1f2014-05-22 00:32:00 +0300103 #if MICROPY_CPYTHON_COMPAT
Damien Georgecbf76742015-11-27 13:38:15 +0000104 { MP_ROM_QSTR(MP_QSTR___new__), MP_ROM_PTR(&object___new___obj) },
Paul Sokolovsky806ea1f2014-05-22 00:32:00 +0300105 #endif
Yonatan Goldschmidt07ccb552019-12-09 18:31:35 +0200106 #if MICROPY_PY_DELATTR_SETATTR
107 { MP_ROM_QSTR(MP_QSTR___setattr__), MP_ROM_PTR(&object___setattr___obj) },
Yonatan Goldschmidt42e45bd2019-12-10 12:05:22 +0200108 { MP_ROM_QSTR(MP_QSTR___delattr__), MP_ROM_PTR(&object___delattr___obj) },
Yonatan Goldschmidt07ccb552019-12-09 18:31:35 +0200109 #endif
Paul Sokolovskya8408a82014-05-21 22:24:36 +0300110};
111
112STATIC MP_DEFINE_CONST_DICT(object_locals_dict, object_locals_dict_table);
Kaspar Schleiserb5cef5c2015-05-09 21:49:23 +0200113#endif
Paul Sokolovskya8408a82014-05-21 22:24:36 +0300114
Damien George3ec0a1a2014-03-22 21:31:28 +0000115const mp_obj_type_t mp_type_object = {
116 { &mp_type_type },
117 .name = MP_QSTR_object,
118 .make_new = object_make_new,
Kaspar Schleiserb5cef5c2015-05-09 21:49:23 +0200119 #if MICROPY_CPYTHON_COMPAT
Damien George999cedb2015-11-27 17:01:44 +0000120 .locals_dict = (mp_obj_dict_t*)&object_locals_dict,
Kaspar Schleiserb5cef5c2015-05-09 21:49:23 +0200121 #endif
Damien George3ec0a1a2014-03-22 21:31:28 +0000122};