Skip to content

Commit cf31d38

Browse files
committed
py/stream: Switch stream close operation from method to ioctl.
This patch moves the implementation of stream closure from a dedicated method to the ioctl of the stream protocol, for each type that implements closing. The benefits of this are: 1. Rounds out the stream ioctl function, which already includes flush, seek and poll (among other things). 2. Makes calling mp_stream_close() on an object slightly more efficient because it now no longer needs to lookup the close method and call it, rather it just delegates straight to the ioctl function (if it exists). 3. Reduces code size and allows future types that implement the stream protocol to be smaller because they don't need a dedicated close method. Code size reduction is around 200 bytes smaller for x86 archs and around 30 bytes smaller for the bare-metal archs.
1 parent 8f11d0b commit cf31d38

15 files changed

Lines changed: 216 additions & 196 deletions

File tree

extmod/modlwip.c

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -637,42 +637,6 @@ STATIC mp_obj_t lwip_socket_make_new(const mp_obj_type_t *type, size_t n_args, s
637637
return socket;
638638
}
639639

640-
STATIC mp_obj_t lwip_socket_close(mp_obj_t self_in) {
641-
lwip_socket_obj_t *socket = self_in;
642-
bool socket_is_listener = false;
643-
644-
if (socket->pcb.tcp == NULL) {
645-
return mp_const_none;
646-
}
647-
switch (socket->type) {
648-
case MOD_NETWORK_SOCK_STREAM: {
649-
if (socket->pcb.tcp->state == LISTEN) {
650-
socket_is_listener = true;
651-
}
652-
if (tcp_close(socket->pcb.tcp) != ERR_OK) {
653-
DEBUG_printf("lwip_close: had to call tcp_abort()\n");
654-
tcp_abort(socket->pcb.tcp);
655-
}
656-
break;
657-
}
658-
case MOD_NETWORK_SOCK_DGRAM: udp_remove(socket->pcb.udp); break;
659-
//case MOD_NETWORK_SOCK_RAW: raw_remove(socket->pcb.raw); break;
660-
}
661-
socket->pcb.tcp = NULL;
662-
socket->state = _ERR_BADF;
663-
if (socket->incoming.pbuf != NULL) {
664-
if (!socket_is_listener) {
665-
pbuf_free(socket->incoming.pbuf);
666-
} else {
667-
tcp_abort(socket->incoming.connection);
668-
}
669-
socket->incoming.pbuf = NULL;
670-
}
671-
672-
return mp_const_none;
673-
}
674-
STATIC MP_DEFINE_CONST_FUN_OBJ_1(lwip_socket_close_obj, lwip_socket_close);
675-
676640
STATIC mp_obj_t lwip_socket_bind(mp_obj_t self_in, mp_obj_t addr_in) {
677641
lwip_socket_obj_t *socket = self_in;
678642

@@ -1179,6 +1143,38 @@ STATIC mp_uint_t lwip_socket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_
11791143
ret |= flags & (MP_STREAM_POLL_RD | MP_STREAM_POLL_WR);
11801144
}
11811145

1146+
} else if (request == MP_STREAM_CLOSE) {
1147+
bool socket_is_listener = false;
1148+
1149+
if (socket->pcb.tcp == NULL) {
1150+
return 0;
1151+
}
1152+
switch (socket->type) {
1153+
case MOD_NETWORK_SOCK_STREAM: {
1154+
if (socket->pcb.tcp->state == LISTEN) {
1155+
socket_is_listener = true;
1156+
}
1157+
if (tcp_close(socket->pcb.tcp) != ERR_OK) {
1158+
DEBUG_printf("lwip_close: had to call tcp_abort()\n");
1159+
tcp_abort(socket->pcb.tcp);
1160+
}
1161+
break;
1162+
}
1163+
case MOD_NETWORK_SOCK_DGRAM: udp_remove(socket->pcb.udp); break;
1164+
//case MOD_NETWORK_SOCK_RAW: raw_remove(socket->pcb.raw); break;
1165+
}
1166+
socket->pcb.tcp = NULL;
1167+
socket->state = _ERR_BADF;
1168+
if (socket->incoming.pbuf != NULL) {
1169+
if (!socket_is_listener) {
1170+
pbuf_free(socket->incoming.pbuf);
1171+
} else {
1172+
tcp_abort(socket->incoming.connection);
1173+
}
1174+
socket->incoming.pbuf = NULL;
1175+
}
1176+
ret = 0;
1177+
11821178
} else {
11831179
*errcode = MP_EINVAL;
11841180
ret = MP_STREAM_ERROR;
@@ -1188,8 +1184,8 @@ STATIC mp_uint_t lwip_socket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_
11881184
}
11891185

