blob: dd4eedebdb4a34a0988ea0660d5775ca1614b72e [file] [log] [blame]
Damien George777b0f32014-04-13 18:59:45 +01001#include <stdlib.h>
2#include <assert.h>
3
4#include "nlr.h"
5#include "misc.h"
6#include "mpconfig.h"
7#include "qstr.h"
8#include "obj.h"
9#include "runtime.h"
10
11#if MICROPY_ENABLE_PROPERTY
12
13typedef struct _mp_obj_property_t {
14 mp_obj_base_t base;
15 mp_obj_t proxy[3]; // getter, setter, deleter
16} mp_obj_property_t;
17
18STATIC mp_obj_t property_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_obj_t *args) {
19 // TODO check n_kw == 0
20
21 mp_obj_property_t *o = m_new_obj(mp_obj_property_t);
22 o->base.type = &mp_type_property;
23 if (n_args >= 5) {
24 nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "property takes at most 4 arguments"));
25 }
26 if (n_args >= 4) {
27 // doc ignored
28 }
29 if (n_args >= 3) {
30 o->proxy[2] = args[2];
31 } else {
32 o->proxy[2] = mp_const_none;
33 }
34 if (n_args >= 2) {
35 o->proxy[1] = args[1];
36 } else {
37 o->proxy[1] = mp_const_none;
38 }
39 if (n_args >= 1) {
40 o->proxy[0] = args[0];
41 } else {
42 o->proxy[0] = mp_const_none;
43 }
44 return o;
45}
46
47STATIC mp_obj_t property_getter(mp_obj_t self_in, mp_obj_t getter) {
48 mp_obj_property_t *p2 = m_new_obj(mp_obj_property_t);
49 *p2 = *(mp_obj_property_t*)self_in;
50 p2->proxy[0] = getter;
51 return p2;
52}
53
54STATIC MP_DEFINE_CONST_FUN_OBJ_2(property_getter_obj, property_getter);
55
56STATIC mp_obj_t property_setter(mp_obj_t self_in, mp_obj_t setter) {
57 mp_obj_property_t *p2 = m_new_obj(mp_obj_property_t);
58 *p2 = *(mp_obj_property_t*)self_in;
59 p2->proxy[1] = setter;
60 return p2;
61}
62
63STATIC MP_DEFINE_CONST_FUN_OBJ_2(property_setter_obj, property_setter);
64
65STATIC mp_obj_t property_deleter(mp_obj_t self_in, mp_obj_t deleter) {
66 mp_obj_property_t *p2 = m_new_obj(mp_obj_property_t);
67 *p2 = *(mp_obj_property_t*)self_in;
68 p2->proxy[2] = deleter;
69 return p2;
70}
71
72STATIC MP_DEFINE_CONST_FUN_OBJ_2(property_deleter_obj, property_deleter);
73
74STATIC const mp_map_elem_t property_locals_dict_table[] = {
75 { MP_OBJ_NEW_QSTR(MP_QSTR_getter), (mp_obj_t)&property_getter_obj },
76 { MP_OBJ_NEW_QSTR(MP_QSTR_setter), (mp_obj_t)&property_setter_obj },
77 { MP_OBJ_NEW_QSTR(MP_QSTR_deleter), (mp_obj_t)&property_deleter_obj },
78};
79
80STATIC MP_DEFINE_CONST_DICT(property_locals_dict, property_locals_dict_table);
81
82const mp_obj_type_t mp_type_property = {
83 { &mp_type_type },
84 .name = MP_QSTR_property,
85 .make_new = property_make_new,
86 .locals_dict = (mp_obj_t)&property_locals_dict,
87};
88
89const mp_obj_t *mp_obj_property_get(mp_obj_t self_in) {
90 assert(MP_OBJ_IS_TYPE(self_in, &mp_type_property));
91 mp_obj_property_t *self = self_in;
92 return self->proxy;
93}
94
95#endif // MICROPY_ENABLE_PROPERTY