diff --git a/src/library_fetch.js b/src/library_fetch.js index 1467a90c5a279..88497f99bae70 100644 --- a/src/library_fetch.js +++ b/src/library_fetch.js @@ -13,9 +13,7 @@ var LibraryFetch = { $Fetch__postset: 'Fetch.staticInit();', #endif $Fetch: Fetch, - _emscripten_fetch_get_response_headers_length__sig: 'pi', _emscripten_fetch_get_response_headers_length: fetchGetResponseHeadersLength, - _emscripten_fetch_get_response_headers__sig: 'pipp', _emscripten_fetch_get_response_headers: fetchGetResponseHeaders, _emscripten_fetch_free: fetchFree, @@ -26,7 +24,6 @@ var LibraryFetch = { #endif $fetchXHR: fetchXHR, - emscripten_start_fetch__sig: 'vp', emscripten_start_fetch: startFetch, emscripten_start_fetch__deps: [ '$Fetch', diff --git a/src/library_sigs.js b/src/library_sigs.js index a503df85dcc8c..00e89727137a0 100644 --- a/src/library_sigs.js +++ b/src/library_sigs.js @@ -271,6 +271,9 @@ sigs = { _emscripten_dbg__sig: 'vp', _emscripten_dlopen_js__sig: 'vpppp', _emscripten_err__sig: 'vp', + _emscripten_fetch_free__sig: 'vi', + _emscripten_fetch_get_response_headers__sig: 'pipp', + _emscripten_fetch_get_response_headers_length__sig: 'pi', _emscripten_fs_load_embedded_files__sig: 'vp', _emscripten_get_now_is_monotonic__sig: 'i', _emscripten_get_progname__sig: 'vpi', @@ -601,6 +604,7 @@ sigs = { emscripten_sleep__sig: 'vi', emscripten_stack_snapshot__sig: 'p', emscripten_stack_unwind_buffer__sig: 'ippi', + emscripten_start_fetch__sig: 'vp', emscripten_supports_offscreencanvas__sig: 'i', emscripten_throw_number__sig: 'vd', emscripten_throw_string__sig: 'vp', diff --git a/src/utility.js b/src/utility.js index 7738f041147a1..69979a7abbd74 100644 --- a/src/utility.js +++ b/src/utility.js @@ -145,8 +145,10 @@ function mergeInto(obj, other, options = null) { if (obj.hasOwnProperty(key)) { const oldsig = obj[key]; const newsig = other[key]; - if (oldsig != newsig) { - error(`Signature redefinition for: ${key}. (old=${oldsig} vs new=${newsig})`); + if (oldsig == newsig) { + warn(`signature redefinition for: ${key}. (old=${oldsig} vs new=${newsig})`); + } else { + error(`signature redefinition for: ${key}. (old=${oldsig} vs new=${newsig})`); } } } diff --git a/system/lib/fetch/emscripten_fetch.c b/system/lib/fetch/emscripten_fetch.c index cb86ebb6eee04..01edeb3a7cce2 100644 --- a/system/lib/fetch/emscripten_fetch.c +++ b/system/lib/fetch/emscripten_fetch.c @@ -17,6 +17,8 @@ #include #include +#include "emscripten_internal.h" + // From https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState #define STATE_UNSENT 0 // Client has been created. open() not called yet. #define STATE_OPENED 1 // open() has been called. @@ -31,12 +33,6 @@ static void fetch_free(emscripten_fetch_t* fetch); -// APIs defined in JS -void emscripten_start_fetch(emscripten_fetch_t* fetch); -size_t _emscripten_fetch_get_response_headers_length(int32_t fetchID); -size_t _emscripten_fetch_get_response_headers(int32_t fetchID, char *dst, size_t dstSizeBytes); -void _emscripten_fetch_free(unsigned int); - typedef struct emscripten_fetch_queue { emscripten_fetch_t** queuedOperations; int numQueuedItems; diff --git a/system/lib/libc/emscripten_internal.h b/system/lib/libc/emscripten_internal.h index 819755001da8f..811934040fdbf 100644 --- a/system/lib/libc/emscripten_internal.h +++ b/system/lib/libc/emscripten_internal.h @@ -107,6 +107,13 @@ void _emscripten_throw_longjmp(void); void __handle_stack_overflow(void* addr); +// Internal fetch API +struct emscripten_fetch_t; +void emscripten_start_fetch(struct emscripten_fetch_t* fetch); +size_t _emscripten_fetch_get_response_headers_length(int32_t fetchID); +size_t _emscripten_fetch_get_response_headers(int32_t fetchID, char *dst, size_t dstSizeBytes); +void _emscripten_fetch_free(unsigned int); + #ifdef __cplusplus } #endif diff --git a/test/test_other.py b/test/test_other.py index 621db8b286773..15e11150e155c 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -3849,7 +3849,7 @@ def test_js_internal_deps(self): err = self.run_process([EMCC, 'src.c', '--js-library', 'lib.js'], stderr=PIPE).stderr self.assertContained("warning: user library symbol 'jslibfunc' depends on internal symbol '$callRuntimeCallbacks'", err) - def test_js_lib_sig_mismatch(self): + def test_js_lib_sig_redefinition(self): create_file('lib.js', r''' mergeInto(LibraryManager.library, { jslibfunc__sig: 'ii', @@ -3857,10 +3857,9 @@ def test_js_lib_sig_mismatch(self): }); mergeInto(LibraryManager.library, { - jslibfunc__sig: 'dd', + jslibfunc__sig: 'ii', jslibfunc: function(x) {}, }); - ''') create_file('src.c', r''' #include @@ -3869,8 +3868,18 @@ def test_js_lib_sig_mismatch(self): printf("c calling: %d\n", jslibfunc()); } ''') - err = self.expect_fail([EMCC, 'src.c', '--js-library', 'lib.js']) - self.assertContained('lib.js: Signature redefinition for: jslibfunc__sig. (old=ii vs new=dd)', err) + err = self.run_process([EMCC, 'src.c', '--js-library', 'lib.js'], stderr=PIPE).stderr + self.assertContained('lib.js: signature redefinition for: jslibfunc__sig. (old=ii vs new=ii)', err) + + # Add another redefinition, this time not matching + create_file('lib2.js', r''' +mergeInto(LibraryManager.library, { + jslibfunc__sig: 'pp', + jslibfunc: function(x) {}, +}); +''') + err = self.expect_fail([EMCC, 'src.c', '--js-library', 'lib.js', '--js-library', 'lib2.js']) + self.assertContained('lib2.js: signature redefinition for: jslibfunc__sig. (old=ii vs new=pp)', err) def test_js_lib_invalid_deps(self): create_file('lib.js', r''' diff --git a/tools/gen_sig_info.py b/tools/gen_sig_info.py index 6467f7db4b883..a4d3a04eca79c 100755 --- a/tools/gen_sig_info.py +++ b/tools/gen_sig_info.py @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -228,12 +229,16 @@ def extract_sig_info(sig_info, extra_settings=None, extra_cflags=None): 'STACK_OVERFLOW_CHECK': 1, 'FULL_ES3': 1, 'USE_SDL': 1, + 'FETCH': 1, # Currently GLFW symbols have different sigs for the same symbol because the # signatures changed between v2 and v3, so for now we continue to maintain # them by hand. 'USE_GLFW': 0, - 'JS_LIBRARIES': ['src/library_websocket.js', - 'src/library_webaudio.js'], + 'JS_LIBRARIES': [ + 'src/library_websocket.js', + 'src/library_webaudio.js', + 'src/library_fetch.js' + ], 'SUPPORT_LONGJMP': 'emscripten' } if extra_settings: diff --git a/tools/system_libs.py b/tools/system_libs.py index 9287295df327f..7bebfb22b6bbc 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -1743,6 +1743,7 @@ def get_default_variation(cls, **kwargs): class libfetch(MTLibrary): name = 'libfetch' never_force = True + includes = ['system/lib/libc'] def get_files(self): return [utils.path_from_root('system/lib/fetch/emscripten_fetch.c')]