11901186
STATIC const mp_rom_map_elem_t lwip_socket_locals_dict_table[] = {
1191-
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&lwip_socket_close_obj) },
1192-
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&lwip_socket_close_obj) },
1187+
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_stream_close_obj) },
1188+
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) },
11931189
{ MP_ROM_QSTR(MP_QSTR_bind), MP_ROM_PTR(&lwip_socket_bind_obj) },
11941190
{ MP_ROM_QSTR(MP_QSTR_listen), MP_ROM_PTR(&lwip_socket_listen_obj) },
11951191
{ MP_ROM_QSTR(MP_QSTR_accept), MP_ROM_PTR(&lwip_socket_accept_obj) },

extmod/modussl_axtls.c

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,25 @@ STATIC mp_uint_t socket_write(mp_obj_t o_in, const void *buf, mp_uint_t size, in
175175
return r;
176176
}
177177

178+
STATIC mp_uint_t socket_ioctl(mp_obj_t o_in, mp_uint_t request, uintptr_t arg, int *errcode) {
179+
mp_obj_ssl_socket_t *self = MP_OBJ_TO_PTR(o_in);
180+
(void)arg;
181+
switch (request) {
182+
case MP_STREAM_CLOSE:
183+
if (self->ssl_sock != NULL) {
184+
ssl_free(self->ssl_sock);
185+
ssl_ctx_free(self->ssl_ctx);
186+
self->ssl_sock = NULL;
187+
mp_stream_close(self->sock);
188+
}
189+
return 0;
190+
191+
default:
192+
*errcode = MP_EINVAL;
193+
return MP_STREAM_ERROR;
194+
}
195+
}
196+
178197
STATIC mp_obj_t socket_setblocking(mp_obj_t self_in, mp_obj_t flag_in) {
179198
// Currently supports only blocking mode
180199
(void)self_in;
@@ -185,26 +204,13 @@ STATIC mp_obj_t socket_setblocking(mp_obj_t self_in, mp_obj_t flag_in) {
185204
}
186205
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_setblocking_obj, socket_setblocking);
187206

