Update playground again
This commit is contained in:
@@ -1167,183 +1167,6 @@ function dbg(...args) {
|
||||
assert(false, 'Exception thrown, but exception catching is not enabled. Compile with -sNO_DISABLE_EXCEPTION_CATCHING or -sEXCEPTION_CATCHING_ALLOWED=[..] to catch.');
|
||||
};
|
||||
|
||||
var _abort = () => {
|
||||
abort('native code called abort()');
|
||||
};
|
||||
|
||||
var _emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num);
|
||||
|
||||
var getHeapMax = () =>
|
||||
// Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate
|
||||
// full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side
|
||||
// for any code that deals with heap sizes, which would require special
|
||||
// casing all heap size related code to treat 0 specially.
|
||||
2147483648;
|
||||
|
||||
var growMemory = (size) => {
|
||||
var b = wasmMemory.buffer;
|
||||
var pages = (size - b.byteLength + 65535) / 65536;
|
||||
try {
|
||||
// round size grow request up to wasm page size (fixed 64KB per spec)
|
||||
wasmMemory.grow(pages); // .grow() takes a delta compared to the previous size
|
||||
updateMemoryViews();
|
||||
return 1 /*success*/;
|
||||
} catch(e) {
|
||||
err(`growMemory: Attempted to grow heap from ${b.byteLength} bytes to ${size} bytes, but got error: ${e}`);
|
||||
}
|
||||
// implicit 0 return to save code size (caller will cast "undefined" into 0
|
||||
// anyhow)
|
||||
};
|
||||
var _emscripten_resize_heap = (requestedSize) => {
|
||||
var oldSize = HEAPU8.length;
|
||||
// With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.
|
||||
requestedSize >>>= 0;
|
||||
// With multithreaded builds, races can happen (another thread might increase the size
|
||||
// in between), so return a failure, and let the caller retry.
|
||||
assert(requestedSize > oldSize);
|
||||
|
||||
// Memory resize rules:
|
||||
// 1. Always increase heap size to at least the requested size, rounded up
|
||||
// to next page multiple.
|
||||
// 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap
|
||||
// geometrically: increase the heap size according to
|
||||
// MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most
|
||||
// overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB).
|
||||
// 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap
|
||||
// linearly: increase the heap size by at least
|
||||
// MEMORY_GROWTH_LINEAR_STEP bytes.
|
||||
// 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by
|
||||
// MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest
|
||||
// 4. If we were unable to allocate as much memory, it may be due to
|
||||
// over-eager decision to excessively reserve due to (3) above.
|
||||
// Hence if an allocation fails, cut down on the amount of excess
|
||||
// growth, in an attempt to succeed to perform a smaller allocation.
|
||||
|
||||
// A limit is set for how much we can grow. We should not exceed that
|
||||
// (the wasm binary specifies it, so if we tried, we'd fail anyhow).
|
||||
var maxHeapSize = getHeapMax();
|
||||
if (requestedSize > maxHeapSize) {
|
||||
err(`Cannot enlarge memory, requested ${requestedSize} bytes, but the limit is ${maxHeapSize} bytes!`);
|
||||
return false;
|
||||
}
|
||||
|
||||
var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple;
|
||||
|
||||
// Loop through potential heap size increases. If we attempt a too eager
|
||||
// reservation that fails, cut down on the attempted size and reserve a
|
||||
// smaller bump instead. (max 3 times, chosen somewhat arbitrarily)
|
||||
for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
|
||||
var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth
|
||||
// but limit overreserving (default to capping at +96MB overgrowth at most)
|
||||
overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 );
|
||||
|
||||
var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));
|
||||
|
||||
var replacement = growMemory(newSize);
|
||||
if (replacement) {
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
err(`Failed to grow the heap from ${oldSize} bytes to ${newSize} bytes, not enough memory!`);
|
||||
return false;
|
||||
};
|
||||
|
||||
var ENV = {
|
||||
};
|
||||
|
||||
var getExecutableName = () => {
|
||||
return thisProgram || './this.program';
|
||||
};
|
||||
var getEnvStrings = () => {
|
||||
if (!getEnvStrings.strings) {
|
||||
// Default values.
|
||||
// Browser language detection #8751
|
||||
var lang = ((typeof navigator == 'object' && navigator.languages && navigator.languages[0]) || 'C').replace('-', '_') + '.UTF-8';
|
||||
var env = {
|
||||
'USER': 'web_user',
|
||||
'LOGNAME': 'web_user',
|
||||
'PATH': '/',
|
||||
'PWD': '/',
|
||||
'HOME': '/home/web_user',
|
||||
'LANG': lang,
|
||||
'_': getExecutableName()
|
||||
};
|
||||
// Apply the user-provided values, if any.
|
||||
for (var x in ENV) {
|
||||
// x is a key in ENV; if ENV[x] is undefined, that means it was
|
||||
// explicitly set to be so. We allow user code to do that to
|
||||
// force variables with default values to remain unset.
|
||||
if (ENV[x] === undefined) delete env[x];
|
||||
else env[x] = ENV[x];
|
||||
}
|
||||
var strings = [];
|
||||
for (var x in env) {
|
||||
strings.push(`${x}=${env[x]}`);
|
||||
}
|
||||
getEnvStrings.strings = strings;
|
||||
}
|
||||
return getEnvStrings.strings;
|
||||
};
|
||||
|
||||
var stringToAscii = (str, buffer) => {
|
||||
for (var i = 0; i < str.length; ++i) {
|
||||
assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff));
|
||||
HEAP8[buffer++] = str.charCodeAt(i);
|
||||
}
|
||||
// Null-terminate the string
|
||||
HEAP8[buffer] = 0;
|
||||
};
|
||||
var _environ_get = (__environ, environ_buf) => {
|
||||
var bufSize = 0;
|
||||
getEnvStrings().forEach((string, i) => {
|
||||
var ptr = environ_buf + bufSize;
|
||||
HEAPU32[(((__environ)+(i*4))>>2)] = ptr;
|
||||
stringToAscii(string, ptr);
|
||||
bufSize += string.length + 1;
|
||||
});
|
||||
return 0;
|
||||
};
|
||||
|
||||
var _environ_sizes_get = (penviron_count, penviron_buf_size) => {
|
||||
var strings = getEnvStrings();
|
||||
HEAPU32[((penviron_count)>>2)] = strings.length;
|
||||
var bufSize = 0;
|
||||
strings.forEach((string) => bufSize += string.length + 1);
|
||||
HEAPU32[((penviron_buf_size)>>2)] = bufSize;
|
||||
return 0;
|
||||
};
|
||||
|
||||
|
||||
var runtimeKeepaliveCounter = 0;
|
||||
var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0;
|
||||
var _proc_exit = (code) => {
|
||||
EXITSTATUS = code;
|
||||
if (!keepRuntimeAlive()) {
|
||||
Module['onExit']?.(code);
|
||||
ABORT = true;
|
||||
}
|
||||
quit_(code, new ExitStatus(code));
|
||||
};
|
||||
|
||||
/** @suppress {duplicate } */
|
||||
/** @param {boolean|number=} implicit */
|
||||
var exitJS = (status, implicit) => {
|
||||
EXITSTATUS = status;
|
||||
|
||||
checkUnflushedContent();
|
||||
|
||||
// if exit() was called explicitly, warn the user if the runtime isn't actually being shut down
|
||||
if (keepRuntimeAlive() && !implicit) {
|
||||
var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`;
|
||||
readyPromiseReject(msg);
|
||||
err(msg);
|
||||
}
|
||||
|
||||
_proc_exit(status);
|
||||
};
|
||||
var _exit = exitJS;
|
||||
|
||||
var PATH = {
|
||||
isAbs:(path) => path.charAt(0) === '/',
|
||||
splitPath:(filename) => {
|
||||
@@ -4208,6 +4031,367 @@ function dbg(...args) {
|
||||
return stream;
|
||||
},
|
||||
};
|
||||
function ___syscall_faccessat(dirfd, path, amode, flags) {
|
||||
try {
|
||||
|
||||
path = SYSCALLS.getStr(path);
|
||||
assert(flags === 0);
|
||||
path = SYSCALLS.calculateAt(dirfd, path);
|
||||
if (amode & ~7) {
|
||||
// need a valid mode
|
||||
return -28;
|
||||
}
|
||||
var lookup = FS.lookupPath(path, { follow: true });
|
||||
var node = lookup.node;
|
||||
if (!node) {
|
||||
return -44;
|
||||
}
|
||||
var perms = '';
|
||||
if (amode & 4) perms += 'r';
|
||||
if (amode & 2) perms += 'w';
|
||||
if (amode & 1) perms += 'x';
|
||||
if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) {
|
||||
return -2;
|
||||
}
|
||||
return 0;
|
||||
} catch (e) {
|
||||
if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;
|
||||
return -e.errno;
|
||||
}
|
||||
}
|
||||
|
||||
function ___syscall_fcntl64(fd, cmd, varargs) {
|
||||
SYSCALLS.varargs = varargs;
|
||||
try {
|
||||
|
||||
var stream = SYSCALLS.getStreamFromFD(fd);
|
||||
switch (cmd) {
|
||||
case 0: {
|
||||
var arg = SYSCALLS.get();
|
||||
if (arg < 0) {
|
||||
return -28;
|
||||
}
|
||||
while (FS.streams[arg]) {
|
||||
arg++;
|
||||
}
|
||||
var newStream;
|
||||
newStream = FS.dupStream(stream, arg);
|
||||
return newStream.fd;
|
||||
}
|
||||
case 1:
|
||||
case 2:
|
||||
return 0; // FD_CLOEXEC makes no sense for a single process.
|
||||
case 3:
|
||||
return stream.flags;
|
||||
case 4: {
|
||||
var arg = SYSCALLS.get();
|
||||
stream.flags |= arg;
|
||||
return 0;
|
||||
}
|
||||
case 12: {
|
||||
var arg = SYSCALLS.getp();
|
||||
var offset = 0;
|
||||
// We're always unlocked.
|
||||
HEAP16[(((arg)+(offset))>>1)] = 2;
|
||||
return 0;
|
||||
}
|
||||
case 13:
|
||||
case 14:
|
||||
return 0; // Pretend that the locking is successful.
|
||||
}
|
||||
return -28;
|
||||
} catch (e) {
|
||||
if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;
|
||||
return -e.errno;
|
||||
}
|
||||
}
|
||||
|
||||
function ___syscall_ioctl(fd, op, varargs) {
|
||||
SYSCALLS.varargs = varargs;
|
||||
try {
|
||||
|
||||
var stream = SYSCALLS.getStreamFromFD(fd);
|
||||
switch (op) {
|
||||
case 21509: {
|
||||
if (!stream.tty) return -59;
|
||||
return 0;
|
||||
}
|
||||
case 21505: {
|
||||
if (!stream.tty) return -59;
|
||||
if (stream.tty.ops.ioctl_tcgets) {
|
||||
var termios = stream.tty.ops.ioctl_tcgets(stream);
|
||||
var argp = SYSCALLS.getp();
|
||||
HEAP32[((argp)>>2)] = termios.c_iflag || 0;
|
||||
HEAP32[(((argp)+(4))>>2)] = termios.c_oflag || 0;
|
||||
HEAP32[(((argp)+(8))>>2)] = termios.c_cflag || 0;
|
||||
HEAP32[(((argp)+(12))>>2)] = termios.c_lflag || 0;
|
||||
for (var i = 0; i < 32; i++) {
|
||||
HEAP8[(argp + i)+(17)] = termios.c_cc[i] || 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case 21510:
|
||||
case 21511:
|
||||
case 21512: {
|
||||
if (!stream.tty) return -59;
|
||||
return 0; // no-op, not actually adjusting terminal settings
|
||||
}
|
||||
case 21506:
|
||||
case 21507:
|
||||
case 21508: {
|
||||
if (!stream.tty) return -59;
|
||||
if (stream.tty.ops.ioctl_tcsets) {
|
||||
var argp = SYSCALLS.getp();
|
||||
var c_iflag = HEAP32[((argp)>>2)];
|
||||
var c_oflag = HEAP32[(((argp)+(4))>>2)];
|
||||
var c_cflag = HEAP32[(((argp)+(8))>>2)];
|
||||
var c_lflag = HEAP32[(((argp)+(12))>>2)];
|
||||
var c_cc = []
|
||||
for (var i = 0; i < 32; i++) {
|
||||
c_cc.push(HEAP8[(argp + i)+(17)]);
|
||||
}
|
||||
return stream.tty.ops.ioctl_tcsets(stream.tty, op, { c_iflag, c_oflag, c_cflag, c_lflag, c_cc });
|
||||
}
|
||||
return 0; // no-op, not actually adjusting terminal settings
|
||||
}
|
||||
case 21519: {
|
||||
if (!stream.tty) return -59;
|
||||
var argp = SYSCALLS.getp();
|
||||
HEAP32[((argp)>>2)] = 0;
|
||||
return 0;
|
||||
}
|
||||
case 21520: {
|
||||
if (!stream.tty) return -59;
|
||||
return -28; // not supported
|
||||
}
|
||||
case 21531: {
|
||||
var argp = SYSCALLS.getp();
|
||||
return FS.ioctl(stream, op, argp);
|
||||
}
|
||||
case 21523: {
|
||||
// TODO: in theory we should write to the winsize struct that gets
|
||||
// passed in, but for now musl doesn't read anything on it
|
||||
if (!stream.tty) return -59;
|
||||
if (stream.tty.ops.ioctl_tiocgwinsz) {
|
||||
var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty);
|
||||
var argp = SYSCALLS.getp();
|
||||
HEAP16[((argp)>>1)] = winsize[0];
|
||||
HEAP16[(((argp)+(2))>>1)] = winsize[1];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case 21524: {
|
||||
// TODO: technically, this ioctl call should change the window size.
|
||||
// but, since emscripten doesn't have any concept of a terminal window
|
||||
// yet, we'll just silently throw it away as we do TIOCGWINSZ
|
||||
if (!stream.tty) return -59;
|
||||
return 0;
|
||||
}
|
||||
case 21515: {
|
||||
if (!stream.tty) return -59;
|
||||
return 0;
|
||||
}
|
||||
default: return -28; // not supported
|
||||
}
|
||||
} catch (e) {
|
||||
if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;
|
||||
return -e.errno;
|
||||
}
|
||||
}
|
||||
|
||||
function ___syscall_openat(dirfd, path, flags, varargs) {
|
||||
SYSCALLS.varargs = varargs;
|
||||
try {
|
||||
|
||||
path = SYSCALLS.getStr(path);
|
||||
path = SYSCALLS.calculateAt(dirfd, path);
|
||||
var mode = varargs ? SYSCALLS.get() : 0;
|
||||
return FS.open(path, flags, mode).fd;
|
||||
} catch (e) {
|
||||
if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;
|
||||
return -e.errno;
|
||||
}
|
||||
}
|
||||
|
||||
var _abort = () => {
|
||||
abort('native code called abort()');
|
||||
};
|
||||
|
||||
var _emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num);
|
||||
|
||||
var getHeapMax = () =>
|
||||
// Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate
|
||||
// full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side
|
||||
// for any code that deals with heap sizes, which would require special
|
||||
// casing all heap size related code to treat 0 specially.
|
||||
2147483648;
|
||||
|
||||
var growMemory = (size) => {
|
||||
var b = wasmMemory.buffer;
|
||||
var pages = (size - b.byteLength + 65535) / 65536;
|
||||
try {
|
||||
// round size grow request up to wasm page size (fixed 64KB per spec)
|
||||
wasmMemory.grow(pages); // .grow() takes a delta compared to the previous size
|
||||
updateMemoryViews();
|
||||
return 1 /*success*/;
|
||||
} catch(e) {
|
||||
err(`growMemory: Attempted to grow heap from ${b.byteLength} bytes to ${size} bytes, but got error: ${e}`);
|
||||
}
|
||||
// implicit 0 return to save code size (caller will cast "undefined" into 0
|
||||
// anyhow)
|
||||
};
|
||||
var _emscripten_resize_heap = (requestedSize) => {
|
||||
var oldSize = HEAPU8.length;
|
||||
// With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.
|
||||
requestedSize >>>= 0;
|
||||
// With multithreaded builds, races can happen (another thread might increase the size
|
||||
// in between), so return a failure, and let the caller retry.
|
||||
assert(requestedSize > oldSize);
|
||||
|
||||
// Memory resize rules:
|
||||
// 1. Always increase heap size to at least the requested size, rounded up
|
||||
// to next page multiple.
|
||||
// 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap
|
||||
// geometrically: increase the heap size according to
|
||||
// MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most
|
||||
// overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB).
|
||||
// 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap
|
||||
// linearly: increase the heap size by at least
|
||||
// MEMORY_GROWTH_LINEAR_STEP bytes.
|
||||
// 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by
|
||||
// MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest
|
||||
// 4. If we were unable to allocate as much memory, it may be due to
|
||||
// over-eager decision to excessively reserve due to (3) above.
|
||||
// Hence if an allocation fails, cut down on the amount of excess
|
||||
// growth, in an attempt to succeed to perform a smaller allocation.
|
||||
|
||||
// A limit is set for how much we can grow. We should not exceed that
|
||||
// (the wasm binary specifies it, so if we tried, we'd fail anyhow).
|
||||
var maxHeapSize = getHeapMax();
|
||||
if (requestedSize > maxHeapSize) {
|
||||
err(`Cannot enlarge memory, requested ${requestedSize} bytes, but the limit is ${maxHeapSize} bytes!`);
|
||||
return false;
|
||||
}
|
||||
|
||||
var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple;
|
||||
|
||||
// Loop through potential heap size increases. If we attempt a too eager
|
||||
// reservation that fails, cut down on the attempted size and reserve a
|
||||
// smaller bump instead. (max 3 times, chosen somewhat arbitrarily)
|
||||
for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
|
||||
var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth
|
||||
// but limit overreserving (default to capping at +96MB overgrowth at most)
|
||||
overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 );
|
||||
|
||||
var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));
|
||||
|
||||
var replacement = growMemory(newSize);
|
||||
if (replacement) {
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
err(`Failed to grow the heap from ${oldSize} bytes to ${newSize} bytes, not enough memory!`);
|
||||
return false;
|
||||
};
|
||||
|
||||
var ENV = {
|
||||
};
|
||||
|
||||
var getExecutableName = () => {
|
||||
return thisProgram || './this.program';
|
||||
};
|
||||
var getEnvStrings = () => {
|
||||
if (!getEnvStrings.strings) {
|
||||
// Default values.
|
||||
// Browser language detection #8751
|
||||
var lang = ((typeof navigator == 'object' && navigator.languages && navigator.languages[0]) || 'C').replace('-', '_') + '.UTF-8';
|
||||
var env = {
|
||||
'USER': 'web_user',
|
||||
'LOGNAME': 'web_user',
|
||||
'PATH': '/',
|
||||
'PWD': '/',
|
||||
'HOME': '/home/web_user',
|
||||
'LANG': lang,
|
||||
'_': getExecutableName()
|
||||
};
|
||||
// Apply the user-provided values, if any.
|
||||
for (var x in ENV) {
|
||||
// x is a key in ENV; if ENV[x] is undefined, that means it was
|
||||
// explicitly set to be so. We allow user code to do that to
|
||||
// force variables with default values to remain unset.
|
||||
if (ENV[x] === undefined) delete env[x];
|
||||
else env[x] = ENV[x];
|
||||
}
|
||||
var strings = [];
|
||||
for (var x in env) {
|
||||
strings.push(`${x}=${env[x]}`);
|
||||
}
|
||||
getEnvStrings.strings = strings;
|
||||
}
|
||||
return getEnvStrings.strings;
|
||||
};
|
||||
|
||||
var stringToAscii = (str, buffer) => {
|
||||
for (var i = 0; i < str.length; ++i) {
|
||||
assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff));
|
||||
HEAP8[buffer++] = str.charCodeAt(i);
|
||||
}
|
||||
// Null-terminate the string
|
||||
HEAP8[buffer] = 0;
|
||||
};
|
||||
var _environ_get = (__environ, environ_buf) => {
|
||||
var bufSize = 0;
|
||||
getEnvStrings().forEach((string, i) => {
|
||||
var ptr = environ_buf + bufSize;
|
||||
HEAPU32[(((__environ)+(i*4))>>2)] = ptr;
|
||||
stringToAscii(string, ptr);
|
||||
bufSize += string.length + 1;
|
||||
});
|
||||
return 0;
|
||||
};
|
||||
|
||||
var _environ_sizes_get = (penviron_count, penviron_buf_size) => {
|
||||
var strings = getEnvStrings();
|
||||
HEAPU32[((penviron_count)>>2)] = strings.length;
|
||||
var bufSize = 0;
|
||||
strings.forEach((string) => bufSize += string.length + 1);
|
||||
HEAPU32[((penviron_buf_size)>>2)] = bufSize;
|
||||
return 0;
|
||||
};
|
||||
|
||||
|
||||
var runtimeKeepaliveCounter = 0;
|
||||
var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0;
|
||||
var _proc_exit = (code) => {
|
||||
EXITSTATUS = code;
|
||||
if (!keepRuntimeAlive()) {
|
||||
Module['onExit']?.(code);
|
||||
ABORT = true;
|
||||
}
|
||||
quit_(code, new ExitStatus(code));
|
||||
};
|
||||
|
||||
/** @suppress {duplicate } */
|
||||
/** @param {boolean|number=} implicit */
|
||||
var exitJS = (status, implicit) => {
|
||||
EXITSTATUS = status;
|
||||
|
||||
checkUnflushedContent();
|
||||
|
||||
// if exit() was called explicitly, warn the user if the runtime isn't actually being shut down
|
||||
if (keepRuntimeAlive() && !implicit) {
|
||||
var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`;
|
||||
readyPromiseReject(msg);
|
||||
err(msg);
|
||||
}
|
||||
|
||||
_proc_exit(status);
|
||||
};
|
||||
var _exit = exitJS;
|
||||
|
||||
function _fd_close(fd) {
|
||||
try {
|
||||
|
||||
@@ -4715,6 +4899,14 @@ var wasmImports = {
|
||||
/** @export */
|
||||
__cxa_throw: ___cxa_throw,
|
||||
/** @export */
|
||||
__syscall_faccessat: ___syscall_faccessat,
|
||||
/** @export */
|
||||
__syscall_fcntl64: ___syscall_fcntl64,
|
||||
/** @export */
|
||||
__syscall_ioctl: ___syscall_ioctl,
|
||||
/** @export */
|
||||
__syscall_openat: ___syscall_openat,
|
||||
/** @export */
|
||||
abort: _abort,
|
||||
/** @export */
|
||||
emscripten_memcpy_js: _emscripten_memcpy_js,
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user