diff --git a/Makefile b/Makefile index 66ec8db4c..fa73be790 100644 --- a/Makefile +++ b/Makefile @@ -172,7 +172,7 @@ clean: clean-python: clean make -C cpython clean -clean-all: +clean-all: clean make -C emsdk clean make -C cpython clean-all diff --git a/Makefile.envs b/Makefile.envs index 0ab7678ca..8884d52a4 100644 --- a/Makefile.envs +++ b/Makefile.envs @@ -1,7 +1,7 @@ export PYVERSION ?= 3.10.2 # Note: when updating EMSCRIPTEN_VERSION make sure to update # the version number in the "uname" patch. -export PYODIDE_EMSCRIPTEN_VERSION ?= 3.1.6 +export PYODIDE_EMSCRIPTEN_VERSION ?= 3.1.13 export PLATFORM_TRIPLET=wasm32-emscripten export SYSCONFIG_NAME=_sysconfigdata__emscripten_$(PLATFORM_TRIPLET) @@ -99,7 +99,6 @@ export SIDE_MODULE_LDFLAGS= $(LDFLAGS_BASE) -s SIDE_MODULE=1 export MAIN_MODULE_LDFLAGS= $(LDFLAGS_BASE) \ -s MAIN_MODULE=1 \ -s EXPORT_NAME="'_createPyodideModule'" \ - -s EXPORTED_FUNCTIONS='["___cxa_guard_acquire", "__ZNSt3__28ios_base4initEPv", "_main"]' \ -s EXCEPTION_CATCHING_ALLOWED=['we only want to allow exception handling in side modules'] \ -s DEMANGLE_SUPPORT=1 \ -s USE_FREETYPE=1 \ diff --git a/cpython/pyconfig.undefs.h b/cpython/pyconfig.undefs.h index b3089795b..b10daa46c 100644 --- a/cpython/pyconfig.undefs.h +++ b/cpython/pyconfig.undefs.h @@ -34,3 +34,5 @@ #define CONFIG_32 #define ANSI + +#undef HAVE_MEMFD_CREATE diff --git a/emsdk/patches/0001-Throw-away-errors-in-minify_wasm_js.patch b/emsdk/patches/0001-Throw-away-errors-in-minify_wasm_js.patch index b5ffd0a3d..9336d23c9 100644 --- a/emsdk/patches/0001-Throw-away-errors-in-minify_wasm_js.patch +++ b/emsdk/patches/0001-Throw-away-errors-in-minify_wasm_js.patch @@ -1,17 +1,17 @@ -From c3e9df0738648c47cd3246a491cc324bf2afa2c5 Mon Sep 17 00:00:00 2001 +From 314d9d1c6405cc197a2022d3176a225c9d70b9e9 Mon Sep 17 00:00:00 2001 From: Hood Date: Thu, 24 Jun 2021 04:08:02 -0700 -Subject: [PATCH 1/8] Throw away errors in minify_wasm_js +Subject: [PATCH 1/4] Throw away errors in minify_wasm_js --- emcc.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/emcc.py b/emcc.py -index 81da47f68..f1550ed96 100755 +index d67aa5414..b97321cde 100755 --- a/emcc.py +++ b/emcc.py -@@ -3326,11 +3326,14 @@ def phase_binaryen(target, options, wasm_target): +@@ -3409,11 +3409,14 @@ def phase_binaryen(target, options, wasm_target): # Closure can print out readable error messages (Closure will then # minify whitespace afterwards) save_intermediate_with_wasm('preclean', wasm_target) diff --git a/emsdk/patches/0006-Add-BigInt64Array-shim-for-Safari-14.patch b/emsdk/patches/0002-Add-BigInt64Array-shim-for-Safari-14.patch similarity index 94% rename from emsdk/patches/0006-Add-BigInt64Array-shim-for-Safari-14.patch rename to emsdk/patches/0002-Add-BigInt64Array-shim-for-Safari-14.patch index 72158dbff..8388d06dd 100644 --- a/emsdk/patches/0006-Add-BigInt64Array-shim-for-Safari-14.patch +++ b/emsdk/patches/0002-Add-BigInt64Array-shim-for-Safari-14.patch @@ -1,7 +1,7 @@ -From cff825cdcba9e0571e5a025b5878fb82d3d79e17 Mon Sep 17 00:00:00 2001 +From 458c78230e6dd45d724b04904f15628c570ae904 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 8 Jun 2022 19:08:18 -0700 -Subject: [PATCH 6/8] Add BigInt64Array shim for Safari 14 +Subject: [PATCH 2/4] Add BigInt64Array shim for Safari 14 --- src/polyfill/bigint64array.js | 94 +++++++++++++++++++++++++++++++++++ @@ -112,10 +112,10 @@ index 000000000..448a2d2a4 + var BigInt64Array = createBigIntArrayShim(partsToBigIntSigned); +} diff --git a/src/preamble.js b/src/preamble.js -index 430ac5568..62f215ab4 100644 +index ce24d8456..618ccd2ac 100644 --- a/src/preamble.js +++ b/src/preamble.js -@@ -267,7 +267,7 @@ function updateGlobalBufferAndViews(buf) { +@@ -297,7 +297,7 @@ function updateGlobalBufferAndViews(buf) { #if WASM_BIGINT Module['HEAP64'] = HEAP64 = new BigInt64Array(buf); Module['HEAPU64'] = HEAPU64 = new BigUint64Array(buf); @@ -125,10 +125,10 @@ index 430ac5568..62f215ab4 100644 var TOTAL_STACK = {{{ TOTAL_STACK }}}; diff --git a/src/settings.js b/src/settings.js -index a3d45c7a3..162d026e5 100644 +index 1a8b7f1fe..be5964519 100644 --- a/src/settings.js +++ b/src/settings.js -@@ -1334,6 +1334,10 @@ var DYNCALLS = 0; +@@ -1341,6 +1341,10 @@ var DYNCALLS = false; // WebAssembly integration with JavaScript BigInt. When enabled we don't need // to legalize i64s into pairs of i32s, as the wasm VM will use a BigInt where // an i64 is used. @@ -137,10 +137,10 @@ index a3d45c7a3..162d026e5 100644 +// with Safari >= v14.0, in that case Emscripten will polyfill BigInt64Array. +// Use `-sMIN_SAFARI_VERSION=140000` to request this. // [link] - var WASM_BIGINT = 0; + var WASM_BIGINT = false; diff --git a/src/shell.js b/src/shell.js -index 021d7cf5f..774a7f411 100644 +index 22fac7f69..9d7558340 100644 --- a/src/shell.js +++ b/src/shell.js @@ -51,7 +51,12 @@ var Module = typeof {{{ EXPORT_NAME }}} != 'undefined' ? {{{ EXPORT_NAME }}} : { diff --git a/emsdk/patches/0002-Fix-lookupPath-when-applied-to-a-symlink-loop.patch b/emsdk/patches/0002-Fix-lookupPath-when-applied-to-a-symlink-loop.patch deleted file mode 100644 index 94b825df6..000000000 --- a/emsdk/patches/0002-Fix-lookupPath-when-applied-to-a-symlink-loop.patch +++ /dev/null @@ -1,31 +0,0 @@ -From e9f1c08431ed75bc1bf5bb949bc409d3407d0bef Mon Sep 17 00:00:00 2001 -From: Hood Chatham -Date: Wed, 2 Mar 2022 13:44:14 -0800 -Subject: [PATCH 2/8] Fix lookupPath when applied to a symlink loop - -The following code leads to an infinite loop in lookupPath: - -FS.symlink("linkX/inside","/linkX"); -FS.lookupPath("/linkX", {follow:true}); - -This patch fixes it. ---- - src/library_fs.js | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/library_fs.js b/src/library_fs.js -index bc5cc412c..d722d7449 100644 ---- a/src/library_fs.js -+++ b/src/library_fs.js -@@ -166,7 +166,7 @@ FS.staticInit();` + - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - -- var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); -+ var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count + 1 }); - current = lookup.node; - - if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). --- -2.25.1 - diff --git a/emsdk/patches/0003-Fix-dup-again.patch b/emsdk/patches/0003-Fix-dup-again.patch new file mode 100644 index 000000000..6486f80c6 --- /dev/null +++ b/emsdk/patches/0003-Fix-dup-again.patch @@ -0,0 +1,75 @@ +From cedb7b1a5a341103707da7fbea435a7f4ed719f1 Mon Sep 17 00:00:00 2001 +From: Hood Chatham +Date: Wed, 8 Jun 2022 22:06:54 -0700 +Subject: [PATCH 3/4] Fix dup again + +--- + src/library_fs.js | 40 ++++++++++++++++++++++++++-------------- + 1 file changed, 26 insertions(+), 14 deletions(-) + +diff --git a/src/library_fs.js b/src/library_fs.js +index 88f3bd98c..693a1988a 100644 +--- a/src/library_fs.js ++++ b/src/library_fs.js +@@ -400,32 +400,44 @@ FS.staticInit();` + + // SOCKFS is completed. + createStream: (stream, fd_start, fd_end) => { + if (!FS.FSStream) { +- FS.FSStream = /** @constructor */ function() { +- this.shared = { }; ++ FS.FSStream = function FSStream() { ++ this.shared = {flags : 0, position : 0}; + }; +- FS.FSStream.prototype = { ++ FS.FSStream.prototype = Object.create(Object.prototype); ++ FS.FSStream.prototype.constructor = FS.FSStream; ++ Object.defineProperties(FS.FSStream.prototype, { + object: { +- get: function() { return this.node; }, +- set: function(val) { this.node = val; } ++ get: function () { ++ return this.node; ++ }, ++ set: function (val) { ++ this.node = val; ++ }, ++ enumerable : true, + }, + isRead: { +- get: function() { return (this.flags & {{{ cDefine('O_ACCMODE') }}}) !== {{{ cDefine('O_WRONLY') }}}; } ++ get: function() { return (this.flags & {{{ cDefine('O_ACCMODE') }}}) !== {{{ cDefine('O_WRONLY') }}}; }, ++ enumerable : true, + }, + isWrite: { +- get: function() { return (this.flags & {{{ cDefine('O_ACCMODE') }}}) !== {{{ cDefine('O_RDONLY') }}}; } ++ get: function() { return (this.flags & {{{ cDefine('O_ACCMODE') }}}) !== {{{ cDefine('O_RDONLY') }}}; }, ++ enumerable : true, + }, + isAppend: { +- get: function() { return (this.flags & {{{ cDefine('O_APPEND') }}}); } ++ get: function() { return (this.flags & {{{ cDefine('O_APPEND') }}}); }, ++ enumerable : true, + }, + flags: { +- get: function() { return this.shared.flags; }, +- set: function(val) { this.shared.flags = val; }, ++ get: function () { return this.shared.flags; }, ++ set: function (val) { this.shared.flags = val; }, ++ enumerable : true, + }, +- position : { +- get function() { return this.shared.position; }, +- set: function(val) { this.shared.position = val; }, ++ position: { ++ get: function() { return this.shared.position; }, ++ set: function (val) { this.shared.position = val; }, ++ enumerable : true, + }, +- }; ++ }); + } + // clone it, so we can return an instance of FSStream + stream = Object.assign(new FS.FSStream(), stream); +-- +2.25.1 + diff --git a/emsdk/patches/0003-Fix-utime-syscall-16460.patch b/emsdk/patches/0003-Fix-utime-syscall-16460.patch deleted file mode 100644 index 9d7468f08..000000000 --- a/emsdk/patches/0003-Fix-utime-syscall-16460.patch +++ /dev/null @@ -1,147 +0,0 @@ -From 9fead8aabbf3418ac1422cd4867815f9eb49e6e6 Mon Sep 17 00:00:00 2001 -From: Christian Heimes -Date: Thu, 10 Mar 2022 18:30:11 +0200 -Subject: [PATCH 3/8] Fix utime() syscall (#16460) - -Fix off by factor 1000: ``FS.utime()`` expects mtime and atime in seconds. - -``times == NULL`` is now correctly handled. ``utimes(path, NULL)`` -updates atime and mtime to current time. - -https://nodejs.org/api/fs.html#fsutimespath-atime-mtime-callback - -Fixes: #16458 -Signed-off-by: Christian Heimes ---- - src/library_noderawfs.js | 2 +- - src/library_syscall.js | 19 ++++++++++++------- - system/lib/wasmfs/syscalls.cpp | 14 +++++++++++--- - tests/utime/test_utime.c | 27 +++++++++++++++++++++++---- - 4 files changed, 47 insertions(+), 15 deletions(-) - -diff --git a/src/library_noderawfs.js b/src/library_noderawfs.js -index 78f995830..f252e3a64 100644 ---- a/src/library_noderawfs.js -+++ b/src/library_noderawfs.js -@@ -81,7 +81,7 @@ mergeInto(LibraryManager.library, { - } - fs.ftruncateSync.apply(void 0, arguments); - }, -- utime: function() { fs.utimesSync.apply(void 0, arguments); }, -+ utime: function(path, atime, mtime) { fs.utimesSync(path, atime/1000, mtime/1000); }, - open: function(path, flags, mode, suggestFD) { - if (typeof flags == "string") { - flags = VFS.modeStringToFlags(flags) -diff --git a/src/library_syscall.js b/src/library_syscall.js -index 8a59a0442..072d4cde3 100644 ---- a/src/library_syscall.js -+++ b/src/library_syscall.js -@@ -1046,13 +1046,18 @@ var SyscallsLibrary = { - assert(flags === 0); - #endif - path = SYSCALLS.calculateAt(dirfd, path, true); -- var seconds = {{{ makeGetValue('times', C_STRUCTS.timespec.tv_sec, 'i32') }}}; -- var nanoseconds = {{{ makeGetValue('times', C_STRUCTS.timespec.tv_nsec, 'i32') }}}; -- var atime = (seconds*1000) + (nanoseconds/(1000*1000)); -- times += {{{ C_STRUCTS.timespec.__size__ }}}; -- seconds = {{{ makeGetValue('times', C_STRUCTS.timespec.tv_sec, 'i32') }}}; -- nanoseconds = {{{ makeGetValue('times', C_STRUCTS.timespec.tv_nsec, 'i32') }}}; -- var mtime = (seconds*1000) + (nanoseconds/(1000*1000)); -+ if (!times) { -+ var atime = Date.now(); -+ var mtime = atime; -+ } else { -+ var seconds = {{{ makeGetValue('times', C_STRUCTS.timespec.tv_sec, 'i32') }}}; -+ var nanoseconds = {{{ makeGetValue('times', C_STRUCTS.timespec.tv_nsec, 'i32') }}}; -+ atime = (seconds*1000) + (nanoseconds/(1000*1000)); -+ times += {{{ C_STRUCTS.timespec.__size__ }}}; -+ seconds = {{{ makeGetValue('times', C_STRUCTS.timespec.tv_sec, 'i32') }}}; -+ nanoseconds = {{{ makeGetValue('times', C_STRUCTS.timespec.tv_nsec, 'i32') }}}; -+ mtime = (seconds*1000) + (nanoseconds/(1000*1000)); -+ } - FS.utime(path, atime, mtime); - return 0; - }, -diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp -index a004b02dd..48f9b4677 100644 ---- a/system/lib/wasmfs/syscalls.cpp -+++ b/system/lib/wasmfs/syscalls.cpp -@@ -992,9 +992,17 @@ long __syscall_utimensat(int dirFD, - return err; - } - -- // TODO: tv_nsec (nanoseconds) as well? but time_t is seconds as an integer -- auto aSeconds = times[0].tv_sec; -- auto mSeconds = times[1].tv_sec; -+ // TODO: Set tv_nsec (nanoseconds) as well. -+ // TODO: Handle tv_nsec being UTIME_NOW or UTIME_OMIT. -+ // TODO: Check for write access to the file (see man page for specifics). -+ time_t aSeconds, mSeconds; -+ if (times == NULL) { -+ aSeconds = time(NULL); -+ mSeconds = aSeconds; -+ } else { -+ aSeconds = times[0].tv_sec; -+ mSeconds = times[1].tv_sec; -+ } - - auto locked = parsedPath.child->locked(); - locked.setATime(aSeconds); -diff --git a/tests/utime/test_utime.c b/tests/utime/test_utime.c -index b0f28bc4d..3a04100ce 100644 ---- a/tests/utime/test_utime.c -+++ b/tests/utime/test_utime.c -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -32,20 +33,38 @@ void test() { - // will fail - struct utimbuf t = {1000000000, 1000000000}; - -- utime("writeable", &t); -+ errno = 0; -+ int rv = utime("writeable", &t); -+ assert(rv == 0); - assert(!errno); - memset(&s, 0, sizeof s); -- stat("writeable", &s); -+ rv = stat("writeable", &s); -+ assert(rv == 0); - assert(s.st_atime == t.actime); - assert(s.st_mtime == t.modtime); - -+ // NULL sets atime and mtime to current time. -+ long now = time(NULL); -+ rv = utime("writeable", NULL); -+ assert(rv == 0); -+ memset(&s, 0, sizeof s); -+ stat("writeable", &s); -+ assert(s.st_atime == s.st_mtime); -+ long diff = s.st_atime - now; -+ if (abs(diff) > 5) { -+ fprintf(stderr, "st_atime: %li, now: %li, diff: %li\n ", s.st_atime, now, diff); -+ assert(abs(diff) <= 5); -+ } -+ - // write permissions aren't checked when setting node - // attributes unless the user uid isn't the owner (so - // therefor, this should work fine) -- utime("unwriteable", &t); -+ rv = utime("unwriteable", &t); -+ assert(rv == 0); - assert(!errno); - memset(&s, 0, sizeof s); -- stat("unwriteable", &s); -+ rv = stat("unwriteable", &s); -+ assert(rv == 0); - assert(s.st_atime == t.actime); - assert(s.st_mtime == t.modtime); - --- -2.25.1 - diff --git a/emsdk/patches/0007-Disable-whole-archive-when-linking-rust.patch b/emsdk/patches/0004-Disable-whole-archive-when-linking-rust.patch similarity index 81% rename from emsdk/patches/0007-Disable-whole-archive-when-linking-rust.patch rename to emsdk/patches/0004-Disable-whole-archive-when-linking-rust.patch index e767cfb61..75d01db52 100644 --- a/emsdk/patches/0007-Disable-whole-archive-when-linking-rust.patch +++ b/emsdk/patches/0004-Disable-whole-archive-when-linking-rust.patch @@ -1,7 +1,7 @@ -From b4140512b840263ca2f44f0b639e67b0928db601 Mon Sep 17 00:00:00 2001 +From c250eb29047c4341cdc1d13f3706eb6991cf0f9b Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 6 Jan 2022 09:40:39 -0800 -Subject: [PATCH 7/8] Disable whole-archive when linking rust +Subject: [PATCH 4/4] Disable whole-archive when linking rust Rust .rlib archives contain an extra metadata file called lib.rmeta. Emscripten sets `--whole-archive` by default if LINKABLE is set. @@ -16,10 +16,10 @@ https://github.com/emscripten-core/emscripten/issues/17109 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/building.py b/tools/building.py -index c69f9ec56..5de0b50ce 100644 +index 24ddaa13f..cb015e18f 100644 --- a/tools/building.py +++ b/tools/building.py -@@ -372,7 +372,7 @@ def link_lld(args, target, external_symbols=None): +@@ -360,7 +360,7 @@ def link_lld(args, target, external_symbols=None): # Emscripten currently expects linkable output (SIDE_MODULE/MAIN_MODULE) to # include all archive contents. diff --git a/emsdk/patches/0004-Fix-dup.patch b/emsdk/patches/0004-Fix-dup.patch deleted file mode 100644 index 3fcecc8ac..000000000 --- a/emsdk/patches/0004-Fix-dup.patch +++ /dev/null @@ -1,91 +0,0 @@ -From d1ddf4947fa923219a388540605420916375f8a5 Mon Sep 17 00:00:00 2001 -From: Hood -Date: Wed, 8 Sep 2021 17:49:15 -0700 -Subject: [PATCH 4/8] Fix dup - -This fixes two problems with the `dup` system calls: -1. `dup` expects that every file descriptor has a corresponding file (so pipes and (https://github.com/emscripten-core/emscripten/issues/14640) - files that have been unlinked (https://github.com/emscripten-core/emscripten/issues/15012) cannot be duplicated ). -2. The dup'd file descriptor does not share flags and position with the original file desciptor. - -This is a simplification of an upstream pull request that would fix this problem. -https://github.com/emscripten-core/emscripten/pull/9396/files -This patch is simpler than the upstream one but leaves NODERAWFS broken. ---- - src/library_fs.js | 8 ++++++-- - src/library_syscall.js | 10 +++++----- - 2 files changed, 11 insertions(+), 7 deletions(-) - -diff --git a/src/library_fs.js b/src/library_fs.js -index d722d7449..47da3c67c 100644 ---- a/src/library_fs.js -+++ b/src/library_fs.js -@@ -404,7 +404,7 @@ FS.staticInit();` + - // SOCKFS is completed. - createStream: (stream, fd_start, fd_end) => { - if (!FS.FSStream) { -- FS.FSStream = /** @constructor */ function(){}; -+ FS.FSStream = /** @constructor */ function(){ this.shared = {}; }; - FS.FSStream.prototype = { - object: { - get: function() { return this.node; }, -@@ -418,7 +418,11 @@ FS.staticInit();` + - }, - isAppend: { - get: function() { return (this.flags & {{{ cDefine('O_APPEND') }}}); } -- } -+ }, -+ get flags() { return this.shared.flags; }, -+ set flags(value) { this.shared.flags = value; }, -+ get position() { return this.shared.position; }, -+ set position(value) { this.shared.position = value; }, - }; - } - // clone it, so we can return an instance of FSStream -diff --git a/src/library_syscall.js b/src/library_syscall.js -index 072d4cde3..47eab24aa 100644 ---- a/src/library_syscall.js -+++ b/src/library_syscall.js -@@ -131,10 +131,10 @@ var SyscallsLibrary = { - } - return 0; - }, -- doDup: function(path, flags, suggestFD) { -+ doDup: function(stream, suggestFD, flags) { - var suggest = FS.getStream(suggestFD); - if (suggest) FS.close(suggest); -- return FS.open(path, flags, 0, suggestFD, suggestFD).fd; -+ return FS.createStream(stream, suggestFD, suggestFD).fd; - }, - doReadv: function(stream, iov, iovcnt, offset) { - var ret = 0; -@@ -303,7 +303,7 @@ var SyscallsLibrary = { - }, - __syscall_dup: function(fd) { - var old = SYSCALLS.getStreamFromFD(fd); -- return FS.open(old.path, old.flags, 0).fd; -+ return FS.createStream(old, 0).fd; - }, - __syscall_pipe__deps: ['$PIPEFS'], - __syscall_pipe: function(fdPtr) { -@@ -853,7 +853,7 @@ var SyscallsLibrary = { - return -{{{ cDefine('EINVAL') }}}; - } - var newStream; -- newStream = FS.open(stream.path, stream.flags, 0, arg); -+ newStream = FS.createStream(stream, arg); - return newStream.fd; - } - case {{{ cDefine('F_GETFD') }}}: -@@ -1077,7 +1077,7 @@ var SyscallsLibrary = { - assert(!flags); - #endif - if (old.fd === suggestFD) return -{{{ cDefine('EINVAL') }}}; -- return SYSCALLS.doDup(old.path, old.flags, suggestFD); -+ return SYSCALLS.doDup(old, suggestFD, flags); - }, - }; - --- -2.25.1 - diff --git a/emsdk/patches/0005-Fix-version-reported-by-uname-17026.patch b/emsdk/patches/0005-Fix-version-reported-by-uname-17026.patch deleted file mode 100644 index 8b7954d8b..000000000 --- a/emsdk/patches/0005-Fix-version-reported-by-uname-17026.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 03a31e67f42161ed920e9a8a00094ce2d49fd667 Mon Sep 17 00:00:00 2001 -From: Sam Clegg -Date: Mon, 23 May 2022 15:25:21 -0700 -Subject: [PATCH 5/8] Fix version reported by uname (#17026) - -Fixes: #16977 ---- - system/lib/libc/emscripten_syscall_stubs.c | 10 +++++++++- - tests/core/test_uname.out | 2 +- - tests/test_core.py | 2 +- - 3 files changed, 11 insertions(+), 3 deletions(-) - -diff --git a/system/lib/libc/emscripten_syscall_stubs.c b/system/lib/libc/emscripten_syscall_stubs.c -index 0a59d1a3d..68b1a2f11 100644 ---- a/system/lib/libc/emscripten_syscall_stubs.c -+++ b/system/lib/libc/emscripten_syscall_stubs.c -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - - static int g_pid = 42; - static int g_pgid = 42; -@@ -42,15 +43,22 @@ static mode_t g_umask = S_IRWXU | S_IRWXG | S_IRWXO; - return -ENOSYS; \ - } - -+#define STRINGIFY(s) #s -+#define STR(s) STRINGIFY(s) -+ - long __syscall_uname(long buf) { - if (!buf) { - return -EFAULT; - } -+ const char* full_version = STR(__EMSCRIPTEN_major__) "." \ -+ STR(__EMSCRIPTEN_minor__) "." \ -+ STR(__EMSCRIPTEN_tiny__); -+ - struct utsname *utsname = (struct utsname *)buf; - - strcpy(utsname->sysname, "Emscripten"); - strcpy(utsname->nodename, "emscripten"); -- strcpy(utsname->release, "1.0"); -+ strcpy(utsname->release, full_version); - strcpy(utsname->version, "#1"); - #ifdef __wams64__ - strcpy(utsname->machine, "wasm64"); -diff --git a/tests/core/test_uname.out b/tests/core/test_uname.out -index 879d445a3..3806f84db 100644 ---- a/tests/core/test_uname.out -+++ b/tests/core/test_uname.out -@@ -1,6 +1,6 @@ - ret: 0 - sysname: Emscripten - nodename: emscripten --release: 1.0 -+release: \d+.\d+.\d+ - version: #1 - machine: wasm32 -diff --git a/tests/test_core.py b/tests/test_core.py -index c334c8398..5800b6a72 100644 ---- a/tests/test_core.py -+++ b/tests/test_core.py -@@ -5773,7 +5773,7 @@ Module['onRuntimeInitialized'] = function() { - self.do_core_test('test_posixtime.c') - - def test_uname(self): -- self.do_core_test('test_uname.c') -+ self.do_core_test('test_uname.c', regex=True) - - def test_unary_literal(self): - self.do_core_test('test_unary_literal.cpp') --- -2.25.1 - diff --git a/emsdk/patches/0008-Add-signature-to-emscripten_get_now.patch b/emsdk/patches/0008-Add-signature-to-emscripten_get_now.patch deleted file mode 100644 index 61ceaf2b1..000000000 --- a/emsdk/patches/0008-Add-signature-to-emscripten_get_now.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 65d4028693bd59bfe75813043b2470342c6a5fe5 Mon Sep 17 00:00:00 2001 -From: Hood Chatham -Date: Wed, 1 Jun 2022 10:54:08 -0700 -Subject: [PATCH 8/8] Add signature to emscripten_get_now - -Upstream PR: -https://github.com/emscripten-core/emscripten/pull/17123/files ---- - src/library.js | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/library.js b/src/library.js -index b1947fc69..65bd4718c 100644 ---- a/src/library.js -+++ b/src/library.js -@@ -2405,6 +2405,7 @@ LibraryManager.library = { - }, - - emscripten_get_now__import: true, -+ emscripten_get_now__sig: 'd', - emscripten_get_now: ';' + - #if ENVIRONMENT_MAY_BE_NODE - "if (ENVIRONMENT_IS_NODE) {\n" + --- -2.25.1 - diff --git a/src/core/error_handling.c b/src/core/error_handling.c index fef64ac06..7d83ee4e6 100644 --- a/src/core/error_handling.c +++ b/src/core/error_handling.c @@ -6,6 +6,7 @@ #include "jsproxy.h" #include "pyproxy.h" #include +#include static PyObject* tbmod = NULL; @@ -15,13 +16,12 @@ _Py_IDENTIFIER(last_value); _Py_IDENTIFIER(last_traceback); void -_Py_DumpTraceback(int fd, void* tstate); +_Py_DumpTraceback(int fd, PyThreadState* tstate); -// We need this b/c otherwise Emscripten will eliminate the symbol. EMSCRIPTEN_KEEPALIVE void -dump_traceback(int fd, void* tstate) +dump_traceback() { - _Py_DumpTraceback(fd, tstate); + _Py_DumpTraceback(fileno(stdout), PyGILState_GetThisThreadState()); } EM_JS(void, console_error, (char* msg), { diff --git a/src/core/error_handling.ts b/src/core/error_handling.ts index 1530b2ad8..4ee178a39 100644 --- a/src/core/error_handling.ts +++ b/src/core/error_handling.ts @@ -4,16 +4,6 @@ declare var Hiwire: any; declare var API: any; declare var Tests: any; -/** - * Dump the Python traceback to the browser console. - * - * @private - */ -API.dump_traceback = function () { - const fd_stdout = 1; - Module._dump_traceback(fd_stdout, Module._PyGILState_GetThisThreadState()); -}; - function ensureCaughtObjectIsError(e: any): Error { if (typeof e === "string") { // Sometimes emscripten throws a raw string... @@ -90,7 +80,7 @@ API.fatal_error = function (e: any) { console.error(e); } try { - API.dump_traceback(); + Module._dump_traceback(); for (let key of Object.keys(API.public_api)) { if (key.startsWith("_") || key === "version") { continue; diff --git a/src/core/error_handling_cpp.cpp b/src/core/error_handling_cpp.cpp index 02bcb00f5..a87230d79 100644 --- a/src/core/error_handling_cpp.cpp +++ b/src/core/error_handling_cpp.cpp @@ -1,3 +1,4 @@ +#include #include #include using namespace std; @@ -5,16 +6,19 @@ using namespace std; extern "C" { + EMSCRIPTEN_KEEPALIVE const char* exc_what(exception& e) { return e.what(); } + EMSCRIPTEN_KEEPALIVE const std::type_info* exc_type() { return &typeid(exception); } + EMSCRIPTEN_KEEPALIVE const char* exc_typename(std::type_info* type) { return type->name(); diff --git a/src/core/post.js b/src/core/post.js index 021555cfd..cc8795cae 100644 --- a/src/core/post.js +++ b/src/core/post.js @@ -3,3 +3,6 @@ Module.UTF8ToString = UTF8ToString; Module.wasmTable = wasmTable; // Emscripten has a bug where it accidentally exposes an empty object as Module.ERRNO_CODES Module.ERRNO_CODES = ERRNO_CODES; +// preloadedWasm isn't exposed on Module by default anymore. TODO: We should use +// a less hacky approach via the fs argument to loadDynamicLibrary +Module.preloadedWasm = preloadedWasm;