188-
STATIC mp_obj_t socket_close(mp_obj_t self_in) {
189-
mp_obj_ssl_socket_t *self = MP_OBJ_TO_PTR(self_in);
190-
if (self->ssl_sock != NULL) {
191-
ssl_free(self->ssl_sock);
192-
ssl_ctx_free(self->ssl_ctx);
193-
self->ssl_sock = NULL;
194-
return mp_stream_close(self->sock);
195-
}
196-
197-
return mp_const_none;
198-
}
199-
STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_close_obj, socket_close);
200-
201207
STATIC const mp_rom_map_elem_t ussl_socket_locals_dict_table[] = {
202208
{ MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) },
203209
{ MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) },
204210
{ MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj) },
205211
{ MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
206212
{ MP_ROM_QSTR(MP_QSTR_setblocking), MP_ROM_PTR(&socket_setblocking_obj) },
207-
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&socket_close_obj) },
213+
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) },
208214
#if MICROPY_PY_USSL_FINALISER
209215
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&socket_close_obj) },
210216
#endif
@@ -215,6 +221,7 @@ STATIC MP_DEFINE_CONST_DICT(ussl_socket_locals_dict, ussl_socket_locals_dict_tab
215221
STATIC const mp_stream_p_t ussl_socket_stream_p = {
216222
.read = socket_read,
217223
.write = socket_write,
224+
.ioctl = socket_ioctl,
218225
};
219226

220227
STATIC const mp_obj_type_t ussl_socket_type = {

extmod/modussl_mbedtls.c

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -274,30 +274,36 @@ STATIC mp_obj_t socket_setblocking(mp_obj_t self_in, mp_obj_t flag_in) {
274274
}
275275
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_setblocking_obj, socket_setblocking);
276276

277-
STATIC mp_obj_t socket_close(mp_obj_t self_in) {
278-
mp_obj_ssl_socket_t *self = MP_OBJ_TO_PTR(self_in);
279-
280-
mbedtls_pk_free(&self->pkey);
281-
mbedtls_x509_crt_free(&self->cert);
282-
mbedtls_x509_crt_free(&self->cacert);
283-
mbedtls_ssl_free(&self->ssl);
284-
mbedtls_ssl_config_free(&self->conf);
285-
mbedtls_ctr_drbg_free(&self->ctr_drbg);
286-
mbedtls_entropy_free(&self->entropy);
287-
288-
return mp_stream_close(self->sock);
277+
STATIC mp_uint_t socket_ioctl(mp_obj_t o_in, mp_uint_t request, uintptr_t arg, int *errcode) {
278+
mp_obj_ssl_socket_t *self = MP_OBJ_TO_PTR(o_in);
279+
(void)arg;
280+
switch (request) {
281+
case MP_STREAM_CLOSE:
282+
mbedtls_pk_free(&self->pkey);
283+
mbedtls_x509_crt_free(&self->cert);
284+
mbedtls_x509_crt_free(&self->cacert);
285+
mbedtls_ssl_free(&self->ssl);
286+
mbedtls_ssl_config_free(&self->conf);
287+
mbedtls_ctr_drbg_free(&self->ctr_drbg);
288+
mbedtls_entropy_free(&self->entropy);
289+
mp_stream_close(self->sock);
290+
return 0;
291+
292+
default:
293+
*errcode = MP_EINVAL;
294+
return MP_STREAM_ERROR;
295+
}
289296
}
290-
STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_close_obj, socket_close);
291297

292298
STATIC const mp_rom_map_elem_t ussl_socket_locals_dict_table[] = {
293299
{ MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) },
294300
{ MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) },
295301
{ MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj) },
296302
{ MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
297303
{ MP_ROM_QSTR(MP_QSTR_setblocking), MP_ROM_PTR(&socket_setblocking_obj) },
298-
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&socket_close_obj) },
304+
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) },
299305
#if MICROPY_PY_USSL_FINALISER
300-
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&socket_close_obj) },
306+
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_stream_close_obj) },
301307
#endif
302308
{ MP_ROM_QSTR(MP_QSTR_getpeercert), MP_ROM_PTR(&mod_ssl_getpeercert_obj) },
303309
};
@@ -307,6 +313,7 @@ STATIC MP_DEFINE_CONST_DICT(ussl_socket_locals_dict, ussl_socket_locals_dict_tab
307313
STATIC const mp_stream_p_t ussl_socket_stream_p = {
308314
.read = socket_read,
309315
.write = socket_write,
316+
.ioctl = socket_ioctl,
310317
};
311318

312319
STATIC const mp_obj_type_t ussl_socket_type = {

extmod/modwebrepl.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -297,12 +297,20 @@ STATIC mp_uint_t webrepl_write(mp_obj_t self_in, const void *buf, mp_uint_t size
297297
return stream_p->write(self->sock, buf, size, errcode);
298298
}
299299

300-
STATIC mp_obj_t webrepl_close(mp_obj_t self_in) {
301-
mp_obj_webrepl_t *self = MP_OBJ_TO_PTR(self_in);
302-
// TODO: This is a place to do cleanup
303-
return mp_stream_close(self->sock);
300+
STATIC mp_uint_t webrepl_ioctl(mp_obj_t o_in, mp_uint_t request, uintptr_t arg, int *errcode) {
301+
mp_obj_webrepl_t *self = MP_OBJ_TO_PTR(o_in);
302+
(void)arg;
303+
switch (request) {
304+
case MP_STREAM_CLOSE:
305+
// TODO: This is a place to do cleanup
306+
mp_stream_close(self->sock);
307+
return 0;
308+
309+
default:
310+
*errcode = MP_EINVAL;
311+
return MP_STREAM_ERROR;
312+
}
304313
}
305-
STATIC MP_DEFINE_CONST_FUN_OBJ_1(webrepl_close_obj, webrepl_close);
306314

307315
STATIC mp_obj_t webrepl_set_password(mp_obj_t passwd_in) {
308316
size_t len;
@@ -319,13 +327,14 @@ STATIC const mp_rom_map_elem_t webrepl_locals_dict_table[] = {
319327
{ MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) },
320328
{ MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) },
321329
{ MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
322-
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&webrepl_close_obj) },
330+
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) },
323331
};
324332
STATIC MP_DEFINE_CONST_DICT(webrepl_locals_dict, webrepl_locals_dict_table);
325333

