|
29 | 29 | #include <string.h> |
30 | 30 | #include <assert.h> |
31 | 31 |
|
| 32 | +#include "py/reader.h" |
32 | 33 | #include "py/emitglue.h" |
33 | 34 | #include "py/persistentcode.h" |
34 | 35 | #include "py/bc.h" |
@@ -98,19 +99,19 @@ STATIC void extract_prelude(const byte **ip, const byte **ip2, bytecode_prelude_ |
98 | 99 | #include "py/bc0.h" |
99 | 100 |
|
100 | 101 | STATIC int read_byte(mp_reader_t *reader) { |
101 | | - return reader->read_byte(reader->data); |
| 102 | + return reader->readbyte(reader->data); |
102 | 103 | } |
103 | 104 |
|
104 | 105 | STATIC void read_bytes(mp_reader_t *reader, byte *buf, size_t len) { |
105 | 106 | while (len-- > 0) { |
106 | | - *buf++ = reader->read_byte(reader->data); |
| 107 | + *buf++ = reader->readbyte(reader->data); |
107 | 108 | } |
108 | 109 | } |
109 | 110 |
|
110 | 111 | STATIC mp_uint_t read_uint(mp_reader_t *reader) { |
111 | 112 | mp_uint_t unum = 0; |
112 | 113 | for (;;) { |
113 | | - byte b = reader->read_byte(reader->data); |
| 114 | + byte b = reader->readbyte(reader->data); |
114 | 115 | unum = (unum << 7) | (b & 0x7f); |
115 | 116 | if ((b & 0x80) == 0) { |
116 | 117 | break; |
@@ -214,128 +215,28 @@ mp_raw_code_t *mp_raw_code_load(mp_reader_t *reader) { |
214 | 215 | if (header[2] != MPY_FEATURE_FLAGS || header[3] > mp_small_int_bits()) { |
215 | 216 | mp_raise_ValueError("incompatible .mpy file"); |
216 | 217 | } |
217 | | - return load_raw_code(reader); |
218 | | -} |
219 | | - |
220 | | -typedef struct _mp_mem_reader_t { |
221 | | - const byte *cur; |
222 | | - const byte *end; |
223 | | -} mp_mem_reader_t; |
224 | | - |
225 | | -STATIC mp_uint_t mp_mem_reader_next_byte(void *br_in) { |
226 | | - mp_mem_reader_t *br = br_in; |
227 | | - if (br->cur < br->end) { |
228 | | - return *br->cur++; |
229 | | - } else { |
230 | | - return (mp_uint_t)-1; |
231 | | - } |
| 218 | + mp_raw_code_t *rc = load_raw_code(reader); |
| 219 | + reader->close(reader->data); |
| 220 | + return rc; |
232 | 221 | } |
233 | 222 |
|
234 | 223 | mp_raw_code_t *mp_raw_code_load_mem(const byte *buf, size_t len) { |
235 | | - mp_mem_reader_t mr = {buf, buf + len}; |
236 | | - mp_reader_t reader = {&mr, mp_mem_reader_next_byte}; |
237 | | - return mp_raw_code_load(&reader); |
238 | | -} |
239 | | - |
240 | | -// here we define mp_raw_code_load_file depending on the port |
241 | | -// TODO abstract this away properly |
242 | | - |
243 | | -#if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || defined(__unix__) |
244 | | -// unix file reader |
245 | | - |
246 | | -#include <sys/stat.h> |
247 | | -#include <fcntl.h> |
248 | | -#include <unistd.h> |
249 | | - |
250 | | -typedef struct _mp_lexer_file_buf_t { |
251 | | - int fd; |
252 | | - byte buf[20]; |
253 | | - mp_uint_t len; |
254 | | - mp_uint_t pos; |
255 | | -} mp_lexer_file_buf_t; |
256 | | - |
257 | | -STATIC mp_uint_t file_buf_next_byte(void *fb_in) { |
258 | | - mp_lexer_file_buf_t *fb = fb_in; |
259 | | - if (fb->pos >= fb->len) { |
260 | | - if (fb->len == 0) { |
261 | | - return (mp_uint_t)-1; |
262 | | - } else { |
263 | | - int n = read(fb->fd, fb->buf, sizeof(fb->buf)); |
264 | | - if (n <= 0) { |
265 | | - fb->len = 0; |
266 | | - return (mp_uint_t)-1; |
267 | | - } |
268 | | - fb->len = n; |
269 | | - fb->pos = 0; |
270 | | - } |
271 | | - } |
272 | | - return fb->buf[fb->pos++]; |
273 | | -} |
274 | | - |
275 | | -mp_raw_code_t *mp_raw_code_load_file(const char *filename) { |
276 | | - mp_lexer_file_buf_t fb; |
277 | | - fb.fd = open(filename, O_RDONLY, 0644); |
278 | | - int n = read(fb.fd, fb.buf, sizeof(fb.buf)); |
279 | | - fb.len = n; |
280 | | - fb.pos = 0; |
281 | 224 | mp_reader_t reader; |
282 | | - reader.data = &fb; |
283 | | - reader.read_byte = file_buf_next_byte; |
284 | | - mp_raw_code_t *rc = mp_raw_code_load(&reader); |
285 | | - close(fb.fd); |
286 | | - return rc; |
287 | | -} |
288 | | - |
289 | | -#elif defined(__thumb2__) || defined(__xtensa__) |
290 | | -// fatfs file reader (assume thumb2 arch uses fatfs...) |
291 | | - |
292 | | -#include "lib/fatfs/ff.h" |
293 | | - |
294 | | -typedef struct _mp_lexer_file_buf_t { |
295 | | - FIL fp; |
296 | | - byte buf[20]; |
297 | | - uint16_t len; |
298 | | - uint16_t pos; |
299 | | -} mp_lexer_file_buf_t; |
300 | | - |
301 | | -STATIC mp_uint_t file_buf_next_byte(void *fb_in) { |
302 | | - mp_lexer_file_buf_t *fb = fb_in; |
303 | | - if (fb->pos >= fb->len) { |
304 | | - if (fb->len < sizeof(fb->buf)) { |
305 | | - return (mp_uint_t)-1; |
306 | | - } else { |
307 | | - UINT n; |
308 | | - f_read(&fb->fp, fb->buf, sizeof(fb->buf), &n); |
309 | | - if (n == 0) { |
310 | | - return (mp_uint_t)-1; |
311 | | - } |
312 | | - fb->len = n; |
313 | | - fb->pos = 0; |
314 | | - } |
| 225 | + if (!mp_reader_new_mem(&reader, buf, len, 0)) { |
| 226 | + m_malloc_fail(BYTES_PER_WORD); // we need to raise a MemoryError |
315 | 227 | } |
316 | | - return fb->buf[fb->pos++]; |
| 228 | + return mp_raw_code_load(&reader); |
317 | 229 | } |
318 | 230 |
|
319 | 231 | mp_raw_code_t *mp_raw_code_load_file(const char *filename) { |
320 | | - mp_lexer_file_buf_t fb; |
321 | | - /*FRESULT res =*/ f_open(&fb.fp, filename, FA_READ); |
322 | | - UINT n; |
323 | | - f_read(&fb.fp, fb.buf, sizeof(fb.buf), &n); |
324 | | - fb.len = n; |
325 | | - fb.pos = 0; |
326 | | - |
327 | 232 | mp_reader_t reader; |
328 | | - reader.data = &fb; |
329 | | - reader.read_byte = file_buf_next_byte; |
330 | | - mp_raw_code_t *rc = mp_raw_code_load(&reader); |
331 | | - |
332 | | - f_close(&fb.fp); |
333 | | - |
334 | | - return rc; |
| 233 | + int ret = mp_reader_new_file(&reader, filename); |
| 234 | + if (ret != 0) { |
| 235 | + mp_raise_OSError(ret); |
| 236 | + } |
| 237 | + return mp_raw_code_load(&reader); |
335 | 238 | } |
336 | 239 |
|
337 | | -#endif |
338 | | - |
339 | 240 | #endif // MICROPY_PERSISTENT_CODE_LOAD |
340 | 241 |
|
341 | 242 | #if MICROPY_PERSISTENT_CODE_SAVE |
|
0 commit comments