From 938a16fdb69f260fa89047fee1b74279a8d3b2e3 Mon Sep 17 00:00:00 2001 From: "pydevices-release-automation[bot]" Date: Sat, 7 Nov 2026 02:33:22 +0000 Subject: [PATCH] WebAssembly runtime: rebuild at micropython-pydevices d374048 --- vendor/micropython/micropython.mjs | 544 +++++++++--------- vendor/micropython/micropython.wasm | Bin 8144199 -> 8151588 bytes .../micropython/micropython.wasm.provenance | 153 +++-- 3 files changed, 387 insertions(+), 310 deletions(-) diff --git a/vendor/micropython/micropython.mjs b/vendor/micropython/micropython.mjs index 3c6d79c..5669fe9 100755 --- a/vendor/micropython/micropython.mjs +++ b/vendor/micropython/micropython.mjs @@ -783,15 +783,15 @@ async function createWasm() { assert(ptr, `null function pointer in dynCall`); assert(!promising, 'async dynCall is not supported in this mode') var rtn = dynCallLegacy(sig, ptr, args); - + function convert(rtn) { return rtn; } - + return convert(rtn); }; - + /** * @param {number} ptr * @param {string} type @@ -820,7 +820,7 @@ async function createWasm() { return '0x' + ptr.toString(16).padStart(8, '0'); } - + /** * @param {number} ptr * @param {number} value @@ -854,7 +854,7 @@ async function createWasm() { } }; - + var PATH = { isAbs:(path) => path.charAt(0) === '/', @@ -1010,9 +1010,9 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { * @return {string} */ var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => { - + var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul); - + // When using conditional TextDecoder, skip it for short strings as the overhead of the native call is not worth it. if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); @@ -1034,7 +1034,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { if ((u0 & 0xF8) != 0xF0) warnOnce(`Invalid UTF-8 leading byte ${ptrToString(u0)} encountered when deserializing a UTF-8 string in wasm memory to a JS string!`); u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); } - + if (u0 < 0x10000) { str += String.fromCharCode(u0); } else { @@ -1044,9 +1044,9 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return str; }; - + var FS_stdin_getChar_buffer = []; - + var lengthBytesUTF8 = (str) => { var len = 0; for (var i = 0; i < str.length; ++i) { @@ -1067,14 +1067,14 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return len; }; - + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { assert(typeof str === 'string', `stringToUTF8Array expects a string (got ${typeof str})`); // Parameter maxBytesToWrite is not optional. Negative values, 0, null, // undefined and false each don't write out any bytes. if (!(maxBytesToWrite > 0)) return 0; - + var startIdx = outIdx; var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. for (var i = 0; i < str.length; ++i) { @@ -1126,7 +1126,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var BUFSIZE = 256; var buf = Buffer.alloc(BUFSIZE); var bytesRead = 0; - + // For some reason we must suppress a closure warning here, even though // fd definitely exists on process.stdin, and is even the proper way to // get the fd of stdin, @@ -1135,7 +1135,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { // so it is related to the surrounding code in some unclear manner. /** @suppress {missingProperties} */ var fd = process.stdin.fd; - + try { bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); } catch(e) { @@ -1145,7 +1145,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { if (e.toString().includes('EOF')) bytesRead = 0; else throw e; } - + if (bytesRead > 0) { result = buf.slice(0, bytesRead).toString('utf-8'); } @@ -1306,8 +1306,8 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }, }, }; - - + + var mmapAlloc = (size) => { abort('internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported'); }; @@ -1534,11 +1534,11 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { if (buffer.buffer === HEAP8.buffer) { canOwn = false; } - + if (!length) return 0; var node = stream.node; node.mtime = node.ctime = Date.now(); - + if (canOwn) { assert(position === 0, 'canOwn must imply no weird position inside the file'); node.contents = buffer.subarray(offset, offset + length); @@ -1608,7 +1608,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }, }, }; - + var FS_modeStringToFlags = (str) => { if (typeof str != 'string') return str; var flagModes = { @@ -1625,7 +1625,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return flags; }; - + var FS_fileDataToTypedArray = (data) => { if (typeof data == 'string') { data = intArrayFromString(data, true); @@ -1635,17 +1635,17 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return data; }; - + var FS_getMode = (canRead, canWrite) => { var mode = 0; if (canRead) mode |= 292 | 73; if (canWrite) mode |= 146; return mode; }; - - - - + + + + /** * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the * emscripten HEAP, returns a copy of that string as a Javascript String object. @@ -1663,9 +1663,9 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { assert(typeof ptr == 'number', `UTF8ToString expects a number (got ${typeof ptr})`); return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead, ignoreNul) : ''; }; - + var strError = (errno) => UTF8ToString(_strerror(errno)); - + var ERRNO_CODES = { 'EPERM': 63, 'ENOENT': 44, @@ -1789,16 +1789,16 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { 'EOWNERDEAD': 62, 'ESTRPIPE': 135, }; - + var asyncLoad = async (url) => { var arrayBuffer = await readAsync(url); assert(arrayBuffer, `Loading data file "${url}" failed (no arrayBuffer).`); return new Uint8Array(arrayBuffer); }; - - + + var FS_createDataFile = (...args) => FS.createDataFile(...args); - + var getUniqueRunDependency = (id) => { var orig = id; while (1) { @@ -1806,21 +1806,21 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { id = orig + Math.random(); } }; - + var runDependencies = 0; - - + + var dependenciesFulfilled = null; - + var runDependencyTracking = { }; - + var runDependencyWatcher = null; var removeRunDependency = (id) => { runDependencies--; - + Module['monitorRunDependencies']?.(runDependencies); - + assert(id, 'removeRunDependency requires an ID'); assert(runDependencyTracking[id]); delete runDependencyTracking[id]; @@ -1836,13 +1836,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } } }; - - + + var addRunDependency = (id) => { runDependencies++; - + Module['monitorRunDependencies']?.(runDependencies); - + assert(id, 'addRunDependency requires an ID') assert(!runDependencyTracking[id]); runDependencyTracking[id] = 1; @@ -1871,13 +1871,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { runDependencyWatcher.unref?.() } }; - - + + var preloadPlugins = []; var FS_handledByPreloadPlugin = async (byteArray, fullname) => { // Ensure plugins are ready. if (typeof Browser != 'undefined') Browser.init(); - + for (var plugin of preloadPlugins) { if (plugin['canHandle'](fullname)) { assert(plugin['handle'].constructor.name === 'AsyncFunction', 'Filesystem plugin handlers must be async functions (See #24914)') @@ -1894,13 +1894,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; var dep = getUniqueRunDependency(`cp ${fullname}`); // might have several active requests for the same fullname addRunDependency(dep); - + try { var byteArray = url; if (typeof url == 'string') { byteArray = await asyncLoad(url); } - + byteArray = await FS_handledByPreloadPlugin(byteArray, fullname); preFinish?.(); if (!dontCreateFile) { @@ -2017,31 +2017,31 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { throw new FS.ErrnoError(44); } opts.follow_mount ??= true - + if (!PATH.isAbs(path)) { path = FS.cwd() + '/' + path; } - + // limit max consecutive symlinks to SYMLOOP_MAX. linkloop: for (var nlinks = 0; nlinks < 40; nlinks++) { // split the absolute path var parts = path.split('/').filter((p) => !!p); - + // start at the root var current = FS.root; var current_path = '/'; - + for (var i = 0; i < parts.length; i++) { var islast = (i === parts.length-1); if (islast && opts.parent) { // stop resolving break; } - + if (parts[i] === '.') { continue; } - + if (parts[i] === '..') { current_path = PATH.dirname(current_path); if (FS.isRoot(current)) { @@ -2055,7 +2055,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } continue; } - + current_path = PATH.join2(current_path, parts[i]); try { current = FS.lookupNode(current, parts[i]); @@ -2068,12 +2068,12 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } throw e; } - + // jump to the mount's root node if this is a mountpoint if (FS.isMountpoint(current) && (!islast || opts.follow_mount)) { current = current.mounted.root; } - + // by default, lookupPath will not follow a symlink if it is the final path component. // setting opts.follow = true will override this behavior. if (FS.isLink(current.mode) && (!islast || opts.follow)) { @@ -2106,7 +2106,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }, hashName(parentid, name) { var hash = 0; - + for (var i = 0; i < name.length; i++) { hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; } @@ -2150,9 +2150,9 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { createNode(parent, name, mode, rdev) { assert(typeof parent == 'object') var node = new FS.FSNode(parent, name, mode, rdev); - + FS.hashAddNode(node); - + return node; }, destroyNode(node) { @@ -2291,7 +2291,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { getStream:(fd) => FS.streams[fd], createStream(stream, fd = -1) { assert(fd >= -1); - + // clone it, so we can return an instance of FSStream stream = Object.assign(new FS.FSStream(), stream); if (fd == -1) { @@ -2345,15 +2345,15 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { getMounts(mount) { var mounts = []; var check = [mount]; - + while (check.length) { var m = check.pop(); - + mounts.push(m); - + check.push(...m.mounts); } - + return mounts; }, syncfs(populate, callback) { @@ -2361,22 +2361,22 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { callback = populate; populate = false; } - + FS.syncFSRequests++; - + if (FS.syncFSRequests > 1) { err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`); } - + var mounts = FS.getMounts(FS.root.mount); var completed = 0; - + function doCallback(errCode) { assert(FS.syncFSRequests > 0); FS.syncFSRequests--; return callback(errCode); } - + function done(errCode) { if (errCode) { if (!done.errored) { @@ -2389,7 +2389,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { doCallback(null); } }; - + // sync all mounts for (var mount of mounts) { if (mount.type.syncfs) { @@ -2408,77 +2408,77 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var root = mountpoint === '/'; var pseudo = !mountpoint; var node; - + if (root && FS.root) { throw new FS.ErrnoError(10); } else if (!root && !pseudo) { var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - + mountpoint = lookup.path; // use the absolute path node = lookup.node; - + if (FS.isMountpoint(node)) { throw new FS.ErrnoError(10); } - + if (!FS.isDir(node.mode)) { throw new FS.ErrnoError(54); } } - + var mount = { type, opts, mountpoint, mounts: [] }; - + // create a root node for the fs var mountRoot = type.mount(mount); mountRoot.mount = mount; mount.root = mountRoot; - + if (root) { FS.root = mountRoot; } else if (node) { // set as a mountpoint node.mounted = mount; - + // add the new mount to the current mount's children if (node.mount) { node.mount.mounts.push(mount); } } - + return mountRoot; }, unmount(mountpoint) { var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - + if (!FS.isMountpoint(lookup.node)) { throw new FS.ErrnoError(28); } - + // destroy the nodes for this mount, and all its child mounts var node = lookup.node; var mount = node.mounted; var mounts = FS.getMounts(mount); - + for (var [hash, current] of Object.entries(FS.nameTable)) { while (current) { var next = current.name_next; - + if (mounts.includes(current.mount)) { FS.destroyNode(current); } - + current = next; } } - + // no longer a mountpoint node.mounted = null; - + // remove this mount from the child mounts var idx = node.mount.mounts.indexOf(mount); assert(idx !== -1); @@ -2531,7 +2531,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { flags: 2, namelen: 255, }; - + if (node.node_ops.statfs) { Object.assign(rtn, node.node_ops.statfs(node.mount.opts.root)); } @@ -2595,13 +2595,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var new_name = PATH.basename(new_path); // parents must exist var lookup, old_dir, new_dir; - + // let the errors from non existent directories percolate up lookup = FS.lookupPath(old_path, { parent: true }); old_dir = lookup.node; lookup = FS.lookupPath(new_path, { parent: true }); new_dir = lookup.node; - + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); // need to be part of the same mount if (old_dir.mount !== new_dir.mount) { @@ -2914,7 +2914,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } // we've already handled these, don't pass down to the underlying vfs flags &= ~(128 | 512 | 131072); - + // register the stream with the filesystem var stream = FS.createStream({ node, @@ -3181,7 +3181,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { // TODO deprecate the old functionality of a single // input / output callback and that utilizes FS.createDevice // and instead require a unique set of stream ops - + // by default, we symlink the standard streams to the // default tty devices. however, if the standard streams // have been overwritten we create a unique device for @@ -3201,7 +3201,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } else { FS.symlink('/dev/tty1', '/dev/stderr'); } - + // open default streams for the stdin, stdout and stderr devices var stdin = FS.open('/dev/stdin', 0); var stdout = FS.open('/dev/stdout', 1); @@ -3212,13 +3212,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }, staticInit() { FS.nameTable = new Array(4096); - + FS.mount(MEMFS, {}, '/'); - + FS.createDefaultDirectories(); FS.createDefaultDevices(); FS.createSpecialDirectories(); - + FS.filesystems = { 'MEMFS': MEMFS, }; @@ -3226,12 +3226,12 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { init(input, output, error) { assert(!FS.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); FS.initialized = true; - + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here input ??= Module['stdin']; output ??= Module['stdout']; error ??= Module['stderr']; - + FS.createStandardStreams(input, output, error); }, quit() { @@ -3412,27 +3412,27 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var header; var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; - + var chunkSize = 1024*1024; // Chunk size in bytes - + if (!hasByteServing) chunkSize = datalength; - + // Function to get a range from the remote URL. var doXHR = (from, to) => { if (from > to) abort(`invalid range (${from}, ${to}) or no bytes requested!`); if (to > datalength-1) abort(`only ${datalength} bytes available! programmer error!`); - + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); - + // Some hints to the browser that we want binary data. xhr.responseType = 'arraybuffer'; if (xhr.overrideMimeType) { xhr.overrideMimeType('text/plain; charset=x-user-defined'); } - + xhr.send(null); if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) abort("Couldn't load " + url + ". Status: " + xhr.status); if (xhr.response !== undefined) { @@ -3451,7 +3451,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { if (typeof lazyArray.chunks[chunkNum] == 'undefined') abort('doXHR failed!'); return lazyArray.chunks[chunkNum]; }); - + if (usesGzip || !datalength) { // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file @@ -3459,7 +3459,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { chunkSize = datalength; out("LazyFiles on gzip forces download of the whole file when length is accessed"); } - + this._length = datalength; this._chunkSize = chunkSize; this.lengthKnown = true; @@ -3477,7 +3477,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return this._chunkSize; } } - + if (globalThis.XMLHttpRequest) { if (!ENVIRONMENT_IS_WORKER) abort('Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'); var lazyArray = new LazyUint8Array(); @@ -3485,7 +3485,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } else { var properties = { isDevice: false, url: url }; } - + var node = FS.createFile(parent, name, properties, canRead, canWrite); // This is a total hack, but I want to get this lazy file code out of the // core of MEMFS. If we want to keep this lazy file concept I feel it should @@ -3546,7 +3546,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return node; }, }; - + var SYSCALLS = { currentUmask:18, calculateAt(dirfd, path, allowEmpty) { @@ -3626,7 +3626,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }; function ___syscall_chdir(path) { try { - + path = SYSCALLS.getStr(path); FS.chdir(path); return 0; @@ -3635,7 +3635,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } - + var syscallGetVarargI = () => { assert(SYSCALLS.varargs != undefined); @@ -3645,12 +3645,12 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return ret; }; var syscallGetVarargP = syscallGetVarargI; - - + + function ___syscall_fcntl64(fd, cmd, varargs) { SYSCALLS.varargs = varargs; try { - + var stream = SYSCALLS.getStreamFromFD(fd); switch (cmd) { case 0: { @@ -3697,27 +3697,27 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } - + function ___syscall_fstat64(fd, buf) { try { - + return SYSCALLS.writeStat(buf, FS.fstat(fd)); } catch (e) { if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; return -e.errno; } } + - - + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => { assert(typeof maxBytesToWrite == 'number', 'stringToUTF8 requires a third parameter that specifies the length of the output buffer'); return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); }; function ___syscall_getcwd(buf, size) { try { - + if (size === 0) return -28; var cwd = FS.cwd(); var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; @@ -3729,19 +3729,19 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } + - - + function ___syscall_getdents64(fd, dirp, count) { try { - + var stream = SYSCALLS.getStreamFromFD(fd) stream.getdents ||= FS.readdir(stream.path); - + var struct_size = 280; var pos = 0; var off = FS.llseek(stream, 0, 1); - + var startIdx = Math.floor(off / struct_size); var endIdx = Math.min(stream.getdents.length, startIdx + Math.floor(count/struct_size)) for (var idx = startIdx; idx < endIdx; idx++) { @@ -3790,13 +3790,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } + - - + function ___syscall_ioctl(fd, op, varargs) { SYSCALLS.varargs = varargs; try { - + var stream = SYSCALLS.getStreamFromFD(fd); switch (op) { case 21509: { @@ -3888,11 +3888,11 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } - + function ___syscall_lstat64(path, buf) { try { - + path = SYSCALLS.getStr(path); return SYSCALLS.writeStat(buf, FS.lstat(path)); } catch (e) { @@ -3900,11 +3900,11 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } - + function ___syscall_mkdirat(dirfd, path, mode) { try { - + path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); mode &= ~SYSCALLS.currentUmask; @@ -3915,11 +3915,11 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } - + function ___syscall_newfstatat(dirfd, path, buf, flags) { try { - + path = SYSCALLS.getStr(path); var nofollow = flags & 256; var allowEmpty = flags & 4096; @@ -3932,13 +3932,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } + - - + function ___syscall_openat(dirfd, path, flags, varargs) { SYSCALLS.varargs = varargs; try { - + path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); var mode = varargs ? syscallGetVarargI() : 0; @@ -3951,7 +3951,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } - + var doPoll = (fds, nfds, timeout, makeNotifyCallback) => { var count = 0; @@ -3978,9 +3978,9 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }; var ___syscall_poll = function(fds, nfds, timeout) { let innerFunc = () => { - + try { - + const isAsyncContext = true; // Enable event handlers only when the poll call is proxied from a worker. // TODO: Could use `Promise.withResolvers` here if we know its available. @@ -4012,7 +4012,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return cb; } - + if (isAsyncContext) { if (timeout > 0) { var t = setTimeout(() => { @@ -4028,7 +4028,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return promise; } - + var count = doPoll(fds, nfds, 0, undefined); if (!count && timeout != 0) warnOnce('non-zero poll() timeout not supported: ' + timeout) return count; @@ -4036,7 +4036,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; return -e.errno; } - + }; return Asyncify.handleAsync(innerFunc); } @@ -4045,18 +4045,18 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function ___syscall_poll_nonblocking(fds, nfds) { try { - + return doPoll(fds, nfds, 0, undefined); } catch (e) { if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; return -e.errno; } } - + function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) { try { - + oldpath = SYSCALLS.getStr(oldpath); newpath = SYSCALLS.getStr(newpath); oldpath = SYSCALLS.calculateAt(olddirfd, oldpath); @@ -4068,11 +4068,11 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } - + function ___syscall_rmdir(path) { try { - + path = SYSCALLS.getStr(path); FS.rmdir(path); return 0; @@ -4081,11 +4081,11 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } - + function ___syscall_stat64(path, buf) { try { - + path = SYSCALLS.getStr(path); return SYSCALLS.writeStat(buf, FS.stat(path)); } catch (e) { @@ -4093,11 +4093,11 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } - + function ___syscall_statfs64(path, size, buf) { try { - + assert(size === 88); SYSCALLS.writeStatFs(buf, FS.statfs(SYSCALLS.getStr(path))); return 0; @@ -4106,11 +4106,11 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } - + function ___syscall_unlinkat(dirfd, path, flags) { try { - + path = SYSCALLS.getStr(path); path = SYSCALLS.calculateAt(dirfd, path); if (!flags) { @@ -4126,7 +4126,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return -e.errno; } } - + var __abort_js = () => abort('native code called abort()'); @@ -4141,12 +4141,12 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { // for any code that deals with heap sizes, which would require special // casing all heap size related code to treat 0 specially. 2147483648; - + var alignMemory = (size, alignment) => { assert(alignment, 'alignment argument is required'); return Math.ceil(size / alignment) * alignment; }; - + var growMemory = (size) => { var oldHeapSize = wasmMemory.buffer.byteLength; var pages = ((size - oldHeapSize + 65535) / 65536) | 0; @@ -4168,7 +4168,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { // With multithreaded builds, races can happen (another thread might increase the size // in between), so return a failure, and let the caller retry. assert(requestedSize > oldSize); - + // Memory resize rules: // 1. Always increase heap size to at least the requested size, rounded up // to next page multiple. @@ -4185,7 +4185,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { // over-eager decision to excessively reserve due to (3) above. // Hence if an allocation fails, cut down on the amount of excess // growth, in an attempt to succeed to perform a smaller allocation. - + // A limit is set for how much we can grow. We should not exceed that // (the wasm binary specifies it, so if we tried, we'd fail anyhow). var maxHeapSize = getHeapMax(); @@ -4193,7 +4193,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { err(`Cannot enlarge memory, requested ${requestedSize} bytes, but the limit is ${maxHeapSize} bytes!`); return false; } - + // Loop through potential heap size increases. If we attempt a too eager // reservation that fails, cut down on the attempted size and reserve a // smaller bump instead. (max 3 times, chosen somewhat arbitrarily) @@ -4201,12 +4201,12 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth // but limit overreserving (default to capping at +96MB overgrowth at most) overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 ); - + var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); - + var replacement = growMemory(newSize); if (replacement) { - + return true; } } @@ -4216,7 +4216,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { function _fd_close(fd) { try { - + var stream = SYSCALLS.getStreamFromFD(fd); FS.close(stream); return 0; @@ -4225,7 +4225,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return e.errno; } } - + /** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { @@ -4244,10 +4244,10 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return ret; }; - + function _fd_read(fd, iov, iovcnt, pnum) { try { - + var stream = SYSCALLS.getStreamFromFD(fd); var num = doReadv(stream, iov, iovcnt); HEAPU32[((pnum)>>2)] = num; @@ -4257,19 +4257,19 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return e.errno; } } + - - + var INT53_MAX = 9007199254740992; - + var INT53_MIN = -9007199254740992; var bigintToI53Checked = (num) => (num < INT53_MIN || num > INT53_MAX) ? NaN : Number(num); function _fd_seek(fd, offset, whence, newOffset) { offset = bigintToI53Checked(offset); - - + + try { - + if (isNaN(offset)) return 22; var stream = SYSCALLS.getStreamFromFD(fd); FS.llseek(stream, offset, whence); @@ -4285,9 +4285,9 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var _fd_sync = function(fd) { let innerFunc = () => { - + try { - + var stream = SYSCALLS.getStreamFromFD(fd); var rtn = stream.stream_ops?.fsync?.(stream); return new Promise((resolve) => { @@ -4302,7 +4302,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; return e.errno; } - + }; return Asyncify.handleAsync(innerFunc); } @@ -4329,10 +4329,10 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return ret; }; - + function _fd_write(fd, iov, iovcnt, pnum) { try { - + var stream = SYSCALLS.getStreamFromFD(fd); var num = doWritev(stream, iov, iovcnt); HEAPU32[((pnum)>>2)] = num; @@ -4342,7 +4342,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return e.errno; } } - + var _mp_js_hook = () => { if (ENVIRONMENT_IS_NODE) { @@ -4353,7 +4353,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { [], ); const fs = require("fs"); - + const buf = Buffer.alloc(1); try { const n = fs.readSync(process.stdin.fd, buf, 0, 1); @@ -4407,7 +4407,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var _pydevices_audio_queued = (input) => input ? pydevices_state.inputFrames.reduce((n,f)=>n+(f.channels[0].length-f.offset)*f.channels.length*4,0) : pydevices_state.audioQueuedBytes; - + var pydevices_encode_sample = (view, p, value, bits, signed, bigEndian) => { const little=!bigEndian, clamped=Math.max(-1,Math.min(1,value)); if(bits===8) signed?view.setInt8(p,Math.round(clamped*127)):view.setUint8(p,Math.round((clamped+1)*127.5)); @@ -4432,7 +4432,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { var _pydevices_audio_state = (input) => input ? +pydevices_state.microphoneEnabled : +pydevices_state.audioEnabled; - + var pydevices_decode_pcm = (bytes, frames, channels, bits, signed, bigEndian) => { const result = Array.from({length:channels}, () => new Float32Array(frames)); const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); @@ -4473,9 +4473,9 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } return display; }; - - - + + + var pydevices_write_event = (ptr, event) => { const types={pointerdown:1,pointermove:2,pointerup:3,pointercancel:4,wheel:5,keydown:6,keyup:7,focus:8,blur:9}; const pointerTypes={mouse:0,touch:1,pen:2}; @@ -4530,7 +4530,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { queue.push(event); } }; - + var pydevices_relative_point = (canvas, event) => { const rect = canvas.getBoundingClientRect(); return { @@ -4581,9 +4581,9 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { on('blur', () => pydevices_push_event(canvasId, {type:'blur'})); canvas.focus(); }; - - - + + + var pydevices_rgba = () => { if (!pydevices_state.rgba) { const table = pydevices_state.rgba = new Uint32Array(65536); @@ -4640,8 +4640,8 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } state.animation = requestAnimationFrame(pydevices_paint); }; - - + + var pydevices_release_canvas = (canvas) => { for (const [name, handler, opts] of canvas.__pydevicesListeners || []) { canvas.removeEventListener(name, handler, opts); @@ -4743,8 +4743,8 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }, }; }; - - + + var _pydevices_display_register = (ptr, len, width, height, canvasPtr) => { if (typeof document === 'undefined') return 0; const canvasId = UTF8ToString(canvasPtr); @@ -4770,12 +4770,12 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return 1; }; - + var _pydevices_display_unregister = (canvasPtr) => { pydevices_state.displays.delete(UTF8ToString(canvasPtr)); }; - + var _pydevices_event_clear = (canvasPtr) => { const display = pydevices_get_display(UTF8ToString(canvasPtr)); display.events.length = 0; @@ -4783,7 +4783,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { if(ring) { HEAPU32[ring.ptr>>2]=0; HEAPU32[(ring.ptr>>2)+1]=0; } }; - + var _pydevices_event_poll = (canvasPtr, lenPtr) => { const display = pydevices_get_display(UTF8ToString(canvasPtr)); if (!display.events.length) return 0; @@ -4795,12 +4795,12 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return ptr; }; - + var _pydevices_event_set_buffer = (canvasPtr, ptr, capacity, stride) => { pydevices_get_display(UTF8ToString(canvasPtr)).eventRing = ptr ? {ptr,capacity,stride} : null; }; - + var _pydevices_host_reset = () => { const state = pydevices_state; if (state.animation) { @@ -4830,7 +4830,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { abort(e); } }; - + var handleException = (e) => { // Certain exception types we do not treat as errors since they are used for // internal control flow. @@ -4848,8 +4848,8 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } quit_(1, e); }; - - + + var runtimeKeepaliveCounter = 0; var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; var _proc_exit = (code) => { @@ -4860,25 +4860,25 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { } quit_(code, new ExitStatus(code)); }; - - + + /** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => { EXITSTATUS = status; - + checkUnflushedContent(); - + // if exit() was called explicitly, warn the user if the runtime isn't actually being shut down if (keepRuntimeAlive() && !implicit) { var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`; err(msg); } - + _proc_exit(status); }; var _exit = exitJS; - - + + var maybeExit = () => { if (!keepRuntimeAlive()) { try { @@ -4901,23 +4901,23 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { maybeExit(); } }; - + var createNamedFunction = (name, func) => Object.defineProperty(func, 'name', { value: name }); - + var runtimeKeepalivePush = () => { runtimeKeepaliveCounter += 1; }; - + var runtimeKeepalivePop = () => { assert(runtimeKeepaliveCounter > 0); runtimeKeepaliveCounter -= 1; }; - - + + var Asyncify = { instrumentWasmImports(imports) { var importPattern = /^(pydevices_http_get|pydevices_sleep_ms|invoke_.*|__asyncjs__.*)$/; - + for (let [x, original] of Object.entries(imports)) { if (typeof original == 'function') { let isAsyncifyImport = original.isAsync || importPattern.test(x); @@ -5014,7 +5014,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { // the dbg() function itself can call back into WebAssembly to get the // current pthread_self() pointer). Asyncify.state = Asyncify.State.Normal; - + // Keep the runtime alive so that a re-wind can be done later. runAndAbortIfError(_asyncify_stop_unwind); if (typeof Fibers != 'undefined') { @@ -5066,7 +5066,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { assert(func); // Once we have rewound and the stack we no longer need to artificially // keep the runtime alive. - + return callUserCallback(func); }, handleSleep(startAsync) { @@ -5165,7 +5165,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { wakeUp(await startAsync()); }), }; - + var _pydevices_http_get = (urlPtr, statusPtr, lenPtr, finalUrlPtr) => Asyncify.handleSleep(async (wakeUp) => { try { const response=await fetch(UTF8ToString(urlPtr)); const bytes=new Uint8Array(await response.arrayBuffer()); @@ -5203,8 +5203,8 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { }; var wasmTableMirror = []; - - + + var getWasmTableEntry = (funcPtr) => { var func = wasmTableMirror[funcPtr]; if (!func) { @@ -5222,14 +5222,14 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { assert(func, `Cannot call unknown function ${ident}, make sure it is exported`); return func; }; - + var writeArrayToMemory = (array, buffer) => { assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') HEAP8.set(array, buffer); }; - - - + + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); var stringToUTF8OnStack = (str) => { var size = lengthBytesUTF8(str) + 1; @@ -5237,13 +5237,13 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { stringToUTF8(str, ret, size); return ret; }; - - - - - - - + + + + + + + /** * @param {string|null=} returnType * @param {Array=} argTypes @@ -5266,7 +5266,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return ret; } }; - + function convertReturnValue(ret) { if (returnType === 'string') { return UTF8ToString(ret); @@ -5274,7 +5274,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { if (returnType === 'boolean') return Boolean(ret); return ret; } - + var func = getCFunc(ident); var cArgs = []; var stack = 0; @@ -5299,7 +5299,7 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { return convertReturnValue(ret); } var asyncMode = opts?.async; - + // Keep the runtime alive through all calls. Note that this call might not be // async, but for simplicity we push and pop in all calls. runtimeKeepalivePush(); @@ -5318,14 +5318,14 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { assert(asyncMode, `The call to ${ident} is running asynchronously. If this was intended, add the async option to the ccall/cwrap call.`); return Asyncify.whenDone().then(onDone); } - + ret = onDone(ret); // If this is an async ccall, ensure we return a promise if (asyncMode) return Promise.resolve(ret); return ret; }; - + /** * @param {string=} returnType * @param {Array=} argTypes @@ -5893,32 +5893,32 @@ var _emscripten_stack_get_free = makeInvalidEarlyAccess('_emscripten_stack_get_f var __emscripten_stack_restore = makeInvalidEarlyAccess('__emscripten_stack_restore'); var __emscripten_stack_alloc = makeInvalidEarlyAccess('__emscripten_stack_alloc'); var _emscripten_stack_get_current = makeInvalidEarlyAccess('_emscripten_stack_get_current'); -var dynCall_iii = makeInvalidEarlyAccess('dynCall_iii'); var dynCall_iiii = makeInvalidEarlyAccess('dynCall_iiii'); -var dynCall_iiiiiii = makeInvalidEarlyAccess('dynCall_iiiiiii'); var dynCall_vi = makeInvalidEarlyAccess('dynCall_vi'); -var dynCall_ii = makeInvalidEarlyAccess('dynCall_ii'); -var dynCall_i = makeInvalidEarlyAccess('dynCall_i'); var dynCall_iiiii = makeInvalidEarlyAccess('dynCall_iiiii'); -var dynCall_viii = makeInvalidEarlyAccess('dynCall_viii'); -var dynCall_iiiiii = makeInvalidEarlyAccess('dynCall_iiiiii'); -var dynCall_di = makeInvalidEarlyAccess('dynCall_di'); +var dynCall_iii = makeInvalidEarlyAccess('dynCall_iii'); +var dynCall_ii = makeInvalidEarlyAccess('dynCall_ii'); var dynCall_v = makeInvalidEarlyAccess('dynCall_v'); -var dynCall_iiji = makeInvalidEarlyAccess('dynCall_iiji'); -var dynCall_viiiiii = makeInvalidEarlyAccess('dynCall_viiiiii'); var dynCall_vii = makeInvalidEarlyAccess('dynCall_vii'); +var dynCall_iiiiii = makeInvalidEarlyAccess('dynCall_iiiiii'); var dynCall_viiii = makeInvalidEarlyAccess('dynCall_viiii'); +var dynCall_viii = makeInvalidEarlyAccess('dynCall_viii'); +var dynCall_i = makeInvalidEarlyAccess('dynCall_i'); +var dynCall_iiiiiii = makeInvalidEarlyAccess('dynCall_iiiiiii'); var dynCall_jji = makeInvalidEarlyAccess('dynCall_jji'); var dynCall_viiiii = makeInvalidEarlyAccess('dynCall_viiiii'); var dynCall_viiiiiii = makeInvalidEarlyAccess('dynCall_viiiiiii'); var dynCall_viiiffiii = makeInvalidEarlyAccess('dynCall_viiiffiii'); var dynCall_viiiiiiii = makeInvalidEarlyAccess('dynCall_viiiiiiii'); var dynCall_viiiiiiiii = makeInvalidEarlyAccess('dynCall_viiiiiiiii'); +var dynCall_viiiiii = makeInvalidEarlyAccess('dynCall_viiiiii'); var dynCall_viiif = makeInvalidEarlyAccess('dynCall_viiif'); var dynCall_vif = makeInvalidEarlyAccess('dynCall_vif'); var dynCall_viff = makeInvalidEarlyAccess('dynCall_viff'); var dynCall_fi = makeInvalidEarlyAccess('dynCall_fi'); var dynCall_iiiiiiii = makeInvalidEarlyAccess('dynCall_iiiiiiii'); +var dynCall_di = makeInvalidEarlyAccess('dynCall_di'); +var dynCall_iiji = makeInvalidEarlyAccess('dynCall_iiji'); var dynCall_vid = makeInvalidEarlyAccess('dynCall_vid'); var dynCall_dd = makeInvalidEarlyAccess('dynCall_dd'); var dynCall_ddd = makeInvalidEarlyAccess('dynCall_ddd'); @@ -5970,32 +5970,32 @@ function assignWasmExports(wasmExports) { assert(typeof wasmExports['_emscripten_stack_restore'] != 'undefined', 'missing Wasm export: _emscripten_stack_restore'); assert(typeof wasmExports['_emscripten_stack_alloc'] != 'undefined', 'missing Wasm export: _emscripten_stack_alloc'); assert(typeof wasmExports['emscripten_stack_get_current'] != 'undefined', 'missing Wasm export: emscripten_stack_get_current'); - assert(typeof wasmExports['dynCall_iii'] != 'undefined', 'missing Wasm export: dynCall_iii'); assert(typeof wasmExports['dynCall_iiii'] != 'undefined', 'missing Wasm export: dynCall_iiii'); - assert(typeof wasmExports['dynCall_iiiiiii'] != 'undefined', 'missing Wasm export: dynCall_iiiiiii'); assert(typeof wasmExports['dynCall_vi'] != 'undefined', 'missing Wasm export: dynCall_vi'); - assert(typeof wasmExports['dynCall_ii'] != 'undefined', 'missing Wasm export: dynCall_ii'); - assert(typeof wasmExports['dynCall_i'] != 'undefined', 'missing Wasm export: dynCall_i'); assert(typeof wasmExports['dynCall_iiiii'] != 'undefined', 'missing Wasm export: dynCall_iiiii'); - assert(typeof wasmExports['dynCall_viii'] != 'undefined', 'missing Wasm export: dynCall_viii'); - assert(typeof wasmExports['dynCall_iiiiii'] != 'undefined', 'missing Wasm export: dynCall_iiiiii'); - assert(typeof wasmExports['dynCall_di'] != 'undefined', 'missing Wasm export: dynCall_di'); + assert(typeof wasmExports['dynCall_iii'] != 'undefined', 'missing Wasm export: dynCall_iii'); + assert(typeof wasmExports['dynCall_ii'] != 'undefined', 'missing Wasm export: dynCall_ii'); assert(typeof wasmExports['dynCall_v'] != 'undefined', 'missing Wasm export: dynCall_v'); - assert(typeof wasmExports['dynCall_iiji'] != 'undefined', 'missing Wasm export: dynCall_iiji'); - assert(typeof wasmExports['dynCall_viiiiii'] != 'undefined', 'missing Wasm export: dynCall_viiiiii'); assert(typeof wasmExports['dynCall_vii'] != 'undefined', 'missing Wasm export: dynCall_vii'); + assert(typeof wasmExports['dynCall_iiiiii'] != 'undefined', 'missing Wasm export: dynCall_iiiiii'); assert(typeof wasmExports['dynCall_viiii'] != 'undefined', 'missing Wasm export: dynCall_viiii'); + assert(typeof wasmExports['dynCall_viii'] != 'undefined', 'missing Wasm export: dynCall_viii'); + assert(typeof wasmExports['dynCall_i'] != 'undefined', 'missing Wasm export: dynCall_i'); + assert(typeof wasmExports['dynCall_iiiiiii'] != 'undefined', 'missing Wasm export: dynCall_iiiiiii'); assert(typeof wasmExports['dynCall_jji'] != 'undefined', 'missing Wasm export: dynCall_jji'); assert(typeof wasmExports['dynCall_viiiii'] != 'undefined', 'missing Wasm export: dynCall_viiiii'); assert(typeof wasmExports['dynCall_viiiiiii'] != 'undefined', 'missing Wasm export: dynCall_viiiiiii'); assert(typeof wasmExports['dynCall_viiiffiii'] != 'undefined', 'missing Wasm export: dynCall_viiiffiii'); assert(typeof wasmExports['dynCall_viiiiiiii'] != 'undefined', 'missing Wasm export: dynCall_viiiiiiii'); assert(typeof wasmExports['dynCall_viiiiiiiii'] != 'undefined', 'missing Wasm export: dynCall_viiiiiiiii'); + assert(typeof wasmExports['dynCall_viiiiii'] != 'undefined', 'missing Wasm export: dynCall_viiiiii'); assert(typeof wasmExports['dynCall_viiif'] != 'undefined', 'missing Wasm export: dynCall_viiif'); assert(typeof wasmExports['dynCall_vif'] != 'undefined', 'missing Wasm export: dynCall_vif'); assert(typeof wasmExports['dynCall_viff'] != 'undefined', 'missing Wasm export: dynCall_viff'); assert(typeof wasmExports['dynCall_fi'] != 'undefined', 'missing Wasm export: dynCall_fi'); assert(typeof wasmExports['dynCall_iiiiiiii'] != 'undefined', 'missing Wasm export: dynCall_iiiiiiii'); + assert(typeof wasmExports['dynCall_di'] != 'undefined', 'missing Wasm export: dynCall_di'); + assert(typeof wasmExports['dynCall_iiji'] != 'undefined', 'missing Wasm export: dynCall_iiji'); assert(typeof wasmExports['dynCall_vid'] != 'undefined', 'missing Wasm export: dynCall_vid'); assert(typeof wasmExports['dynCall_dd'] != 'undefined', 'missing Wasm export: dynCall_dd'); assert(typeof wasmExports['dynCall_ddd'] != 'undefined', 'missing Wasm export: dynCall_ddd'); @@ -6043,32 +6043,32 @@ function assignWasmExports(wasmExports) { __emscripten_stack_restore = wasmExports['_emscripten_stack_restore']; __emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc']; _emscripten_stack_get_current = wasmExports['emscripten_stack_get_current']; - dynCall_iii = dynCalls['iii'] = createExportWrapper('dynCall_iii', 3); dynCall_iiii = dynCalls['iiii'] = createExportWrapper('dynCall_iiii', 4); - dynCall_iiiiiii = dynCalls['iiiiiii'] = createExportWrapper('dynCall_iiiiiii', 7); dynCall_vi = dynCalls['vi'] = createExportWrapper('dynCall_vi', 2); - dynCall_ii = dynCalls['ii'] = createExportWrapper('dynCall_ii', 2); - dynCall_i = dynCalls['i'] = createExportWrapper('dynCall_i', 1); dynCall_iiiii = dynCalls['iiiii'] = createExportWrapper('dynCall_iiiii', 5); - dynCall_viii = dynCalls['viii'] = createExportWrapper('dynCall_viii', 4); - dynCall_iiiiii = dynCalls['iiiiii'] = createExportWrapper('dynCall_iiiiii', 6); - dynCall_di = dynCalls['di'] = createExportWrapper('dynCall_di', 2); + dynCall_iii = dynCalls['iii'] = createExportWrapper('dynCall_iii', 3); + dynCall_ii = dynCalls['ii'] = createExportWrapper('dynCall_ii', 2); dynCall_v = dynCalls['v'] = createExportWrapper('dynCall_v', 1); - dynCall_iiji = dynCalls['iiji'] = createExportWrapper('dynCall_iiji', 4); - dynCall_viiiiii = dynCalls['viiiiii'] = createExportWrapper('dynCall_viiiiii', 7); dynCall_vii = dynCalls['vii'] = createExportWrapper('dynCall_vii', 3); + dynCall_iiiiii = dynCalls['iiiiii'] = createExportWrapper('dynCall_iiiiii', 6); dynCall_viiii = dynCalls['viiii'] = createExportWrapper('dynCall_viiii', 5); + dynCall_viii = dynCalls['viii'] = createExportWrapper('dynCall_viii', 4); + dynCall_i = dynCalls['i'] = createExportWrapper('dynCall_i', 1); + dynCall_iiiiiii = dynCalls['iiiiiii'] = createExportWrapper('dynCall_iiiiiii', 7); dynCall_jji = dynCalls['jji'] = createExportWrapper('dynCall_jji', 3); dynCall_viiiii = dynCalls['viiiii'] = createExportWrapper('dynCall_viiiii', 6); dynCall_viiiiiii = dynCalls['viiiiiii'] = createExportWrapper('dynCall_viiiiiii', 8); dynCall_viiiffiii = dynCalls['viiiffiii'] = createExportWrapper('dynCall_viiiffiii', 9); dynCall_viiiiiiii = dynCalls['viiiiiiii'] = createExportWrapper('dynCall_viiiiiiii', 9); dynCall_viiiiiiiii = dynCalls['viiiiiiiii'] = createExportWrapper('dynCall_viiiiiiiii', 10); + dynCall_viiiiii = dynCalls['viiiiii'] = createExportWrapper('dynCall_viiiiii', 7); dynCall_viiif = dynCalls['viiif'] = createExportWrapper('dynCall_viiif', 5); dynCall_vif = dynCalls['vif'] = createExportWrapper('dynCall_vif', 3); dynCall_viff = dynCalls['viff'] = createExportWrapper('dynCall_viff', 4); dynCall_fi = dynCalls['fi'] = createExportWrapper('dynCall_fi', 2); dynCall_iiiiiiii = dynCalls['iiiiiiii'] = createExportWrapper('dynCall_iiiiiiii', 8); + dynCall_di = dynCalls['di'] = createExportWrapper('dynCall_di', 2); + dynCall_iiji = dynCalls['iiji'] = createExportWrapper('dynCall_iiji', 4); dynCall_vid = dynCalls['vid'] = createExportWrapper('dynCall_vid', 3); dynCall_dd = dynCalls['dd'] = createExportWrapper('dynCall_dd', 2); dynCall_ddd = dynCalls['ddd'] = createExportWrapper('dynCall_ddd', 3); @@ -6280,6 +6280,17 @@ function invoke_v(index) { } } +function invoke_vii(index,a1,a2) { + var sp = stackSave(); + try { + dynCall_vii(index,a1,a2); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + function invoke_iiii(index,a1,a2,a3) { var sp = stackSave(); try { @@ -6346,17 +6357,6 @@ function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) { } } -function invoke_vii(index,a1,a2) { - var sp = stackSave(); - try { - dynCall_vii(index,a1,a2); - } catch(e) { - stackRestore(sp); - if (!(e instanceof EmscriptenEH)) throw e; - _setThrew(1, 0); - } -} - function invoke_i(index) { var sp = stackSave(); try { diff --git a/vendor/micropython/micropython.wasm b/vendor/micropython/micropython.wasm index 8c3774f327d82e9c7b253676d380adf21f77f90f..f3e414ab2ac5fc72f49a4d36b367ca50761baaa8 100755 GIT binary patch delta 1063524 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%0AR~eR6!d{c21YMRJGLO9=DHZxkn{)L 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