addToLibrary({
$stackSave__deps: ['emscripten_stack_get_current'],
$stackSave: () => _emscripten_stack_get_current(),
$stackRestore__deps: ['_emscripten_stack_restore'],
$stackRestore: (val) => __emscripten_stack_restore(val),
$stackAlloc__deps: ['_emscripten_stack_alloc'],
$stackAlloc: (sz) => __emscripten_stack_alloc(sz),
$getTempRet0__deps: ['_emscripten_tempret_get'],
$getTempRet0: (val) => __emscripten_tempret_get(),
$setTempRet0__deps: ['_emscripten_tempret_set'],
$setTempRet0: (val) => __emscripten_tempret_set(val),
stackAlloc: '$stackAlloc',
stackSave: '$stackSave',
stackRestore: '$stackSave',
setTempRet0: '$setTempRet0',
getTempRet0: '$getTempRet0',
$ptrToString: (ptr) => {
#if ASSERTIONS
assert(typeof ptr === 'number');
#endif
#if MEMORY64
if (ptr < 0) ptr = 2n**64n + BigInt(ptr);
#else
ptr >>>= 0;
#endif
return '0x' + ptr.toString(16).padStart({{{ POINTER_SIZE * 2 }}}, '0');
},
$zeroMemory: (ptr, size) => HEAPU8.fill(0, ptr, ptr + size),
#if SAFE_HEAP
segfault: '=segfault',
alignfault: '=alignfault',
#endif
#if !MINIMAL_RUNTIME
$exitJS__docs: '/** @param {boolean|number=} implicit */',
$exitJS__deps: [
'proc_exit',
#if ASSERTIONS || EXIT_RUNTIME
'$keepRuntimeAlive',
#endif
#if PTHREADS
'$exitOnMainThread',
#endif
#if PTHREADS_DEBUG || ASSERTIONS
'$runtimeKeepaliveCounter',
#endif
],
$exitJS: (status, implicit) => {
EXITSTATUS = status;
#if ASSERTIONS && !EXIT_RUNTIME
checkUnflushedContent();
#endif
#if PTHREADS
if (ENVIRONMENT_IS_PTHREAD) {
#if ASSERTIONS
assert(!implicit);
#endif
#if PTHREADS_DEBUG
dbg(`Pthread ${ptrToString(_pthread_self())} called exit(${status}), posting exitOnMainThread.`);
#endif
exitOnMainThread(status);
throw 'unwind';
}
#if PTHREADS_DEBUG
err(`main thread called exit(${status}): keepRuntimeAlive=${keepRuntimeAlive()} (counter=${runtimeKeepaliveCounter})`);
#endif
#endif
#if EXIT_RUNTIME
if (!keepRuntimeAlive()) {
exitRuntime();
}
#endif
#if ASSERTIONS
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)`;
#if MODULARIZE
readyPromiseReject?.(msg);
#endif
err(msg);
}
#endif
_proc_exit(status);
},
#endif
#if MINIMAL_RUNTIME
exit: 'proc_exit',
#else
exit: '$exitJS',
#endif
emscripten_get_heap_max__deps: ['$getHeapMax'],
emscripten_get_heap_max: () => getHeapMax(),
$getHeapMax: () =>
#if ALLOW_MEMORY_GROWTH
#if MEMORY64 == 1
{{{ MAXIMUM_MEMORY }}},
#else
{{{ Math.min(MAXIMUM_MEMORY, FOUR_GB - WASM_PAGE_SIZE) }}},
#endif
#else
HEAPU8.length,
#endif
#if ABORTING_MALLOC
$abortOnCannotGrowMemory: (requestedSize) => {
#if ASSERTIONS
#if ALLOW_MEMORY_GROWTH
abort(`Cannot enlarge memory arrays to size ${requestedSize} bytes (OOM). If you want malloc to return NULL (0) instead of this abort, do not link with -sABORTING_MALLOC (that is, the default when growth is enabled is to not abort, but you have overridden that)`);
#else
abort(`Cannot enlarge memory arrays to size ${requestedSize} bytes (OOM). Either (1) compile with -sINITIAL_MEMORY=X with X higher than the current value ${HEAP8.length}, (2) compile with -sALLOW_MEMORY_GROWTH which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -sABORTING_MALLOC=0`);
#endif
#else
abort('OOM');
#endif
},
#endif
$growMemory: (size) => {
var oldHeapSize = wasmMemory.buffer.byteLength;
var pages = ((size - oldHeapSize + {{{ WASM_PAGE_SIZE - 1 }}}) / {{{ WASM_PAGE_SIZE }}}) | 0;
#if RUNTIME_DEBUG
dbg(`growMemory: ${size} (+${size - oldHeapSize} bytes / ${pages} pages)`);
#endif
try {
wasmMemory.grow({{{ toIndexType('pages') }}});
#if !GROWABLE_ARRAYBUFFERS
updateMemoryViews();
#endif
#if MEMORYPROFILER
if (typeof emscriptenMemoryProfiler != 'undefined') {
emscriptenMemoryProfiler.onMemoryResize(oldHeapSize, wasmMemory.buffer.byteLength);
}
#endif
return 1 ;
} catch(e) {
#if ASSERTIONS
err(`growMemory: Attempted to grow heap from ${oldHeapSize} bytes to ${size} bytes, but got error: ${e}`);
#endif
}
},
emscripten_resize_heap__deps: [
#if ABORTING_MALLOC
'$abortOnCannotGrowMemory',
#endif
#if ALLOW_MEMORY_GROWTH
#if ASSERTIONS == 2
'emscripten_get_now',
#endif
'$getHeapMax',
'$alignMemory',
'$growMemory',
#endif
],
emscripten_resize_heap: 'ip',
emscripten_resize_heap: (requestedSize) => {
var oldSize = HEAPU8.length;
#if !MEMORY64 && !CAN_ADDRESS_2GB
requestedSize >>>= 0;
#endif
#if ALLOW_MEMORY_GROWTH == 0
#if ABORTING_MALLOC
abortOnCannotGrowMemory(requestedSize);
#else
return false;
#endif
#else
#if SHARED_MEMORY
if (requestedSize <= oldSize) {
return false;
}
#elif ASSERTIONS
assert(requestedSize > oldSize);
#endif
#if EMSCRIPTEN_TRACING
_emscripten_trace_report_memory_layout();
#endif
var maxHeapSize = getHeapMax();
if (requestedSize > maxHeapSize) {
#if ASSERTIONS
err(`Cannot enlarge memory, requested ${requestedSize} bytes, but the limit is ${maxHeapSize} bytes!`);
#endif
#if ABORTING_MALLOC
abortOnCannotGrowMemory(requestedSize);
#else
return false;
#endif
}
for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
#if MEMORY_GROWTH_LINEAR_STEP == -1
var overGrownHeapSize = oldSize * (1 + {{{ MEMORY_GROWTH_GEOMETRIC_STEP }}} / cutDown); // ensure geometric growth
#if MEMORY_GROWTH_GEOMETRIC_CAP
overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + {{{ MEMORY_GROWTH_GEOMETRIC_CAP }}} );
#endif
#else
var overGrownHeapSize = oldSize + {{{ MEMORY_GROWTH_LINEAR_STEP }}} / cutDown; // ensure linear growth
#endif
var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), {{{ WASM_PAGE_SIZE }}}));
#if ASSERTIONS == 2
var t0 = _emscripten_get_now();
#endif
var replacement = growMemory(newSize);
#if ASSERTIONS == 2
var t1 = _emscripten_get_now();
dbg(`Heap resize call from ${oldSize} to ${newSize} took ${(t1 - t0)} msecs. Success: ${!!replacement}`);
#endif
if (replacement) {
#if ASSERTIONS && WASM2JS
err('Warning: Enlarging memory arrays, this is not fast! ' + [oldSize, newSize]);
#endif
#if EMSCRIPTEN_TRACING
traceLogMessage("Emscripten", `Enlarging memory arrays from ${oldSize} to ${newSize}`);
_emscripten_trace_report_memory_layout();
#endif
return true;
}
}
#if ASSERTIONS
err(`Failed to grow the heap from ${oldSize} bytes to ${newSize} bytes, not enough memory!`);
#endif
#if ABORTING_MALLOC
abortOnCannotGrowMemory(requestedSize);
#else
return false;
#endif
#endif
},
#if !GROWABLE_ARRAYBUFFERS
emscripten_notify_memory_growth: (memoryIndex) => {
#if ASSERTIONS
assert(memoryIndex == 0);
#endif
updateMemoryViews();
},
#endif
_emscripten_system: (command) => {
#if ENVIRONMENT_MAY_BE_NODE
if (ENVIRONMENT_IS_NODE) {
if (!command) return 1;
var cmdstr = UTF8ToString(command);
if (!cmdstr.length) return 0;
var cp = require('child_process');
var ret = cp.spawnSync(cmdstr, [], {shell:true, stdio:'inherit'});
var _W_EXITCODE = (ret, sig) => ((ret) << 8 | (sig));
if (ret.status === null) {
var signalToNumber = (sig) => {
switch (sig) {
case 'SIGHUP': return {{{ cDefs.SIGHUP }}};
case 'SIGQUIT': return {{{ cDefs.SIGQUIT }}};
case 'SIGFPE': return {{{ cDefs.SIGFPE }}};
case 'SIGKILL': return {{{ cDefs.SIGKILL }}};
case 'SIGALRM': return {{{ cDefs.SIGALRM }}};
case 'SIGTERM': return {{{ cDefs.SIGTERM }}};
default: return {{{ cDefs.SIGINT }}};
}
}
return _W_EXITCODE(0, signalToNumber(ret.signal));
}
return _W_EXITCODE(ret.status, 0);
}
#endif
if (!command) return 0;
return -{{{ cDefs.ENOSYS }}};
},
#if !STANDALONE_WASM
_abort_js: () =>
#if ASSERTIONS
abort('native code called abort()'),
#else
abort(''),
#endif
#endif
$ENV: {},
#if !STANDALONE_WASM
__assert_fail: (condition, filename, line, func) =>
abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [filename ? UTF8ToString(filename) : 'unknown filename', line, func ? UTF8ToString(func) : 'unknown function']),
#endif
#if STACK_OVERFLOW_CHECK >= 2
#if MAIN_MODULE
$setStackLimits__deps: ['$setDylinkStackLimits'],
#endif
$setStackLimits: () => {
var stackLow = _emscripten_stack_get_base();
var stackHigh = _emscripten_stack_get_end();
#if RUNTIME_DEBUG
dbg(`setStackLimits: ${ptrToString(stackLow)}, ${ptrToString(stackHigh)}`);
#endif
#if MAIN_MODULE
setDylinkStackLimits(stackLow, stackHigh);
#else
___set_stack_limits(stackLow, stackHigh);
#endif
},
#endif
$withStackSave__deps: ['$stackSave', '$stackRestore'],
$withStackSave: (f) => {
var stack = stackSave();
var ret = f();
stackRestore(stack);
return ret;
},
#if SUPPORT_LONGJMP == 'emscripten'
_emscripten_throw_longjmp__deps: ['setThrew'],
_emscripten_throw_longjmp: () => {
#if EXCEPTION_STACK_TRACES
throw new EmscriptenSjLj;
#else
throw Infinity;
#endif
},
#elif !SUPPORT_LONGJMP
#if !INCLUDE_FULL_LIBRARY
longjmp__deps: [() => {
error('longjmp support was disabled (SUPPORT_LONGJMP=0), but it is required by the code (either set SUPPORT_LONGJMP=1, or remove uses of it in the project)');
}],
get setjmp__deps() {
return this.longjmp__deps;
},
get _emscripten_throw_longjmp__deps() {
return this.longjmp__deps;
},
#endif
_emscripten_throw_longjmp: () => {
error('longjmp support was disabled (SUPPORT_LONGJMP=0), but it is required by the code (either set SUPPORT_LONGJMP=1, or remove uses of it in the project)');
},
longjmp: (env, value) => {
abort('longjmp not supported (build with -s SUPPORT_LONGJMP)');
},
setjmp: (env) => {
abort('setjmp not supported (build with -s SUPPORT_LONGJMP)');
},
#endif
$ERRNO_CODES: `{
'EPERM': {{{ cDefs.EPERM }}},
'ENOENT': {{{ cDefs.ENOENT }}},
'ESRCH': {{{ cDefs.ESRCH }}},
'EINTR': {{{ cDefs.EINTR }}},
'EIO': {{{ cDefs.EIO }}},
'ENXIO': {{{ cDefs.ENXIO }}},
'E2BIG': {{{ cDefs.E2BIG }}},
'ENOEXEC': {{{ cDefs.ENOEXEC }}},
'EBADF': {{{ cDefs.EBADF }}},
'ECHILD': {{{ cDefs.ECHILD }}},
'EAGAIN': {{{ cDefs.EAGAIN }}},
'EWOULDBLOCK': {{{ cDefs.EWOULDBLOCK }}},
'ENOMEM': {{{ cDefs.ENOMEM }}},
'EACCES': {{{ cDefs.EACCES }}},
'EFAULT': {{{ cDefs.EFAULT }}},
'ENOTBLK': {{{ cDefs.ENOTBLK }}},
'EBUSY': {{{ cDefs.EBUSY }}},
'EEXIST': {{{ cDefs.EEXIST }}},
'EXDEV': {{{ cDefs.EXDEV }}},
'ENODEV': {{{ cDefs.ENODEV }}},
'ENOTDIR': {{{ cDefs.ENOTDIR }}},
'EISDIR': {{{ cDefs.EISDIR }}},
'EINVAL': {{{ cDefs.EINVAL }}},
'ENFILE': {{{ cDefs.ENFILE }}},
'EMFILE': {{{ cDefs.EMFILE }}},
'ENOTTY': {{{ cDefs.ENOTTY }}},
'ETXTBSY': {{{ cDefs.ETXTBSY }}},
'EFBIG': {{{ cDefs.EFBIG }}},
'ENOSPC': {{{ cDefs.ENOSPC }}},
'ESPIPE': {{{ cDefs.ESPIPE }}},
'EROFS': {{{ cDefs.EROFS }}},
'EMLINK': {{{ cDefs.EMLINK }}},
'EPIPE': {{{ cDefs.EPIPE }}},
'EDOM': {{{ cDefs.EDOM }}},
'ERANGE': {{{ cDefs.ERANGE }}},
'ENOMSG': {{{ cDefs.ENOMSG }}},
'EIDRM': {{{ cDefs.EIDRM }}},
'ECHRNG': {{{ cDefs.ECHRNG }}},
'EL2NSYNC': {{{ cDefs.EL2NSYNC }}},
'EL3HLT': {{{ cDefs.EL3HLT }}},
'EL3RST': {{{ cDefs.EL3RST }}},
'ELNRNG': {{{ cDefs.ELNRNG }}},
'EUNATCH': {{{ cDefs.EUNATCH }}},
'ENOCSI': {{{ cDefs.ENOCSI }}},
'EL2HLT': {{{ cDefs.EL2HLT }}},
'EDEADLK': {{{ cDefs.EDEADLK }}},
'ENOLCK': {{{ cDefs.ENOLCK }}},
'EBADE': {{{ cDefs.EBADE }}},
'EBADR': {{{ cDefs.EBADR }}},
'EXFULL': {{{ cDefs.EXFULL }}},
'ENOANO': {{{ cDefs.ENOANO }}},
'EBADRQC': {{{ cDefs.EBADRQC }}},
'EBADSLT': {{{ cDefs.EBADSLT }}},
'EDEADLOCK': {{{ cDefs.EDEADLOCK }}},
'EBFONT': {{{ cDefs.EBFONT }}},
'ENOSTR': {{{ cDefs.ENOSTR }}},
'ENODATA': {{{ cDefs.ENODATA }}},
'ETIME': {{{ cDefs.ETIME }}},
'ENOSR': {{{ cDefs.ENOSR }}},
'ENONET': {{{ cDefs.ENONET }}},
'ENOPKG': {{{ cDefs.ENOPKG }}},
'EREMOTE': {{{ cDefs.EREMOTE }}},
'ENOLINK': {{{ cDefs.ENOLINK }}},
'EADV': {{{ cDefs.EADV }}},
'ESRMNT': {{{ cDefs.ESRMNT }}},
'ECOMM': {{{ cDefs.ECOMM }}},
'EPROTO': {{{ cDefs.EPROTO }}},
'EMULTIHOP': {{{ cDefs.EMULTIHOP }}},
'EDOTDOT': {{{ cDefs.EDOTDOT }}},
'EBADMSG': {{{ cDefs.EBADMSG }}},
'ENOTUNIQ': {{{ cDefs.ENOTUNIQ }}},
'EBADFD': {{{ cDefs.EBADFD }}},
'EREMCHG': {{{ cDefs.EREMCHG }}},
'ELIBACC': {{{ cDefs.ELIBACC }}},
'ELIBBAD': {{{ cDefs.ELIBBAD }}},
'ELIBSCN': {{{ cDefs.ELIBSCN }}},
'ELIBMAX': {{{ cDefs.ELIBMAX }}},
'ELIBEXEC': {{{ cDefs.ELIBEXEC }}},
'ENOSYS': {{{ cDefs.ENOSYS }}},
'ENOTEMPTY': {{{ cDefs.ENOTEMPTY }}},
'ENAMETOOLONG': {{{ cDefs.ENAMETOOLONG }}},
'ELOOP': {{{ cDefs.ELOOP }}},
'EOPNOTSUPP': {{{ cDefs.EOPNOTSUPP }}},
'EPFNOSUPPORT': {{{ cDefs.EPFNOSUPPORT }}},
'ECONNRESET': {{{ cDefs.ECONNRESET }}},
'ENOBUFS': {{{ cDefs.ENOBUFS }}},
'EAFNOSUPPORT': {{{ cDefs.EAFNOSUPPORT }}},
'EPROTOTYPE': {{{ cDefs.EPROTOTYPE }}},
'ENOTSOCK': {{{ cDefs.ENOTSOCK }}},
'ENOPROTOOPT': {{{ cDefs.ENOPROTOOPT }}},
'ESHUTDOWN': {{{ cDefs.ESHUTDOWN }}},
'ECONNREFUSED': {{{ cDefs.ECONNREFUSED }}},
'EADDRINUSE': {{{ cDefs.EADDRINUSE }}},
'ECONNABORTED': {{{ cDefs.ECONNABORTED }}},
'ENETUNREACH': {{{ cDefs.ENETUNREACH }}},
'ENETDOWN': {{{ cDefs.ENETDOWN }}},
'ETIMEDOUT': {{{ cDefs.ETIMEDOUT }}},
'EHOSTDOWN': {{{ cDefs.EHOSTDOWN }}},
'EHOSTUNREACH': {{{ cDefs.EHOSTUNREACH }}},
'EINPROGRESS': {{{ cDefs.EINPROGRESS }}},
'EALREADY': {{{ cDefs.EALREADY }}},
'EDESTADDRREQ': {{{ cDefs.EDESTADDRREQ }}},
'EMSGSIZE': {{{ cDefs.EMSGSIZE }}},
'EPROTONOSUPPORT': {{{ cDefs.EPROTONOSUPPORT }}},
'ESOCKTNOSUPPORT': {{{ cDefs.ESOCKTNOSUPPORT }}},
'EADDRNOTAVAIL': {{{ cDefs.EADDRNOTAVAIL }}},
'ENETRESET': {{{ cDefs.ENETRESET }}},
'EISCONN': {{{ cDefs.EISCONN }}},
'ENOTCONN': {{{ cDefs.ENOTCONN }}},
'ETOOMANYREFS': {{{ cDefs.ETOOMANYREFS }}},
'EUSERS': {{{ cDefs.EUSERS }}},
'EDQUOT': {{{ cDefs.EDQUOT }}},
'ESTALE': {{{ cDefs.ESTALE }}},
'ENOTSUP': {{{ cDefs.ENOTSUP }}},
'ENOMEDIUM': {{{ cDefs.ENOMEDIUM }}},
'EILSEQ': {{{ cDefs.EILSEQ }}},
'EOVERFLOW': {{{ cDefs.EOVERFLOW }}},
'ECANCELED': {{{ cDefs.ECANCELED }}},
'ENOTRECOVERABLE': {{{ cDefs.ENOTRECOVERABLE }}},
'EOWNERDEAD': {{{ cDefs.EOWNERDEAD }}},
'ESTRPIPE': {{{ cDefs.ESTRPIPE }}},
}`,
#if PURE_WASI
$strError: (errno) => errno + '',
#else
$strError__deps: ['strerror', '$UTF8ToString'],
$strError: (errno) => UTF8ToString(_strerror(errno)),
#endif
#if PROXY_POSIX_SOCKETS == 0
$inetPton4: (str) => {
var b = str.split('.');
for (var i = 0; i < 4; i++) {
var tmp = Number(b[i]);
if (isNaN(tmp)) return null;
b[i] = tmp;
}
return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0;
},
$inetNtop4: (addr) =>
(addr & 0xff) + '.' + ((addr >> 8) & 0xff) + '.' + ((addr >> 16) & 0xff) + '.' + ((addr >> 24) & 0xff),
$inetPton6__deps: ['htons'],
$inetPton6: (str) => {
var words;
var w, offset, z, i;
var valid6regx = /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i
var parts = [];
if (!valid6regx.test(str)) {
return null;
}
if (str === "::") {
return [0, 0, 0, 0, 0, 0, 0, 0];
}
if (str.startsWith("::")) {
str = str.replace("::", "Z:");
} else {
str = str.replace("::", ":Z:");
}
if (str.indexOf(".") > 0) {
str = str.replace(new RegExp('[.]', 'g'), ":");
words = str.split(":");
words[words.length-4] = Number(words[words.length-4]) + Number(words[words.length-3])*256;
words[words.length-3] = Number(words[words.length-2]) + Number(words[words.length-1])*256;
words = words.slice(0, words.length-2);
} else {
words = str.split(":");
}
offset = 0; z = 0;
for (w=0; w < words.length; w++) {
if (typeof words[w] == 'string') {
if (words[w] === 'Z') {
for (z = 0; z < (8 - words.length+1); z++) {
parts[w+z] = 0;
}
offset = z-1;
} else {
parts[w+offset] = _htons(parseInt(words[w],16));
}
} else {
parts[w+offset] = words[w];
}
}
return [
(parts[1] << 16) | parts[0],
(parts[3] << 16) | parts[2],
(parts[5] << 16) | parts[4],
(parts[7] << 16) | parts[6]
];
},
$inetNtop6__deps: ['$inetNtop4', 'ntohs'],
$inetNtop6: (ints) => {
var str = "";
var word = 0;
var longest = 0;
var lastzero = 0;
var zstart = 0;
var len = 0;
var i = 0;
var parts = [
ints[0] & 0xffff,
(ints[0] >> 16),
ints[1] & 0xffff,
(ints[1] >> 16),
ints[2] & 0xffff,
(ints[2] >> 16),
ints[3] & 0xffff,
(ints[3] >> 16)
];
var hasipv4 = true;
var v4part = "";
for (i = 0; i < 5; i++) {
if (parts[i] !== 0) { hasipv4 = false; break; }
}
if (hasipv4) {
v4part = inetNtop4(parts[6] | (parts[7] << 16));
if (parts[5] === -1) {
str = "::ffff:";
str += v4part;
return str;
}
if (parts[5] === 0) {
str = "::";
if (v4part === "0.0.0.0") v4part = "";
if (v4part === "0.0.0.1") v4part = "1";
str += v4part;
return str;
}
}
for (word = 0; word < 8; word++) {
if (parts[word] === 0) {
if (word - lastzero > 1) {
len = 0;
}
lastzero = word;
len++;
}
if (len > longest) {
longest = len;
zstart = word - longest + 1;
}
}
for (word = 0; word < 8; word++) {
if (longest > 1) {
if (parts[word] === 0 && word >= zstart && word < (zstart + longest) ) {
if (word === zstart) {
str += ":";
if (zstart === 0) str += ":";
}
continue;
}
}
str += Number(_ntohs(parts[word] & 0xffff)).toString(16);
str += word < 7 ? ":" : "";
}
return str;
},
$readSockaddr__deps: ['$inetNtop4', '$inetNtop6', 'ntohs'],
$readSockaddr: (sa, salen) => {
var family = {{{ makeGetValue('sa', C_STRUCTS.sockaddr_in.sin_family, 'i16') }}};
var port = _ntohs({{{ makeGetValue('sa', C_STRUCTS.sockaddr_in.sin_port, 'u16') }}});
var addr;
switch (family) {
case {{{ cDefs.AF_INET }}}:
if (salen !== {{{ C_STRUCTS.sockaddr_in.__size__ }}}) {
return { errno: {{{ cDefs.EINVAL }}} };
}
addr = {{{ makeGetValue('sa', C_STRUCTS.sockaddr_in.sin_addr.s_addr, 'i32') }}};
addr = inetNtop4(addr);
break;
case {{{ cDefs.AF_INET6 }}}:
if (salen !== {{{ C_STRUCTS.sockaddr_in6.__size__ }}}) {
return { errno: {{{ cDefs.EINVAL }}} };
}
addr = [
{{{ makeGetValue('sa', C_STRUCTS.sockaddr_in6.sin6_addr.__in6_union.__s6_addr+0, 'i32') }}},
{{{ makeGetValue('sa', C_STRUCTS.sockaddr_in6.sin6_addr.__in6_union.__s6_addr+4, 'i32') }}},
{{{ makeGetValue('sa', C_STRUCTS.sockaddr_in6.sin6_addr.__in6_union.__s6_addr+8, 'i32') }}},
{{{ makeGetValue('sa', C_STRUCTS.sockaddr_in6.sin6_addr.__in6_union.__s6_addr+12, 'i32') }}}
];
addr = inetNtop6(addr);
break;
default:
return { errno: {{{ cDefs.EAFNOSUPPORT }}} };
}
return { family: family, addr: addr, port: port };
},
$writeSockaddr__docs: '/** @param {number=} addrlen */',
$writeSockaddr__deps: ['$inetPton4', '$inetPton6', '$zeroMemory', 'htons'],
$writeSockaddr: (sa, family, addr, port, addrlen) => {
switch (family) {
case {{{ cDefs.AF_INET }}}:
addr = inetPton4(addr);
zeroMemory(sa, {{{ C_STRUCTS.sockaddr_in.__size__ }}});
if (addrlen) {
{{{ makeSetValue('addrlen', 0, C_STRUCTS.sockaddr_in.__size__, 'i32') }}};
}
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in.sin_family, 'family', 'i16') }}};
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in.sin_addr.s_addr, 'addr', 'i32') }}};
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in.sin_port, '_htons(port)', 'i16') }}};
break;
case {{{ cDefs.AF_INET6 }}}:
addr = inetPton6(addr);
zeroMemory(sa, {{{ C_STRUCTS.sockaddr_in6.__size__ }}});
if (addrlen) {
{{{ makeSetValue('addrlen', 0, C_STRUCTS.sockaddr_in6.__size__, 'i32') }}};
}
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_family, 'family', 'i32') }}};
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_addr.__in6_union.__s6_addr+0, 'addr[0]', 'i32') }}};
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_addr.__in6_union.__s6_addr+4, 'addr[1]', 'i32') }}};
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_addr.__in6_union.__s6_addr+8, 'addr[2]', 'i32') }}};
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_addr.__in6_union.__s6_addr+12, 'addr[3]', 'i32') }}};
{{{ makeSetValue('sa', C_STRUCTS.sockaddr_in6.sin6_port, '_htons(port)', 'i16') }}};
break;
default:
return {{{ cDefs.EAFNOSUPPORT }}};
}
return 0;
},
$DNS__deps: ['$inetPton4', '$inetPton6'],
$DNS: {
address_map: {
id: 1,
addrs: {},
names: {}
},
lookup_name(name) {
var res = inetPton4(name);
if (res !== null) {
return name;
}
res = inetPton6(name);
if (res !== null) {
return name;
}
var addr;
if (DNS.address_map.addrs[name]) {
addr = DNS.address_map.addrs[name];
} else {
var id = DNS.address_map.id++;
#if ASSERTIONS
assert(id < 65535, 'exceeded max address mappings of 65535');
#endif
addr = '172.29.' + (id & 0xff) + '.' + (id & 0xff00);
DNS.address_map.names[addr] = name;
DNS.address_map.addrs[name] = addr;
}
return addr;
},
lookup_addr(addr) {
if (DNS.address_map.names[addr]) {
return DNS.address_map.names[addr];
}
return null;
}
},
_emscripten_lookup_name__deps: ['$UTF8ToString', '$DNS', '$inetPton4'],
_emscripten_lookup_name: (name) => {
var nameString = UTF8ToString(name);
return inetPton4(DNS.lookup_name(nameString));
},
getaddrinfo__deps: ['$DNS', '$inetPton4', '$inetNtop4', '$inetPton6', '$inetNtop6', '$writeSockaddr', 'malloc', 'htonl'],
getaddrinfo__proxy: 'sync',
getaddrinfo: (node, service, hint, out) => {
var addrs = [];
var canon = null;
var addr = 0;
var port = 0;
var flags = 0;
var family = {{{ cDefs.AF_UNSPEC }}};
var type = 0;
var proto = 0;
var ai, last;
function allocaddrinfo(family, type, proto, canon, addr, port) {
var sa, salen, ai;
var errno;
salen = family === {{{ cDefs.AF_INET6 }}} ?
{{{ C_STRUCTS.sockaddr_in6.__size__ }}} :
{{{ C_STRUCTS.sockaddr_in.__size__ }}};
addr = family === {{{ cDefs.AF_INET6 }}} ?
inetNtop6(addr) :
inetNtop4(addr);
sa = _malloc(salen);
errno = writeSockaddr(sa, family, addr, port);
#if ASSERTIONS
assert(!errno);
#endif
ai = _malloc({{{ C_STRUCTS.addrinfo.__size__ }}});
{{{ makeSetValue('ai', C_STRUCTS.addrinfo.ai_family, 'family', 'i32') }}};
{{{ makeSetValue('ai', C_STRUCTS.addrinfo.ai_socktype, 'type', 'i32') }}};
{{{ makeSetValue('ai', C_STRUCTS.addrinfo.ai_protocol, 'proto', 'i32') }}};
{{{ makeSetValue('ai', C_STRUCTS.addrinfo.ai_canonname, 'canon', '*') }}};
{{{ makeSetValue('ai', C_STRUCTS.addrinfo.ai_addr, 'sa', '*') }}};
if (family === {{{ cDefs.AF_INET6 }}}) {
{{{ makeSetValue('ai', C_STRUCTS.addrinfo.ai_addrlen, C_STRUCTS.sockaddr_in6.__size__, 'i32') }}};
} else {
{{{ makeSetValue('ai', C_STRUCTS.addrinfo.ai_addrlen, C_STRUCTS.sockaddr_in.__size__, 'i32') }}};
}
{{{ makeSetValue('ai', C_STRUCTS.addrinfo.ai_next, '0', 'i32') }}};
return ai;
}
if (hint) {
flags = {{{ makeGetValue('hint', C_STRUCTS.addrinfo.ai_flags, 'i32') }}};
family = {{{ makeGetValue('hint', C_STRUCTS.addrinfo.ai_family, 'i32') }}};
type = {{{ makeGetValue('hint', C_STRUCTS.addrinfo.ai_socktype, 'i32') }}};
proto = {{{ makeGetValue('hint', C_STRUCTS.addrinfo.ai_protocol, 'i32') }}};
}
if (type && !proto) {
proto = type === {{{ cDefs.SOCK_DGRAM }}} ? {{{ cDefs.IPPROTO_UDP }}} : {{{ cDefs.IPPROTO_TCP }}};
}
if (!type && proto) {
type = proto === {{{ cDefs.IPPROTO_UDP }}} ? {{{ cDefs.SOCK_DGRAM }}} : {{{ cDefs.SOCK_STREAM }}};
}
if (proto === 0) {
proto = {{{ cDefs.IPPROTO_TCP }}};
}
if (type === 0) {
type = {{{ cDefs.SOCK_STREAM }}};
}
if (!node && !service) {
return {{{ cDefs.EAI_NONAME }}};
}
if (flags & ~({{{ cDefs.AI_PASSIVE }}}|{{{ cDefs.AI_CANONNAME }}}|{{{ cDefs.AI_NUMERICHOST }}}|
{{{ cDefs.AI_NUMERICSERV }}}|{{{ cDefs.AI_V4MAPPED }}}|{{{ cDefs.AI_ALL }}}|{{{ cDefs.AI_ADDRCONFIG }}})) {
return {{{ cDefs.EAI_BADFLAGS }}};
}
if (hint !== 0 && ({{{ makeGetValue('hint', C_STRUCTS.addrinfo.ai_flags, 'i32') }}} & {{{ cDefs.AI_CANONNAME }}}) && !node) {
return {{{ cDefs.EAI_BADFLAGS }}};
}
if (flags & {{{ cDefs.AI_ADDRCONFIG }}}) {
return {{{ cDefs.EAI_NONAME }}};
}
if (type !== 0 && type !== {{{ cDefs.SOCK_STREAM }}} && type !== {{{ cDefs.SOCK_DGRAM }}}) {
return {{{ cDefs.EAI_SOCKTYPE }}};
}
if (family !== {{{ cDefs.AF_UNSPEC }}} && family !== {{{ cDefs.AF_INET }}} && family !== {{{ cDefs.AF_INET6 }}}) {
return {{{ cDefs.EAI_FAMILY }}};
}
if (service) {
service = UTF8ToString(service);
port = parseInt(service, 10);
if (isNaN(port)) {
if (flags & {{{ cDefs.AI_NUMERICSERV }}}) {
return {{{ cDefs.EAI_NONAME }}};
}
return {{{ cDefs.EAI_SERVICE }}};
}
}
if (!node) {
if (family === {{{ cDefs.AF_UNSPEC }}}) {
family = {{{ cDefs.AF_INET }}};
}
if ((flags & {{{ cDefs.AI_PASSIVE }}}) === 0) {
if (family === {{{ cDefs.AF_INET }}}) {
addr = _htonl({{{ cDefs.INADDR_LOOPBACK }}});
} else {
addr = [0, 0, 0, _htonl(1)];
}
}
ai = allocaddrinfo(family, type, proto, null, addr, port);
{{{ makeSetValue('out', '0', 'ai', '*') }}};
return 0;
}
node = UTF8ToString(node);
addr = inetPton4(node);
if (addr !== null) {
if (family === {{{ cDefs.AF_UNSPEC }}} || family === {{{ cDefs.AF_INET }}}) {
family = {{{ cDefs.AF_INET }}};
}
else if (family === {{{ cDefs.AF_INET6 }}} && (flags & {{{ cDefs.AI_V4MAPPED }}})) {
addr = [0, 0, _htonl(0xffff), addr];
family = {{{ cDefs.AF_INET6 }}};
} else {
return {{{ cDefs.EAI_NONAME }}};
}
} else {
addr = inetPton6(node);
if (addr !== null) {
if (family === {{{ cDefs.AF_UNSPEC }}} || family === {{{ cDefs.AF_INET6 }}}) {
family = {{{ cDefs.AF_INET6 }}};
} else {
return {{{ cDefs.EAI_NONAME }}};
}
}
}
if (addr != null) {
ai = allocaddrinfo(family, type, proto, node, addr, port);
{{{ makeSetValue('out', '0', 'ai', '*') }}};
return 0;
}
if (flags & {{{ cDefs.AI_NUMERICHOST }}}) {
return {{{ cDefs.EAI_NONAME }}};
}
node = DNS.lookup_name(node);
addr = inetPton4(node);
if (family === {{{ cDefs.AF_UNSPEC }}}) {
family = {{{ cDefs.AF_INET }}};
} else if (family === {{{ cDefs.AF_INET6 }}}) {
addr = [0, 0, _htonl(0xffff), addr];
}
ai = allocaddrinfo(family, type, proto, null, addr, port);
{{{ makeSetValue('out', '0', 'ai', '*') }}};
return 0;
},
getnameinfo__deps: ['$DNS', '$readSockaddr', '$stringToUTF8'],
getnameinfo: (sa, salen, node, nodelen, serv, servlen, flags) => {
var info = readSockaddr(sa, salen);
if (info.errno) {
return {{{ cDefs.EAI_FAMILY }}};
}
var port = info.port;
var addr = info.addr;
var overflowed = false;
if (node && nodelen) {
var lookup;
if ((flags & {{{ cDefs.NI_NUMERICHOST }}}) || !(lookup = DNS.lookup_addr(addr))) {
if (flags & {{{ cDefs.NI_NAMEREQD }}}) {
return {{{ cDefs.EAI_NONAME }}};
}
} else {
addr = lookup;
}
var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen);
if (numBytesWrittenExclNull+1 >= nodelen) {
overflowed = true;
}
}
if (serv && servlen) {
port = '' + port;
var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen);
if (numBytesWrittenExclNull+1 >= servlen) {
overflowed = true;
}
}
if (overflowed) {
return {{{ cDefs.EAI_OVERFLOW }}};
}
return 0;
},
$Protocols: {
list: [],
map: {}
},
setprotoent__deps: ['$Protocols', '$stringToAscii', 'malloc'],
setprotoent: (stayopen) => {
function allocprotoent(name, proto, aliases) {
var nameBuf = _malloc(name.length + 1);
stringToAscii(name, nameBuf);
var j = 0;
var length = aliases.length;
var aliasListBuf = _malloc((length + 1) * 4);
for (var i = 0; i < length; i++, j += 4) {
var alias = aliases[i];
var aliasBuf = _malloc(alias.length + 1);
stringToAscii(alias, aliasBuf);
{{{ makeSetValue('aliasListBuf', 'j', 'aliasBuf', '*') }}};
}
{{{ makeSetValue('aliasListBuf', 'j', '0', '*') }}};
var pe = _malloc({{{ C_STRUCTS.protoent.__size__ }}});
{{{ makeSetValue('pe', C_STRUCTS.protoent.p_name, 'nameBuf', '*') }}};
{{{ makeSetValue('pe', C_STRUCTS.protoent.p_aliases, 'aliasListBuf', '*') }}};
{{{ makeSetValue('pe', C_STRUCTS.protoent.p_proto, 'proto', 'i32') }}};
return pe;
};
var list = Protocols.list;
var map = Protocols.map;
if (list.length === 0) {
var entry = allocprotoent('tcp', 6, ['TCP']);
list.push(entry);
map['tcp'] = map['6'] = entry;
entry = allocprotoent('udp', 17, ['UDP']);
list.push(entry);
map['udp'] = map['17'] = entry;
}
_setprotoent.index = 0;
},
endprotoent: () => {
},
getprotoent__deps: ['setprotoent', '$Protocols'],
getprotoent: (number) => {
if (_setprotoent.index === Protocols.list.length) {
return 0;
}
var result = Protocols.list[_setprotoent.index++];
return result;
},
getprotobyname__deps: ['setprotoent', '$Protocols'],
getprotobyname: (name) => {
name = UTF8ToString(name);
_setprotoent(true);
var result = Protocols.map[name];
return result;
},
getprotobynumber__deps: ['setprotoent', '$Protocols'],
getprotobynumber: (number) => {
_setprotoent(true);
var result = Protocols.map[number];
return result;
},
#if SOCKET_WEBRTC
$Sockets__deps: [
() => 'var SocketIO = ' + read('../third_party/socket.io.js') + ';\n',
() => 'var Peer = ' + read('../third_party/wrtcp.js') + ';\n'
],
#endif
$Sockets: {
BUFFER_SIZE: 10*1024,
MAX_BUFFER_SIZE: 10*1024*1024,
nextFd: 1,
fds: {},
nextport: 1,
maxport: 65535,
peer: null,
connections: {},
portmap: {},
localAddr: 0xfe00000a,
addrPool: [ 0x0200000a, 0x0300000a, 0x0400000a, 0x0500000a,
0x0600000a, 0x0700000a, 0x0800000a, 0x0900000a, 0x0a00000a,
0x0b00000a, 0x0c00000a, 0x0d00000a, 0x0e00000a]
},
#endif
$timers: {},
_setitimer_js__proxy: 'sync',
_setitimer_js__deps: ['$timers', '$callUserCallback', '_emscripten_timeout', 'emscripten_get_now'],
_setitimer_js: (which, timeout_ms) => {
#if RUNTIME_DEBUG
dbg(`setitimer_js ${which} timeout=${timeout_ms}`);
#endif
if (timers[which]) {
clearTimeout(timers[which].id);
delete timers[which];
}
if (!timeout_ms) return 0;
var id = setTimeout(() => {
#if ASSERTIONS
assert(which in timers);
#endif
delete timers[which];
#if RUNTIME_DEBUG
dbg(`itimer fired: ${which}`);
#endif
callUserCallback(() => __emscripten_timeout(which, _emscripten_get_now()));
}, timeout_ms);
timers[which] = { id, timeout_ms };
return 0;
},
__call_sighandler: (fp, sig) => {{{ makeDynCall('vi', 'fp') }}}(sig),
emscripten_run_script: (ptr) => {
{{{ makeEval('eval(UTF8ToString(ptr));') }}}
},
emscripten_run_script_int__docs: '/** @suppress{checkTypes} */',
emscripten_run_script_int: (ptr) => {
{{{ makeEval('return eval(UTF8ToString(ptr))|0;') }}}
},
emscripten_run_script_string__noleakcheck: true,
emscripten_run_script_string__deps: ['$lengthBytesUTF8', '$stringToUTF8', 'realloc'],
emscripten_run_script_string: (ptr) => {
{{{ makeEval("var s = eval(UTF8ToString(ptr));") }}}
if (s == null) {
return 0;
}
s += '';
var me = _emscripten_run_script_string;
me.bufferSize = lengthBytesUTF8(s) + 1;
me.buffer = _realloc(me.buffer ?? 0, me.bufferSize)
stringToUTF8(s, me.buffer, me.bufferSize);
return me.buffer;
},
emscripten_random: () => Math.random(),
emscripten_date_now: () => Date.now(),
emscripten_performance_now: () => {{{ getPerformanceNow() }}}(),
#if PTHREADS && !AUDIO_WORKLET
emscripten_get_now: () => performance.timeOrigin + {{{ getPerformanceNow() }}}(),
#else
#if AUDIO_WORKLET
emscripten_get_now: `;
// AudioWorkletGlobalScope does not have performance.now()
// (https://github.com/WebAudio/web-audio-api/issues/2527), so if building
// with
// Audio Worklets enabled, do a dynamic check for its presence.
if (typeof performance != 'undefined' && {{{ getPerformanceNow() }}}) {
#if PTHREADS
_emscripten_get_now = () => performance.timeOrigin + {{{ getPerformanceNow() }}}();
#else
_emscripten_get_now = () => {{{ getPerformanceNow() }}}();
#endif
} else {
_emscripten_get_now = Date.now;
}
`,
#else
emscripten_get_now: () => {{{ getPerformanceNow() }}}(),
#endif
#endif
emscripten_get_now_res: () => {
#if ENVIRONMENT_MAY_BE_NODE
if (ENVIRONMENT_IS_NODE) {
return 1;
}
#endif
#if AUDIO_WORKLET
if (typeof performance == 'object' && performance && typeof performance['now'] == 'function') {
return 1000;
}
return 1000*1000;
#else
return 1000;
#endif
},
$nowIsMonotonic__internal: true,
#if AUDIO_WORKLET
$nowIsMonotonic: `((typeof performance == 'object' && performance && typeof performance['now'] == 'function'));`,
#else
$nowIsMonotonic: 1,
#endif
_emscripten_get_now_is_monotonic__internal: true,
_emscripten_get_now_is_monotonic__deps: ['$nowIsMonotonic'],
_emscripten_get_now_is_monotonic: () => nowIsMonotonic,
$warnOnce: (text) => {
warnOnce.shown ||= {};
if (!warnOnce.shown[text]) {
warnOnce.shown[text] = 1;
#if ENVIRONMENT_MAY_BE_NODE
if (ENVIRONMENT_IS_NODE) text = 'warning: ' + text;
#endif
err(text);
}
},
_emscripten_log_formatted__deps: ['$getCallstack'],
_emscripten_log_formatted: (flags, str) => {
str = UTF8ToString(str);
if (flags & {{{ cDefs.EM_LOG_C_STACK | cDefs.EM_LOG_JS_STACK }}}) {
str = str.replace(/\s+$/, '');
str += (str.length > 0 ? '\n' : '') + getCallstack(flags);
}
if (flags & {{{ cDefs.EM_LOG_CONSOLE }}}) {
if (flags & {{{ cDefs.EM_LOG_ERROR }}}) {
console.error(str);
} else if (flags & {{{ cDefs.EM_LOG_WARN }}}) {
console.warn(str);
} else if (flags & {{{ cDefs.EM_LOG_INFO }}}) {
console.info(str);
} else if (flags & {{{ cDefs.EM_LOG_DEBUG }}}) {
console.debug(str);
} else {
console.log(str);
}
} else if (flags & {{{ cDefs.EM_LOG_ERROR | cDefs.EM_LOG_WARN }}}) {
err(str);
} else {
out(str);
}
},
emscripten_get_compiler_setting__noleakcheck: true,
#if RETAIN_COMPILER_SETTINGS
emscripten_get_compiler_setting__deps: ['$stringToNewUTF8'],
#endif
emscripten_get_compiler_setting: (name) => {
#if RETAIN_COMPILER_SETTINGS
name = UTF8ToString(name);
var ret = getCompilerSetting(name);
if (typeof ret == 'number' || typeof ret == 'boolean') return ret;
var cache = _emscripten_get_compiler_setting.cache ??= {};
var fullret = cache[name];
if (fullret) return fullret;
return cache[name] = stringToNewUTF8(ret);
#else
throw 'You must build with -sRETAIN_COMPILER_SETTINGS for getCompilerSetting or emscripten_get_compiler_setting to work';
#endif
},
emscripten_has_asyncify: () => {{{ ASYNCIFY }}},
emscripten_debugger: () => { debugger },
emscripten_print_double__deps: ['$stringToUTF8', '$lengthBytesUTF8'],
emscripten_print_double: (x, to, max) => {
var str = x + '';
if (to) return stringToUTF8(str, to, max);
else return lengthBytesUTF8(str);
},
#if USE_ASAN || USE_LSAN || UBSAN_RUNTIME
$withBuiltinMalloc__deps: [
'malloc', 'calloc', 'free', 'memalign', 'realloc',
'emscripten_builtin_malloc', 'emscripten_builtin_free', 'emscripten_builtin_memalign', 'emscripten_builtin_calloc', 'emscripten_builtin_realloc'
],
$withBuiltinMalloc__docs: '/** @suppress{checkTypes} */',
$withBuiltinMalloc: (func) => {
var prev_malloc = typeof _malloc != 'undefined' ? _malloc : undefined;
var prev_calloc = typeof _calloc != 'undefined' ? _calloc : undefined;
var prev_memalign = typeof _memalign != 'undefined' ? _memalign : undefined;
var prev_free = typeof _free != 'undefined' ? _free : undefined;
var prev_realloc = typeof _realloc != 'undefined' ? _realloc : undefined;
_malloc = _emscripten_builtin_malloc;
_calloc = _emscripten_builtin_calloc;
_memalign = _emscripten_builtin_memalign;
_free = _emscripten_builtin_free;
_realloc = _emscripten_builtin_realloc;
try {
return func();
} finally {
_malloc = prev_malloc;
_calloc = prev_calloc;
_memalign = prev_memalign;
_free = prev_free;
_realloc = prev_realloc;
}
},
_emscripten_sanitizer_use_colors: () => {
var setting = Module['printWithColors'];
if (setting !== undefined) {
return setting;
}
return ENVIRONMENT_IS_NODE && process.stderr.isTTY;
},
_emscripten_sanitizer_get_option__deps: ['$withBuiltinMalloc', '$stringToNewUTF8', '$UTF8ToString'],
_emscripten_sanitizer_get_option__sig: 'pp',
_emscripten_sanitizer_get_option: (name) => {
return withBuiltinMalloc(() => stringToNewUTF8(Module[UTF8ToString(name)] || ""));
},
#endif
$readEmAsmArgsArray: [],
$readEmAsmArgs__deps: ['$readEmAsmArgsArray'],
$readEmAsmArgs: (sigPtr, buf) => {
#if ASSERTIONS
assert(Array.isArray(readEmAsmArgsArray));
assert(buf % {{{ STACK_ALIGN }}} == 0);
#endif
readEmAsmArgsArray.length = 0;
var ch;
while (ch = HEAPU8[sigPtr++]) {
#if ASSERTIONS
var chr = String.fromCharCode(ch);
var validChars = ['d', 'f', 'i', 'p'];
#if WASM_BIGINT
validChars.push('j');
#endif
assert(validChars.includes(chr), `Invalid character ${ch}("${chr}") in readEmAsmArgs! Use only [${validChars}], and do not specify "v" for void return argument.`);
#endif
var wide = (ch != {{{ charCode('i') }}});
#if !MEMORY64
wide &= (ch != {{{ charCode('p') }}});
#endif
buf += wide && (buf % 8) ? 4 : 0;
readEmAsmArgsArray.push(
ch == {{{ charCode('p') }}} ? {{{ makeGetValue('buf', 0, '*') }}} :
#if WASM_BIGINT
ch == {{{ charCode('j') }}} ? {{{ makeGetValue('buf', 0, 'i64') }}} :
#endif
ch == {{{ charCode('i') }}} ?
{{{ makeGetValue('buf', 0, 'i32') }}} :
{{{ makeGetValue('buf', 0, 'double') }}}
);
buf += wide ? 8 : 4;
}
return readEmAsmArgsArray;
},
#if HAVE_EM_ASM
$runEmAsmFunction__deps: ['$readEmAsmArgs'],
$runEmAsmFunction: (code, sigPtr, argbuf) => {
var args = readEmAsmArgs(sigPtr, argbuf);
#if ASSERTIONS
assert(ASM_CONSTS.hasOwnProperty(code), `No EM_ASM constant found at address ${code}. The loaded WebAssembly file is likely out of sync with the generated JavaScript.`);
#endif
return ASM_CONSTS[code](...args);
},
emscripten_asm_const_int__deps: ['$runEmAsmFunction'],
emscripten_asm_const_int: (code, sigPtr, argbuf) => {
return runEmAsmFunction(code, sigPtr, argbuf);
},
emscripten_asm_const_double__deps: ['$runEmAsmFunction'],
emscripten_asm_const_double: (code, sigPtr, argbuf) => {
return runEmAsmFunction(code, sigPtr, argbuf);
},
emscripten_asm_const_ptr__deps: ['$runEmAsmFunction'],
emscripten_asm_const_ptr: (code, sigPtr, argbuf) => {
return runEmAsmFunction(code, sigPtr, argbuf);
},
$runMainThreadEmAsm__deps: ['$readEmAsmArgs',
#if PTHREADS
'$proxyToMainThread'
#endif
],
$runMainThreadEmAsm: (emAsmAddr, sigPtr, argbuf, sync) => {
var args = readEmAsmArgs(sigPtr, argbuf);
#if PTHREADS
if (ENVIRONMENT_IS_PTHREAD) {
return proxyToMainThread(0, emAsmAddr, sync, ...args);
}
#endif
#if ASSERTIONS
assert(ASM_CONSTS.hasOwnProperty(emAsmAddr), `No EM_ASM constant found at address ${emAsmAddr}. The loaded WebAssembly file is likely out of sync with the generated JavaScript.`);
#endif
return ASM_CONSTS[emAsmAddr](...args);
},
emscripten_asm_const_int_sync_on_main_thread__deps: ['$runMainThreadEmAsm'],
emscripten_asm_const_int_sync_on_main_thread: (emAsmAddr, sigPtr, argbuf) => runMainThreadEmAsm(emAsmAddr, sigPtr, argbuf, 1),
emscripten_asm_const_ptr_sync_on_main_thread__deps: ['$runMainThreadEmAsm'],
emscripten_asm_const_ptr_sync_on_main_thread: (emAsmAddr, sigPtr, argbuf) => runMainThreadEmAsm(emAsmAddr, sigPtr, argbuf, 1),
emscripten_asm_const_double_sync_on_main_thread: 'emscripten_asm_const_int_sync_on_main_thread',
emscripten_asm_const_async_on_main_thread__deps: ['$runMainThreadEmAsm'],
emscripten_asm_const_async_on_main_thread: (emAsmAddr, sigPtr, argbuf) => runMainThreadEmAsm(emAsmAddr, sigPtr, argbuf, 0),
#endif
$emGlobalThis__internal: true,
#if SUPPORTS_GLOBALTHIS
$emGlobalThis: 'globalThis',
#else
$getGlobalThis__internal: true,
$getGlobalThis: () => {
if (typeof globalThis != 'undefined') {
return globalThis;
}
#if DYNAMIC_EXECUTION
return new Function('return this')();
#else
function testGlobal(obj) {
obj['__emGlobalThis'] = obj;
var success = typeof __emGlobalThis == 'object' && obj['__emGlobalThis'] === obj;
delete obj['__emGlobalThis'];
return success;
}
if (typeof self != 'undefined' && testGlobal(self)) {
return self;
}
#if ENVIRONMENT_MAY_BE_NODE
if (typeof global != 'undefined' && testGlobal(global)) {
return global;
}
#endif
abort('unable to get global object.');
#endif
},
$emGlobalThis__deps: ['$getGlobalThis'],
$emGlobalThis: 'getGlobalThis()',
#endif
#if !DECLARE_ASM_MODULE_EXPORTS
$exportWasmSymbols__deps: ['$asmjsMangle'
#if DYNCALLS || !WASM_BIGINT
, '$dynCalls'
#endif
],
$exportWasmSymbols: (wasmExports) => {
#if ENVIRONMENT_MAY_BE_NODE && ENVIRONMENT_MAY_BE_WEB
var global_object = (typeof process != "undefined" ? global : this);
#elif ENVIRONMENT_MAY_BE_NODE
var global_object = global;
#else
var global_object = this;
#endif
for (var [name, exportedSymbol] of Object.entries(wasmExports)) {
name = asmjsMangle(name);
#if DYNCALLS || !WASM_BIGINT
if (name.startsWith('dynCall_')) {
dynCalls[name.substr(8)] = exportedSymbol;
}
#endif
if (typeof exportedSymbol.value === 'undefined') {
#if MINIMAL_RUNTIME
global_object[name] = exportedSymbol;
#else
global_object[name] = Module[name] = exportedSymbol;
#endif
}
}
},
#endif
$jstoi_q__docs: '/** @suppress {checkTypes} */',
$jstoi_q: (str) => parseInt(str),
#if LINK_AS_CXX
_Unwind_Backtrace__deps: ['$getCallstack'],
_Unwind_Backtrace: (func, arg) => {
var trace = getCallstack();
var parts = trace.split('\n');
for (var i = 0; i < parts.length; i++) {
var ret = {{{ makeDynCall('iii', 'func') }}}(0, arg);
if (ret !== 0) return;
}
},
_Unwind_GetIPInfo: (context, ipBefore) => abort('Unwind_GetIPInfo'),
_Unwind_FindEnclosingFunction: (ip) => 0,
_Unwind_RaiseException__deps: ['__cxa_throw'],
_Unwind_RaiseException: (ex) => {
err('Warning: _Unwind_RaiseException is not correctly implemented');
return ___cxa_throw(ex, 0, 0);
},
_Unwind_DeleteException: (ex) => err('TODO: Unwind_DeleteException'),
#endif
#if STACK_OVERFLOW_CHECK
__handle_stack_overflow__deps: ['emscripten_stack_get_base', 'emscripten_stack_get_end', '$ptrToString'],
__handle_stack_overflow: (requested) => {
var base = _emscripten_stack_get_base();
var end = _emscripten_stack_get_end();
abort(`stack overflow (Attempt to set SP to ${ptrToString(requested)}` +
`, with stack limits [${ptrToString(end)} - ${ptrToString(base)}` +
']). If you require more stack space build with -sSTACK_SIZE=<bytes>');
},
#endif
#if MINIMAL_RUNTIME
$getExecutableName: () => {
#if ENVIRONMENT_MAY_BE_NODE
if (ENVIRONMENT_IS_NODE && process.argv.length > 1) {
return process.argv[1].replace(/\\/g, '/');
}
#endif
return "./this.program";
},
#else
$getExecutableName: () => thisProgram || './this.program',
#endif
$autoResumeAudioContext__docs: '/** @param {Object=} elements */',
$autoResumeAudioContext: (ctx, elements) => {
if (!elements) {
elements = [document, document.getElementById('canvas')];
}
['keydown', 'mousedown', 'touchstart'].forEach((event) => {
elements.forEach((element) => {
element?.addEventListener(event, () => {
if (ctx.state === 'suspended') ctx.resume();
}, { 'once': true });
});
});
},
#if DYNCALLS || !WASM_BIGINT
$dynCalls__internal: true,
$dynCalls: {},
$dynCallLegacy__deps: ['$dynCalls'],
$dynCallLegacy: (sig, ptr, args) => {
sig = sig.replace(/p/g, {{{ MEMORY64 ? "'j'" : "'i'" }}})
#if ASSERTIONS
assert(sig in dynCalls, `bad function pointer type - sig is not in dynCalls: '${sig}'`);
if (args?.length) {
#if WASM_BIGINT
assert(args.length === sig.length - 1);
#else
assert(args.length === sig.substring(1).replace(/j/g, '--').length);
#endif
} else {
assert(sig.length == 1);
}
#endif
var f = dynCalls[sig];
return f(ptr, ...args);
},
$dynCall__deps: [
#if DYNCALLS || !WASM_BIGINT
'$dynCallLegacy',
#endif
#if !DYNCALLS
'$getWasmTableEntry',
#endif
],
#endif
$getDynCaller__deps: ['$dynCall'],
$getDynCaller: (sig, ptr, promising = false) => {
#if ASSERTIONS && !DYNCALLS
assert(sig.includes('j') || sig.includes('p'), 'getDynCaller should only be called with i64 sigs')
#endif
return (...args) => dynCall(sig, ptr, args, promising);
},
$dynCall: (sig, ptr, args = [], promising = false) => {
#if ASSERTIONS && (DYNCALLS || !WASM_BIGINT || !JSPI)
assert(!promising, 'async dynCall is not supported in this mode')
#endif
#if MEMORY64
for (var i = 1; i < sig.length; ++i) {
if (sig[i] == 'p') args[i-1] = BigInt(args[i-1]);
}
#endif
#if DYNCALLS
var rtn = dynCallLegacy(sig, ptr, args);
#else
#if !WASM_BIGINT
if (sig.includes('j')) {
return dynCallLegacy(sig, ptr, args);
}
#endif
#if ASSERTIONS
assert(getWasmTableEntry(ptr), `missing table entry in dynCall: ${ptr}`);
#endif
var func = getWasmTableEntry(ptr);
#if JSPI
if (promising) {
func = WebAssembly.promising(func);
}
#endif
var rtn = func(...args);
#endif
function convert(rtn) {
#if MEMORY64
return sig[0] == 'p' ? Number(rtn) : rtn;
#elif CAN_ADDRESS_2GB
return sig[0] == 'p' ? rtn >>> 0 : rtn;
#else
return rtn;
#endif
}
#if JSPI
if (promising) {
return rtn.then(convert);
}
#endif
return convert(rtn);
},
$callRuntimeCallbacks__internal: true,
$callRuntimeCallbacks: (callbacks) => {
while (callbacks.length > 0) {
callbacks.shift()(Module);
}
},
#if SHRINK_LEVEL == 0 || ASYNCIFY == 2
$wasmTableMirror__internal: true,
$wasmTableMirror: [],
$setWasmTableEntry__internal: true,
$setWasmTableEntry__deps: ['$wasmTableMirror', '$wasmTable'],
$setWasmTableEntry: (idx, func) => {
wasmTable.set({{{ toIndexType('idx') }}}, func);
wasmTableMirror[idx] = wasmTable.get({{{ toIndexType('idx') }}});
},
$getWasmTableEntry__internal: true,
$getWasmTableEntry__deps: ['$wasmTableMirror', '$wasmTable'],
$getWasmTableEntry: (funcPtr) => {
#if MEMORY64
funcPtr = Number(funcPtr);
#endif
var func = wasmTableMirror[funcPtr];
if (!func) {
wasmTableMirror[funcPtr] = func = wasmTable.get({{{ toIndexType('funcPtr') }}});
#if ASYNCIFY == 2
if (Asyncify.isAsyncExport(func)) {
wasmTableMirror[funcPtr] = func = Asyncify.makeAsyncFunction(func);
}
#endif
}
#if ASSERTIONS && ASYNCIFY != 2
assert(wasmTable.get({{{ toIndexType('funcPtr') }}}) == func, 'JavaScript-side Wasm function table mirror is out of date!');
#endif
return func;
},
#else
$setWasmTableEntry__docs: '/** @suppress{checkTypes} */',
$setWasmTableEntry__deps: ['$wasmTable'],
$setWasmTableEntry: (idx, func) => wasmTable.set({{{ toIndexType('idx') }}}, func),
$getWasmTableEntry__docs: '/** @suppress{checkTypes} */',
$getWasmTableEntry__deps: ['$wasmTable'],
$getWasmTableEntry: (funcPtr) => {
return wasmTable.get({{{ toIndexType('funcPtr') }}});
},
#endif
emscripten_exit_with_live_runtime: () => {
{{{ runtimeKeepalivePush() }}}
throw 'unwind';
},
#if !MINIMAL_RUNTIME
_emscripten_runtime_keepalive_clear__deps: ['$runtimeKeepaliveCounter'],
#endif
_emscripten_runtime_keepalive_clear: () => {
#if isSymbolNeeded('$noExitRuntime')
noExitRuntime = false;
#endif
#if !MINIMAL_RUNTIME
runtimeKeepaliveCounter = 0;
#endif
},
emscripten_force_exit__deps: ['exit', '_emscripten_runtime_keepalive_clear',
#if !EXIT_RUNTIME && ASSERTIONS
'$warnOnce',
#endif
],
emscripten_force_exit__proxy: 'sync',
emscripten_force_exit: (status) => {
#if RUNTIME_DEBUG
dbg('emscripten_force_exit');
#endif
#if !EXIT_RUNTIME && ASSERTIONS
warnOnce('emscripten_force_exit cannot actually shut down the runtime, as the build does not have EXIT_RUNTIME set');
#endif
__emscripten_runtime_keepalive_clear();
_exit(status);
},
emscripten_out: (str) => out(UTF8ToString(str)),
emscripten_outn: (str, len) => out(UTF8ToString(str, len)),
emscripten_err: (str) => err(UTF8ToString(str)),
emscripten_errn: (str, len) => err(UTF8ToString(str, len)),
#if ASSERTIONS || RUNTIME_DEBUG
emscripten_dbg: (str) => dbg(UTF8ToString(str)),
emscripten_dbgn: (str, len) => dbg(UTF8ToString(str, len)),
emscripten_dbg_backtrace: (str) => {
dbg(UTF8ToString(str) + '\n' + new Error().stack);
},
#endif
_emscripten_get_progname__deps: ['$getExecutableName', '$stringToUTF8'],
_emscripten_get_progname: (str, len) => stringToUTF8(getExecutableName(), str, len),
emscripten_console_log: (str) => {
#if ASSERTIONS
assert(typeof str == 'number');
#endif
console.log(UTF8ToString(str));
},
emscripten_console_warn: (str) => {
#if ASSERTIONS
assert(typeof str == 'number');
#endif
console.warn(UTF8ToString(str));
},
emscripten_console_error: (str) => {
#if ASSERTIONS
assert(typeof str == 'number');
#endif
console.error(UTF8ToString(str));
},
emscripten_console_trace: (str) => {
#if ASSERTIONS
assert(typeof str == 'number');
#endif
console.trace(UTF8ToString(str));
},
emscripten_throw_number: (number) => {
throw number;
},
emscripten_throw_string: (str) => {
#if ASSERTIONS
assert(typeof str == 'number');
#endif
throw UTF8ToString(str);
},
#if !MINIMAL_RUNTIME
#if STACK_OVERFLOW_CHECK
$handleException__deps: ['emscripten_stack_get_current'],
#endif
$handleException: (e) => {
if (e instanceof ExitStatus || e == 'unwind') {
#if RUNTIME_DEBUG
dbg(`handleException: unwinding: EXITSTATUS=${EXITSTATUS}`);
#endif
return EXITSTATUS;
}
#if STACK_OVERFLOW_CHECK
checkStackCookie();
if (e instanceof WebAssembly.RuntimeError) {
if (_emscripten_stack_get_current() <= 0) {
err('Stack overflow detected. You can try increasing -sSTACK_SIZE (currently set to {{{ STACK_SIZE }}})');
}
}
#endif
quit_(1, e);
},
$runtimeKeepaliveCounter__internal: true,
$runtimeKeepaliveCounter: 0,
#if isSymbolNeeded('$noExitRuntime')
$keepRuntimeAlive__deps: ['$runtimeKeepaliveCounter'],
$keepRuntimeAlive: () => noExitRuntime || runtimeKeepaliveCounter > 0,
#elif !EXIT_RUNTIME && !PTHREADS
$keepRuntimeAlive: () => true,
#else
$keepRuntimeAlive__deps: ['$runtimeKeepaliveCounter'],
$keepRuntimeAlive: () => runtimeKeepaliveCounter > 0,
#endif
$runtimeKeepalivePush__deps: ['$runtimeKeepaliveCounter'],
$runtimeKeepalivePush__sig: 'v',
$runtimeKeepalivePush: () => {
runtimeKeepaliveCounter += 1;
#if RUNTIME_DEBUG
dbg(`runtimeKeepalivePush -> counter=${runtimeKeepaliveCounter}`);
#endif
},
$runtimeKeepalivePop__deps: ['$runtimeKeepaliveCounter'],
$runtimeKeepalivePop__sig: 'v',
$runtimeKeepalivePop: () => {
#if ASSERTIONS
assert(runtimeKeepaliveCounter > 0);
#endif
runtimeKeepaliveCounter -= 1;
#if RUNTIME_DEBUG
dbg(`runtimeKeepalivePop -> counter=${runtimeKeepaliveCounter}`);
#endif
},
emscripten_runtime_keepalive_push: '$runtimeKeepalivePush',
emscripten_runtime_keepalive_pop: '$runtimeKeepalivePop',
emscripten_runtime_keepalive_check: '$keepRuntimeAlive',
$callUserCallback__deps: ['$handleException', '$maybeExit'],
$callUserCallback: (func) => {
#if EXIT_RUNTIME
if (runtimeExited || ABORT) {
#else
if (ABORT) {
#endif
#if ASSERTIONS
err('user callback triggered after runtime exited or application aborted. Ignoring.');
#endif
return;
}
try {
func();
maybeExit();
} catch (e) {
handleException(e);
}
},
$maybeExit__deps: ['exit', '$handleException', '$keepRuntimeAlive',
#if PTHREADS
'_emscripten_thread_exit',
#endif
#if RUNTIME_DEBUG >= 2
'$runtimeKeepaliveCounter',
#endif
],
$maybeExit: () => {
#if EXIT_RUNTIME
if (runtimeExited) {
return;
}
#endif
#if RUNTIME_DEBUG >= 2
dbg(`maybeExit: user callback done: runtimeKeepaliveCounter=${runtimeKeepaliveCounter}`);
#endif
if (!keepRuntimeAlive()) {
#if RUNTIME_DEBUG
dbg(`maybeExit: calling exit() implicitly after user callback completed: ${EXITSTATUS}`);
#endif
try {
#if PTHREADS
if (ENVIRONMENT_IS_PTHREAD) {
if (_pthread_self()) __emscripten_thread_exit(EXITSTATUS);
return;
}
#endif
_exit(EXITSTATUS);
} catch (e) {
handleException(e);
}
}
},
$asyncLoad: async (url) => {
var arrayBuffer = await readAsync(url);
#if ASSERTIONS
assert(arrayBuffer, `Loading data file "${url}" failed (no arrayBuffer).`);
#endif
return new Uint8Array(arrayBuffer);
},
#else
$callUserCallback: (func) => {
#if EXIT_RUNTIME
if (runtimeExited) {
#if ASSERTIONS
err('user callback triggered after runtime exited or application aborted. Ignoring.');
#endif
return;
}
#endif
func();
},
#endif
$asmjsMangle: (x) => {
if (x == '__main_argc_argv') {
x = 'main';
}
#if DYNCALLS
return x.startsWith('dynCall_') ? x : '_' + x;
#else
return '_' + x;
#endif
},
$alignMemory: (size, alignment) => {
#if ASSERTIONS
assert(alignment, "alignment argument is required");
#endif
return Math.ceil(size / alignment) * alignment;
},
#if hasExportedSymbol('emscripten_builtin_memalign')
$mmapAlloc__deps: ['$zeroMemory', '$alignMemory'],
#endif
$mmapAlloc: (size) => {
#if hasExportedSymbol('emscripten_builtin_memalign')
size = alignMemory(size, {{{ WASM_PAGE_SIZE }}});
var ptr = _emscripten_builtin_memalign({{{ WASM_PAGE_SIZE }}}, size);
if (ptr) zeroMemory(ptr, size);
return ptr;
#elif ASSERTIONS
abort('internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported');
#else
abort();
#endif
},
#if RELOCATABLE
__stack_pointer: "new WebAssembly.Global({'value': '{{{ POINTER_WASM_TYPE }}}', 'mutable': true}, {{{ to64(STACK_HIGH) }}})",
__memory_base: "new WebAssembly.Global({'value': '{{{ POINTER_WASM_TYPE }}}', 'mutable': false}, {{{ to64(GLOBAL_BASE) }}})",
__table_base: "new WebAssembly.Global({'value': '{{{ POINTER_WASM_TYPE }}}', 'mutable': false}, {{{ to64(TABLE_BASE) }}})",
#if MEMORY64 == 2
__memory_base32: "new WebAssembly.Global({'value': 'i32', 'mutable': false}, {{{ GLOBAL_BASE }}})",
#endif
#if MEMORY64
__table_base32: {{{ TABLE_BASE }}},
#endif
__heap_base: '{{{ HEAP_BASE }}}',
__stack_high: '{{{ STACK_HIGH }}}',
__stack_low: '{{{ STACK_LOW }}}',
__global_base: '{{{ GLOBAL_BASE }}}',
#if WASM_EXCEPTIONS
__cpp_exception: "new WebAssembly.Tag({'parameters': ['{{{ POINTER_WASM_TYPE }}}']})",
#endif
#if SUPPORT_LONGJMP == 'wasm'
__c_longjmp: "new WebAssembly.Tag({'parameters': ['{{{ POINTER_WASM_TYPE }}}']})",
#endif
#if ASYNCIFY == 1
__asyncify_state: "new WebAssembly.Global({'value': 'i32', 'mutable': true}, 0)",
__asyncify_data: "new WebAssembly.Global({'value': '{{{ POINTER_WASM_TYPE }}}', 'mutable': true}, {{{ to64(0) }}})",
#endif
#endif
_emscripten_fs_load_embedded_files__deps: ['$FS', '$PATH'],
_emscripten_fs_load_embedded_files: (ptr) => {
#if RUNTIME_DEBUG
dbg('preloading data files');
#endif
do {
var name_addr = {{{ makeGetValue('ptr', '0', '*') }}};
ptr += {{{ POINTER_SIZE }}};
var len = {{{ makeGetValue('ptr', '0', '*') }}};
ptr += {{{ POINTER_SIZE }}};
var content = {{{ makeGetValue('ptr', '0', '*') }}};
ptr += {{{ POINTER_SIZE }}};
var name = UTF8ToString(name_addr)
#if RUNTIME_DEBUG
dbg(`preloading files: ${name}`);
#endif
FS.createPath('/', PATH.dirname(name), true, true);
FS.createDataFile(name, null, HEAP8.subarray(content, content + len), true, true, true);
} while ({{{ makeGetValue('ptr', '0', '*') }}});
#if RUNTIME_DEBUG
dbg('done preloading data files');
#endif
},
$HandleAllocator: class {
allocated = [undefined];
freelist = [];
get(id) {
#if ASSERTIONS
assert(this.allocated[id] !== undefined, `invalid handle: ${id}`);
#endif
return this.allocated[id];
}
has(id) {
return this.allocated[id] !== undefined;
}
allocate(handle) {
var id = this.freelist.pop() || this.allocated.length;
this.allocated[id] = handle;
return id;
}
free(id) {
#if ASSERTIONS
assert(this.allocated[id] !== undefined);
#endif
this.allocated[id] = undefined;
this.freelist.push(id);
}
},
$getNativeTypeSize__deps: ['$POINTER_SIZE'],
$getNativeTypeSize: {{{ getNativeTypeSize }}},
$wasmTable__docs: '/** @type {WebAssembly.Table} */',
#if RELOCATABLE
$wasmTable: `=new WebAssembly.Table({
'initial': {{{ toIndexType(INITIAL_TABLE) }}},
#if !ALLOW_TABLE_GROWTH
'maximum': {{{ toIndexType(INITIAL_TABLE) }}},
#endif
#if MEMORY64 == 1
'address': 'i64',
#endif
'element': 'anyfunc'
});
`,
#else
$wasmTable: undefined,
#endif
$getUniqueRunDependency: (id) => {
#if ASSERTIONS
var orig = id;
while (1) {
if (!runDependencyTracking[id]) return id;
id = orig + Math.random();
}
#else
return id;
#endif
},
$noExitRuntime__postset: () => addAtModule(makeModuleReceive('noExitRuntime')),
$noExitRuntime: {{{ !EXIT_RUNTIME }}},
#if !MINIMAL_RUNTIME
$runDependencies__internal: true,
$runDependencies: 0,
$dependenciesFulfilled__internal: true,
$dependenciesFulfilled: null,
#if ASSERTIONS
$runDependencyTracking__internal: true,
$runDependencyTracking: {},
$runDependencyWatcher__internal: true,
$runDependencyWatcher: null,
#endif
$addRunDependency__deps: ['$runDependencies', '$removeRunDependency',
#if ASSERTIONS
'$runDependencyTracking',
'$runDependencyWatcher',
#endif
],
$addRunDependency: (id) => {
runDependencies++;
#if expectToReceiveOnModule('monitorRunDependencies')
Module['monitorRunDependencies']?.(runDependencies);
#endif
#if ASSERTIONS
#if RUNTIME_DEBUG
dbg('addRunDependency', id);
#endif
assert(id, 'addRunDependency requires an ID')
assert(!runDependencyTracking[id]);
runDependencyTracking[id] = 1;
if (runDependencyWatcher === null && typeof setInterval != 'undefined') {
runDependencyWatcher = setInterval(() => {
if (ABORT) {
clearInterval(runDependencyWatcher);
runDependencyWatcher = null;
return;
}
var shown = false;
for (var dep in runDependencyTracking) {
if (!shown) {
shown = true;
err('still waiting on run dependencies:');
}
err(`dependency: ${dep}`);
}
if (shown) {
err('(end of list)');
}
}, 10000);
#if ENVIRONMENT_MAY_BE_NODE
runDependencyWatcher.unref?.()
#endif
}
#endif
},
$removeRunDependency__deps: ['$runDependencies', '$dependenciesFulfilled',
#if ASSERTIONS
'$runDependencyTracking',
'$runDependencyWatcher',
#endif
],
$removeRunDependency: (id) => {
runDependencies--;
#if expectToReceiveOnModule('monitorRunDependencies')
Module['monitorRunDependencies']?.(runDependencies);
#endif
#if ASSERTIONS
#if RUNTIME_DEBUG
dbg('removeRunDependency', id);
#endif
assert(id, 'removeRunDependency requires an ID');
assert(runDependencyTracking[id]);
delete runDependencyTracking[id];
#endif
if (runDependencies == 0) {
#if ASSERTIONS
if (runDependencyWatcher !== null) {
clearInterval(runDependencyWatcher);
runDependencyWatcher = null;
}
#endif
if (dependenciesFulfilled) {
var callback = dependenciesFulfilled;
dependenciesFulfilled = null;
callback();
}
}
},
#endif
$onPreRuns: [],
$onPreRuns__internal: true,
$onPreRuns__deps: ['$callRuntimeCallbacks'],
$onPreRuns__postset: () => {
ATPRERUNS.unshift('callRuntimeCallbacks(onPreRuns);');
},
$addOnPreRun__deps: ['$onPreRuns'],
$addOnPreRun: (cb) => onPreRuns.push(cb),
$onInits: [],
$onInits__internal: true,
$onInits__deps: ['$callRuntimeCallbacks'],
$onInits__postset: () => {
ATINITS.unshift('callRuntimeCallbacks(onInits);');
},
$addOnInit__deps: ['$onInits'],
$addOnInit: (cb) => onInits.push(cb),
$onPostCtors: [],
$onPostCtors__internal: true,
$onPostCtors__deps: ['$callRuntimeCallbacks'],
$onPostCtors__postset: () => {
ATPOSTCTORS.unshift('callRuntimeCallbacks(onPostCtors);');
},
$addOnPostCtor__deps: ['$onPostCtors'],
$addOnPostCtor: (cb) => onPostCtors.push(cb),
$onMains: [],
$onMains__internal: true,
$onMains__deps: ['$callRuntimeCallbacks'],
$onMains__postset: () => {
ATMAINS.unshift('callRuntimeCallbacks(onMains);');
},
$addOnPreMain__deps: ['$onMains'],
$addOnPreMain: (cb) => onMains.push(cb),
$onExits: [],
$onExits__internal: true,
$onExits__deps: ['$callRuntimeCallbacks'],
$onExits__postset: () => {
ATEXITS.unshift('callRuntimeCallbacks(onExits);');
},
$addOnExit__deps: ['$onExits'],
$addOnExit: (cb) => onExits.push(cb),
$onPostRuns: [],
$onPostRuns__internal: true,
$onPostRuns__deps: ['$callRuntimeCallbacks'],
$onPostRuns__postset: () => {
ATPOSTRUNS.unshift('callRuntimeCallbacks(onPostRuns);');
},
$addOnPostRun__deps: ['$onPostRuns'],
$addOnPostRun: (cb) => onPostRuns.push(cb),
$STACK_SIZE: {{{ STACK_SIZE }}},
$STACK_ALIGN: {{{ STACK_ALIGN }}},
$POINTER_SIZE: {{{ POINTER_SIZE }}},
$ASSERTIONS: {{{ ASSERTIONS }}},
});
function autoAddDeps(object, name) {
for (var item in object) {
if (!item.endsWith('__deps')) {
if (!object[item + '__deps']) {
object[item + '__deps'] = [];
}
object[item + '__deps'].push(name);
}
}
}
#if LEGACY_RUNTIME
extraLibraryFuncs.push(
'$addFunction',
'$removeFunction',
'$allocate',
'$ALLOC_NORMAL',
'$ALLOC_STACK',
'$AsciiToString',
'$stringToAscii',
'$UTF16ToString',
'$stringToUTF16',
'$lengthBytesUTF16',
'$UTF32ToString',
'$stringToUTF32',
'$lengthBytesUTF32',
'$stringToNewUTF8',
'$stringToUTF8OnStack',
'$writeStringToMemory',
'$writeArrayToMemory',
'$writeAsciiToMemory',
'$intArrayFromString',
'$intArrayToString',
'$warnOnce',
'$ccall',
'$cwrap',
'$ExitStatus',
'$UTF8ArrayToString',
'$UTF8ToString',
'$stringToUTF8Array',
'$stringToUTF8',
'$lengthBytesUTF8',
);
#endif
function wrapSyscallFunction(x, library, isWasi) {
if (isJsOnlySymbol(x) || isDecorator(x)) {
return;
}
var t = library[x];
if (typeof t == 'string') return;
t = t.toString();
if (!SYSCALLS_REQUIRE_FILESYSTEM && t.includes('FS.')) {
library[x + '__deps'] = [];
t = modifyJSFunction(t, (args, body) => {
return `(${args}) => {\n` +
(ASSERTIONS ? "abort('it should not be possible to operate on streams when !SYSCALLS_REQUIRE_FILESYSTEM');\n" : '') +
'}';
});
}
var isVariadic = !isWasi && t.includes(', varargs');
#if SYSCALLS_REQUIRE_FILESYSTEM == 0
var canThrow = false;
#else
var canThrow = library[x + '__nothrow'] !== true;
#endif
library[x + '__deps'] ??= [];
#if PURE_WASI && !GROWABLE_ARRAYBUFFERS
var pre = '\nif (!HEAPU8.byteLength) _emscripten_notify_memory_growth(0);\n'
library[x + '__deps'].push('emscripten_notify_memory_growth');
#else
var pre = '';
#endif
var post = '';
if (isVariadic) {
pre += 'SYSCALLS.varargs = varargs;\n';
}
#if SYSCALL_DEBUG
if (isVariadic) {
if (canThrow) {
post += 'finally { SYSCALLS.varargs = undefined; }\n';
} else {
post += 'SYSCALLS.varargs = undefined;\n';
}
}
pre += `dbg('syscall! ${x}: [' + Array.prototype.slice.call(arguments) + ']');\n`;
pre += "var canWarn = true;\n";
pre += "var ret = (() => {";
post += "})();\n";
post += "if (ret && ret < 0 && canWarn) {\n";
post += " dbg(`error: syscall may have failed with ${-ret} (${strError(-ret)})`);\n";
post += "}\n";
post += "dbg(`syscall return: ${ret}`);\n";
post += "return ret;\n";
library[x + '__deps'].push('$strError');
#endif
delete library[x + '__nothrow'];
var handler = '';
if (canThrow) {
pre += 'try {\n';
handler +=
"} catch (e) {\n" +
" if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;\n";
#if SYSCALL_DEBUG
handler +=
" dbg(`error: syscall failed with ${e.errno} (${strError(e.errno)})`);\n" +
" canWarn = false;\n";
#endif
if (isWasi) {
handler += " return e.errno;\n";
} else {
handler += " return -e.errno;\n";
}
handler += "}\n";
}
post = handler + post;
if (pre || post) {
t = modifyJSFunction(t, (args, body) => `function (${args}) {\n${pre}${body}${post}}\n`);
}
library[x] = eval('(' + t + ')');
if (!WASMFS && t.includes('SYSCALLS')) {
library[x + '__deps'].push('$SYSCALLS');
}
#if PTHREADS
if (library[x + '__proxy'] === undefined) {
library[x + '__proxy'] = 'sync';
}
#endif
}