Content-Length: 645378 | pFad | http://github.com/adafruit/circuitpython/commit/5aa203f13edbc89b142512997ab4b3e30bd2fdcc

21 Restore CIRCUITPY-CHANGEs for stream protocols · adafruit/circuitpython@5aa203f · GitHub
Skip to content

Commit 5aa203f

Browse files
committed
Restore CIRCUITPY-CHANGEs for stream protocols
We mark all protocols with their type using MP_PROTO_IMPLEMENT, and checking in mp_get_stream{,_raise}. This was not turning up as a problem in tests until a (new, not yet commited) change to jpegio caused a segfault because a type implementing a different protocol was passed in to mp_get_stream. By using 0 (instead of MP_QSTR_protocol_stream) as the marker for objects implementing the standard micropython stream protocol, the number of CIRCUITPY-CHANGEs is minimized.
1 parent 51e3d5e commit 5aa203f

File tree

13 files changed

+17
-20
lines changed

13 files changed

+17
-20
lines changed

Diff for: extmod/modjson.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ STATIC mp_uint_t json_python_readinto(mp_obj_t obj, void *buf, mp_uint_t size, i
188188
}
189189

190190
STATIC mp_obj_t _mod_json_load(mp_obj_t stream_obj, bool return_first_json) {
191-
const mp_stream_p_t *stream_p = mp_proto_get(MP_QSTR_protocol_stream, stream_obj);
191+
const mp_stream_p_t *stream_p = mp_proto_get(0, stream_obj);
192192
json_stream_t s;
193193
uint8_t character_buffer[CIRCUITPY_JSON_READ_CHUNK_SIZE];
194194
if (stream_p == NULL) {

Diff for: ports/espressif/bindings/espnow/ESPNow.c

-1
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,6 @@ STATIC mp_uint_t espnow_stream_ioctl(mp_obj_t self_in, mp_uint_t request, uintpt
332332
}
333333

334334
STATIC const mp_stream_p_t espnow_stream_p = {
335-
MP_PROTO_IMPLEMENT(MP_QSTR_protocol_stream)
336335
.ioctl = espnow_stream_ioctl,
337336
};
338337

Diff for: py/proto.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@
2727
#ifndef MICROPY_INCLUDED_PY_PROTO_H
2828
#define MICROPY_INCLUDED_PY_PROTO_H
2929

30+
// CIRCUITPY-CHANGE
31+
//
32+
// In CircuitPython, we have multiple different 'protocol' types (rather than multiplexing through ioctl).
33+
// The standard (read/write/ioctl) protocol is indicated by the "0" protocol, while others must MP_PROTO_IMPLEMENT(QSTR_...).
34+
// While not used in CircuitPython or tested, the ability to skip including the protocol field in a protocol object is included at the source level
35+
3036
#ifdef MICROPY_UNSAFE_PROTO
3137
#define MP_PROTOCOL_HEAD /* NOTHING */
3238
#define MP_PROTO_IMPLEMENT(name) /* NOTHING */
@@ -35,7 +41,7 @@ static inline void *mp_proto_get(uint16_t name, mp_const_obj_type_t obj) {
3541
}
3642
#else
3743
#define MP_PROTOCOL_HEAD \
38-
uint16_t name; // The name of this protocol, a qstr
44+
uint16_t name;
3945
#define MP_PROTO_IMPLEMENT(n) .name = n,
4046
const void *mp_proto_get(uint16_t name, mp_const_obj_t obj);
4147
const void *mp_proto_get_or_throw(uint16_t name, mp_const_obj_t obj);

Diff for: py/stream.c

+7-8
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,13 @@ mp_uint_t mp_stream_rw(mp_obj_t stream, void *buf_, mp_uint_t size, int *errcode
8383
}
8484

8585
const mp_stream_p_t *mp_get_stream_raise(mp_obj_t self_in, int flags) {
86-
const mp_obj_type_t *type = mp_obj_get_type(self_in);
87-
if (MP_OBJ_TYPE_HAS_SLOT(type, protocol)) {
88-
const mp_stream_p_t *stream_p = MP_OBJ_TYPE_GET_SLOT(type, protocol);
89-
if (!((flags & MP_STREAM_OP_READ) && stream_p->read == NULL)
90-
&& !((flags & MP_STREAM_OP_WRITE) && stream_p->write == NULL)
91-
&& !((flags & MP_STREAM_OP_IOCTL) && stream_p->ioctl == NULL)) {
92-
return stream_p;
93-
}
86+
// CIRCUITPY-CHANGE: using type-safe protocol accessor
87+
const mp_stream_p_t *stream_p = mp_get_stream(self_in);
88+
if (stream_p
89+
&& !((flags & MP_STREAM_OP_READ) && stream_p->read == NULL)
90+
&& !((flags & MP_STREAM_OP_WRITE) && stream_p->write == NULL)
91+
&& !((flags & MP_STREAM_OP_IOCTL) && stream_p->ioctl == NULL)) {
92+
return stream_p;
9493
}
9594
// CPython: io.UnsupportedOperation, OSError subclass
9695
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("stream operation not supported"));

Diff for: py/stream.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_ioctl_obj);
103103

104104
// Object is assumed to have a non-NULL stream protocol with valid r/w/ioctl methods
105105
static inline const mp_stream_p_t *mp_get_stream(mp_const_obj_t self) {
106-
return (const mp_stream_p_t *)MP_OBJ_TYPE_GET_SLOT(((const mp_obj_base_t *)MP_OBJ_TO_PTR(self))->type, protocol);
106+
// CIRCUITPY-CHANGE: using type-safe protocol accessor
107+
return mp_proto_get(0, (mp_obj_t)self);
107108
}
108109

109110
const mp_stream_p_t *mp_get_stream_raise(mp_obj_t self_in, int flags);

Diff for: shared-bindings/_bleio/CharacteristicBuffer.c

-1
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,6 @@ STATIC const mp_rom_map_elem_t bleio_characteristic_buffer_locals_dict_table[] =
212212
STATIC MP_DEFINE_CONST_DICT(bleio_characteristic_buffer_locals_dict, bleio_characteristic_buffer_locals_dict_table);
213213

214214
STATIC const mp_stream_p_t characteristic_buffer_stream_p = {
215-
MP_PROTO_IMPLEMENT(MP_QSTR_protocol_stream)
216215
.read = bleio_characteristic_buffer_read,
217216
.write = bleio_characteristic_buffer_write,
218217
.ioctl = bleio_characteristic_buffer_ioctl,

Diff for: shared-bindings/busio/UART.c

-1
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,6 @@ STATIC MP_DEFINE_CONST_DICT(busio_uart_locals_dict, busio_uart_locals_dict_table
453453

454454
#if CIRCUITPY_BUSIO_UART
455455
STATIC const mp_stream_p_t uart_stream_p = {
456-
MP_PROTO_IMPLEMENT(MP_QSTR_protocol_stream)
457456
.read = busio_uart_read,
458457
.write = busio_uart_write,
459458
.ioctl = busio_uart_ioctl,

Diff for: shared-bindings/keypad/EventQueue.c

-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,6 @@ STATIC mp_uint_t eventqueue_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t
159159
}
160160

161161
STATIC const mp_stream_p_t eventqueue_p = {
162-
MP_PROTO_IMPLEMENT(MP_QSTR_protocol_stream)
163162
.ioctl = eventqueue_ioctl,
164163
};
165164
#endif

Diff for: shared-bindings/socketpool/Socket.c

-1
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,6 @@ STATIC mp_uint_t socket_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg
443443
}
444444

445445
STATIC const mp_stream_p_t socket_stream_p = {
446-
MP_PROTO_IMPLEMENT(MP_QSTR_protocol_stream)
447446
.ioctl = socket_ioctl,
448447
.is_text = false,
449448
};

Diff for: shared-bindings/terminalio/Terminal.c

-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,6 @@ STATIC const mp_rom_map_elem_t terminalio_terminal_locals_dict_table[] = {
132132
STATIC MP_DEFINE_CONST_DICT(terminalio_terminal_locals_dict, terminalio_terminal_locals_dict_table);
133133

134134
STATIC const mp_stream_p_t terminalio_terminal_stream_p = {
135-
MP_PROTO_IMPLEMENT(MP_QSTR_protocol_stream)
136135
.read = NULL,
137136
.write = terminalio_terminal_write,
138137
.ioctl = terminalio_terminal_ioctl,

Diff for: shared-bindings/usb_cdc/Serial.c

-1
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,6 @@ STATIC const mp_rom_map_elem_t usb_cdc_serial_locals_dict_table[] = {
267267
STATIC MP_DEFINE_CONST_DICT(usb_cdc_serial_locals_dict, usb_cdc_serial_locals_dict_table);
268268

269269
STATIC const mp_stream_p_t usb_cdc_serial_stream_p = {
270-
MP_PROTO_IMPLEMENT(MP_QSTR_protocol_stream)
271270
.read = usb_cdc_serial_read_stream,
272271
.write = usb_cdc_serial_write_stream,
273272
.ioctl = usb_cdc_serial_ioctl_stream,

Diff for: shared-bindings/usb_midi/PortIn.c

-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ STATIC const mp_rom_map_elem_t usb_midi_portin_locals_dict_table[] = {
101101
STATIC MP_DEFINE_CONST_DICT(usb_midi_portin_locals_dict, usb_midi_portin_locals_dict_table);
102102

103103
STATIC const mp_stream_p_t usb_midi_portin_stream_p = {
104-
MP_PROTO_IMPLEMENT(MP_QSTR_protocol_stream)
105104
.read = usb_midi_portin_read,
106105
.write = NULL,
107106
.ioctl = usb_midi_portin_ioctl,

Diff for: shared-bindings/usb_midi/PortOut.c

-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ STATIC const mp_rom_map_elem_t usb_midi_portout_locals_dict_table[] = {
8383
STATIC MP_DEFINE_CONST_DICT(usb_midi_portout_locals_dict, usb_midi_portout_locals_dict_table);
8484

8585
STATIC const mp_stream_p_t usb_midi_portout_stream_p = {
86-
MP_PROTO_IMPLEMENT(MP_QSTR_protocol_stream)
8786
.read = NULL,
8887
.write = usb_midi_portout_write,
8988
.ioctl = usb_midi_portout_ioctl,

0 commit comments

Comments
 (0)








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://github.com/adafruit/circuitpython/commit/5aa203f13edbc89b142512997ab4b3e30bd2fdcc

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy