webassembly/api: Allow specifying the pystack size.

This allows increasing the Python recursion depth if needed.

Also increase the default to 2k words.  There is enough RAM in the
browser/node context for this to be increased, and having a larger pystack
allows more complex code to run without hitting the limit.

Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
Damien George
2024-06-19 15:17:21 +10:00
parent 13195a678d
commit 88513d1226
3 changed files with 23 additions and 16 deletions

View File

@@ -25,6 +25,7 @@
*/ */
// Options: // Options:
// - pystack: size in words of the MicroPython Python stack.
// - heapsize: size in bytes of the MicroPython GC heap. // - heapsize: size in bytes of the MicroPython GC heap.
// - url: location to load `micropython.mjs`. // - url: location to load `micropython.mjs`.
// - stdin: function to return input characters. // - stdin: function to return input characters.
@@ -34,10 +35,11 @@
// - stderr: same behaviour as stdout but for error output. // - stderr: same behaviour as stdout but for error output.
// - linebuffer: whether to buffer line-by-line to stdout/stderr. // - linebuffer: whether to buffer line-by-line to stdout/stderr.
export async function loadMicroPython(options) { export async function loadMicroPython(options) {
const { heapsize, url, stdin, stdout, stderr, linebuffer } = Object.assign( const { pystack, heapsize, url, stdin, stdout, stderr, linebuffer } =
{ heapsize: 1024 * 1024, linebuffer: true }, Object.assign(
options, { pystack: 2 * 1024, heapsize: 1024 * 1024, linebuffer: true },
); options,
);
let Module = {}; let Module = {};
Module.locateFile = (path, scriptDirectory) => Module.locateFile = (path, scriptDirectory) =>
url || scriptDirectory + path; url || scriptDirectory + path;
@@ -96,7 +98,12 @@ export async function loadMicroPython(options) {
); );
return proxy_convert_mp_to_js_obj_jsside_with_free(value); return proxy_convert_mp_to_js_obj_jsside_with_free(value);
}; };
Module.ccall("mp_js_init", "null", ["number"], [heapsize]); Module.ccall(
"mp_js_init",
"null",
["number", "number"],
[pystack, heapsize],
);
Module.ccall("proxy_c_init", "null", [], []); Module.ccall("proxy_c_init", "null", [], []);
return { return {
_module: Module, _module: Module,

View File

@@ -66,7 +66,12 @@ void external_call_depth_dec(void) {
--external_call_depth; --external_call_depth;
} }
void mp_js_init(int heap_size) { void mp_js_init(int pystack_size, int heap_size) {
#if MICROPY_ENABLE_PYSTACK
mp_obj_t *pystack = (mp_obj_t *)malloc(pystack_size * sizeof(mp_obj_t));
mp_pystack_init(pystack, pystack + pystack_size);
#endif
#if MICROPY_ENABLE_GC #if MICROPY_ENABLE_GC
char *heap = (char *)malloc(heap_size * sizeof(char)); char *heap = (char *)malloc(heap_size * sizeof(char));
gc_init(heap, heap + heap_size); gc_init(heap, heap + heap_size);
@@ -80,11 +85,6 @@ void mp_js_init(int heap_size) {
MP_STATE_MEM(gc_alloc_threshold) = 16 * 1024 / MICROPY_BYTES_PER_GC_BLOCK; MP_STATE_MEM(gc_alloc_threshold) = 16 * 1024 / MICROPY_BYTES_PER_GC_BLOCK;
#endif #endif
#if MICROPY_ENABLE_PYSTACK
static mp_obj_t pystack[1024];
mp_pystack_init(pystack, &pystack[MP_ARRAY_SIZE(pystack)]);
#endif
mp_init(); mp_init();
#if MICROPY_VFS_POSIX #if MICROPY_VFS_POSIX

View File

@@ -17,11 +17,11 @@
135109888 135109888
134978800 134978800
134716640 134716640
135216848 135216784
136217216 136217152
138218032 138217840
142219616 142219296
150222864 150222224
1 1
2 2
4 4