webassembly: Make mp_js_do_str asynchronous.

This fixes a bug where `gc.collect()` would crash due to
emscripten_scan_stack being called synchronously within mp_js_do_str.  The
fix is to make mp_js_do_str asynchronous.

Fixes #10692.

Signed-off-by: Eli Bierman <eli@elib.dev>
This commit is contained in:
elibdev 2023-06-19 11:56:38 -04:00 committed by Damien George
parent 0e215a9fba
commit b2ad7e238b
2 changed files with 7 additions and 5 deletions

View File

@ -49,7 +49,7 @@ using the require command and the general API outlined below. For example:
var mp_js = require('./build/micropython.js'); var mp_js = require('./build/micropython.js');
mp_js_init(64 * 1024); mp_js_init(64 * 1024);
mp_js_do_str("print('hello world')\n"); await mp_js_do_str("print('hello world')\n");
``` ```
Running with HTML Running with HTML
@ -77,7 +77,7 @@ something to stdout. The following code demonstrates basic functionality:
Module["onRuntimeInitialized"] = async function() { Module["onRuntimeInitialized"] = async function() {
mp_js_startup(); mp_js_startup();
mp_js_init(64 * 1024); mp_js_init(64 * 1024);
mp_js_do_str("print('hello world')"); await mp_js_do_str("print('hello world')");
}; };
</script> </script>
</body> </body>
@ -108,7 +108,7 @@ Initialize MicroPython with the given stack size in bytes. This must be
called before attempting to interact with MicroPython. called before attempting to interact with MicroPython.
``` ```
mp_js_do_str(code) await mp_js_do_str(code)
``` ```
Execute the input code. `code` must be a `string`. Execute the input code. `code` must be a `string`.

View File

@ -29,7 +29,7 @@ var Module = {};
var mainProgram = function() var mainProgram = function()
{ {
mp_js_init = Module.cwrap('mp_js_init', 'null', ['number']); mp_js_init = Module.cwrap('mp_js_init', 'null', ['number']);
mp_js_do_str = Module.cwrap('mp_js_do_str', 'number', ['string']); mp_js_do_str = Module.cwrap('mp_js_do_str', 'number', ['string'], {async: true});
mp_js_init_repl = Module.cwrap('mp_js_init_repl', 'null', ['null']); mp_js_init_repl = Module.cwrap('mp_js_init_repl', 'null', ['null']);
mp_js_process_char = Module.cwrap('mp_js_process_char', 'number', ['number']); mp_js_process_char = Module.cwrap('mp_js_process_char', 'number', ['number']);
@ -75,7 +75,9 @@ var mainProgram = function()
} }
}); });
} else { } else {
process.exitCode = mp_js_do_str(contents); mp_js_do_str(contents).then(exitCode => {
process.exitCode = exitCode
})
} }
} }
} }