Skip to content
This repository was archived by the owner on Apr 25, 2021. It is now read-only.

Commit 07de016

Browse files
committed
oprom 업데이트
1 parent 4414418 commit 07de016

14 files changed

Lines changed: 206 additions & 100 deletions

src/moducomponents.c

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include <string.h>
1414

1515

16-
mp_obj_t wrap_result(int retcode);
16+
mp_obj_t wrap_result(int code);
1717

1818

1919
STATIC mp_obj_t ucomponents_components(size_t n_args, const mp_obj_t *args) {
@@ -44,50 +44,26 @@ MP_DEFINE_CONST_FUN_OBJ_0(ucomponents_max_components_obj, ucomponents_max_compon
4444

4545

4646
STATIC mp_obj_t ucomponents_methods(mp_obj_t address_obj) {
47-
byte *data = NULL;
48-
size_t size = 0;
49-
50-
mpack_writer_t *writer = msgpack_dump_new(&data, &size);
51-
mpack_start_array(writer, 1);
52-
msgpack_dump(writer, address_obj);
53-
mpack_finish_array(writer);
54-
msgpack_dump_close(writer);
55-
56-
return wrap_result(__syscall2(SYS_COMPONENTS_METHODS, (int) data, (int) size));
47+
mp_obj_t items[] = {address_obj};
48+
msgpack_result_t result = msgpack_args_dumps(1, items);
49+
return wrap_result(__syscall2(SYS_COMPONENTS_METHODS, (int)result.data, (int)result.size));
5750
}
5851

5952
MP_DEFINE_CONST_FUN_OBJ_1(ucomponents_methods_obj, ucomponents_methods);
6053

6154

62-
STATIC mp_obj_t ucomponents_annotations(mp_obj_t address_obj, mp_obj_t method_obj) {
63-
byte *data = NULL;
64-
size_t size = 0;
65-
66-
mpack_writer_t *writer = msgpack_dump_new(&data, &size);
67-
mpack_start_array(writer, 2);
68-
msgpack_dump(writer, address_obj);
69-
msgpack_dump(writer, method_obj);
70-
mpack_finish_array(writer);
71-
msgpack_dump_close(writer);
72-
73-
return wrap_result(__syscall2(SYS_COMPONENTS_ANNOTATIONS, (int) data, (int) size));
55+
STATIC mp_obj_t ucomponents_doc(mp_obj_t address_obj, mp_obj_t method_obj) {
56+
mp_obj_t items[] = {address_obj, method_obj};
57+
msgpack_result_t result = msgpack_args_dumps(2, items);
58+
return wrap_result(__syscall2(SYS_COMPONENTS_DOC, (int)result.data, (int)result.size));
7459
}
7560

76-
MP_DEFINE_CONST_FUN_OBJ_2(ucomponents_annotations_obj, ucomponents_annotations);
61+
MP_DEFINE_CONST_FUN_OBJ_2(ucomponents_doc_obj, ucomponents_doc);
7762

7863

7964
STATIC mp_obj_t ucomponents_invoke(size_t n_args, const mp_obj_t *args) {
80-
byte *data = NULL;
81-
size_t size = 0;
82-
83-
mpack_writer_t *writer = msgpack_dump_new(&data, &size);
84-
mpack_start_array(writer, n_args);
85-
for (int i = 0; i < n_args; i++)
86-
msgpack_dump(writer, args[i]);
87-
mpack_finish_array(writer);
88-
msgpack_dump_close(writer);
89-
90-
mp_obj_t values = wrap_result(__syscall2(SYS_COMPONENTS_INVOKE, (int) data, (int) size));
65+
msgpack_result_t result = msgpack_args_dumps(n_args, args);
66+
mp_obj_t values = wrap_result(__syscall2(SYS_COMPONENTS_INVOKE, (int)result.data, (int)result.size));
9167
if (values == mp_const_none)
9268
return mp_const_none;
9369

@@ -113,7 +89,7 @@ STATIC const mp_rom_map_elem_t ucomponents_module_globals_table[] = {
11389
{MP_ROM_QSTR(MP_QSTR_component_count), MP_ROM_PTR(&ucomponents_component_count_obj)},
11490
{MP_ROM_QSTR(MP_QSTR_max_components), MP_ROM_PTR(&ucomponents_max_components_obj)},
11591
{MP_ROM_QSTR(MP_QSTR_methods), MP_ROM_PTR(&ucomponents_methods_obj)},
116-
{MP_ROM_QSTR(MP_QSTR_annotations), MP_ROM_PTR(&ucomponents_annotations_obj)},
92+
{MP_ROM_QSTR(MP_QSTR_doc), MP_ROM_PTR(&ucomponents_doc_obj)},
11793

11894
// invoke
11995
{MP_ROM_QSTR(MP_QSTR_invoke), MP_ROM_PTR(&ucomponents_invoke_obj)},

src/moducomputer.c

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include <string.h>
1414

1515

16-
mp_obj_t wrap_result(int retcode);
16+
mp_obj_t wrap_result(int code);
1717

1818
mp_obj_t ucomputer_debug(mp_obj_t);
1919

@@ -45,17 +45,8 @@ MP_DEFINE_CONST_FUN_OBJ_1(ucomputer_crash_obj, ucomputer_crash);
4545

4646

4747
STATIC mp_obj_t ucomputer_push_signal(size_t n_args, const mp_obj_t *args) {
48-
byte *data = NULL;
49-
size_t size = 0;
50-
51-
mpack_writer_t *writer = msgpack_dump_new(&data, &size);
52-
mpack_start_array(writer, n_args);
53-
for (int i = 0; i < n_args; i++)
54-
msgpack_dump(writer, args[i]);
55-
mpack_finish_array(writer);
56-
msgpack_dump_close(writer);
57-
58-
return wrap_result(__syscall2(SYS_SIGNAL_PUSH, (int) data, (int) size));
48+
msgpack_result_t result = msgpack_args_dumps(n_args, args);
49+
return wrap_result(__syscall2(SYS_SIGNAL_PUSH, (int)result.data, (int)result.size));
5950
}
6051

6152
MP_DEFINE_CONST_FUN_OBJ_VAR(ucomputer_push_signal_obj, 1, ucomputer_push_signal);

src/modules/bios.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def bios():
1111
eeprom = eeproms[0]
1212
if True:
1313
invoke(eeprom, 'setLabel', "EEPROM (micropython)")
14-
invoke(eeprom, 'set', b"""
14+
invoke(eeprom, 'set', b"""#!micropython
1515
from ucomputer import crash, get_computer_address
1616
from ucomponents import invoke, components
1717
from uio import FileIO
@@ -31,16 +31,17 @@ def check_bootable(address):
3131
3232
3333
def load(address):
34-
file = invoke(address, 'open', init, 'r')
34+
handle = invoke(address, 'open', init, 'r')
3535
3636
try:
3737
buffer = []
3838
while True:
39-
buf = invoke(address, 'read', file, 4096)
39+
buf = invoke(address, 'read', handle, 4096)
4040
if not buf: break
4141
buffer.append(buf)
4242
finally:
43-
invoke(address, 'close', file)
43+
invoke(address, 'close', handle)
44+
handle.dispose()
4445
4546
content = b"".join(buffer)
4647
return content.decode()

src/modumsgpack.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@
88
#include "lib/mpack/mpack.h"
99

1010
mp_obj_t umsgpack_dumps(mp_obj_t obj) {
11-
byte *data;
12-
size_t size;
13-
msgpack_dumps(obj, &data, &size);
14-
return mp_obj_new_bytes(data, size);
11+
msgpack_result_t result = msgpack_dumps(obj);
12+
return mp_obj_new_bytes(result.data, result.size);
1513
}
1614

1715
MP_DEFINE_CONST_FUN_OBJ_1(umsgpack_dumps_obj, umsgpack_dumps);

src/modutime.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include "extmod/utime_mphal.h"
99
#include "syscall.h"
1010

11-
mp_obj_t wrap_result(int retcode);
11+
mp_obj_t wrap_result(int code);
1212

1313

1414
STATIC mp_obj_t utime_time_world() {

src/moduvalue.c

Lines changed: 113 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,38 +13,24 @@
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

1919
mp_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

5036
STATIC 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+
86166
STATIC 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

94182
STATIC MP_DEFINE_CONST_DICT(uvalue_module_globals, uvalue_module_globals_table);

src/msgpack.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -217,13 +217,10 @@ void msgpack_dump(mpack_writer_t *writer, mp_obj_t obj) {
217217
mpack_finish_map(writer);
218218
} else if (CHECK(uvalue_type)) {
219219
uvalue_obj_t *uvalue = (uvalue_obj_t *)obj;
220-
size_t size = 0;
221-
byte *buffer = NULL;
222-
223-
msgpack_dumps(uvalue->value, &buffer, &size);
224220

225221
int UVALUE_TYPE = 1;
226-
mpack_write_ext(writer, UVALUE_TYPE, (const char *)buffer, size);
222+
msgpack_result_t result = msgpack_dumps(uvalue->value);
223+
mpack_write_ext(writer, UVALUE_TYPE, (const char *)result.data, result.size);
227224
} else {
228225
mp_raise_TypeError(NULL);
229226
}
@@ -246,8 +243,22 @@ void msgpack_dump_close(mpack_writer_t *writer) {
246243
}
247244
}
248245

249-
void msgpack_dumps(mp_obj_t obj, byte **data, size_t *size) {
250-
mpack_writer_t *writer = msgpack_dump_new(data, size);
246+
msgpack_result_t msgpack_dumps(mp_obj_t obj) {
247+
msgpack_result_t result = {NULL, 0};
248+
mpack_writer_t *writer = msgpack_dump_new(&result.data, &result.size);
251249
msgpack_dump(writer, obj);
252250
msgpack_dump_close(writer);
251+
return result;
252+
}
253+
254+
255+
msgpack_result_t msgpack_args_dumps(size_t n_args, const mp_obj_t *args) {
256+
msgpack_result_t result = {NULL, 0};
257+
mpack_writer_t *writer = msgpack_dump_new(&result.data, &result.size);
258+
mpack_start_array(writer, n_args);
259+
for (int i = 0; i < n_args; i++)
260+
msgpack_dump(writer, args[i]);
261+
mpack_finish_array(writer);
262+
msgpack_dump_close(writer);
263+
return result;
253264
}

src/msgpack.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,19 @@
44
#include "py/obj.h"
55
#include "lib/mpack/mpack.h"
66

7+
typedef struct _msgpack_result_t {
8+
byte *data;
9+
size_t size;
10+
} msgpack_result_t;
11+
12+
713
mp_obj_t msgpack_loads(const char *buf, size_t len);
814

915
mpack_writer_t *msgpack_dump_new(byte **data, size_t *size);
1016
void msgpack_dump(mpack_writer_t *writer, mp_obj_t obj);
1117
void msgpack_dump_close(mpack_writer_t *writer);
12-
void msgpack_dumps(mp_obj_t obj, byte **data, size_t *size);
18+
19+
msgpack_result_t msgpack_dumps(mp_obj_t obj);
20+
msgpack_result_t msgpack_args_dumps(size_t n_args, const mp_obj_t *args);
1321

1422
#endif // OPENPIE_UMSGPACK_H

0 commit comments

Comments
 (0)