326334
STATIC const mp_stream_p_t webrepl_stream_p = {
327335
.read = webrepl_read,
328336
.write = webrepl_write,
337+
.ioctl = webrepl_ioctl,
329338
};
330339

331340
STATIC const mp_obj_type_t webrepl_type = {

extmod/modwebsocket.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,11 @@ STATIC mp_uint_t websocket_write(mp_obj_t self_in, const void *buf, mp_uint_t si
256256
STATIC mp_uint_t websocket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, int *errcode) {
257257
mp_obj_websocket_t *self = MP_OBJ_TO_PTR(self_in);
258258
switch (request) {
259+
case MP_STREAM_CLOSE:
260+
// TODO: Send close signaling to the other side, otherwise it's
261+
// abrupt close (connection abort).
262+
mp_stream_close(self->sock);
263+
return 0;
259264
case MP_STREAM_GET_DATA_OPTS:
260265
return self->ws_flags & FRAME_OPCODE_MASK;
261266
case MP_STREAM_SET_DATA_OPTS: {
@@ -269,21 +274,13 @@ STATIC mp_uint_t websocket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t
269274
}
270275
}
271276

272-
STATIC mp_obj_t websocket_close(mp_obj_t self_in) {
273-
mp_obj_websocket_t *self = MP_OBJ_TO_PTR(self_in);
274-
// TODO: Send close signaling to the other side, otherwise it's
275-
// abrupt close (connection abort).
276-
return mp_stream_close(self->sock);
277-
}
278-
STATIC MP_DEFINE_CONST_FUN_OBJ_1(websocket_close_obj, websocket_close);
279-
280277
STATIC const mp_rom_map_elem_t websocket_locals_dict_table[] = {
281278
{ MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) },
282279
{ MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) },
283280
{ MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj) },
284281
{ MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
285282
{ MP_ROM_QSTR(MP_QSTR_ioctl), MP_ROM_PTR(&mp_stream_ioctl_obj) },
286-
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&websocket_close_obj) },
283+
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) },
287284
};
288285
STATIC MP_DEFINE_CONST_DICT(websocket_locals_dict, websocket_locals_dict_table);
289286

extmod/vfs_fat_file.c

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -103,22 +103,9 @@ STATIC mp_uint_t file_obj_write(mp_obj_t self_in, const void *buf, mp_uint_t siz
103103
}
104104

105105

106-
STATIC mp_obj_t file_obj_close(mp_obj_t self_in) {
107-
pyb_file_obj_t *self = MP_OBJ_TO_PTR(self_in);
108-
// if fs==NULL then the file is closed and in that case this method is a no-op
109-
if (self->fp.obj.fs != NULL) {
110-
FRESULT res = f_close(&self->fp);
111-
if (res != FR_OK) {
112-
mp_raise_OSError(fresult_to_errno_table[res]);
113-
}
114-
}
115-
return mp_const_none;
116-
}
117-
STATIC MP_DEFINE_CONST_FUN_OBJ_1(file_obj_close_obj, file_obj_close);
118-
119106
STATIC mp_obj_t file_obj___exit__(size_t n_args, const mp_obj_t *args) {
120107
(void)n_args;
121-
return file_obj_close(args[0]);
108+
return mp_stream_close(args[0]);
122109
}
123110
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(file_obj___exit___obj, 4, 4, file_obj___exit__);
124111

