mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-22 15:38:11 +00:00
core/emulator: assume -m main
when no arguments are provided
fixes #1115
This commit is contained in:
parent
f4c9d0a040
commit
8502412dbc
@ -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]
|
## 2.3.3 [to be released on 2nd September 2020]
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
- Running the frozen version of the emulator doesn't need arguments. [#1115]
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- Print inverted question mark for non-printable characters.
|
- 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
|
[#1074]: https://github.com/trezor/trezor-firmware/issues/1074
|
||||||
[#1089]: https://github.com/trezor/trezor-firmware/issues/1089
|
[#1089]: https://github.com/trezor/trezor-firmware/issues/1089
|
||||||
[#1098]: https://github.com/trezor/trezor-firmware/issues/1098
|
[#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
|
[#1126]: https://github.com/trezor/trezor-firmware/issues/1126
|
||||||
|
@ -427,6 +427,46 @@ void main_clean_exit(int status) {
|
|||||||
#define PATHLIST_SEP_CHAR ':'
|
#define PATHLIST_SEP_CHAR ':'
|
||||||
#endif
|
#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);
|
MP_NOINLINE int main_(int argc, char **argv);
|
||||||
|
|
||||||
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;
|
const int NOTHING_EXECUTED = -2;
|
||||||
int ret = NOTHING_EXECUTED;
|
int ret = NOTHING_EXECUTED;
|
||||||
bool inspect = false;
|
bool inspect = false;
|
||||||
|
bool default_import = true;
|
||||||
for (int a = 1; a < argc; a++) {
|
for (int a = 1; a < argc; a++) {
|
||||||
if (argv[a][0] == '-') {
|
if (argv[a][0] == '-') {
|
||||||
if (strcmp(argv[a], "-i") == 0) {
|
if (strcmp(argv[a], "-i") == 0) {
|
||||||
|
default_import = false;
|
||||||
inspect = true;
|
inspect = true;
|
||||||
} else if (strcmp(argv[a], "-c") == 0) {
|
} else if (strcmp(argv[a], "-c") == 0) {
|
||||||
if (a + 1 >= argc) {
|
if (a + 1 >= argc) {
|
||||||
@ -572,44 +614,9 @@ MP_NOINLINE int main_(int argc, char **argv) {
|
|||||||
if (a + 1 >= argc) {
|
if (a + 1 >= argc) {
|
||||||
return usage(argv);
|
return usage(argv);
|
||||||
}
|
}
|
||||||
mp_obj_t import_args[4];
|
default_import = false;
|
||||||
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")."
|
|
||||||
set_sys_argv(argv, argc, a + 1);
|
set_sys_argv(argv, argc, a + 1);
|
||||||
|
ret = do_import_module(argv[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;
|
|
||||||
break;
|
break;
|
||||||
} else if (strcmp(argv[a], "-X") == 0) {
|
} else if (strcmp(argv[a], "-X") == 0) {
|
||||||
a += 1;
|
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 (ret == NOTHING_EXECUTED || inspect) {
|
||||||
if (isatty(0)) {
|
if (isatty(0)) {
|
||||||
prompt_read_history();
|
prompt_read_history();
|
||||||
|
@ -13,4 +13,4 @@ else
|
|||||||
cd "src${TREZOR_MODEL}"
|
cd "src${TREZOR_MODEL}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
../build/unix/micropython -O$PYOPT -X heapsize=20M -m main
|
../build/unix/micropython -O$PYOPT -X heapsize=20M
|
||||||
|
@ -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.
|
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
|
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.
|
See [Emulator](../core/emulator/index.md) for more info.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user