summaryrefslogtreecommitdiffstatshomepage
path: root/lib/utils/pyexec.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2017-03-14 11:21:29 +1100
committerDamien George <damien.p.george@gmail.com>2017-03-14 11:52:05 +1100
commit56b238393b8c4172c7054011216792a9546ce7db (patch)
tree6a681d7f8a21c04474d80d95e92cf2a4c3417e23 /lib/utils/pyexec.c
parent1831034be13fef5344583c557ff089df31788251 (diff)
downloadmicropython-56b238393b8c4172c7054011216792a9546ce7db.tar.gz
micropython-56b238393b8c4172c7054011216792a9546ce7db.zip
lib/utils/pyexec: Refactor to put lexer constructors all in one place.
The lexer can now raise an exception on construction so it must go within an nlr handler block.
Diffstat (limited to 'lib/utils/pyexec.c')
-rw-r--r--lib/utils/pyexec.c67
1 files changed, 25 insertions, 42 deletions
diff --git a/lib/utils/pyexec.c b/lib/utils/pyexec.c
index 0d20c19178..80a7282b14 100644
--- a/lib/utils/pyexec.c
+++ b/lib/utils/pyexec.c
@@ -52,13 +52,15 @@ STATIC bool repl_display_debugging_info = 0;
#define EXEC_FLAG_ALLOW_DEBUGGING (2)
#define EXEC_FLAG_IS_REPL (4)
#define EXEC_FLAG_SOURCE_IS_RAW_CODE (8)
+#define EXEC_FLAG_SOURCE_IS_VSTR (16)
+#define EXEC_FLAG_SOURCE_IS_FILENAME (32)
// parses, compiles and executes the code in the lexer
// frees the lexer before returning
// EXEC_FLAG_PRINT_EOF prints 2 EOF chars: 1 after normal output, 1 after exception output
// EXEC_FLAG_ALLOW_DEBUGGING allows debugging info to be printed after executing the code
// EXEC_FLAG_IS_REPL is used for REPL inputs (flag passed on to mp_compile)
-STATIC int parse_compile_execute(void *source, mp_parse_input_kind_t input_kind, int exec_flags) {
+STATIC int parse_compile_execute(const void *source, mp_parse_input_kind_t input_kind, int exec_flags) {
int ret = 0;
uint32_t start = 0;
@@ -76,8 +78,16 @@ STATIC int parse_compile_execute(void *source, mp_parse_input_kind_t input_kind,
#endif
{
#if MICROPY_ENABLE_COMPILER
+ mp_lexer_t *lex;
+ if (exec_flags & EXEC_FLAG_SOURCE_IS_VSTR) {
+ const vstr_t *vstr = source;
+ lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, vstr->buf, vstr->len, 0);
+ } else if (exec_flags & EXEC_FLAG_SOURCE_IS_FILENAME) {
+ lex = mp_lexer_new_from_file(source);
+ } else {
+ lex = (mp_lexer_t*)source;
+ }
// source is a lexer, parse and compile the script
- mp_lexer_t *lex = source;
qstr source_name = lex->source_name;
mp_parse_tree_t parse_tree = mp_parse(lex, input_kind);
module_fun = mp_compile(&parse_tree, source_name, MP_EMIT_OPT_NONE, exec_flags & EXEC_FLAG_IS_REPL);
@@ -202,14 +212,9 @@ STATIC int pyexec_raw_repl_process_char(int c) {
return PYEXEC_FORCED_EXIT;
}
- mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, MP_STATE_VM(repl_line)->buf, MP_STATE_VM(repl_line)->len, 0);
- if (lex == NULL) {
- mp_hal_stdout_tx_str("\x04MemoryError\r\n\x04");
- } else {
- int ret = parse_compile_execute(lex, MP_PARSE_FILE_INPUT, EXEC_FLAG_PRINT_EOF);
- if (ret & PYEXEC_FORCED_EXIT) {
- return ret;
- }
+ int ret = parse_compile_execute(MP_STATE_VM(repl_line), MP_PARSE_FILE_INPUT, EXEC_FLAG_PRINT_EOF | EXEC_FLAG_SOURCE_IS_VSTR);
+ if (ret & PYEXEC_FORCED_EXIT) {
+ return ret;
}
reset:
@@ -285,14 +290,9 @@ STATIC int pyexec_friendly_repl_process_char(int c) {
}
exec: ;
- mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, vstr_str(MP_STATE_VM(repl_line)), vstr_len(MP_STATE_VM(repl_line)), 0);
- if (lex == NULL) {
- printf("MemoryError\n");
- } else {
- int ret = parse_compile_execute(lex, MP_PARSE_SINGLE_INPUT, EXEC_FLAG_ALLOW_DEBUGGING | EXEC_FLAG_IS_REPL);
- if (ret & PYEXEC_FORCED_EXIT) {
- return ret;
- }
+ int ret = parse_compile_execute(MP_STATE_VM(repl_line), MP_PARSE_SINGLE_INPUT, EXEC_FLAG_ALLOW_DEBUGGING | EXEC_FLAG_IS_REPL | EXEC_FLAG_SOURCE_IS_VSTR);
+ if (ret & PYEXEC_FORCED_EXIT) {
+ return ret;
}
input_restart:
@@ -361,14 +361,9 @@ raw_repl_reset:
return PYEXEC_FORCED_EXIT;
}
- mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, line.buf, line.len, 0);
- if (lex == NULL) {
- printf("\x04MemoryError\n\x04");
- } else {
- int ret = parse_compile_execute(lex, MP_PARSE_FILE_INPUT, EXEC_FLAG_PRINT_EOF);
- if (ret & PYEXEC_FORCED_EXIT) {
- return ret;
- }
+ int ret = parse_compile_execute(&line, MP_PARSE_FILE_INPUT, EXEC_FLAG_PRINT_EOF | EXEC_FLAG_SOURCE_IS_VSTR);
+ if (ret & PYEXEC_FORCED_EXIT) {
+ return ret;
}
}
}
@@ -489,14 +484,9 @@ friendly_repl_reset:
}
}
- mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, vstr_str(&line), vstr_len(&line), 0);
- if (lex == NULL) {
- printf("MemoryError\n");
- } else {
- ret = parse_compile_execute(lex, parse_input_kind, EXEC_FLAG_ALLOW_DEBUGGING | EXEC_FLAG_IS_REPL);
- if (ret & PYEXEC_FORCED_EXIT) {
- return ret;
- }
+ ret = parse_compile_execute(&line, parse_input_kind, EXEC_FLAG_ALLOW_DEBUGGING | EXEC_FLAG_IS_REPL | EXEC_FLAG_SOURCE_IS_VSTR);
+ if (ret & PYEXEC_FORCED_EXIT) {
+ return ret;
}
}
}
@@ -505,14 +495,7 @@ friendly_repl_reset:
#endif // MICROPY_ENABLE_COMPILER
int pyexec_file(const char *filename) {
- mp_lexer_t *lex = mp_lexer_new_from_file(filename);
-
- if (lex == NULL) {
- printf("could not open file '%s' for reading\n", filename);
- return false;
- }
-
- return parse_compile_execute(lex, MP_PARSE_FILE_INPUT, 0);
+ return parse_compile_execute(filename, MP_PARSE_FILE_INPUT, 0);
}
#if MICROPY_MODULE_FROZEN