@@ -153,6 +140,17 @@ STATIC mp_uint_t file_obj_ioctl(mp_obj_t o_in, mp_uint_t request, uintptr_t arg,
153140
}
154141
return 0;
155142

143+
} else if (request == MP_STREAM_CLOSE) {
144+
// if fs==NULL then the file is closed and in that case this method is a no-op
145+
if (self->fp.obj.fs != NULL) {
146+
FRESULT res = f_close(&self->fp);
147+
if (res != FR_OK) {
148+
*errcode = fresult_to_errno_table[res];
149+
return MP_STREAM_ERROR;
150+
}
151+
}
152+
return 0;
153+
156154
} else {
157155
*errcode = MP_EINVAL;
158156
return MP_STREAM_ERROR;
@@ -234,10 +232,10 @@ STATIC const mp_rom_map_elem_t rawfile_locals_dict_table[] = {
234232
{ MP_ROM_QSTR(MP_QSTR_readlines), MP_ROM_PTR(&mp_stream_unbuffered_readlines_obj) },
235233
{ MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
236234
{ MP_ROM_QSTR(MP_QSTR_flush), MP_ROM_PTR(&mp_stream_flush_obj) },
237-
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&file_obj_close_obj) },
235+
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) },
238236
{ MP_ROM_QSTR(MP_QSTR_seek), MP_ROM_PTR(&mp_stream_seek_obj) },
239237
{ MP_ROM_QSTR(MP_QSTR_tell), MP_ROM_PTR(&mp_stream_tell_obj) },
240-
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&file_obj_close_obj) },
238+
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_stream_close_obj) },
241239
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&mp_identity_obj) },
242240
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&file_obj___exit___obj) },
243241
};

ports/cc3200/mods/modusocket.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,9 @@ STATIC int wlan_socket_ioctl (mod_network_socket_obj_t *s, mp_uint_t request, mp
336336
if (SL_FD_ISSET(sd, &xfds)) {
337337
ret |= MP_STREAM_POLL_HUP;
338338
}
339+
} else if (request == MP_STREAM_CLOSE) {
340+
wlan_socket_close(s);
341+
ret = 0;
339342
} else {
340343
*_errno = MP_EINVAL;
341344
ret = MP_STREAM_ERROR;
@@ -466,14 +469,6 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, size_t n_args, size_t
466469
return s;
467470
}
468471

469-
// method socket.close()
470-
STATIC mp_obj_t socket_close(mp_obj_t self_in) {
471-
mod_network_socket_obj_t *self = self_in;
472-
wlan_socket_close(self);
473-
return mp_const_none;
474-
}
475-
STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_close_obj, socket_close);
476-
477472
// method socket.bind(address)
478473
STATIC mp_obj_t socket_bind(mp_obj_t self_in, mp_obj_t addr_in) {
479474
mod_network_socket_obj_t *self = self_in;
@@ -704,8 +699,8 @@ STATIC mp_obj_t socket_makefile(size_t n_args, const mp_obj_t *args) {
704699
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_makefile_obj, 1, 6, socket_makefile);
705700

706701
STATIC const mp_rom_map_elem_t socket_locals_dict_table[] = {
707-
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&socket_close_obj) },
708-
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&socket_close_obj) },
702+
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_stream_close_obj) },
703+
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) },
709704
{ MP_ROM_QSTR(MP_QSTR_bind), MP_ROM_PTR(&socket_bind_obj) },
710705
{ MP_ROM_QSTR(MP_QSTR_listen), MP_ROM_PTR(&socket_listen_obj) },
711706
{ MP_ROM_QSTR(MP_QSTR_accept), MP_ROM_PTR(&socket_accept_obj) },

0 commit comments

Comments
 (0)