From 1993c8cf9af930cd6ff2f28390ac3a8a09d5b297 Mon Sep 17 00:00:00 2001 From: Damien George Date: Fri, 28 Feb 2020 12:45:36 +1100 Subject: py/builtinevex: Support passing in a bytearray/buffer to eval/exec. CPython allows this and it's a simple generalisation of the existing code which just supported str/bytes. Fixes issue #5704. --- py/builtinevex.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'py/builtinevex.c') diff --git a/py/builtinevex.c b/py/builtinevex.c index a4bf7d924a..4e61205485 100644 --- a/py/builtinevex.c +++ b/py/builtinevex.c @@ -136,17 +136,18 @@ STATIC mp_obj_t eval_exec_helper(size_t n_args, const mp_obj_t *args, mp_parse_i } #endif - size_t str_len; - const char *str = mp_obj_str_get_data(args[0], &str_len); + // Extract the source code. + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ); // create the lexer // MP_PARSE_SINGLE_INPUT is used to indicate a file input mp_lexer_t *lex; if (MICROPY_PY_BUILTINS_EXECFILE && parse_input_kind == MP_PARSE_SINGLE_INPUT) { - lex = mp_lexer_new_from_file(str); + lex = mp_lexer_new_from_file(bufinfo.buf); parse_input_kind = MP_PARSE_FILE_INPUT; } else { - lex = mp_lexer_new_from_str_len(MP_QSTR__lt_string_gt_, str, str_len, 0); + lex = mp_lexer_new_from_str_len(MP_QSTR__lt_string_gt_, bufinfo.buf, bufinfo.len, 0); } return mp_parse_compile_execute(lex, parse_input_kind, globals, locals); -- cgit v1.2.3