Skip to content

Commit a1cfdc7

Browse files
committed
Remove deps_info system and and the running of llvm-nm on input file. NFC
This uses a new "stub object" construct to tell the linker (wasm-ld) not only about the existence of the JS library symbols but the native symbols on which they depend (a.k.a reverse dependencies). This allows us to completely remove deps_info.py in favor of just using normal `__deps` entries in the library files. It also means we no longer need to run `llvm-nm` on the linker inputs to discover the symbols they use. Depends on: https://reviews.llvm.org/D145308 Fixes: #18875
1 parent dfbf6a8 commit a1cfdc7

31 files changed

+130
-544
lines changed

emcc.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
from tools.minimal_runtime_shell import generate_minimal_runtime_html
5151
import tools.line_endings
5252
from tools import feature_matrix
53-
from tools import deps_info
5453
from tools import js_manipulation
5554
from tools import wasm2c
5655
from tools import webassembly
@@ -1316,11 +1315,19 @@ def run(args):
13161315
js_info = get_js_sym_info()
13171316
if not settings.SIDE_MODULE:
13181317
js_syms = js_info['deps']
1319-
deps_info.append_deps_info(js_syms)
1318+
if not settings.USES_DYNAMIC_ALLOC:
1319+
# When USES_DYNAMIC_ALLOC=0 is set we don't export malloc/free, even
1320+
# if the JS library symbols depend on them. In this mode we instead
1321+
# fail at runtime if they are actaully called.
1322+
for value in js_syms.values():
1323+
if 'malloc' in value:
1324+
value.remove('malloc')
1325+
if 'free' in value:
1326+
value.remove('free')
13201327
if settings.ASYNCIFY:
13211328
settings.ASYNCIFY_IMPORTS += ['env.' + x for x in js_info['asyncFuncs']]
13221329

1323-
phase_calculate_system_libraries(state, linker_arguments, linker_inputs, newargs)
1330+
phase_calculate_system_libraries(state, linker_arguments, newargs)
13241331

13251332
phase_link(linker_arguments, wasm_target, js_syms)
13261333

@@ -2082,11 +2089,6 @@ def phase_linker_setup(options, state, newargs):
20822089
settings.INCLUDE_FULL_LIBRARY = 1
20832090
settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$loadDylibs']
20842091

2085-
# If we are including the entire JS library then we know for sure we will, by definition,
2086-
# require all the reverse dependencies.
2087-
if settings.INCLUDE_FULL_LIBRARY:
2088-
default_setting('REVERSE_DEPS', 'all')
2089-
20902092
if settings.MAIN_MODULE == 1 or settings.SIDE_MODULE == 1:
20912093
settings.LINKABLE = 1
20922094

@@ -3079,14 +3081,13 @@ def compile_source_file(i, input_file):
30793081

30803082

30813083
@ToolchainProfiler.profile_block('calculate system libraries')
3082-
def phase_calculate_system_libraries(state, linker_arguments, linker_inputs, newargs):
3084+
def phase_calculate_system_libraries(state, linker_arguments, newargs):
30833085
extra_files_to_link = []
30843086
# Link in ports and system libraries, if necessary
30853087
if not settings.SIDE_MODULE:
30863088
# Ports are always linked into the main module, never the side module.
30873089
extra_files_to_link += ports.get_libs(settings)
3088-
all_linker_inputs = [f for _, f in sorted(linker_inputs)] + extra_files_to_link
3089-
extra_files_to_link += system_libs.calculate(all_linker_inputs, newargs, forced=state.forced_stdlibs)
3090+
extra_files_to_link += system_libs.calculate(newargs, forced=state.forced_stdlibs)
30903091
linker_arguments.extend(extra_files_to_link)
30913092

30923093

site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -596,9 +596,6 @@ See the `library_*.js`_ files for other examples.
596596
This is useful when all the implemented methods use a JavaScript
597597
singleton containing helper methods. See ``library_webgl.js`` for
598598
an example.
599-
- If a JavaScript library depends on a compiled C library (like most
600-
of *libc*), you must edit `src/deps_info.json`_. Search for
601-
"deps_info" in `tools/system_libs.py`_.
602599
- The keys passed into `mergeInto` generate functions that are prefixed
603600
by ``_``. In other words ``my_func: function() {},`` becomes
604601
``function _my_func() {}``, as all C methods in emscripten have a ``_`` prefix. Keys starting with ``$`` have the ``$``
@@ -810,7 +807,6 @@ you can give it a try. See `Emnapi documentation`_ for more details.
810807

