1313#include <stdio.h>
1414#include <string.h>
1515
16- mp_obj_t wrap_result (int retcode );
16+ mp_obj_t wrap_result (int code );
1717
1818
1919mp_obj_t object_hook_obj = mp_const_none ;
2020
21- mp_obj_t uvalue_new (mp_obj_t value );
2221
23- mp_obj_t oc_create_value (mp_obj_t raw_value_obj ) {
24- mp_obj_t value_obj = uvalue_new (raw_value_obj );
25- if (object_hook_obj == mp_const_none ) {
26- return value_obj ;
22+ STATIC mp_obj_t uvalue_dispose (mp_obj_t raw_value_obj ) {
23+ uvalue_obj_t * self = MP_OBJ_TO_PTR (raw_value_obj );
24+ if (self -> value != mp_const_none ) {
25+ msgpack_result_t result = msgpack_dumps (self ); // UValue
26+ wrap_result (__syscall2 (SYS_VALUE_DISPOSE , (int )result .data , (int )result .size ));
27+ self -> value = mp_const_none ;
2728 }
2829
29- return mp_call_function_1 (object_hook_obj , value_obj );
30- }
31-
32-
33- STATIC mp_obj_t uvalue_hook_value (mp_obj_t hook_obj ) {
34- object_hook_obj = hook_obj ;
35- return hook_obj ;
36- }
37-
38- MP_DEFINE_CONST_FUN_OBJ_1 (uvalue_hook_value_obj , uvalue_hook_value );
39-
40-
41- STATIC mp_obj_t uvalue_del (mp_obj_t raw_value_obj ) {
42- mp_int_t pointer = mp_obj_get_int (raw_value_obj );
43- (void )pointer ; // TODO: syscall
4430 return mp_const_none ;
4531}
4632
47- MP_DEFINE_CONST_FUN_OBJ_1 (uvalue_del_obj , uvalue_del );
33+ MP_DEFINE_CONST_FUN_OBJ_1 (uvalue_dispose_obj , uvalue_dispose );
4834
4935
5036STATIC void uvalue_print (const mp_print_t * print , mp_obj_t self_in , mp_print_kind_t kind ) {
@@ -62,9 +48,12 @@ STATIC void uvalue_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
6248 // load attribute
6349 if (MP_QSTR_value == attr ) {
6450 dest [0 ] = MP_OBJ_TO_PTR (self -> value );
65- } else if (MP_QSTR___del__ == attr ) {
66- dest [0 ] = (mp_obj_t )MP_OBJ_TO_PTR (& uvalue_del_obj );
51+ } else if (MP_QSTR___del__ == attr || MP_QSTR_dispose == attr ) {
52+ mp_obj_t method = (mp_obj_t )MP_OBJ_TO_PTR (& uvalue_dispose_obj );
53+ mp_convert_member_lookup (self , MP_ROM_PTR (& uvalue_type ), method , dest );
6754 }
55+ } else {
56+ mp_raise_msg (& mp_type_AttributeError , "can't set attribute" );
6857 }
6958}
7059
@@ -83,12 +72,111 @@ mp_obj_t uvalue_new(mp_obj_t value) {
8372}
8473
8574
75+ mp_obj_t oc_create_value (mp_obj_t raw_value_obj ) {
76+ mp_obj_t value_obj = uvalue_new (raw_value_obj );
77+ if (object_hook_obj == mp_const_none ) {
78+ return value_obj ;
79+ }
80+
81+ return mp_call_function_1 (object_hook_obj , value_obj );
82+ }
83+
84+
85+ STATIC mp_obj_t uvalue_hook_value (mp_obj_t hook_obj ) {
86+ object_hook_obj = hook_obj ;
87+ return hook_obj ;
88+ }
89+
90+ MP_DEFINE_CONST_FUN_OBJ_1 (uvalue_hook_value_obj , uvalue_hook_value );
91+
92+
93+ STATIC mp_obj_t _uvalue__syscall (int syscall_number , size_t n_args , const mp_obj_t * args ) {
94+ switch (syscall_number ) {
95+ case SYS_VALUE_INVOKE :
96+ case SYS_VALUE_CALL :
97+ case SYS_VALUE_APPLY :
98+ case SYS_VALUE_UNAPPLY :
99+ break ;
100+ default :
101+ mp_raise_ValueError ("invalid call" );
102+ }
103+
104+ msgpack_result_t result = msgpack_args_dumps (n_args , args );
105+ return wrap_result (__syscall2 (syscall_number , (int )result .data , (int )result .size ));
106+ }
107+
108+
109+ STATIC mp_obj_t uvalue_invoke (size_t n_args , const mp_obj_t * args ) {
110+ mp_obj_t values = _uvalue__syscall (SYS_VALUE_INVOKE , n_args , args );
111+ if (values == mp_const_none )
112+ return mp_const_none ;
113+
114+ size_t count = 0 ;
115+ mp_obj_t * items = NULL ;
116+ mp_obj_get_array (values , & count , & items );
117+ if (count == 0 )
118+ return mp_const_none ;
119+ else if (count == 1 )
120+ return items [0 ];
121+ else
122+ return values ;
123+ }
124+
125+ MP_DEFINE_CONST_FUN_OBJ_VAR (uvalue_invoke_obj , 2 , uvalue_invoke );
126+
127+
128+ STATIC mp_obj_t uvalue_call (size_t n_args , const mp_obj_t * args ) {
129+ return _uvalue__syscall (SYS_VALUE_CALL , n_args , args );
130+ }
131+
132+ MP_DEFINE_CONST_FUN_OBJ_VAR (uvalue_call_obj , 1 , uvalue_call );
133+
134+
135+ STATIC mp_obj_t uvalue_apply (size_t n_args , const mp_obj_t * args ) {
136+ return _uvalue__syscall (SYS_VALUE_CALL , n_args , args );
137+ }
138+
139+ MP_DEFINE_CONST_FUN_OBJ_VAR (uvalue_apply_obj , 1 , uvalue_apply );
140+
141+
142+ STATIC mp_obj_t uvalue_unapply (size_t n_args , const mp_obj_t * args ) {
143+ return _uvalue__syscall (SYS_VALUE_CALL , n_args , args );
144+ }
145+
146+ MP_DEFINE_CONST_FUN_OBJ_VAR (uvalue_unapply_obj , 1 , uvalue_unapply );
147+
148+
149+ STATIC mp_obj_t uvalue_methods (mp_obj_t uvalue_obj ) {
150+ mp_obj_t items [] = {uvalue_obj };
151+ msgpack_result_t result = msgpack_args_dumps (1 , items );
152+ return wrap_result (__syscall2 (SYS_VALUE_METHODS , (int )result .data , (int )result .size ));
153+ }
154+
155+ MP_DEFINE_CONST_FUN_OBJ_1 (uvalue_methods_obj , uvalue_methods );
156+
157+
158+ STATIC mp_obj_t uvalue_doc (size_t n_args , const mp_obj_t * args ) {
159+ msgpack_result_t result = msgpack_args_dumps (n_args , args );
160+ return wrap_result (__syscall2 (SYS_VALUE_DOC , (int )result .data , (int )result .size ));
161+ }
162+
163+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (uvalue_doc_obj , 1 , 2 , uvalue_doc );
164+
165+
86166STATIC const mp_rom_map_elem_t uvalue_module_globals_table [] = {
87167 {MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR_uvalue )},
88168
89169 // objects
90- {MP_ROM_QSTR (MP_QSTR_hook_value ), MP_ROM_PTR (& uvalue_hook_value_obj )},
91170 {MP_ROM_QSTR (MP_QSTR_UValue ), MP_ROM_PTR (& uvalue_type )},
171+ {MP_ROM_QSTR (MP_QSTR_hook_value ), MP_ROM_PTR (& uvalue_hook_value_obj )},
172+
173+ // invoke
174+ {MP_ROM_QSTR (MP_QSTR_invoke ), MP_ROM_PTR (& uvalue_invoke_obj )},
175+ {MP_ROM_QSTR (MP_QSTR_call ), MP_ROM_PTR (& uvalue_call_obj )},
176+ {MP_ROM_QSTR (MP_QSTR_apply ), MP_ROM_PTR (& uvalue_apply_obj )},
177+ {MP_ROM_QSTR (MP_QSTR_unapply ), MP_ROM_PTR (& uvalue_unapply_obj )},
178+ {MP_ROM_QSTR (MP_QSTR_methods ), MP_ROM_PTR (& uvalue_methods_obj )},
179+ {MP_ROM_QSTR (MP_QSTR_doc ), MP_ROM_PTR (& uvalue_doc_obj )},
92180};
93181
94182STATIC MP_DEFINE_CONST_DICT (uvalue_module_globals , uvalue_module_globals_table );
0 commit comments