Skip to content

Commit bd417a8

Browse files
committed
unix/main: Replace execute_from_lexer with new pyexec functions.
Remove execute_from_lexer() and replace its usage with: - pyexec_str_single() for REPL single-input execution - pyexec_stdin() for stdin execution Also optimize do_str() to use vstr_init_fixed_buf() and factor shared return code conversion logic into convert_pyexec_result(). Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
1 parent 7b41822 commit bd417a8

File tree

2 files changed

+17
-75
lines changed

2 files changed

+17
-75
lines changed

ports/unix/main.c

Lines changed: 14 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -109,64 +109,6 @@ static int handle_uncaught_exception(mp_obj_base_t *exc) {
109109
return 1;
110110
}
111111

112-
#define LEX_SRC_STR (1)
113-
#define LEX_SRC_STDIN (4)
114-
115-
// Returns standard error codes: 0 for success, 1 for all other errors,
116-
// except if FORCED_EXIT bit is set then script raised SystemExit and the
117-
// value of the exit is in the lower 8 bits of the return value
118-
static int execute_from_lexer(int source_kind, const void *source, mp_parse_input_kind_t input_kind, bool is_repl) {
119-
mp_hal_set_interrupt_char(CHAR_CTRL_C);
120-
121-
nlr_buf_t nlr;
122-
if (nlr_push(&nlr) == 0) {
123-
// create lexer based on source kind
124-
mp_lexer_t *lex;
125-
if (source_kind == LEX_SRC_STR) {
126-
const char *line = source;
127-
lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, line, strlen(line), false);
128-
} else { // LEX_SRC_STDIN
129-
lex = mp_lexer_new_from_fd(MP_QSTR__lt_stdin_gt_, 0, false);
130-
}
131-
132-
qstr source_name = lex->source_name;
133-
134-
#if MICROPY_PY___FILE__
135-
if (input_kind == MP_PARSE_FILE_INPUT) {
136-
mp_store_global(MP_QSTR___file__, MP_OBJ_NEW_QSTR(source_name));
137-
}
138-
#endif
139-
140-
mp_parse_tree_t parse_tree = mp_parse(lex, input_kind);
141-
142-
#if defined(MICROPY_UNIX_COVERAGE)
143-
// allow to print the parse tree in the coverage build
144-
if (mp_verbose_flag >= 3) {
145-
printf("----------------\n");
146-
mp_parse_node_print(&mp_plat_print, parse_tree.root, 0);
147-
printf("----------------\n");
148-
}
149-
#endif
150-
151-
mp_obj_t module_fun = mp_compile(&parse_tree, source_name, is_repl);
152-
153-
if (!mp_compile_only) {
154-
// execute it
155-
mp_call_function_0(module_fun);
156-
}
157-
158-
mp_hal_set_interrupt_char(-1);
159-
mp_handle_pending(true);
160-
nlr_pop();
161-
return 0;
162-
163-
} else {
164-
// uncaught exception
165-
mp_hal_set_interrupt_char(-1);
166-
mp_handle_pending(false);
167-
return handle_uncaught_exception(nlr.ret_val);
168-
}
169-
}
170112

171113
#if MICROPY_USE_READLINE == 1
172114
#include "shared/readline/readline.h"
@@ -226,7 +168,7 @@ static int do_repl(void) {
226168
line = line3;
227169
}
228170

229-
ret = execute_from_lexer(LEX_SRC_STR, line, MP_PARSE_SINGLE_INPUT, true);
171+
ret = convert_pyexec_result(pyexec_str_single(line, true));
230172
free(line);
231173
if (ret & FORCED_EXIT) {
232174
return ret;
@@ -237,10 +179,10 @@ static int do_repl(void) {
237179
}
238180

239181

240-
static int do_file(const char *file) {
241-
int ret = pyexec_file(file);
242-
// pyexec returns 1 for success, 0 for exception, PYEXEC_FORCED_EXIT for SystemExit
243-
// Convert to unix port's expected codes: 0 for success, 1 for exception, FORCED_EXIT|val for SystemExit
182+
// Convert pyexec return codes to unix port's expected codes
183+
// pyexec returns 1 for success, 0 for exception, PYEXEC_FORCED_EXIT for SystemExit
184+
// Convert to unix port's expected codes: 0 for success, 1 for exception, FORCED_EXIT|val for SystemExit
185+
static int convert_pyexec_result(int ret) {
244186
if (ret == 1) {
245187
return 0; // success
246188
} else if (ret & PYEXEC_FORCED_EXIT) {
@@ -250,19 +192,16 @@ static int do_file(const char *file) {
250192
}
251193
}
252194

195+
static int do_file(const char *file) {
196+
return convert_pyexec_result(pyexec_file(file));
197+
}
198+
253199
static int do_str(const char *str) {
254200
vstr_t vstr;
255-
vstr_init(&vstr, strlen(str));
256-
vstr_add_strn(&vstr, str, strlen(str));
257-
int ret = pyexec_vstr(&vstr, false);
258-
vstr_clear(&vstr);
259-
if (ret == 1) {
260-
return 0; // success
261-
} else if (ret & PYEXEC_FORCED_EXIT) {
262-
return ret; // SystemExit with exit value in lower 8 bits
263-
} else {
264-
return 1; // exception
265-
}
201+
size_t len = strlen(str);
202+
vstr_init_fixed_buf(&vstr, len, (char*)str);
203+
vstr.len = len;
204+
return convert_pyexec_result(pyexec_vstr(&vstr, false));
266205
}
267206

268207
static void print_help(char **argv) {
@@ -703,7 +642,7 @@ MP_NOINLINE int main_(int argc, char **argv) {
703642
ret = do_repl();
704643
prompt_write_history();
705644
} else {
706-
ret = execute_from_lexer(LEX_SRC_STDIN, NULL, MP_PARSE_FILE_INPUT, false);
645+
ret = convert_pyexec_result(pyexec_stdin());
707646
}
708647
}
709648

ports/unix/mpconfigport.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ typedef long mp_off_t;
169169
// Enable support for compile-only mode.
170170
#define MICROPY_PYEXEC_COMPILE_ONLY (1)
171171

172+
// Enable POSIX-specific pyexec functions.
173+
#define MICROPY_PYEXEC_POSIX_FUNCTIONS (1)
174+
172175
#define MICROPY_PY_SOCKET_LISTEN_BACKLOG_DEFAULT (SOMAXCONN < 128 ? SOMAXCONN : 128)
173176

174177
// Bare-metal ports don't have stderr. Printing debug to stderr may give tests

0 commit comments

Comments
 (0)