diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 3d35792ddf..d5d034030c 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -7,6 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## 2.3.3 [to be released on 2nd September 2020] ### Added +- Running the frozen version of the emulator doesn't need arguments. [#1115] ### Changed - Print inverted question mark for non-printable characters. @@ -252,4 +253,5 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). [#1074]: https://github.com/trezor/trezor-firmware/issues/1074 [#1089]: https://github.com/trezor/trezor-firmware/issues/1089 [#1098]: https://github.com/trezor/trezor-firmware/issues/1098 +[#1115]: https://github.com/trezor/trezor-firmware/issues/1115 [#1126]: https://github.com/trezor/trezor-firmware/issues/1126 diff --git a/core/embed/unix/main.c b/core/embed/unix/main.c index 3b3b1c72db..109176dba4 100644 --- a/core/embed/unix/main.c +++ b/core/embed/unix/main.c @@ -427,6 +427,46 @@ void main_clean_exit(int status) { #define PATHLIST_SEP_CHAR ':' #endif +static int do_import_module(const char *modname) { + mp_obj_t import_args[4]; + import_args[0] = mp_obj_new_str(modname, strlen(modname)); + import_args[1] = import_args[2] = mp_const_none; + // Ask __import__ to handle imported module specially - set its __name__ + // to __main__, and also return this leaf module, not top-level package + // containing it. + import_args[3] = mp_const_false; + // TODO: https://docs.python.org/3/using/cmdline.html#cmdoption-m : + // "the first element of sys.argv will be the full path to + // the module file (while the module file is being located, + // the first element will be set to "-m")." + + mp_obj_t mod; + nlr_buf_t nlr; + bool subpkg_tried = false; + +reimport: + if (nlr_push(&nlr) == 0) { + mod = mp_builtin___import__(MP_ARRAY_SIZE(import_args), import_args); + nlr_pop(); + } else { + // uncaught exception + exit(handle_uncaught_exception(nlr.ret_val) & 0xff); + } + + if (mp_obj_is_package(mod) && !subpkg_tried) { + subpkg_tried = true; + vstr_t vstr; + int len = strlen(modname); + vstr_init(&vstr, len + sizeof(".__main__")); + vstr_add_strn(&vstr, modname, len); + vstr_add_strn(&vstr, ".__main__", sizeof(".__main__") - 1); + import_args[0] = mp_obj_new_str_from_vstr(&mp_type_str, &vstr); + goto reimport; + } + + return 0; +} + MP_NOINLINE int main_(int argc, char **argv); int main(int argc, char **argv) { @@ -555,9 +595,11 @@ MP_NOINLINE int main_(int argc, char **argv) { const int NOTHING_EXECUTED = -2; int ret = NOTHING_EXECUTED; bool inspect = false; + bool default_import = true; for (int a = 1; a < argc; a++) { if (argv[a][0] == '-') { if (strcmp(argv[a], "-i") == 0) { + default_import = false; inspect = true; } else if (strcmp(argv[a], "-c") == 0) { if (a + 1 >= argc) { @@ -572,44 +614,9 @@ MP_NOINLINE int main_(int argc, char **argv) { if (a + 1 >= argc) { return usage(argv); } - mp_obj_t import_args[4]; - import_args[0] = mp_obj_new_str(argv[a + 1], strlen(argv[a + 1])); - import_args[1] = import_args[2] = mp_const_none; - // Ask __import__ to handle imported module specially - set its __name__ - // to __main__, and also return this leaf module, not top-level package - // containing it. - import_args[3] = mp_const_false; - // TODO: https://docs.python.org/3/using/cmdline.html#cmdoption-m : - // "the first element of sys.argv will be the full path to - // the module file (while the module file is being located, - // the first element will be set to "-m")." + default_import = false; set_sys_argv(argv, argc, a + 1); - - mp_obj_t mod; - nlr_buf_t nlr; - bool subpkg_tried = false; - - reimport: - if (nlr_push(&nlr) == 0) { - mod = mp_builtin___import__(MP_ARRAY_SIZE(import_args), import_args); - nlr_pop(); - } else { - // uncaught exception - return handle_uncaught_exception(nlr.ret_val) & 0xff; - } - - if (mp_obj_is_package(mod) && !subpkg_tried) { - subpkg_tried = true; - vstr_t vstr; - int len = strlen(argv[a + 1]); - vstr_init(&vstr, len + sizeof(".__main__")); - vstr_add_strn(&vstr, argv[a + 1], len); - vstr_add_strn(&vstr, ".__main__", sizeof(".__main__") - 1); - import_args[0] = mp_obj_new_str_from_vstr(&mp_type_str, &vstr); - goto reimport; - } - - ret = 0; + ret = do_import_module(argv[a + 1]); break; } else if (strcmp(argv[a], "-X") == 0) { a += 1; @@ -651,6 +658,10 @@ MP_NOINLINE int main_(int argc, char **argv) { } } + if (ret == NOTHING_EXECUTED && default_import) { + ret = do_import_module("main"); + } + if (ret == NOTHING_EXECUTED || inspect) { if (isatty(0)) { prompt_read_history(); diff --git a/core/emu.sh b/core/emu.sh index f59e015b2a..d71c8cf8b0 100755 --- a/core/emu.sh +++ b/core/emu.sh @@ -13,4 +13,4 @@ else cd "src${TREZOR_MODEL}" fi -../build/unix/micropython -O$PYOPT -X heapsize=20M -m main +../build/unix/micropython -O$PYOPT -X heapsize=20M diff --git a/docs/ci/jobs.md b/docs/ci/jobs.md index 4607a22048..6ee77273ba 100644 --- a/docs/ci/jobs.md +++ b/docs/ci/jobs.md @@ -34,7 +34,7 @@ on the device gets wiped on every start in this firmware. Build of Core into UNIX emulator. Something you can run on your laptop. Frozen version. That means you do not need any other files to run it, it is just -a single binary file. Run it using `micropython -m main`. +a single binary file that you can execute directly. See [Emulator](../core/emulator/index.md) for more info.