Skip to content

Commit f870e8d

Browse files
committed
py/reader: Provide mp_reader_try_read_rom() function.
This allows accessing data directly in ROM if the reader supports it. Signed-off-by: Damien George <[email protected]>
1 parent a1c3210 commit f870e8d

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

py/reader.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ static mp_uint_t mp_reader_mem_readbyte(void *data) {
5050

5151
static void mp_reader_mem_close(void *data) {
5252
mp_reader_mem_t *reader = (mp_reader_mem_t *)data;
53-
if (reader->free_len > 0) {
53+
if (reader->free_len > 0 && reader->free_len != MP_READER_IS_ROM) {
5454
m_del(char, (char *)reader->beg, reader->free_len);
5555
}
5656
m_del_obj(mp_reader_mem_t, reader);
@@ -67,6 +67,19 @@ void mp_reader_new_mem(mp_reader_t *reader, const byte *buf, size_t len, size_t
6767
reader->close = mp_reader_mem_close;
6868
}
6969

70+
const uint8_t *mp_reader_try_read_rom(mp_reader_t *reader, size_t len) {
71+
if (reader->readbyte != mp_reader_mem_readbyte) {
72+
return NULL;
73+
}
74+
mp_reader_mem_t *m = reader->data;
75+
if (m->free_len != MP_READER_IS_ROM) {
76+
return NULL;
77+
}
78+
const uint8_t *data = m->cur;
79+
m->cur += len;
80+
return data;
81+
}
82+
7083
#if MICROPY_READER_POSIX
7184

7285
#include <sys/stat.h>

py/reader.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828

2929
#include "py/obj.h"
3030

31+
// Pass to the `free_len` argument to `mp_reader_new_mem` to indicate that the data is in ROM.
32+
// This means that the data is addressable and will remain valid at least until a soft reset.
33+
#define MP_READER_IS_ROM ((size_t)-1)
34+
3135
// the readbyte function must return the next byte in the input stream
3236
// it must return MP_READER_EOF if end of stream
3337
// it can be called again after returning MP_READER_EOF, and in that case must return MP_READER_EOF
@@ -43,4 +47,9 @@ void mp_reader_new_mem(mp_reader_t *reader, const byte *buf, size_t len, size_t
4347
void mp_reader_new_file(mp_reader_t *reader, qstr filename);
4448
void mp_reader_new_file_from_fd(mp_reader_t *reader, int fd, bool close_fd);
4549

50+
// Try to efficiently read the given number of bytes from a ROM-based reader.
51+
// Returns a valid, non-NULL pointer to the requseted data if the reader points to ROM.
52+
// Returns NULL if the reader does not point to ROM.
53+
const uint8_t *mp_reader_try_read_rom(mp_reader_t *reader, size_t len);
54+
4655
#endif // MICROPY_INCLUDED_PY_READER_H

0 commit comments

Comments
 (0)