811808
.. _library.js: https://github.com/emscripten-core/emscripten/blob/main/src/library.js
812809
.. _test_js_libraries: https://github.com/emscripten-core/emscripten/blob/1.29.12/tests/test_core.py#L5043
813-
.. _src/deps_info.json: https://github.com/emscripten-core/emscripten/blob/main/src/deps_info.json
814810
.. _tools/system_libs.py: https://github.com/emscripten-core/emscripten/blob/main/tools/system_libs.py
815811
.. _library_\*.js: https://github.com/emscripten-core/emscripten/tree/main/src
816812
.. _test_add_function in test/test_core.py: https://github.com/emscripten-core/emscripten/blob/1.29.12/tests/test_core.py#L6237

src/jsifier.js

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,25 @@ function isDefined(symName) {
6666
return false;
6767
}
6868

69+
function getTransitiveDeps(symbol) {
70+
const transitiveDeps = new Set();
71+
const seen = new Set();
72+
const toVisit = [symbol];
73+
while (toVisit.length) {
74+
const sym = toVisit.pop();
75+
if (!seen.has(sym)) {
76+
let directDeps = LibraryManager.library[sym + '__deps'] || [];
77+
directDeps = directDeps.filter((d) => typeof d === 'string');
78+
if (directDeps.length) {
79+
directDeps.forEach(transitiveDeps.add, transitiveDeps);
80+
toVisit.push(...directDeps);
81+
}
82+
seen.add(sym);
83+
}
84+
}
85+
return Array.from(transitiveDeps);
86+
}
87+
6988
function runJSify() {
7089
const libraryItems = [];
7190
const symbolDeps = {};
@@ -260,8 +279,14 @@ function ${name}(${args}) {
260279

261280
if (symbolsOnly) {
262281
if (!isJsOnlySymbol(symbol) && LibraryManager.library.hasOwnProperty(symbol)) {
263-
externalDeps = deps.filter((d) => !isJsOnlySymbol(d) && !(d in LibraryManager.library) && typeof d === 'string');
264-
symbolDeps[symbol] = externalDeps;
282+
var value = LibraryManager.library[symbol];
283+
var resolvedSymbol = symbol;
284+
// Resolve aliases before looking up deps
285+
if (typeof value == 'string' && value[0] != '=' && LibraryManager.library.hasOwnProperty(value)) {
286+
resolvedSymbol = value;
287+
}
288+
var transtiveDeps = getTransitiveDeps(resolvedSymbol);
289+
symbolDeps[symbol] = transtiveDeps.filter((d) => !isJsOnlySymbol(d) && !(d in LibraryManager.library));
265290
}
266291
return;
267292
}

src/library.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ mergeInto(LibraryManager.library, {
569569

570570
// TODO: Initialize these to defaults on startup from system settings.
571571
// Note: glibc has one fewer underscore for all of these. Also used in other related functions (timegm)
572-
_tzset_js__deps: ['$stringToNewUTF8'],
572+
_tzset_js__deps: ['$stringToNewUTF8', 'malloc'],
573573
_tzset_js__internal: true,
574574
_tzset_js: function(timezone, daylight, tzname) {
575575
// TODO: Use (malleable) environment variables instead of system settings.
@@ -1212,6 +1212,7 @@ mergeInto(LibraryManager.library, {
12121212
// ==========================================================================
12131213

12141214
#if SUPPORT_LONGJMP == 'emscripten'
1215+
_emscripten_throw_longjmp__deps: ['setThrew'],
12151216
_emscripten_throw_longjmp: function() {
12161217
#if EXCEPTION_STACK_TRACES
12171218
throw new EmscriptenSjLj;
@@ -1721,7 +1722,7 @@ mergeInto(LibraryManager.library, {
17211722
return { family: family, addr: addr, port: port };
17221723
},
17231724
$writeSockaddr__docs: '/** @param {number=} addrlen */',
1724-
$writeSockaddr__deps: ['$Sockets', '$inetPton4', '$inetPton6', '$zeroMemory'],
1725+
$writeSockaddr__deps: ['$Sockets', '$inetPton4', '$inetPton6', '$zeroMemory', 'htons'],
17251726
$writeSockaddr: function (sa, family, addr, port, addrlen) {
17261727
switch (family) {
17271728
case {{{ cDefs.AF_INET }}}:
@@ -1858,7 +1859,7 @@ mergeInto(LibraryManager.library, {
18581859
return 0;
18591860
},
18601861

1861-
getaddrinfo__deps: ['$Sockets', '$DNS', '$inetPton4', '$inetNtop4', '$inetPton6', '$inetNtop6', '$writeSockaddr'],
1862+
getaddrinfo__deps: ['$Sockets', '$DNS', '$inetPton4', '$inetNtop4', '$inetPton6', '$inetNtop6', '$writeSockaddr', 'malloc', 'htonl'],
18621863
getaddrinfo__proxy: 'sync',
18631864
getaddrinfo: function(node, service, hint, out) {
18641865
// Note getaddrinfo currently only returns a single addrinfo with ai_next defaulting to NULL. When NULL
@@ -2623,7 +2624,7 @@ mergeInto(LibraryManager.library, {
26232624
// using builtin_malloc to avoid LSan reporting these as leaks.
26242625
emscripten_get_compiler_setting__noleakcheck: true,
26252626
#if RETAIN_COMPILER_SETTINGS
2626-
emscripten_get_compiler_setting__deps: ['$stringToNewUTF8'],
2627+
emscripten_get_compiler_setting__deps: ['$stringToNewUTF8', 'malloc'],
26272628
#endif
26282629
emscripten_get_compiler_setting: function(name) {
26292630
#if RETAIN_COMPILER_SETTINGS
@@ -2805,7 +2806,7 @@ mergeInto(LibraryManager.library, {
28052806

28062807
// Look up the function name from our stack frame cache with our PC representation.
28072808
#if USE_OFFSET_CONVERTER
2808-
emscripten_pc_get_function__deps: ['$UNWIND_CACHE', 'free', '$stringToNewUTF8'],
2809+
emscripten_pc_get_function__deps: ['$UNWIND_CACHE', '$stringToNewUTF8', 'malloc', 'free'],
28092810
// Don't treat allocation of _emscripten_pc_get_function.ret as a leak
28102811
emscripten_pc_get_function__noleakcheck: true,
28112812
#endif

src/library_async.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ mergeInto(LibraryManager.library, {
489489
});
490490
},
491491

492-
emscripten_wget_data__deps: ['$asyncLoad', 'malloc'],
492+
emscripten_wget_data__deps: ['$asyncLoad', 'malloc', 'free'],
493493
emscripten_wget_data__async: true,
494494
emscripten_wget_data: function(url, pbuffer, pnum, perror) {
495495
return Asyncify.handleSleep((wakeUp) => {

src/library_browser.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,6 +1212,7 @@ var LibraryBrowser = {
12121212

12131213
// To avoid creating worker parent->child chains, always proxies to execute on the main thread.
12141214
emscripten_create_worker__proxy: 'sync',
1215+
emscripten_create_worker__deps: ['$UTF8ToString', 'malloc', 'free'],
12151216
emscripten_create_worker: function(url) {
12161217
url = UTF8ToString(url);
12171218
var id = Browser.workers.length;
@@ -1253,6 +1254,7 @@ var LibraryBrowser = {
12531254
return id;
12541255
},
12551256

1257+
emscripten_destroy_worker__deps: ['free'],
12561258
emscripten_destroy_worker__proxy: 'sync',
12571259
emscripten_destroy_worker: function(id) {
12581260
var info = Browser.workers[id];

src/library_exceptions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ var LibraryExceptions = {
224224
return type;
225225
},
226226

227-
__cxa_begin_catch__deps: ['$exceptionCaught', '$exception_addRef', '$uncaughtExceptionCount'],
227+
__cxa_begin_catch__deps: ['$exceptionCaught', '$exception_addRef', '$uncaughtExceptionCount', '__cxa_can_catch', 'setTempRet0'],
228228
__cxa_begin_catch__sig: 'pp',
229229
__cxa_begin_catch: function(ptr) {
230230
var info = new ExceptionInfo(ptr);

src/library_glew.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ var LibraryGLEW = {
112112
},
113113
},
114114

115+
glewInit__deps: ['malloc'],
115116
glewInit: function() { return 0; },
116117

117118
glewIsSupported: function(name) {

src/library_glfw.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1121,7 +1121,7 @@ var LibraryGLFW = {
11211121
/*******************************************************************************
11221122
* GLFW FUNCTIONS
11231123
******************************************************************************/
1124-
glfwInit__deps: ['emscripten_get_device_pixel_ratio'],
1124+
glfwInit__deps: ['emscripten_get_device_pixel_ratio', 'malloc', 'free'],
11251125
glfwInit__sig: 'i',
11261126
glfwInit: function() {
11271127
if (GLFW.windows) return 1; // GL_TRUE
@@ -1269,6 +1269,7 @@ var LibraryGLFW = {
12691269
glfwPostEmptyEvent__sig: 'v',
12701270
glfwPostEmptyEvent: function() {},
12711271

1272+
glfwGetMonitors__deps: ['malloc'],
12721273
glfwGetMonitors__sig: 'ii',
12731274
glfwGetMonitors: function(count) {
12741275
{{{ makeSetValue('count', '0', '1', 'i32') }}};

src/library_html5.js

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ var LibraryHTML5 = {
235235
},
236236
},
237237

238-
$registerKeyEventCallback__deps: ['$JSEvents', '$findEventTarget', '$stringToUTF8'],
238+
$registerKeyEventCallback__deps: ['$JSEvents', '$findEventTarget', 'malloc', '$stringToUTF8'],
239239
$registerKeyEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
240240
#if PTHREADS
241241
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -503,7 +503,7 @@ var LibraryHTML5 = {
503503
#endif
504504
},
505505

506-
$registerMouseEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget'],
506+
$registerMouseEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget', 'malloc'],
507507
$registerMouseEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
508508
#if PTHREADS
509509
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -616,7 +616,7 @@ var LibraryHTML5 = {
616616
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
617617
},
618618

619-
$registerWheelEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget'],
619+
$registerWheelEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget', 'malloc'],
620620
$registerWheelEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
621621
#if PTHREADS
622622
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -692,7 +692,7 @@ var LibraryHTML5 = {
692692
}
693693
},
694694

695-
$registerUiEventCallback__deps: ['$JSEvents', '$findEventTarget'],
695+
$registerUiEventCallback__deps: ['$JSEvents', '$findEventTarget', 'malloc'],
696696
$registerUiEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
697697
#if PTHREADS
698698
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -768,7 +768,7 @@ var LibraryHTML5 = {
768768
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
769769
},
770770

771-
$registerFocusEventCallback__deps: ['$JSEvents', '$findEventTarget', '$stringToUTF8'],
771+
$registerFocusEventCallback__deps: ['$JSEvents', '$findEventTarget', 'malloc', '$stringToUTF8'],
772772
$registerFocusEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
773773
#if PTHREADS
774774
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -911,7 +911,7 @@ var LibraryHTML5 = {
911911
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceMotionEvent.rotationRateGamma, 'rr["gamma"]', 'double') }}};
912912
},
913913

914-
$registerDeviceMotionEventCallback__deps: ['$JSEvents', '$fillDeviceMotionEventData', '$findEventTarget'],
914+
$registerDeviceMotionEventCallback__deps: ['$JSEvents', '$fillDeviceMotionEventData', '$findEventTarget', 'malloc'],
915915
$registerDeviceMotionEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
916916
#if PTHREADS
917917
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -979,7 +979,7 @@ var LibraryHTML5 = {
979979
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenOrientationChangeEvent.orientationAngle, 'orientation', 'i32') }}};
980980
},
981981

982-
$registerOrientationChangeEventCallback__deps: ['$JSEvents', '$fillOrientationChangeEventData', '$findEventTarget'],
982+
$registerOrientationChangeEventCallback__deps: ['$JSEvents', '$fillOrientationChangeEventData', '$findEventTarget', 'malloc'],
983983
$registerOrientationChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
984984
#if PTHREADS
985985
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -1099,7 +1099,7 @@ var LibraryHTML5 = {
10991099
}
11001100
},
11011101

1102-
$registerFullscreenChangeEventCallback__deps: ['$JSEvents', '$fillFullscreenChangeEventData', '$findEventTarget'],
1102+
$registerFullscreenChangeEventCallback__deps: ['$JSEvents', '$fillFullscreenChangeEventData', '$findEventTarget', 'malloc'],
11031103
$registerFullscreenChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
11041104
#if PTHREADS
11051105
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -1677,7 +1677,7 @@ var LibraryHTML5 = {
16771677
stringToUTF8(id, eventStruct + {{{ C_STRUCTS.EmscriptenPointerlockChangeEvent.id }}}, {{{ cDefs.EM_HTML5_LONG_STRING_LEN_BYTES }}});
16781678
},
16791679

1680-
$registerPointerlockChangeEventCallback__deps: ['$JSEvents', '$fillPointerlockChangeEventData', '$findEventTarget'],
1680+
$registerPointerlockChangeEventCallback__deps: ['$JSEvents', '$fillPointerlockChangeEventData', '$findEventTarget', 'malloc'],
16811681
$registerPointerlockChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
16821682
#if PTHREADS
16831683
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -1923,7 +1923,7 @@ var LibraryHTML5 = {
19231923
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenVisibilityChangeEvent.visibilityState, 'visibilityState', 'i32') }}};
19241924
},
19251925

1926-
$registerVisibilityChangeEventCallback__deps: ['$JSEvents', '$fillVisibilityChangeEventData', '$findEventTarget'],
1926+
$registerVisibilityChangeEventCallback__deps: ['$JSEvents', '$fillVisibilityChangeEventData', '$findEventTarget', 'malloc'],
19271927
$registerVisibilityChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
19281928
#if PTHREADS
19291929
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -1978,7 +1978,7 @@ var LibraryHTML5 = {
19781978
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
19791979
},
19801980

1981-
$registerTouchEventCallback__deps: ['$JSEvents', '$findEventTarget', '$getBoundingClientRect'],
1981+
$registerTouchEventCallback__deps: ['$JSEvents', '$findEventTarget', '$getBoundingClientRect', 'malloc'],
19821982
$registerTouchEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
19831983
#if PTHREADS
19841984
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -2137,7 +2137,7 @@ var LibraryHTML5 = {
21372137
stringToUTF8(e.mapping, eventStruct + {{{ C_STRUCTS.EmscriptenGamepadEvent.mapping }}}, {{{ cDefs.EM_HTML5_MEDIUM_STRING_LEN_BYTES }}});
21382138
},
21392139

2140-
$registerGamepadEventCallback__deps: ['$JSEvents', '$fillGamepadEventData', '$findEventTarget'],
2140+
$registerGamepadEventCallback__deps: ['$JSEvents', '$fillGamepadEventData', '$findEventTarget', 'malloc'],
21412141
$registerGamepadEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
21422142
#if PTHREADS
21432143
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -2305,15 +2305,15 @@ var LibraryHTML5 = {
23052305
},
23062306

23072307
emscripten_set_batterychargingchange_callback_on_thread__proxy: 'sync',
2308-
emscripten_set_batterychargingchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery', 'malloc'],
2308+
emscripten_set_batterychargingchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery'],
23092309
emscripten_set_batterychargingchange_callback_on_thread: function(userData, callbackfunc, targetThread) {
23102310
if (!battery()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
23112311
registerBatteryEventCallback(battery(), userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BATTERYCHARGINGCHANGE }}}, "chargingchange", targetThread);
23122312
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
23132313
},
23142314

23152315
emscripten_set_batterylevelchange_callback_on_thread__proxy: 'sync',
2316-
emscripten_set_batterylevelchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery', 'malloc'],
2316+
emscripten_set_batterylevelchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery'],
23172317
emscripten_set_batterylevelchange_callback_on_thread: function(userData, callbackfunc, targetThread) {
23182318
if (!battery()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
23192319
registerBatteryEventCallback(battery(), userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BATTERYLEVELCHANGE }}}, "levelchange", targetThread);

0 commit comments

Comments
 (0)