summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xemcc5
-rw-r--r--src/analyzer.js16
-rw-r--r--src/intertyper.js11
-rw-r--r--src/library.js12
-rw-r--r--src/library_browser.js1
-rw-r--r--src/library_fs.js22
-rw-r--r--src/library_gl.js46
-rw-r--r--src/library_memfs.js66
-rw-r--r--src/library_sdl.js7
-rw-r--r--src/postamble.js1
-rw-r--r--src/settings.js5
-rw-r--r--src/shell.js7
-rw-r--r--tests/cases/phi24_ta2.ll1
-rwxr-xr-xtests/runner.py4
-rw-r--r--tests/sockets/webrtc_host.c89
-rw-r--r--tests/sockets/webrtc_peer.c81
-rw-r--r--tests/test_browser.py110
-rw-r--r--tests/test_sockets.py68
-rw-r--r--tools/find_bigfuncs.py4
-rw-r--r--tools/js-optimizer.js14
-rw-r--r--tools/test-js-optimizer-asm-outline1-output.js159
-rw-r--r--tools/test-js-optimizer-asm-outline2-output.js790
22 files changed, 999 insertions, 520 deletions
diff --git a/emcc b/emcc
index b63eada0..df2ef38c 100755
--- a/emcc
+++ b/emcc
@@ -137,7 +137,7 @@ Options that are modified or new in %s include:
opt levels, see apply_opt_level() in
tools/shared.py and also src/settings.js.)
-O2 As -O1, plus the relooper (loop recreation),
- LLVM -O2 optimizations, and
+ LLVM -O3 optimizations, and
-s ALIASING_FUNCTION_POINTERS=1
@@ -1621,9 +1621,6 @@ try:
js_optimizer_queue += [get_eliminate(), 'simplifyExpressions']
- if shared.Settings.RELOOP and not shared.Settings.ASM_JS:
- js_optimizer_queue += ['optimizeShiftsAggressive', get_eliminate()] # aggressive shifts optimization requires loops, it breaks on switches
-
if closure and not shared.Settings.ASM_JS:
flush_js_optimizer_queue()
diff --git a/src/analyzer.js b/src/analyzer.js
index 931ce421..2a7d64f5 100644
--- a/src/analyzer.js
+++ b/src/analyzer.js
@@ -953,9 +953,23 @@ function analyzer(data, sidePass) {
if (type[0] == '{' || type[0] == '<') {
type = nonPointing;
var packed = type[0] == '<';
+ var internal = type;
+ if (packed) {
+ if (internal[internal.length-1] != '>') {
+ warnOnce('ignoring type ' + internal);
+ return; // function pointer or such
+ }
+ internal = internal.substr(1, internal.length-2);
+ }
+ assert(internal[0] == '{', internal);
+ if (internal[internal.length-1] != '}') {
+ warnOnce('ignoring type ' + internal);
+ return; // function pointer or such
+ }
+ internal = internal.substr(2, internal.length-4);
Types.types[type] = {
name_: type,
- fields: splitTokenList(tokenize(type.substr(2 + packed, type.length - 4 - 2*packed)).tokens).map(function(segment) {
+ fields: splitTokenList(tokenize(internal).tokens).map(function(segment) {
return segment[0].text;
}),
packed: packed,
diff --git a/src/intertyper.js b/src/intertyper.js
index 3fc840c4..31e97bd0 100644
--- a/src/intertyper.js
+++ b/src/intertyper.js
@@ -365,8 +365,17 @@ function intertyper(data, sidePass, baseLineNums) {
}
if (tokensLength >= 3 && (token0Text == 'call' || token1Text == 'call'))
return 'Call';
- if (token0Text == 'target')
+ if (token0Text == 'target') {
+ if (token1Text == 'triple') {
+ var triple = item.tokens[3].text;
+ triple = triple.substr(1, triple.length-2);
+ var expected = TARGET_LE32 ? 'le32-unknown-nacl' : 'i386-pc-linux-gnu';
+ if (triple !== expected) {
+ warn('using an unexpected LLVM triple: ' + [triple, ' !== ', expected] + ' (are you using emcc for everything and not clang?)');
+ }
+ }
return '/dev/null';
+ }
if (token0Text == ';')
return '/dev/null';
if (tokensLength >= 3 && token0Text == 'invoke')
diff --git a/src/library.js b/src/library.js
index 815badc1..9e78db13 100644
--- a/src/library.js
+++ b/src/library.js
@@ -100,7 +100,7 @@ LibraryManager.library = {
}
var entries;
try {
- entries = FS.readdir(stream);
+ entries = FS.readdir(stream.path);
} catch (e) {
return FS.handleFSError(e);
}
@@ -478,8 +478,6 @@ LibraryManager.library = {
open: function(path, oflag, varargs) {
// int open(const char *path, int oflag, ...);
// http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html
- // NOTE: This implementation tries to mimic glibc rather than strictly
- // following the POSIX standard.
var mode = {{{ makeGetValue('varargs', 0, 'i32') }}};
path = Pointer_stringify(path);
try {
@@ -7237,7 +7235,7 @@ LibraryManager.library = {
socket__deps: ['$FS', '$Sockets'],
socket: function(family, type, protocol) {
var INCOMING_QUEUE_LENGTH = 64;
- var stream = FS.createStream({
+ var info = FS.createStream({
addr: null,
port: null,
inQueue: new CircularBuffer(INCOMING_QUEUE_LENGTH),
@@ -7246,7 +7244,7 @@ LibraryManager.library = {
socket: true,
stream_ops: {}
});
- assert(stream.fd < 64); // select() assumes socket fd values are in 0..63
+ assert(info.fd < 64); // select() assumes socket fd values are in 0..63
var stream = type == {{{ cDefine('SOCK_STREAM') }}};
if (protocol) {
assert(stream == (protocol == {{{ cDefine('IPPROTO_TCP') }}})); // if stream, must be tcp
@@ -7359,8 +7357,7 @@ LibraryManager.library = {
}
};
};
-
- return stream.fd;
+ return info.fd;
},
mkport__deps: ['$Sockets'],
@@ -7454,6 +7451,7 @@ LibraryManager.library = {
buffer.set(data, info.header.byteLength);
connection.send('unreliable', buffer.buffer);
+ return ret;
},
recvmsg__deps: ['$FS', '$Sockets', 'bind', '__setErrNo', '$ERRNO_CODES', 'htons'],
diff --git a/src/library_browser.js b/src/library_browser.js
index f65791e4..511e158e 100644
--- a/src/library_browser.js
+++ b/src/library_browser.js
@@ -6,6 +6,7 @@ mergeInto(LibraryManager.library, {
$Browser__deps: ['$PATH'],
$Browser__postset: 'Module["requestFullScreen"] = function(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };\n' + // exports
'Module["requestAnimationFrame"] = function(func) { Browser.requestAnimationFrame(func) };\n' +
+ 'Module["setCanvasSize"] = function(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };\n' +
'Module["pauseMainLoop"] = function() { Browser.mainLoop.pause() };\n' +
'Module["resumeMainLoop"] = function() { Browser.mainLoop.resume() };\n' +
'Module["getUserMedia"] = function() { Browser.getUserMedia() }',
diff --git a/src/library_fs.js b/src/library_fs.js
index f18e4809..51341a3e 100644
--- a/src/library_fs.js
+++ b/src/library_fs.js
@@ -56,7 +56,7 @@ mergeInto(LibraryManager.library, {
for (var i = 0; i < name.length; i++) {
hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
}
- return (parentid + hash) % FS.name_table.length;
+ return ((parentid + hash) >>> 0) % FS.name_table.length;
},
hashAddNode: function(node) {
var hash = FS.hashName(node.parent.id, node.name);
@@ -735,6 +735,9 @@ mergeInto(LibraryManager.library, {
});
// use a custom read function
stream_ops.read = function(stream, buffer, offset, length, position) {
+ if (!FS.forceLoadFile(node)) {
+ throw new FS.ErrnoError(ERRNO_CODES.EIO);
+ }
var contents = stream.node.contents;
var size = Math.min(contents.length - position, length);
if (contents.slice) { // normal array
@@ -1040,7 +1043,7 @@ mergeInto(LibraryManager.library, {
FS.hashRemoveNode(old_node);
// do the underlying fs rename
try {
- old_node.node_ops.rename(old_node, new_dir, new_name);
+ old_dir.node_ops.rename(old_node, new_dir, new_name);
} catch (e) {
throw e;
} finally {
@@ -1067,6 +1070,14 @@ mergeInto(LibraryManager.library, {
parent.node_ops.rmdir(parent, name);
FS.destroyNode(node);
},
+ readdir: function(path) {
+ var lookup = FS.lookupPath(path, { follow: true });
+ var node = lookup.node;
+ if (!node.node_ops.readdir) {
+ throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
+ }
+ return node.node_ops.readdir(node);
+ },
unlink: function(path) {
var lookup = FS.lookupPath(path, { parent: true });
var parent = lookup.node;
@@ -1207,6 +1218,7 @@ mergeInto(LibraryManager.library, {
open: function(path, flags, mode, fd_start, fd_end) {
path = PATH.normalize(path);
flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;
+ mode = typeof mode === 'undefined' ? 0666 : mode;
if ((flags & {{{ cDefine('O_CREAT') }}})) {
mode = (mode & {{{ cDefine('S_IALLUGO') }}}) | {{{ cDefine('S_IFREG') }}};
} else {
@@ -1285,12 +1297,6 @@ mergeInto(LibraryManager.library, {
}
return stream.stream_ops.llseek(stream, offset, whence);
},
- readdir: function(stream) {
- if (!stream.stream_ops.readdir) {
- throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);
- }
- return stream.stream_ops.readdir(stream);
- },
read: function(stream, buffer, offset, length, position) {
if (length < 0 || position < 0) {
throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
diff --git a/src/library_gl.js b/src/library_gl.js
index 8c724245..89a13bbe 100644
--- a/src/library_gl.js
+++ b/src/library_gl.js
@@ -1285,7 +1285,7 @@ var LibraryGL = {
return Module.ctx.isFramebuffer(fb);
},
-#if DISABLE_GL_EMULATION == 0
+#if LEGACY_GL_EMULATION
// GL emulation: provides misc. functionality not present in OpenGL ES 2.0 or WebGL
@@ -1323,7 +1323,7 @@ var LibraryGL = {
GLEmulation.fogColor = new Float32Array(4);
// Add some emulation workarounds
- Module.printErr('WARNING: using emscripten GL emulation. This is a collection of limited workarounds, do not expect it to work. (If you do not want this, build with -s DISABLE_GL_EMULATION=1)');
+ Module.printErr('WARNING: using emscripten GL emulation. This is a collection of limited workarounds, do not expect it to work.');
#if GL_UNSAFE_OPTS == 0
Module.printErr('WARNING: using emscripten GL emulation unsafe opts. If weirdness happens, try -s GL_UNSAFE_OPTS=0');
#endif
@@ -1618,17 +1618,15 @@ var LibraryGL = {
var glCompileShader = _glCompileShader;
_glCompileShader = function(shader) {
Module.ctx.compileShader(GL.shaders[shader]);
+#if GL_DEBUG
if (!Module.ctx.getShaderParameter(GL.shaders[shader], Module.ctx.COMPILE_STATUS)) {
Module.printErr('Failed to compile shader: ' + Module.ctx.getShaderInfoLog(GL.shaders[shader]));
Module.printErr('Info: ' + JSON.stringify(GL.shaderInfos[shader]));
-#if GL_DEBUG
Module.printErr('Original source: ' + GL.shaderOriginalSources[shader]);
Module.printErr('Source: ' + GL.shaderSources[shader]);
throw 'Shader compilation halt';
-#else
- Module.printErr('Enable GL_DEBUG to see shader source');
-#endif
}
+#endif
};
GL.programShaders = {};
@@ -4202,7 +4200,31 @@ var LibraryGL = {
glBindVertexArrayOES: 'glBindVertexArray',
glFramebufferTexture2DOES: 'glFramebufferTexture2D',
-#endif // DISABLE_GL_EMULATION == 0
+#else // LEGACY_GL_EMULATION
+
+ // Warn if code tries to use various emulation stuff, when emulation is disabled
+ glVertexPointer__deps: [function() {
+ error('Legacy GL function (glVertexPointer) called. You need to compile with -s LEGACY_GL_EMULATION=1 to enable legacy GL emulation.');
+ }],
+ glVertexPointer: function(){},
+ glGenVertexArrays__deps: [function() {
+ error('Legacy GL function (glGenVertexArrays) called. You need to compile with -s LEGACY_GL_EMULATION=1 to enable legacy GL emulation.');
+ }],
+ glGenVertexArrays: function(){},
+ glMatrixMode__deps: [function() {
+ error('Legacy GL function (glMatrixMode) called. You need to compile with -s LEGACY_GL_EMULATION=1 to enable legacy GL emulation.');
+ }],
+ glMatrixMode: function(){},
+ glBegin__deps: [function() {
+ error('Legacy GL function (glBegin) called. You need to compile with -s LEGACY_GL_EMULATION=1 to enable legacy GL emulation.');
+ }],
+ glBegin: function(){},
+ glLoadIdentity__deps: [function() {
+ error('Legacy GL function (glLoadIdentity) called. You need to compile with -s LEGACY_GL_EMULATION=1 to enable legacy GL emulation.');
+ }],
+ glLoadIdentity: function(){},
+
+#endif // LEGACY_GL_EMULATION
// GLU
@@ -4438,7 +4460,7 @@ var LibraryGL = {
autoAddDeps(LibraryGL, '$GL');
-if (!DISABLE_GL_EMULATION) {
+if (LEGACY_GL_EMULATION) {
// Emulation requires everything else, potentially
LibraryGL.$GLEmulation__deps = LibraryGL.$GLEmulation__deps.slice(0); // the __deps object is shared
var glFuncs = [];
@@ -4455,11 +4477,11 @@ if (!DISABLE_GL_EMULATION) {
}
});
- if (FORCE_GL_EMULATION) {
- LibraryGL.glDrawElements__deps = LibraryGL.glDrawElements__deps.concat('$GLEmulation');
- LibraryGL.glDrawArrays__deps = LibraryGL.glDrawArrays__deps.concat('$GLEmulation');
- }
+ LibraryGL.glDrawElements__deps = LibraryGL.glDrawElements__deps.concat('$GLEmulation');
+ LibraryGL.glDrawArrays__deps = LibraryGL.glDrawArrays__deps.concat('$GLEmulation');
}
mergeInto(LibraryManager.library, LibraryGL);
+assert(!(FULL_ES2 && LEGACY_GL_EMULATION), 'cannot emulate both ES2 and legacy GL');
+
diff --git a/src/library_memfs.js b/src/library_memfs.js
index a044e0c6..0fa6cdfb 100644
--- a/src/library_memfs.js
+++ b/src/library_memfs.js
@@ -10,16 +10,48 @@ mergeInto(LibraryManager.library, {
throw new FS.ErrnoError(ERRNO_CODES.EPERM);
}
var node = FS.createNode(parent, name, mode, dev);
- node.node_ops = MEMFS.node_ops;
if (FS.isDir(node.mode)) {
- node.stream_ops = MEMFS.stream_ops;
+ node.node_ops = {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr,
+ lookup: MEMFS.node_ops.lookup,
+ mknod: MEMFS.node_ops.mknod,
+ mknod: MEMFS.node_ops.mknod,
+ rename: MEMFS.node_ops.rename,
+ unlink: MEMFS.node_ops.unlink,
+ rmdir: MEMFS.node_ops.rmdir,
+ readdir: MEMFS.node_ops.readdir,
+ symlink: MEMFS.node_ops.symlink
+ };
+ node.stream_ops = {
+ llseek: MEMFS.stream_ops.llseek
+ };
node.contents = {};
} else if (FS.isFile(node.mode)) {
- node.stream_ops = MEMFS.stream_ops;
+ node.node_ops = {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr
+ };
+ node.stream_ops = {
+ llseek: MEMFS.stream_ops.llseek,
+ read: MEMFS.stream_ops.read,
+ write: MEMFS.stream_ops.write,
+ allocate: MEMFS.stream_ops.allocate,
+ mmap: MEMFS.stream_ops.mmap
+ };
node.contents = [];
} else if (FS.isLink(node.mode)) {
- node.stream_ops = MEMFS.stream_ops;
+ node.node_ops = {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr,
+ readlink: MEMFS.node_ops.readlink
+ };
+ node.stream_ops = {};
} else if (FS.isChrdev(node.mode)) {
+ node.node_ops = {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr
+ };
node.stream_ops = FS.chrdev_stream_ops;
}
node.timestamp = Date.now();
@@ -106,6 +138,16 @@ mergeInto(LibraryManager.library, {
}
delete parent.contents[name];
},
+ readdir: function(node) {
+ var entries = ['.', '..']
+ for (var key in node.contents) {
+ if (!node.contents.hasOwnProperty(key)) {
+ continue;
+ }
+ entries.push(key);
+ }
+ return entries;
+ },
symlink: function(parent, newname, oldpath) {
var node = MEMFS.create_node(parent, newname, 0777 | {{{ cDefine('S_IFLNK') }}}, 0);
node.link = oldpath;
@@ -119,19 +161,6 @@ mergeInto(LibraryManager.library, {
},
},
stream_ops: {
- open: function(stream) {
- if (FS.isDir(stream.node.mode)) {
- // cache off the directory entries when open'd
- var entries = ['.', '..']
- for (var key in stream.node.contents) {
- if (!stream.node.contents.hasOwnProperty(key)) {
- continue;
- }
- entries.push(key);
- }
- stream.entries = entries;
- }
- },
read: function(stream, buffer, offset, length, position) {
var contents = stream.node.contents;
var size = Math.min(contents.length - position, length);
@@ -172,9 +201,6 @@ mergeInto(LibraryManager.library, {
stream.position = position;
return position;
},
- readdir: function(stream) {
- return stream.entries;
- },
allocate: function(stream, offset, length) {
var contents = stream.node.contents;
var limit = offset + length;
diff --git a/src/library_sdl.js b/src/library_sdl.js
index 92cfc7e5..6cc337e8 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -258,7 +258,7 @@ var LibrarySDL = {
makeSurface: function(width, height, flags, usePageCanvas, source, rmask, gmask, bmask, amask) {
flags = flags || 0;
- var surf = _malloc(14*Runtime.QUANTUM_SIZE); // SDL_Surface has 14 fields of quantum size
+ var surf = _malloc(15*Runtime.QUANTUM_SIZE); // SDL_Surface has 15 fields of quantum size
var buffer = _malloc(width*height*4); // TODO: only allocate when locked the first time
var pixelFormat = _malloc(18*Runtime.QUANTUM_SIZE);
flags |= 1; // SDL_HWSURFACE - this tells SDL_MUSTLOCK that this needs to be locked
@@ -755,6 +755,11 @@ var LibrarySDL = {
return depth; // all modes are ok.
},
+ SDL_AudioDriverName__deps: ['SDL_VideoDriverName'],
+ SDL_AudioDriverName: function(buf, max_size) {
+ return _SDL_VideoDriverName(buf, max_size);
+ },
+
SDL_VideoDriverName: function(buf, max_size) {
if (SDL.startTime === null) {
return 0; //return NULL
diff --git a/src/postamble.js b/src/postamble.js
index c4ca3aae..08c3a9d8 100644
--- a/src/postamble.js
+++ b/src/postamble.js
@@ -127,6 +127,7 @@ Module['exit'] = Module.exit = exit;
function abort(text) {
if (text) {
Module.print(text);
+ Module.printErr(text);
}
ABORT = true;
diff --git a/src/settings.js b/src/settings.js
index 3ecac040..8757f7b9 100644
--- a/src/settings.js
+++ b/src/settings.js
@@ -191,9 +191,8 @@ var GL_TESTING = 0; // When enabled, sets preserveDrawingBuffer in the context,
var GL_MAX_TEMP_BUFFER_SIZE = 2097152; // How large GL emulation temp buffers are
var GL_UNSAFE_OPTS = 1; // Enables some potentially-unsafe optimizations in GL emulation code
var FULL_ES2 = 0; // Forces support for all GLES2 features, not just the WebGL-friendly subset.
-var FORCE_GL_EMULATION = 0; // Forces inclusion of full GL emulation code.
-var DISABLE_GL_EMULATION = 0; // Disable inclusion of full GL emulation code. Useful when you don't want emulation
- // but do need INCLUDE_FULL_LIBRARY or MAIN_MODULE.
+var LEGACY_GL_EMULATION = 0; // Includes code to emulate various desktop GL features. Incomplete but useful
+ // in some cases, see https://github.com/kripken/emscripten/wiki/OpenGL-support
var STB_IMAGE = 0; // Enables building of stb-image, a tiny public-domain library for decoding images, allowing
// decoding of images without using the browser's built-in decoders. The benefit is that this
diff --git a/src/shell.js b/src/shell.js
index bac4eaa3..f91aa96a 100644
--- a/src/shell.js
+++ b/src/shell.js
@@ -74,7 +74,12 @@ else if (ENVIRONMENT_IS_SHELL) {
Module['print'] = print;
if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm
- Module['read'] = read;
+ if (typeof read != 'undefined') {
+ Module['read'] = read;
+ } else {
+ Module['read'] = function() { throw 'no read() available (jsc?)' };
+ }
+
Module['readBinary'] = function(f) {
return read(f, 'binary');
};
diff --git a/tests/cases/phi24_ta2.ll b/tests/cases/phi24_ta2.ll
index 4894d5e6..2d9b6646 100644
--- a/tests/cases/phi24_ta2.ll
+++ b/tests/cases/phi24_ta2.ll
@@ -252,6 +252,7 @@ target triple = "i386-pc-linux-gnu"
@g_287 = internal constant i32 -1, align 4
define i32 @main(i32 %argc, i8** nocapture %argv) nounwind {
+ %msgdummy = alloca { i8*, { i64, i8* } (i8*)* } ; test for parsing of this kind of stuff, compilation-only test
%p_6.i.i = alloca %union.U3, align 8
%1 = icmp eq i32 %argc, 2
br i1 %1, label %2, label %7
diff --git a/tests/runner.py b/tests/runner.py
index 2f508dfc..8feb83f9 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -480,7 +480,7 @@ def server_func(dir, q):
if 'report_' in s.path:
q.put(s.path)
else:
- filename = s.path[1:]
+ filename = s.path.split('?')[0][1:]
if os.path.exists(filename):
s.send_response(200)
s.send_header("Content-type", "text/html")
@@ -649,6 +649,7 @@ class BrowserCore(RunnerCore):
self.reftest(path_from_root('tests', reference))
args = args + ['--pre-js', 'reftest.js', '-s', 'GL_TESTING=1']
Popen([PYTHON, EMCC, temp_filepath, '-o', outfile] + args).communicate()
+ assert os.path.exists(outfile)
if type(expected) is str: expected = [expected]
self.run_browser(outfile, message, ['/report_result?' + e for e in expected])
@@ -772,3 +773,4 @@ an individual test with
testRunner = unittest.TextTestRunner(verbosity=2)
for suite in suites:
testRunner.run(suite)
+
diff --git a/tests/sockets/webrtc_host.c b/tests/sockets/webrtc_host.c
new file mode 100644
index 00000000..770e59e0
--- /dev/null
+++ b/tests/sockets/webrtc_host.c
@@ -0,0 +1,89 @@
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <assert.h>
+#if EMSCRIPTEN
+#include <emscripten.h>
+#endif
+
+#define EXPECTED_BYTES 5
+#define BUFLEN 16
+
+int result = 0;
+int sock;
+char buf[BUFLEN];
+char expected[] = "emscripten";
+struct sockaddr_in si_host,
+ si_peer;
+struct iovec iov[1];
+struct msghdr hdr;
+int done = 0;
+
+void iter(void* arg) {
+ int n;
+ n = recvmsg(sock, &hdr, 0);
+
+ if(0 < n) {
+ done = 1;
+ fprintf(stderr, "received %d bytes: %s", n, (char*)hdr.msg_iov[0].iov_base);
+
+ shutdown(sock, SHUT_RDWR);
+ close(sock);
+
+#if EMSCRIPTEN
+ int result = 1;
+ REPORT_RESULT();
+ exit(EXIT_SUCCESS);
+ emscripten_cancel_main_loop();
+#endif
+ } else if(EWOULDBLOCK != errno) {
+ perror("recvmsg failed");
+ exit(EXIT_FAILURE);
+ emscripten_cancel_main_loop();
+ }
+}
+
+int main(void)
+{
+ memset(&si_host, 0, sizeof(struct sockaddr_in));
+ memset(&si_peer, 0, sizeof(struct sockaddr_in));
+
+ si_host.sin_family = AF_INET;
+ si_host.sin_port = htons(8991);
+ si_host.sin_addr.s_addr = htonl(INADDR_ANY);
+
+ if(-1 == (sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP))) {
+ perror("cannot create host socket");
+ exit(EXIT_FAILURE);
+ }
+
+ if(-1 == bind(sock, (struct sockaddr*)&si_host, sizeof(struct sockaddr))) {
+ perror("cannot bind host socket");
+ exit(EXIT_FAILURE);
+ }
+
+ iov[0].iov_base = buf;
+ iov[0].iov_len = sizeof(buf);
+
+ memset (&hdr, 0, sizeof (struct msghdr));
+
+ hdr.msg_name = &si_peer;
+ hdr.msg_namelen = sizeof(struct sockaddr_in);
+ hdr.msg_iov = iov;
+ hdr.msg_iovlen = 1;
+
+#if EMSCRIPTEN
+ emscripten_set_main_loop(iter, 0, 0);
+#else
+ while (!done) iter(NULL);
+#endif
+
+ return EXIT_SUCCESS;
+} \ No newline at end of file
diff --git a/tests/sockets/webrtc_peer.c b/tests/sockets/webrtc_peer.c
new file mode 100644
index 00000000..d24979e7
--- /dev/null
+++ b/tests/sockets/webrtc_peer.c
@@ -0,0 +1,81 @@
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <assert.h>
+#if EMSCRIPTEN
+#include <emscripten.h>
+#endif
+
+#define EXPECTED_BYTES 5
+#define BUFLEN 16
+#define HOST_ADDR "10.0.0.1"
+
+int result = 0;
+int sock;
+char buf[16] = "emscripten";
+struct sockaddr_in si_host;
+struct iovec iov[1];
+struct msghdr hdr;
+int done = 0;
+
+void iter(void* arg) {
+ int n;
+ n = sendmsg(sock, &hdr, 0);
+
+ if(0 < n) {
+ done = 1;
+ fprintf(stderr, "sent %d bytes: %s", n, (char*)hdr.msg_iov[0].iov_base);
+
+ shutdown(sock, SHUT_RDWR);
+ close(sock);
+
+ exit(EXIT_SUCCESS);
+ emscripten_cancel_main_loop();
+ } else if(EWOULDBLOCK != errno) {
+ perror("sendmsg failed");
+ exit(EXIT_FAILURE);
+ emscripten_cancel_main_loop();
+ }
+}
+
+int main(void)
+{
+ memset(&si_host, 0, sizeof(struct sockaddr_in));
+
+ si_host.sin_family = AF_INET;
+ si_host.sin_port = htons(8991);
+ if(0 == inet_pton(AF_INET, HOST_ADDR, &si_host.sin_addr)) {
+ perror("inet_aton failed");
+ exit(EXIT_FAILURE);
+ }
+
+ if(-1 == (sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP))) {
+ perror("cannot create socket");
+ exit(EXIT_FAILURE);
+ }
+
+ iov[0].iov_base = buf;
+ iov[0].iov_len = sizeof(buf);
+
+ memset (&hdr, 0, sizeof (struct msghdr));
+
+ hdr.msg_name = &si_host;
+ hdr.msg_namelen = sizeof(struct sockaddr_in);
+ hdr.msg_iov = iov;
+ hdr.msg_iovlen = 1;
+
+#if EMSCRIPTEN
+ emscripten_set_main_loop(iter, 0, 0);
+#else
+ while (!done) iter(NULL);
+#endif
+
+ return EXIT_SUCCESS;
+} \ No newline at end of file
diff --git a/tests/test_browser.py b/tests/test_browser.py
index 60c030aa..cd5668a3 100644
--- a/tests/test_browser.py
+++ b/tests/test_browser.py
@@ -620,7 +620,7 @@ Press any key to continue.'''
def test_sdl_canvas(self):
open(os.path.join(self.get_dir(), 'sdl_canvas.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl_canvas.c')).read()))
- Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl_canvas.c'), '-o', 'page.html']).communicate()
+ Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl_canvas.c'), '-o', 'page.html', '-s', 'LEGACY_GL_EMULATION=1']).communicate()
self.run_browser('page.html', '', '/report_result?1')
def test_sdl_key(self):
@@ -843,50 +843,50 @@ Press any key to continue.'''
def test_sdl_ogl(self):
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.btest('sdl_ogl.c', reference='screenshot-gray-purple.png', reference_slack=1,
- args=['-O2', '--minify', '0', '--preload-file', 'screenshot.png'],
+ args=['-O2', '--minify', '0', '--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'],
message='You should see an image with gray at the top.')
def test_sdl_ogl_defaultmatrixmode(self):
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.btest('sdl_ogl_defaultMatrixMode.c', reference='screenshot-gray-purple.png', reference_slack=1,
- args=['--minify', '0', '--preload-file', 'screenshot.png'],
+ args=['--minify', '0', '--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'],
message='You should see an image with gray at the top.')
def test_sdl_ogl_p(self):
# Immediate mode with pointers
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.btest('sdl_ogl_p.c', reference='screenshot-gray.png', reference_slack=1,
- args=['--preload-file', 'screenshot.png'],
+ args=['--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'],
message='You should see an image with gray at the top.')
def test_sdl_fog_simple(self):
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.btest('sdl_fog_simple.c', reference='screenshot-fog-simple.png',
- args=['-O2', '--minify', '0', '--preload-file', 'screenshot.png'],
+ args=['-O2', '--minify', '0', '--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'],
message='You should see an image with fog.')
def test_sdl_fog_negative(self):
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.btest('sdl_fog_negative.c', reference='screenshot-fog-negative.png',
- args=['--preload-file', 'screenshot.png'],
+ args=['--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'],
message='You should see an image with fog.')
def test_sdl_fog_density(self):
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.btest('sdl_fog_density.c', reference='screenshot-fog-density.png',
- args=['--preload-file', 'screenshot.png'],
+ args=['--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'],
message='You should see an image with fog.')
def test_sdl_fog_exp2(self):
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.btest('sdl_fog_exp2.c', reference='screenshot-fog-exp2.png',
- args=['--preload-file', 'screenshot.png'],
+ args=['--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'],
message='You should see an image with fog.')
def test_sdl_fog_linear(self):
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
self.btest('sdl_fog_linear.c', reference='screenshot-fog-linear.png', reference_slack=1,
- args=['--preload-file', 'screenshot.png'],
+ args=['--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'],
message='You should see an image with fog.')
def test_openal_playback(self):
@@ -903,7 +903,7 @@ Press any key to continue.'''
def test_glfw(self):
open(os.path.join(self.get_dir(), 'glfw.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'glfw.c')).read()))
- Popen([PYTHON, EMCC, '-O2', os.path.join(self.get_dir(), 'glfw.c'), '-o', 'page.html']).communicate()
+ Popen([PYTHON, EMCC, '-O2', os.path.join(self.get_dir(), 'glfw.c'), '-o', 'page.html', '-s', 'LEGACY_GL_EMULATION=1']).communicate()
self.run_browser('page.html', '', '/report_result?1')
def test_egl_width_height(self):
@@ -1056,30 +1056,26 @@ Press any key to continue.'''
server.terminate()
def test_glgears(self):
- self.btest('hello_world_gles.c', reference='gears.png',
+ self.btest('hello_world_gles.c', reference='gears.png', reference_slack=1,
args=['-DHAVE_BUILTIN_SINCOS'], outfile='something.html',
message='You should see animating gears.')
def test_glgears_animation(self):
es2_suffix = ['', '_full', '_full_944']
for full_es2 in [0, 1, 2]:
- for emulation in [0, 1]:
- if full_es2 and emulation: continue
- print full_es2, emulation
- Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_gles%s.c' % es2_suffix[full_es2]), '-o', 'something.html',
- '-DHAVE_BUILTIN_SINCOS', '-s', 'GL_TESTING=1',
- '--shell-file', path_from_root('tests', 'hello_world_gles_shell.html')] +
- (['-s', 'FORCE_GL_EMULATION=1'] if emulation else []) +
- (['-s', 'FULL_ES2=1'] if full_es2 else []),
- ).communicate()
- self.run_browser('something.html', 'You should see animating gears.', '/report_gl_result?true')
- assert ('var GLEmulation' in open(self.in_dir('something.html')).read()) == emulation, "emulation code should be added when asked for"
+ print full_es2
+ Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_gles%s.c' % es2_suffix[full_es2]), '-o', 'something.html',
+ '-DHAVE_BUILTIN_SINCOS', '-s', 'GL_TESTING=1',
+ '--shell-file', path_from_root('tests', 'hello_world_gles_shell.html')] +
+ (['-s', 'FULL_ES2=1'] if full_es2 else []),
+ ).communicate()
+ self.run_browser('something.html', 'You should see animating gears.', '/report_gl_result?true')
def test_fulles2_sdlproc(self):
self.btest('full_es2_sdlproc.c', '1', args=['-s', 'GL_TESTING=1', '-DHAVE_BUILTIN_SINCOS', '-s', 'FULL_ES2=1'])
def test_glgears_deriv(self):
- self.btest('hello_world_gles_deriv.c', reference='gears.png',
+ self.btest('hello_world_gles_deriv.c', reference='gears.png', reference_slack=1,
args=['-DHAVE_BUILTIN_SINCOS'], outfile='something.html',
message='You should see animating gears.')
with open('something.html') as f:
@@ -1163,90 +1159,90 @@ Press any key to continue.'''
self.btest('glgetattachedshaders.c', '1')
def test_sdlglshader(self):
- self.btest('sdlglshader.c', reference='sdlglshader.png', args=['-O2', '--closure', '1'])
+ self.btest('sdlglshader.c', reference='sdlglshader.png', args=['-O2', '--closure', '1', '-s', 'LEGACY_GL_EMULATION=1'])
def test_gl_ps(self):
# pointers and a shader
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
- self.btest('gl_ps.c', reference='gl_ps.png', args=['--preload-file', 'screenshot.png'], reference_slack=1)
+ self.btest('gl_ps.c', reference='gl_ps.png', args=['--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], reference_slack=1)
def test_gl_ps_packed(self):
# packed data that needs to be strided
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
- self.btest('gl_ps_packed.c', reference='gl_ps.png', args=['--preload-file', 'screenshot.png'], reference_slack=1)
+ self.btest('gl_ps_packed.c', reference='gl_ps.png', args=['--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'], reference_slack=1)
def test_gl_ps_strides(self):
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
- self.btest('gl_ps_strides.c', reference='gl_ps_strides.png', args=['--preload-file', 'screenshot.png'])
+ self.btest('gl_ps_strides.c', reference='gl_ps_strides.png', args=['--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'])
def test_gl_renderers(self):
- self.btest('gl_renderers.c', reference='gl_renderers.png', args=['-s', 'GL_UNSAFE_OPTS=0'])
+ self.btest('gl_renderers.c', reference='gl_renderers.png', args=['-s', 'GL_UNSAFE_OPTS=0', '-s', 'LEGACY_GL_EMULATION=1'])
def test_gl_stride(self):
- self.btest('gl_stride.c', reference='gl_stride.png', args=['-s', 'GL_UNSAFE_OPTS=0'])
+ self.btest('gl_stride.c', reference='gl_stride.png', args=['-s', 'GL_UNSAFE_OPTS=0', '-s', 'LEGACY_GL_EMULATION=1'])
def test_matrix_identity(self):
- self.btest('gl_matrix_identity.c', expected=['-1882984448', '460451840'])
+ self.btest('gl_matrix_identity.c', expected=['-1882984448', '460451840'], args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_pre(self):
- self.btest('cubegeom_pre.c', reference='cubegeom_pre.png')
+ self.btest('cubegeom_pre.c', reference='cubegeom_pre.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_pre2(self):
- self.btest('cubegeom_pre2.c', reference='cubegeom_pre2.png', args=['-s', 'GL_DEBUG=1']) # some coverage for GL_DEBUG not breaking the build
+ self.btest('cubegeom_pre2.c', reference='cubegeom_pre2.png', args=['-s', 'GL_DEBUG=1', '-s', 'LEGACY_GL_EMULATION=1']) # some coverage for GL_DEBUG not breaking the build
def test_cubegeom_pre3(self):
- self.btest('cubegeom_pre3.c', reference='cubegeom_pre2.png')
+ self.btest('cubegeom_pre3.c', reference='cubegeom_pre2.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom(self):
- self.btest('cubegeom.c', args=['-O2', '-g'], reference='cubegeom.png')
+ self.btest('cubegeom.c', reference='cubegeom.png', args=['-O2', '-g', '-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_glew(self):
- self.btest('cubegeom_glew.c', args=['-O2', '--closure', '1'], reference='cubegeom.png')
+ self.btest('cubegeom_glew.c', reference='cubegeom.png', args=['-O2', '--closure', '1', '-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_color(self):
- self.btest('cubegeom_color.c', reference='cubegeom_color.png')
+ self.btest('cubegeom_color.c', reference='cubegeom_color.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_normal(self):
- self.btest('cubegeom_normal.c', reference='cubegeom_normal.png')
+ self.btest('cubegeom_normal.c', reference='cubegeom_normal.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_normal_dap(self): # draw is given a direct pointer to clientside memory, no element array buffer
- self.btest('cubegeom_normal_dap.c', reference='cubegeom_normal.png')
+ self.btest('cubegeom_normal_dap.c', reference='cubegeom_normal.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_normal_dap_far(self): # indices do nto start from 0
- self.btest('cubegeom_normal_dap_far.c', reference='cubegeom_normal.png')
+ self.btest('cubegeom_normal_dap_far.c', reference='cubegeom_normal.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_normal_dap_far_range(self): # glDrawRangeElements
- self.btest('cubegeom_normal_dap_far_range.c', reference='cubegeom_normal.png')
+ self.btest('cubegeom_normal_dap_far_range.c', reference='cubegeom_normal.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_normal_dap_far_glda(self): # use glDrawArrays
- self.btest('cubegeom_normal_dap_far_glda.c', reference='cubegeom_normal_dap_far_glda.png')
+ self.btest('cubegeom_normal_dap_far_glda.c', reference='cubegeom_normal_dap_far_glda.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_normal_dap_far_glda_quad(self): # with quad
- self.btest('cubegeom_normal_dap_far_glda_quad.c', reference='cubegeom_normal_dap_far_glda_quad.png')
+ self.btest('cubegeom_normal_dap_far_glda_quad.c', reference='cubegeom_normal_dap_far_glda_quad.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_mt(self):
- self.btest('cubegeom_mt.c', reference='cubegeom_mt.png') # multitexture
+ self.btest('cubegeom_mt.c', reference='cubegeom_mt.png', args=['-s', 'LEGACY_GL_EMULATION=1']) # multitexture
def test_cubegeom_color2(self):
- self.btest('cubegeom_color2.c', reference='cubegeom_color2.png')
+ self.btest('cubegeom_color2.c', reference='cubegeom_color2.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_texturematrix(self):
- self.btest('cubegeom_texturematrix.c', reference='cubegeom_texturematrix.png')
+ self.btest('cubegeom_texturematrix.c', reference='cubegeom_texturematrix.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_fog(self):
- self.btest('cubegeom_fog.c', reference='cubegeom_fog.png')
+ self.btest('cubegeom_fog.c', reference='cubegeom_fog.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_pre_vao(self):
- self.btest('cubegeom_pre_vao.c', reference='cubegeom_pre_vao.png')
+ self.btest('cubegeom_pre_vao.c', reference='cubegeom_pre_vao.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_pre2_vao(self):
- self.btest('cubegeom_pre2_vao.c', reference='cubegeom_pre_vao.png')
+ self.btest('cubegeom_pre2_vao.c', reference='cubegeom_pre_vao.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cubegeom_pre2_vao2(self):
- self.btest('cubegeom_pre2_vao2.c', reference='cubegeom_pre2_vao2.png')
+ self.btest('cubegeom_pre2_vao2.c', reference='cubegeom_pre2_vao2.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_cube_explosion(self):
- self.btest('cube_explosion.c', reference='cube_explosion.png')
+ self.btest('cube_explosion.c', reference='cube_explosion.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_sdl_canvas_blank(self):
self.btest('sdl_canvas_blank.c', reference='sdl_canvas_blank.png')
@@ -1298,11 +1294,11 @@ Press any key to continue.'''
def test_glbegin_points(self):
shutil.copyfile(path_from_root('tests', 'screenshot.png'), os.path.join(self.get_dir(), 'screenshot.png'))
- self.btest('glbegin_points.c', reference='glbegin_points.png', args=['--preload-file', 'screenshot.png'])
+ self.btest('glbegin_points.c', reference='glbegin_points.png', args=['--preload-file', 'screenshot.png', '-s', 'LEGACY_GL_EMULATION=1'])
def test_s3tc(self):
shutil.copyfile(path_from_root('tests', 'screenshot.dds'), os.path.join(self.get_dir(), 'screenshot.dds'))
- self.btest('s3tc.c', reference='s3tc.png', args=['--preload-file', 'screenshot.dds'])
+ self.btest('s3tc.c', reference='s3tc.png', args=['--preload-file', 'screenshot.dds', '-s', 'LEGACY_GL_EMULATION=1'])
def test_s3tc_crunch(self):
shutil.copyfile(path_from_root('tests', 'ship.dds'), 'ship.dds')
@@ -1313,7 +1309,7 @@ Press any key to continue.'''
shutil.move('ship.dds', 'ship.donotfindme.dds') # make sure we load from the compressed
shutil.move('bloom.dds', 'bloom.donotfindme.dds') # make sure we load from the compressed
shutil.move('water.dds', 'water.donotfindme.dds') # make sure we load from the compressed
- self.btest('s3tc_crunch.c', reference='s3tc_crunch.png', reference_slack=11, args=['--pre-js', 'pre.js'])
+ self.btest('s3tc_crunch.c', reference='s3tc_crunch.png', reference_slack=11, args=['--pre-js', 'pre.js', '-s', 'LEGACY_GL_EMULATION=1'])
def test_s3tc_crunch_split(self): # load several datafiles/outputs of file packager
shutil.copyfile(path_from_root('tests', 'ship.dds'), 'ship.dds')
@@ -1324,14 +1320,14 @@ Press any key to continue.'''
shutil.move('ship.dds', 'ship.donotfindme.dds') # make sure we load from the compressed
shutil.move('bloom.dds', 'bloom.donotfindme.dds') # make sure we load from the compressed
shutil.move('water.dds', 'water.donotfindme.dds') # make sure we load from the compressed
- self.btest('s3tc_crunch.c', reference='s3tc_crunch.png', reference_slack=11, args=['--pre-js', 'asset_a.js', '--pre-js', 'asset_b.js'])
+ self.btest('s3tc_crunch.c', reference='s3tc_crunch.png', reference_slack=11, args=['--pre-js', 'asset_a.js', '--pre-js', 'asset_b.js', '-s', 'LEGACY_GL_EMULATION=1'])
def test_aniso(self):
shutil.copyfile(path_from_root('tests', 'water.dds'), 'water.dds')
- self.btest('aniso.c', reference='aniso.png', reference_slack=2, args=['--preload-file', 'water.dds'])
+ self.btest('aniso.c', reference='aniso.png', reference_slack=2, args=['--preload-file', 'water.dds', '-s', 'LEGACY_GL_EMULATION=1'])
def test_tex_nonbyte(self):
- self.btest('tex_nonbyte.c', reference='tex_nonbyte.png')
+ self.btest('tex_nonbyte.c', reference='tex_nonbyte.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_float_tex(self):
self.btest('float_tex.cpp', reference='float_tex.png')
@@ -1340,7 +1336,7 @@ Press any key to continue.'''
self.btest('gl_subdata.cpp', reference='float_tex.png')
def test_perspective(self):
- self.btest('perspective.c', reference='perspective.png')
+ self.btest('perspective.c', reference='perspective.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
def test_runtimelink(self):
return self.skip('shared libs are deprecated')
diff --git a/tests/test_sockets.py b/tests/test_sockets.py
index 03593674..4f6ee2a9 100644
--- a/tests/test_sockets.py
+++ b/tests/test_sockets.py
@@ -198,3 +198,71 @@ class sockets(BrowserCore):
# ]:
# with harness:
# self.btest(os.path.join('sockets', 'test_enet_client.c'), expected='0', args=['-DSOCKK=9011'] + enet)
+
+ def test_webrtc(self):
+ host_src = 'webrtc_host.c'
+ peer_src = 'webrtc_peer.c'
+
+ host_outfile = 'host.html'
+ peer_outfile = 'peer.html'
+
+ host_filepath = path_from_root('tests', 'sockets', host_src)
+ temp_host_filepath = os.path.join(self.get_dir(), os.path.basename(host_src))
+ with open(host_filepath) as f: host_src = f.read()
+ with open(temp_host_filepath, 'w') as f: f.write(self.with_report_result(host_src))
+
+ peer_filepath = path_from_root('tests', 'sockets', peer_src)
+ temp_peer_filepath = os.path.join(self.get_dir(), os.path.basename(peer_src))
+ with open(peer_filepath) as f: peer_src = f.read()
+ with open(temp_peer_filepath, 'w') as f: f.write(self.with_report_result(peer_src))
+
+ open(os.path.join(self.get_dir(), 'host_pre.js'), 'w').write('''
+ var Module = {
+ webrtc: {
+ broker: 'https://mdsw.ch:8080',
+ session: undefined,
+ onpeer: function(peer, route) {
+ window.open('http://localhost:8888/peer.html?' + route);
+ // iframe = document.createElement("IFRAME");
+ // iframe.setAttribute("src", "http://localhost:8888/peer.html?" + route);
+ // iframe.style.display = "none";
+ // document.body.appendChild(iframe);
+ peer.listen();
+ },
+ onconnect: function(peer) {
+ },
+ ondisconnect: function(peer) {
+ },
+ onerror: function(error) {
+ console.error(error);
+ }
+ },
+ };
+ ''')
+
+ open(os.path.join(self.get_dir(), 'peer_pre.js'), 'w').write('''
+ var Module = {
+ webrtc: {
+ broker: 'https://mdsw.ch:8080',
+ session: window.location.toString().split('?')[1],
+ onpeer: function(peer, route) {
+ peer.connect(Module['webrtc']['session']);
+ },
+ onconnect: function(peer) {
+ },
+ ondisconnect: function(peer) {
+ // Calling window.close() from this handler hangs my browser, so run it in the next turn
+ setTimeout(window.close, 0);
+ },
+ onerror: function(error) {
+ console.error(error);
+ }
+ }
+ };
+ ''')
+
+ Popen([PYTHON, EMCC, temp_host_filepath, '-o', host_outfile] + ['-s', 'GL_TESTING=1', '--pre-js', 'host_pre.js', '-s', 'SOCKET_WEBRTC=1', '-s', 'SOCKET_DEBUG=1']).communicate()
+ Popen([PYTHON, EMCC, temp_peer_filepath, '-o', peer_outfile] + ['-s', 'GL_TESTING=1', '--pre-js', 'peer_pre.js', '-s', 'SOCKET_WEBRTC=1', '-s', 'SOCKET_DEBUG=1']).communicate()
+
+ expected = '1'
+ self.run_browser(host_outfile, '.', ['/report_result?' + e for e in expected]) \ No newline at end of file
diff --git a/tools/find_bigfuncs.py b/tools/find_bigfuncs.py
index 6fdec3a9..79136343 100644
--- a/tools/find_bigfuncs.py
+++ b/tools/find_bigfuncs.py
@@ -1,5 +1,5 @@
'''
-Simple tool to find big functions in an .ll file.
+Simple tool to find big functions in a js or ll file
'''
import os, sys, re
@@ -11,7 +11,7 @@ curr = None
data = []
for line in open(filename):
i += 1
- if line.startswith('function '):
+ if line.startswith(('function ', 'define ')):
start = i
curr = line
elif line.startswith('}') and curr:
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index ff6aee67..e61317af 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -801,7 +801,10 @@ function simplifyExpressions(ast) {
// HEAP[x >> 2]
// very often. We can in some cases do the shift on the variable itself when it is set,
// to greatly reduce the number of shift operations.
-// TODO: when shifting a variable, if there are other uses, keep an unshifted version too, to prevent slowdowns?
+// XXX this optimization is deprecated and currently invalid: does not handle overflows
+// or non-aligned (round numbers, x >> 2 is a multiple of 4). Both are ok to assume
+// for pointers (undefined behavior otherwise), but invalid in general, and we do
+// no sufficiently-well distinguish the cases.
function optimizeShiftsInternal(ast, conservative) {
var MAX_SHIFTS = 3;
traverseGeneratedFunctions(ast, function(fun) {
@@ -3001,7 +3004,7 @@ function outline(ast) {
// Try to flatten out code as much as possible, to make outlining more feasible.
function flatten(func, asmData) {
- var minSize = sizeToOutline;
+ var minSize = extraInfo.sizeToOutline/4;
var helperId = 0;
function getHelper() {
while (1) {
@@ -3475,6 +3478,9 @@ function outline(ast) {
}
}
}
+ function done() {
+ return asmData.splitCounter >= asmData.maxOutlinings || measureSize(func) <= extraInfo.sizeToOutline;
+ }
while (1) {
i--;
calcMinIndex(); // TODO: optimize
@@ -3530,7 +3536,7 @@ function outline(ast) {
if (ret.length > pre) {
// we outlined recursively, reset our state here
//printErr('successful outline in recursion ' + func[1] + ' due to recursive in level ' + level);
- if (measureSize(func) <= extraInfo.sizeToOutline) break;
+ if (done()) break;
end = i-1;
sizeSeen = 0;
canRestart = true;
@@ -3570,7 +3576,7 @@ function outline(ast) {
if (newFuncs.length) {
ret.push.apply(ret, newFuncs);
}
- if (measureSize(func) <= extraInfo.sizeToOutline) break;
+ if (done()) break;
sizeSeen = 0;
end = i-1;
canRestart = true;
diff --git a/tools/test-js-optimizer-asm-outline1-output.js b/tools/test-js-optimizer-asm-outline1-output.js
index 904e56cf..d8ea9446 100644
--- a/tools/test-js-optimizer-asm-outline1-output.js
+++ b/tools/test-js-optimizer-asm-outline1-output.js
@@ -276,8 +276,29 @@ function vars_w_stack(x, y) {
function chain() {
var helper$0 = 0, sp = 0;
sp = STACKTOP;
- STACKTOP = STACKTOP + 240 | 0;
+ STACKTOP = STACKTOP + 464 | 0;
helper$0 = 1;
+ if (helper$0) {
+ helper$0 = 0;
+ if (x == 1) {
+ print(1);
+ } else {
+ helper$0 = 1;
+ }
+ }
+ if (helper$0) {
+ helper$0 = 0;
+ if (x == 2) {
+ print(2);
+ } else {
+ helper$0 = 1;
+ }
+ }
+ HEAP32[sp + 8 >> 2] = helper$0;
+ HEAP32[sp + 48 >> 2] = 0;
+ HEAP32[sp + 52 >> 2] = 0;
+ chain$4(sp);
+ helper$0 = HEAP32[sp + 8 >> 2] | 0;
HEAP32[sp + 8 >> 2] = helper$0;
HEAP32[sp + 40 >> 2] = 0;
HEAP32[sp + 44 >> 2] = 0;
@@ -288,6 +309,16 @@ function chain() {
HEAP32[sp + 36 >> 2] = 0;
chain$2(sp);
helper$0 = HEAP32[sp + 8 >> 2] | 0;
+ HEAP32[sp + 8 >> 2] = helper$0;
+ HEAP32[sp + 24 >> 2] = 0;
+ HEAP32[sp + 28 >> 2] = 0;
+ chain$1(sp);
+ helper$0 = HEAP32[sp + 8 >> 2] | 0;
+ HEAP32[sp + 8 >> 2] = helper$0;
+ HEAP32[sp + 16 >> 2] = 0;
+ HEAP32[sp + 20 >> 2] = 0;
+ chain$0(sp);
+ helper$0 = HEAP32[sp + 8 >> 2] | 0;
STACKTOP = sp;
}
function lin$0(sp) {
@@ -500,22 +531,21 @@ function chain$0(sp) {
sp = sp | 0;
var helper$0 = 0;
helper$0 = HEAP32[sp + 8 >> 2] | 0;
- if (x == 7) {
- print(7);
- } else if (x == 8) {
- print(8);
- } else if (x == 9) {
- print(9);
- } else if (x == 10) {
- print(10);
- } else if (x == 11) {
- print(11);
- } else if (x == 12) {
- print(12);
- } else if (1) {
- print(99);
- } else {
- helper$0 = 1;
+ if (helper$0) {
+ helper$0 = 0;
+ if (x == 12) {
+ print(12);
+ } else {
+ helper$0 = 1;
+ }
+ }
+ if (helper$0) {
+ helper$0 = 0;
+ if (1) {
+ print(99);
+ } else {
+ helper$0 = 1;
+ }
}
HEAP32[sp + 8 >> 2] = helper$0;
}
@@ -523,20 +553,21 @@ function chain$1(sp) {
sp = sp | 0;
var helper$0 = 0;
helper$0 = HEAP32[sp + 8 >> 2] | 0;
- if (x == 1) {
- print(1);
- } else if (x == 2) {
- print(2);
- } else if (x == 3) {
- print(3);
- } else if (x == 4) {
- print(4);
- } else if (x == 5) {
- print(5);
- } else if (x == 6) {
- print(6);
- } else {
- helper$0 = 1;
+ if (helper$0) {
+ helper$0 = 0;
+ if (x == 10) {
+ print(10);
+ } else {
+ helper$0 = 1;
+ }
+ }
+ if (helper$0) {
+ helper$0 = 0;
+ if (x == 11) {
+ print(11);
+ } else {
+ helper$0 = 1;
+ }
}
HEAP32[sp + 8 >> 2] = helper$0;
}
@@ -546,11 +577,19 @@ function chain$2(sp) {
helper$0 = HEAP32[sp + 8 >> 2] | 0;
if (helper$0) {
helper$0 = 0;
- HEAP32[sp + 8 >> 2] = helper$0;
- HEAP32[sp + 16 >> 2] = 0;
- HEAP32[sp + 20 >> 2] = 0;
- chain$0(sp);
- helper$0 = HEAP32[sp + 8 >> 2] | 0;
+ if (x == 8) {
+ print(8);
+ } else {
+ helper$0 = 1;
+ }
+ }
+ if (helper$0) {
+ helper$0 = 0;
+ if (x == 9) {
+ print(9);
+ } else {
+ helper$0 = 1;
+ }
}
HEAP32[sp + 8 >> 2] = helper$0;
}
@@ -560,11 +599,49 @@ function chain$3(sp) {
helper$0 = HEAP32[sp + 8 >> 2] | 0;
if (helper$0) {
helper$0 = 0;
- HEAP32[sp + 8 >> 2] = helper$0;
- HEAP32[sp + 24 >> 2] = 0;
- HEAP32[sp + 28 >> 2] = 0;
- chain$1(sp);
- helper$0 = HEAP32[sp + 8 >> 2] | 0;
+ if (x == 6) {
+ print(6);
+ } else {
+ helper$0 = 1;
+ }
+ }
+ if (helper$0) {
+ helper$0 = 0;
+ if (x == 7) {
+ print(7);
+ } else {
+ helper$0 = 1;
+ }
+ }
+ HEAP32[sp + 8 >> 2] = helper$0;
+}
+function chain$4(sp) {
+ sp = sp | 0;
+ var helper$0 = 0;
+ helper$0 = HEAP32[sp + 8 >> 2] | 0;
+ if (helper$0) {
+ helper$0 = 0;
+ if (x == 3) {
+ print(3);
+ } else {
+ helper$0 = 1;
+ }
+ }
+ if (helper$0) {
+ helper$0 = 0;
+ if (x == 4) {
+ print(4);
+ } else {
+ helper$0 = 1;
+ }
+ }
+ if (helper$0) {
+ helper$0 = 0;
+ if (x == 5) {
+ print(5);
+ } else {
+ helper$0 = 1;
+ }
}
HEAP32[sp + 8 >> 2] = helper$0;
}
diff --git a/tools/test-js-optimizer-asm-outline2-output.js b/tools/test-js-optimizer-asm-outline2-output.js
index 28feb6cb..2658fda0 100644
--- a/tools/test-js-optimizer-asm-outline2-output.js
+++ b/tools/test-js-optimizer-asm-outline2-output.js
@@ -23,7 +23,7 @@ function linear() {
}
function _free($mem) {
$mem = $mem | 0;
- var $5 = 0, $10 = 0, $16 = 0, $21 = 0, $25 = 0, $26 = 0, $psize_0 = 0, $p_0 = 0, $189 = 0, $194 = 0, sp = 0;
+ var $5 = 0, $10 = 0, $16 = 0, $21 = 0, $25 = 0, $26 = 0, $psize_0 = 0, $p_0 = 0, $189 = 0, $194 = 0, sp = 0, helper$0 = 0;
sp = STACKTOP;
if (($mem | 0) == 0) {
STACKTOP = sp;
@@ -39,59 +39,71 @@ function _free($mem) {
}
$16 = $mem + (($10 & -8) - 8) | 0;
L621 : do {
- if (($10 & 1 | 0) == 0) {
- $21 = HEAP32[($mem - 8 | 0) >> 2] | 0;
- if (($10 & 3 | 0) == 0) {
- return;
- }
- $25 = $mem + (-8 - $21 | 0) | 0;
- $26 = $21 + ($10 & -8) | 0;
- if (($mem + (-8 - $21 | 0) | 0) >>> 0 < $5 >>> 0) {
- _abort();
- }
- if (($25 | 0) == (HEAP32[25] | 0)) {
- if ((HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] & 3 | 0) != 3) {
- $p_0 = $25;
- $psize_0 = $26;
+ helper$0 = 1;
+ if (helper$0) {
+ helper$0 = 0;
+ if (($10 & 1 | 0) == 0) {
+ $21 = HEAP32[($mem - 8 | 0) >> 2] | 0;
+ if (($10 & 3 | 0) == 0) {
+ return;
+ }
+ $25 = $mem + (-8 - $21 | 0) | 0;
+ $26 = $21 + ($10 & -8) | 0;
+ if (($mem + (-8 - $21 | 0) | 0) >>> 0 < $5 >>> 0) {
+ _abort();
+ }
+ if (($25 | 0) == (HEAP32[25] | 0)) {
+ if ((HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] & 3 | 0) != 3) {
+ $p_0 = $25;
+ $psize_0 = $26;
+ break;
+ }
+ HEAP32[22] = $26;
+ HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] = HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] & -2;
+ HEAP32[$mem + ((-8 - $21 | 0) + 4) >> 2] = $26 | 1;
+ HEAP32[($mem + (($10 & -8) - 8) | 0) >> 2] = $26;
+ return;
+ }
+ HEAP32[sp + 8 >> 2] = $mem;
+ HEAP32[sp + 16 >> 2] = $5;
+ HEAP32[sp + 40 >> 2] = $21;
+ HEAP32[sp + 48 >> 2] = $25;
+ HEAP32[sp + 56 >> 2] = $26;
+ HEAP32[sp + 216 >> 2] = $psize_0;
+ HEAP32[sp + 224 >> 2] = $p_0;
+ HEAP32[sp + 696 >> 2] = 0;
+ HEAP32[sp + 700 >> 2] = 0;
+ _free$1(sp);
+ $psize_0 = HEAP32[sp + 216 >> 2] | 0;
+ $p_0 = HEAP32[sp + 224 >> 2] | 0;
+ tempValue = HEAP32[sp + 696 >> 2] | 0;
+ tempInt = HEAP32[sp + 700 >> 2] | 0;
+ tempDouble = +HEAPF32[sp + 700 >> 2];
+ HEAP32[sp + 696 >> 2] = 0;
+ HEAP32[sp + 700 >> 2] = 0;
+ if ((tempValue | 0) == 1) {
break;
}
- HEAP32[22] = $26;
- HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] = HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] & -2;
- HEAP32[$mem + ((-8 - $21 | 0) + 4) >> 2] = $26 | 1;
- HEAP32[($mem + (($10 & -8) - 8) | 0) >> 2] = $26;
- return;
- }
- HEAP32[sp + 8 >> 2] = $mem;
- HEAP32[sp + 16 >> 2] = $5;
- HEAP32[sp + 40 >> 2] = $21;
- HEAP32[sp + 48 >> 2] = $25;
- HEAP32[sp + 56 >> 2] = $26;
- HEAP32[sp + 216 >> 2] = $psize_0;
- HEAP32[sp + 224 >> 2] = $p_0;
- HEAP32[sp + 648 >> 2] = 0;
- HEAP32[sp + 652 >> 2] = 0;
- _free$1(sp);
- $psize_0 = HEAP32[sp + 216 >> 2] | 0;
- $p_0 = HEAP32[sp + 224 >> 2] | 0;
- tempValue = HEAP32[sp + 648 >> 2] | 0;
- tempInt = HEAP32[sp + 652 >> 2] | 0;
- tempDouble = +HEAPF32[sp + 652 >> 2];
- HEAP32[sp + 648 >> 2] = 0;
- HEAP32[sp + 652 >> 2] = 0;
- if ((tempValue | 0) == 1) {
- break;
- }
- if ((tempValue | 0) == 2) {
- switch (tempInt | 0) {
- case 2:
- {
- break L621;
+ if ((tempValue | 0) == 2) {
+ switch (tempInt | 0) {
+ case 2:
+ {
+ break L621;
+ }
}
}
+ } else {
+ helper$0 = 1;
+ }
+ }
+ if (helper$0) {
+ helper$0 = 0;
+ if (1) {
+ $p_0 = $mem - 8 | 0;
+ $psize_0 = $10 & -8;
+ } else {
+ helper$0 = 1;
}
- } else {
- $p_0 = $mem - 8 | 0;
- $psize_0 = $10 & -8;
}
} while (0);
$189 = $p_0;
@@ -109,14 +121,14 @@ function _free($mem) {
HEAP32[sp + 224 >> 2] = $p_0;
HEAP32[sp + 232 >> 2] = $189;
HEAP32[sp + 240 >> 2] = $194;
- HEAP32[sp + 656 >> 2] = 0;
- HEAP32[sp + 660 >> 2] = 0;
+ HEAP32[sp + 704 >> 2] = 0;
+ HEAP32[sp + 708 >> 2] = 0;
_free$2(sp);
- tempValue = HEAP32[sp + 656 >> 2] | 0;
- tempInt = HEAP32[sp + 660 >> 2] | 0;
- tempDouble = +HEAPF32[sp + 660 >> 2];
- HEAP32[sp + 656 >> 2] = 0;
- HEAP32[sp + 660 >> 2] = 0;
+ tempValue = HEAP32[sp + 704 >> 2] | 0;
+ tempInt = HEAP32[sp + 708 >> 2] | 0;
+ tempDouble = +HEAPF32[sp + 708 >> 2];
+ HEAP32[sp + 704 >> 2] = 0;
+ HEAP32[sp + 708 >> 2] = 0;
if ((tempValue | 0) == 5) {
return;
}
@@ -153,175 +165,200 @@ function linear$1(sp) {
}
function _free$0(sp) {
sp = sp | 0;
- var $194 = 0, $233 = 0, $mem = 0, $10 = 0, $236 = 0, $16 = 0, $_pre_phi305 = 0, $267 = 0, $270 = 0, $273 = 0, $294 = 0, $299 = 0, $R7_1 = 0, $R7_0 = 0, $RP9_0 = 0, $301 = 0, $302 = 0, $305 = 0, $306 = 0, $278 = 0, $320 = 0, $351 = 0, $364 = 0;
+ var helper$3 = 0, $194 = 0, $233 = 0, $mem = 0, $10 = 0, $236 = 0, $16 = 0, $_pre_phi305 = 0, $267 = 0, $270 = 0, $273 = 0, helper$4 = 0, $294 = 0, $299 = 0, $R7_1 = 0, $R7_0 = 0, $RP9_0 = 0, $301 = 0, $302 = 0, $305 = 0, $306 = 0, $278 = 0, $320 = 0, $351 = 0, $364 = 0;
$mem = HEAP32[sp + 8 >> 2] | 0;
$10 = HEAP32[sp + 24 >> 2] | 0;
$16 = HEAP32[sp + 32 >> 2] | 0;
$194 = HEAP32[sp + 240 >> 2] | 0;
+ helper$3 = HEAP32[sp + 664 >> 2] | 0;
OL : do {
- if ($194 >>> 0 < 256) {
- $233 = HEAP32[$mem + ($10 & -8) >> 2] | 0;
- $236 = HEAP32[$mem + ($10 & -8 | 4) >> 2] | 0;
- do {
- if (($233 | 0) != (120 + ($194 >>> 3 << 1 << 2) | 0 | 0)) {
- if ($233 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ if (helper$3) {
+ helper$3 = 0;
+ if ($194 >>> 0 < 256) {
+ $233 = HEAP32[$mem + ($10 & -8) >> 2] | 0;
+ $236 = HEAP32[$mem + ($10 & -8 | 4) >> 2] | 0;
+ do {
+ if (($233 | 0) != (120 + ($194 >>> 3 << 1 << 2) | 0 | 0)) {
+ if ($233 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ }
+ if ((HEAP32[$233 + 12 >> 2] | 0) == ($16 | 0)) {
+ break;
+ }
_abort();
}
- if ((HEAP32[$233 + 12 >> 2] | 0) == ($16 | 0)) {
- break;
- }
- _abort();
+ } while (0);
+ if (($236 | 0) == ($233 | 0)) {
+ HEAP32[20] = HEAP32[20] & (1 << ($194 >>> 3) ^ -1);
+ HEAP32[sp + 688 >> 2] = 1;
+ break OL;
}
- } while (0);
- if (($236 | 0) == ($233 | 0)) {
- HEAP32[20] = HEAP32[20] & (1 << ($194 >>> 3) ^ -1);
- HEAP32[sp + 640 >> 2] = 1;
- break OL;
- }
- do {
- if (($236 | 0) == (120 + ($194 >>> 3 << 1 << 2) | 0 | 0)) {
- $_pre_phi305 = $236 + 8 | 0;
- } else {
- if ($236 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
- }
- if ((HEAP32[($236 + 8 | 0) >> 2] | 0) == ($16 | 0)) {
+ do {
+ if (($236 | 0) == (120 + ($194 >>> 3 << 1 << 2) | 0 | 0)) {
$_pre_phi305 = $236 + 8 | 0;
- break;
- }
- _abort();
- }
- } while (0);
- HEAP32[$233 + 12 >> 2] = $236;
- HEAP32[$_pre_phi305 >> 2] = $233;
- } else {
- $267 = $mem + (($10 & -8) - 8) | 0;
- $270 = HEAP32[$mem + (($10 & -8) + 16) >> 2] | 0;
- $273 = HEAP32[$mem + ($10 & -8 | 4) >> 2] | 0;
- do {
- if (($273 | 0) == ($267 | 0)) {
- $294 = HEAP32[($mem + (($10 & -8) + 12) | 0) >> 2] | 0;
- if (($294 | 0) == 0) {
- $299 = HEAP32[($mem + (($10 & -8) + 8) | 0) >> 2] | 0;
- if (($299 | 0) == 0) {
- $R7_1 = 0;
- break;
- } else {
- $R7_0 = $299;
- $RP9_0 = $mem + (($10 & -8) + 8) | 0;
- }
} else {
- $R7_0 = $294;
- $RP9_0 = $mem + (($10 & -8) + 12) | 0;
- }
- while (1) {
- $301 = $R7_0 + 20 | 0;
- $302 = HEAP32[$301 >> 2] | 0;
- if (($302 | 0) != 0) {
- $R7_0 = $302;
- $RP9_0 = $301;
- continue;
+ if ($236 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
}
- $305 = $R7_0 + 16 | 0;
- $306 = HEAP32[$305 >> 2] | 0;
- if (($306 | 0) == 0) {
+ if ((HEAP32[($236 + 8 | 0) >> 2] | 0) == ($16 | 0)) {
+ $_pre_phi305 = $236 + 8 | 0;
break;
- } else {
- $R7_0 = $306;
- $RP9_0 = $305;
}
- }
- if ($RP9_0 >>> 0 < (HEAP32[24] | 0) >>> 0) {
_abort();
- } else {
- HEAP32[$RP9_0 >> 2] = 0;
- $R7_1 = $R7_0;
- break;
}
- } else {
- $278 = HEAP32[$mem + ($10 & -8) >> 2] | 0;
- if ($278 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
+ } while (0);
+ HEAP32[$233 + 12 >> 2] = $236;
+ HEAP32[$_pre_phi305 >> 2] = $233;
+ } else {
+ helper$3 = 1;
+ }
+ }
+ if (helper$3) {
+ helper$3 = 0;
+ if (1) {
+ $267 = $mem + (($10 & -8) - 8) | 0;
+ $270 = HEAP32[$mem + (($10 & -8) + 16) >> 2] | 0;
+ $273 = HEAP32[$mem + ($10 & -8 | 4) >> 2] | 0;
+ do {
+ helper$4 = 1;
+ if (helper$4) {
+ helper$4 = 0;
+ if (($273 | 0) == ($267 | 0)) {
+ $294 = HEAP32[($mem + (($10 & -8) + 12) | 0) >> 2] | 0;
+ if (($294 | 0) == 0) {
+ $299 = HEAP32[($mem + (($10 & -8) + 8) | 0) >> 2] | 0;
+ if (($299 | 0) == 0) {
+ $R7_1 = 0;
+ break;
+ } else {
+ $R7_0 = $299;
+ $RP9_0 = $mem + (($10 & -8) + 8) | 0;
+ }
+ } else {
+ $R7_0 = $294;
+ $RP9_0 = $mem + (($10 & -8) + 12) | 0;
+ }
+ while (1) {
+ $301 = $R7_0 + 20 | 0;
+ $302 = HEAP32[$301 >> 2] | 0;
+ if (($302 | 0) != 0) {
+ $R7_0 = $302;
+ $RP9_0 = $301;
+ continue;
+ }
+ $305 = $R7_0 + 16 | 0;
+ $306 = HEAP32[$305 >> 2] | 0;
+ if (($306 | 0) == 0) {
+ break;
+ } else {
+ $R7_0 = $306;
+ $RP9_0 = $305;
+ }
+ }
+ if ($RP9_0 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ } else {
+ HEAP32[$RP9_0 >> 2] = 0;
+ $R7_1 = $R7_0;
+ break;
+ }
+ } else {
+ helper$4 = 1;
+ }
}
- if ((HEAP32[($278 + 12 | 0) >> 2] | 0) != ($267 | 0)) {
- _abort();
+ if (helper$4) {
+ helper$4 = 0;
+ if (1) {
+ $278 = HEAP32[$mem + ($10 & -8) >> 2] | 0;
+ if ($278 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ }
+ if ((HEAP32[($278 + 12 | 0) >> 2] | 0) != ($267 | 0)) {
+ _abort();
+ }
+ if ((HEAP32[($273 + 8 | 0) >> 2] | 0) == ($267 | 0)) {
+ HEAP32[($278 + 12 | 0) >> 2] = $273;
+ HEAP32[($273 + 8 | 0) >> 2] = $278;
+ $R7_1 = $273;
+ break;
+ } else {
+ _abort();
+ }
+ } else {
+ helper$4 = 1;
+ }
}
- if ((HEAP32[($273 + 8 | 0) >> 2] | 0) == ($267 | 0)) {
- HEAP32[($278 + 12 | 0) >> 2] = $273;
- HEAP32[($273 + 8 | 0) >> 2] = $278;
- $R7_1 = $273;
- break;
+ } while (0);
+ if (($270 | 0) == 0) {
+ HEAP32[sp + 688 >> 2] = 1;
+ break OL;
+ }
+ $320 = 384 + (HEAP32[($mem + (($10 & -8) + 20) | 0) >> 2] << 2) | 0;
+ do {
+ if (($267 | 0) == (HEAP32[$320 >> 2] | 0)) {
+ HEAP32[$320 >> 2] = $R7_1;
+ if (($R7_1 | 0) != 0) {
+ break;
+ }
+ HEAP32[21] = HEAP32[21] & (1 << HEAP32[($mem + (($10 & -8) + 20) | 0) >> 2] ^ -1);
+ HEAP32[sp + 688 >> 2] = 2;
+ HEAP32[sp + 692 >> 2] = 2;
+ break OL;
} else {
- _abort();
+ if ($270 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ }
+ if ((HEAP32[($270 + 16 | 0) >> 2] | 0) == ($267 | 0)) {
+ HEAP32[($270 + 16 | 0) >> 2] = $R7_1;
+ } else {
+ HEAP32[$270 + 20 >> 2] = $R7_1;
+ }
+ if (($R7_1 | 0) == 0) {
+ HEAP32[sp + 688 >> 2] = 2;
+ HEAP32[sp + 692 >> 2] = 2;
+ break OL;
+ }
}
+ } while (0);
+ if ($R7_1 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
}
- } while (0);
- if (($270 | 0) == 0) {
- HEAP32[sp + 640 >> 2] = 1;
- break OL;
- }
- $320 = 384 + (HEAP32[($mem + (($10 & -8) + 20) | 0) >> 2] << 2) | 0;
- do {
- if (($267 | 0) == (HEAP32[$320 >> 2] | 0)) {
- HEAP32[$320 >> 2] = $R7_1;
- if (($R7_1 | 0) != 0) {
- break;
+ HEAP32[$R7_1 + 24 >> 2] = $270;
+ $351 = HEAP32[$mem + (($10 & -8) + 8) >> 2] | 0;
+ do {
+ if (($351 | 0) != 0) {
+ if ($351 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ } else {
+ HEAP32[$R7_1 + 16 >> 2] = $351;
+ HEAP32[$351 + 24 >> 2] = $R7_1;
+ break;
+ }
}
- HEAP32[21] = HEAP32[21] & (1 << HEAP32[($mem + (($10 & -8) + 20) | 0) >> 2] ^ -1);
- HEAP32[sp + 640 >> 2] = 2;
- HEAP32[sp + 644 >> 2] = 2;
+ } while (0);
+ $364 = HEAP32[$mem + (($10 & -8) + 12) >> 2] | 0;
+ if (($364 | 0) == 0) {
+ HEAP32[sp + 688 >> 2] = 1;
break OL;
- } else {
- if ($270 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
- }
- if ((HEAP32[($270 + 16 | 0) >> 2] | 0) == ($267 | 0)) {
- HEAP32[($270 + 16 | 0) >> 2] = $R7_1;
- } else {
- HEAP32[$270 + 20 >> 2] = $R7_1;
- }
- if (($R7_1 | 0) == 0) {
- HEAP32[sp + 640 >> 2] = 2;
- HEAP32[sp + 644 >> 2] = 2;
- break OL;
- }
}
- } while (0);
- if ($R7_1 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
- }
- HEAP32[$R7_1 + 24 >> 2] = $270;
- $351 = HEAP32[$mem + (($10 & -8) + 8) >> 2] | 0;
- do {
- if (($351 | 0) != 0) {
- if ($351 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
- } else {
- HEAP32[$R7_1 + 16 >> 2] = $351;
- HEAP32[$351 + 24 >> 2] = $R7_1;
- break;
- }
+ if ($364 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ } else {
+ HEAP32[$R7_1 + 20 >> 2] = $364;
+ HEAP32[$364 + 24 >> 2] = $R7_1;
+ HEAP32[sp + 688 >> 2] = 1;
+ break OL;
}
- } while (0);
- $364 = HEAP32[$mem + (($10 & -8) + 12) >> 2] | 0;
- if (($364 | 0) == 0) {
- HEAP32[sp + 640 >> 2] = 1;
- break OL;
- }
- if ($364 >>> 0 < (HEAP32[24] | 0) >>> 0) {
- _abort();
} else {
- HEAP32[$R7_1 + 20 >> 2] = $364;
- HEAP32[$364 + 24 >> 2] = $R7_1;
- HEAP32[sp + 640 >> 2] = 1;
- break OL;
+ helper$3 = 1;
}
}
} while (0);
+ HEAP32[sp + 664 >> 2] = helper$3;
}
function _free$1(sp) {
sp = sp | 0;
- var $21 = 0, $37 = 0, $mem = 0, $40 = 0, $5 = 0, $25 = 0, $26 = 0, $_pre_phi307 = 0, $69 = 0, $72 = 0, $75 = 0, $95 = 0, $100 = 0, $R_1 = 0, $R_0 = 0, $RP_0 = 0, $102 = 0, $103 = 0, $106 = 0, $107 = 0, $80 = 0, $120 = 0, $151 = 0, $164 = 0, $p_0 = 0, $psize_0 = 0;
+ var $21 = 0, $37 = 0, $mem = 0, $40 = 0, $5 = 0, $25 = 0, $26 = 0, $_pre_phi307 = 0, $69 = 0, $72 = 0, $75 = 0, helper$1 = 0, $95 = 0, $100 = 0, $R_1 = 0, $R_0 = 0, $RP_0 = 0, $102 = 0, $103 = 0, $106 = 0, $107 = 0, $80 = 0, $120 = 0, $151 = 0, $164 = 0, $p_0 = 0, $psize_0 = 0;
$mem = HEAP32[sp + 8 >> 2] | 0;
$5 = HEAP32[sp + 16 >> 2] | 0;
$21 = HEAP32[sp + 40 >> 2] | 0;
@@ -348,7 +385,7 @@ function _free$1(sp) {
HEAP32[20] = HEAP32[20] & (1 << ($21 >>> 3) ^ -1);
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 648 >> 2] = 1;
+ HEAP32[sp + 696 >> 2] = 1;
break OL;
}
do {
@@ -369,74 +406,86 @@ function _free$1(sp) {
HEAP32[$_pre_phi307 >> 2] = $37;
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 648 >> 2] = 1;
+ HEAP32[sp + 696 >> 2] = 1;
break OL;
}
$69 = $mem + (-8 - $21 | 0) | 0;
$72 = HEAP32[$mem + ((-8 - $21 | 0) + 24) >> 2] | 0;
$75 = HEAP32[$mem + ((-8 - $21 | 0) + 12) >> 2] | 0;
do {
- if (($75 | 0) == ($69 | 0)) {
- $95 = HEAP32[($mem + ((-8 - $21 | 0) + 20) | 0) >> 2] | 0;
- if (($95 | 0) == 0) {
- $100 = HEAP32[($mem + ((-8 - $21 | 0) + 16) | 0) >> 2] | 0;
- if (($100 | 0) == 0) {
- $R_1 = 0;
- break;
+ helper$1 = 1;
+ if (helper$1) {
+ helper$1 = 0;
+ if (($75 | 0) == ($69 | 0)) {
+ $95 = HEAP32[($mem + ((-8 - $21 | 0) + 20) | 0) >> 2] | 0;
+ if (($95 | 0) == 0) {
+ $100 = HEAP32[($mem + ((-8 - $21 | 0) + 16) | 0) >> 2] | 0;
+ if (($100 | 0) == 0) {
+ $R_1 = 0;
+ break;
+ } else {
+ $R_0 = $100;
+ $RP_0 = $mem + ((-8 - $21 | 0) + 16) | 0;
+ }
+ } else {
+ $R_0 = $95;
+ $RP_0 = $mem + ((-8 - $21 | 0) + 20) | 0;
+ }
+ while (1) {
+ $102 = $R_0 + 20 | 0;
+ $103 = HEAP32[$102 >> 2] | 0;
+ if (($103 | 0) != 0) {
+ $R_0 = $103;
+ $RP_0 = $102;
+ continue;
+ }
+ $106 = $R_0 + 16 | 0;
+ $107 = HEAP32[$106 >> 2] | 0;
+ if (($107 | 0) == 0) {
+ break;
+ } else {
+ $R_0 = $107;
+ $RP_0 = $106;
+ }
+ }
+ if ($RP_0 >>> 0 < $5 >>> 0) {
+ _abort();
} else {
- $R_0 = $100;
- $RP_0 = $mem + ((-8 - $21 | 0) + 16) | 0;
+ HEAP32[$RP_0 >> 2] = 0;
+ $R_1 = $R_0;
+ break;
}
} else {
- $R_0 = $95;
- $RP_0 = $mem + ((-8 - $21 | 0) + 20) | 0;
+ helper$1 = 1;
}
- while (1) {
- $102 = $R_0 + 20 | 0;
- $103 = HEAP32[$102 >> 2] | 0;
- if (($103 | 0) != 0) {
- $R_0 = $103;
- $RP_0 = $102;
- continue;
+ }
+ if (helper$1) {
+ helper$1 = 0;
+ if (1) {
+ $80 = HEAP32[$mem + ((-8 - $21 | 0) + 8) >> 2] | 0;
+ if ($80 >>> 0 < $5 >>> 0) {
+ _abort();
+ }
+ if ((HEAP32[($80 + 12 | 0) >> 2] | 0) != ($69 | 0)) {
+ _abort();
}
- $106 = $R_0 + 16 | 0;
- $107 = HEAP32[$106 >> 2] | 0;
- if (($107 | 0) == 0) {
+ if ((HEAP32[($75 + 8 | 0) >> 2] | 0) == ($69 | 0)) {
+ HEAP32[($80 + 12 | 0) >> 2] = $75;
+ HEAP32[($75 + 8 | 0) >> 2] = $80;
+ $R_1 = $75;
break;
} else {
- $R_0 = $107;
- $RP_0 = $106;
+ _abort();
}
- }
- if ($RP_0 >>> 0 < $5 >>> 0) {
- _abort();
} else {
- HEAP32[$RP_0 >> 2] = 0;
- $R_1 = $R_0;
- break;
- }
- } else {
- $80 = HEAP32[$mem + ((-8 - $21 | 0) + 8) >> 2] | 0;
- if ($80 >>> 0 < $5 >>> 0) {
- _abort();
- }
- if ((HEAP32[($80 + 12 | 0) >> 2] | 0) != ($69 | 0)) {
- _abort();
- }
- if ((HEAP32[($75 + 8 | 0) >> 2] | 0) == ($69 | 0)) {
- HEAP32[($80 + 12 | 0) >> 2] = $75;
- HEAP32[($75 + 8 | 0) >> 2] = $80;
- $R_1 = $75;
- break;
- } else {
- _abort();
+ helper$1 = 1;
}
}
} while (0);
if (($72 | 0) == 0) {
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 648 >> 2] = 1;
+ HEAP32[sp + 696 >> 2] = 1;
break OL;
}
$120 = 384 + (HEAP32[($mem + ((-8 - $21 | 0) + 28) | 0) >> 2] << 2) | 0;
@@ -449,8 +498,8 @@ function _free$1(sp) {
HEAP32[21] = HEAP32[21] & (1 << HEAP32[($mem + ((-8 - $21 | 0) + 28) | 0) >> 2] ^ -1);
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 648 >> 2] = 2;
- HEAP32[sp + 652 >> 2] = 2;
+ HEAP32[sp + 696 >> 2] = 2;
+ HEAP32[sp + 700 >> 2] = 2;
break OL;
} else {
if ($72 >>> 0 < (HEAP32[24] | 0) >>> 0) {
@@ -464,8 +513,8 @@ function _free$1(sp) {
if (($R_1 | 0) == 0) {
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 648 >> 2] = 2;
- HEAP32[sp + 652 >> 2] = 2;
+ HEAP32[sp + 696 >> 2] = 2;
+ HEAP32[sp + 700 >> 2] = 2;
break OL;
}
}
@@ -490,7 +539,7 @@ function _free$1(sp) {
if (($164 | 0) == 0) {
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 648 >> 2] = 1;
+ HEAP32[sp + 696 >> 2] = 1;
break OL;
}
if ($164 >>> 0 < (HEAP32[24] | 0) >>> 0) {
@@ -500,7 +549,7 @@ function _free$1(sp) {
HEAP32[$164 + 24 >> 2] = $R_1;
$p_0 = $25;
$psize_0 = $26;
- HEAP32[sp + 648 >> 2] = 1;
+ HEAP32[sp + 696 >> 2] = 1;
break OL;
}
} while (0);
@@ -509,7 +558,7 @@ function _free$1(sp) {
}
function _free$2(sp) {
sp = sp | 0;
- var $194 = 0, $16 = 0, $204 = 0, $psize_0 = 0, $p_0 = 0, $220 = 0, $189 = 0, $227 = 0, $mem = 0, $10 = 0, $psize_1 = 0, $390 = 0, $396 = 0, $F16_0 = 0, $_pre_phi = 0, $404 = 0, $414 = 0, $415 = 0, $I18_0 = 0, $428 = 0, $436 = 0, $443 = 0, $447 = 0, $448 = 0, $463 = 0, $K19_0 = 0, $T_0 = 0, $472 = 0, $473 = 0, label = 0, $486 = 0, $487 = 0, $489 = 0, $501 = 0, $sp_0_in_i = 0, $sp_0_i = 0;
+ var helper$2 = 0, $194 = 0, $16 = 0, $204 = 0, $psize_0 = 0, $p_0 = 0, $220 = 0, $189 = 0, $227 = 0, helper$3 = 0, $mem = 0, $10 = 0, $psize_1 = 0, $390 = 0, $396 = 0, $F16_0 = 0, $_pre_phi = 0, $404 = 0, $414 = 0, $415 = 0, $I18_0 = 0, $428 = 0, $436 = 0, $443 = 0, $447 = 0, $448 = 0, helper$5 = 0, $463 = 0, $K19_0 = 0, $T_0 = 0, $472 = 0, $473 = 0, label = 0, $486 = 0, $487 = 0, $489 = 0, $501 = 0, $sp_0_in_i = 0, $sp_0_i = 0;
$mem = HEAP32[sp + 8 >> 2] | 0;
$10 = HEAP32[sp + 24 >> 2] | 0;
$16 = HEAP32[sp + 32 >> 2] | 0;
@@ -519,73 +568,88 @@ function _free$2(sp) {
$194 = HEAP32[sp + 240 >> 2] | 0;
OL : do {
do {
- if (($194 & 2 | 0) == 0) {
- if (($16 | 0) == (HEAP32[26] | 0)) {
- $204 = (HEAP32[23] | 0) + $psize_0 | 0;
- HEAP32[23] = $204;
- HEAP32[26] = $p_0;
- HEAP32[$p_0 + 4 >> 2] = $204 | 1;
- if (($p_0 | 0) == (HEAP32[25] | 0)) {
- HEAP32[25] = 0;
- HEAP32[22] = 0;
- }
- if ($204 >>> 0 <= (HEAP32[27] | 0) >>> 0) {
- HEAP32[sp + 656 >> 2] = 5;
+ helper$2 = 1;
+ if (helper$2) {
+ helper$2 = 0;
+ if (($194 & 2 | 0) == 0) {
+ if (($16 | 0) == (HEAP32[26] | 0)) {
+ $204 = (HEAP32[23] | 0) + $psize_0 | 0;
+ HEAP32[23] = $204;
+ HEAP32[26] = $p_0;
+ HEAP32[$p_0 + 4 >> 2] = $204 | 1;
+ if (($p_0 | 0) == (HEAP32[25] | 0)) {
+ HEAP32[25] = 0;
+ HEAP32[22] = 0;
+ }
+ if ($204 >>> 0 <= (HEAP32[27] | 0) >>> 0) {
+ HEAP32[sp + 704 >> 2] = 5;
+ break OL;
+ }
+ _sys_trim(0) | 0;
+ HEAP32[sp + 704 >> 2] = 5;
break OL;
}
- _sys_trim(0) | 0;
- HEAP32[sp + 656 >> 2] = 5;
- break OL;
- }
- if (($16 | 0) == (HEAP32[25] | 0)) {
- $220 = (HEAP32[22] | 0) + $psize_0 | 0;
- HEAP32[22] = $220;
- HEAP32[25] = $p_0;
- HEAP32[$p_0 + 4 >> 2] = $220 | 1;
- HEAP32[$189 + $220 >> 2] = $220;
- HEAP32[sp + 656 >> 2] = 5;
- break OL;
- }
- $227 = ($194 & -8) + $psize_0 | 0;
- L726 : do {
- HEAP32[sp + 8 >> 2] = $mem;
- HEAP32[sp + 24 >> 2] = $10;
- HEAP32[sp + 32 >> 2] = $16;
- HEAP32[sp + 240 >> 2] = $194;
- HEAP32[sp + 640 >> 2] = 0;
- HEAP32[sp + 644 >> 2] = 0;
- _free$0(sp);
- tempValue = HEAP32[sp + 640 >> 2] | 0;
- tempInt = HEAP32[sp + 644 >> 2] | 0;
- tempDouble = +HEAPF32[sp + 644 >> 2];
- HEAP32[sp + 640 >> 2] = 0;
- HEAP32[sp + 644 >> 2] = 0;
- if ((tempValue | 0) == 1) {
- break;
+ if (($16 | 0) == (HEAP32[25] | 0)) {
+ $220 = (HEAP32[22] | 0) + $psize_0 | 0;
+ HEAP32[22] = $220;
+ HEAP32[25] = $p_0;
+ HEAP32[$p_0 + 4 >> 2] = $220 | 1;
+ HEAP32[$189 + $220 >> 2] = $220;
+ HEAP32[sp + 704 >> 2] = 5;
+ break OL;
}
- if ((tempValue | 0) == 2) {
- switch (tempInt | 0) {
- case 2:
- {
- break L726;
+ $227 = ($194 & -8) + $psize_0 | 0;
+ L726 : do {
+ helper$3 = 1;
+ HEAP32[sp + 8 >> 2] = $mem;
+ HEAP32[sp + 24 >> 2] = $10;
+ HEAP32[sp + 32 >> 2] = $16;
+ HEAP32[sp + 240 >> 2] = $194;
+ HEAP32[sp + 664 >> 2] = helper$3;
+ HEAP32[sp + 688 >> 2] = 0;
+ HEAP32[sp + 692 >> 2] = 0;
+ _free$0(sp);
+ helper$3 = HEAP32[sp + 664 >> 2] | 0;
+ tempValue = HEAP32[sp + 688 >> 2] | 0;
+ tempInt = HEAP32[sp + 692 >> 2] | 0;
+ tempDouble = +HEAPF32[sp + 692 >> 2];
+ HEAP32[sp + 688 >> 2] = 0;
+ HEAP32[sp + 692 >> 2] = 0;
+ if ((tempValue | 0) == 1) {
+ break;
+ }
+ if ((tempValue | 0) == 2) {
+ switch (tempInt | 0) {
+ case 2:
+ {
+ break L726;
+ }
}
}
+ } while (0);
+ HEAP32[$p_0 + 4 >> 2] = $227 | 1;
+ HEAP32[$189 + $227 >> 2] = $227;
+ if (($p_0 | 0) != (HEAP32[25] | 0)) {
+ $psize_1 = $227;
+ break;
}
- } while (0);
- HEAP32[$p_0 + 4 >> 2] = $227 | 1;
- HEAP32[$189 + $227 >> 2] = $227;
- if (($p_0 | 0) != (HEAP32[25] | 0)) {
- $psize_1 = $227;
- break;
+ HEAP32[22] = $227;
+ HEAP32[sp + 704 >> 2] = 5;
+ break OL;
+ } else {
+ helper$2 = 1;
+ }
+ }
+ if (helper$2) {
+ helper$2 = 0;
+ if (1) {
+ HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] = $194 & -2;
+ HEAP32[$p_0 + 4 >> 2] = $psize_0 | 1;
+ HEAP32[$189 + $psize_0 >> 2] = $psize_0;
+ $psize_1 = $psize_0;
+ } else {
+ helper$2 = 1;
}
- HEAP32[22] = $227;
- HEAP32[sp + 656 >> 2] = 5;
- break OL;
- } else {
- HEAP32[($mem + (($10 & -8) - 4) | 0) >> 2] = $194 & -2;
- HEAP32[$p_0 + 4 >> 2] = $psize_0 | 1;
- HEAP32[$189 + $psize_0 >> 2] = $psize_0;
- $psize_1 = $psize_0;
}
} while (0);
$390 = $psize_1 >>> 3;
@@ -610,7 +674,7 @@ function _free$2(sp) {
HEAP32[$F16_0 + 12 >> 2] = $p_0;
HEAP32[$p_0 + 8 >> 2] = $F16_0;
HEAP32[$p_0 + 12 >> 2] = 120 + ($390 << 1 << 2) | 0;
- HEAP32[sp + 656 >> 2] = 5;
+ HEAP32[sp + 704 >> 2] = 5;
break OL;
}
$414 = $p_0;
@@ -635,60 +699,72 @@ function _free$2(sp) {
$447 = HEAP32[21] | 0;
$448 = 1 << $I18_0;
do {
- if (($447 & $448 | 0) == 0) {
- HEAP32[21] = $447 | $448;
- HEAP32[$443 >> 2] = $414;
- HEAP32[$p_0 + 24 >> 2] = $443;
- HEAP32[$p_0 + 12 >> 2] = $p_0;
- HEAP32[$p_0 + 8 >> 2] = $p_0;
- } else {
- if (($I18_0 | 0) == 31) {
- $463 = 0;
+ helper$5 = 1;
+ if (helper$5) {
+ helper$5 = 0;
+ if (($447 & $448 | 0) == 0) {
+ HEAP32[21] = $447 | $448;
+ HEAP32[$443 >> 2] = $414;
+ HEAP32[$p_0 + 24 >> 2] = $443;
+ HEAP32[$p_0 + 12 >> 2] = $p_0;
+ HEAP32[$p_0 + 8 >> 2] = $p_0;
} else {
- $463 = 25 - ($I18_0 >>> 1) | 0;
+ helper$5 = 1;
}
- $K19_0 = $psize_1 << $463;
- $T_0 = HEAP32[$443 >> 2] | 0;
- while (1) {
- if ((HEAP32[$T_0 + 4 >> 2] & -8 | 0) == ($psize_1 | 0)) {
- break;
- }
- $472 = $T_0 + 16 + ($K19_0 >>> 31 << 2) | 0;
- $473 = HEAP32[$472 >> 2] | 0;
- if (($473 | 0) == 0) {
- label = 569;
- break;
+ }
+ if (helper$5) {
+ helper$5 = 0;
+ if (1) {
+ if (($I18_0 | 0) == 31) {
+ $463 = 0;
} else {
- $K19_0 = $K19_0 << 1;
- $T_0 = $473;
+ $463 = 25 - ($I18_0 >>> 1) | 0;
}
- }
- if ((label | 0) == 569) {
- if ($472 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ $K19_0 = $psize_1 << $463;
+ $T_0 = HEAP32[$443 >> 2] | 0;
+ while (1) {
+ if ((HEAP32[$T_0 + 4 >> 2] & -8 | 0) == ($psize_1 | 0)) {
+ break;
+ }
+ $472 = $T_0 + 16 + ($K19_0 >>> 31 << 2) | 0;
+ $473 = HEAP32[$472 >> 2] | 0;
+ if (($473 | 0) == 0) {
+ label = 569;
+ break;
+ } else {
+ $K19_0 = $K19_0 << 1;
+ $T_0 = $473;
+ }
+ }
+ if ((label | 0) == 569) {
+ if ($472 >>> 0 < (HEAP32[24] | 0) >>> 0) {
+ _abort();
+ } else {
+ HEAP32[$472 >> 2] = $414;
+ HEAP32[$p_0 + 24 >> 2] = $T_0;
+ HEAP32[$p_0 + 12 >> 2] = $p_0;
+ HEAP32[$p_0 + 8 >> 2] = $p_0;
+ break;
+ }
+ }
+ $486 = $T_0 + 8 | 0;
+ $487 = HEAP32[$486 >> 2] | 0;
+ $489 = HEAP32[24] | 0;
+ if ($T_0 >>> 0 < $489 >>> 0) {
+ _abort();
+ }
+ if ($487 >>> 0 < $489 >>> 0) {
_abort();
} else {
- HEAP32[$472 >> 2] = $414;
- HEAP32[$p_0 + 24 >> 2] = $T_0;
- HEAP32[$p_0 + 12 >> 2] = $p_0;
- HEAP32[$p_0 + 8 >> 2] = $p_0;
+ HEAP32[$487 + 12 >> 2] = $414;
+ HEAP32[$486 >> 2] = $414;
+ HEAP32[$p_0 + 8 >> 2] = $487;
+ HEAP32[$p_0 + 12 >> 2] = $T_0;
+ HEAP32[$p_0 + 24 >> 2] = 0;
break;
}
- }
- $486 = $T_0 + 8 | 0;
- $487 = HEAP32[$486 >> 2] | 0;
- $489 = HEAP32[24] | 0;
- if ($T_0 >>> 0 < $489 >>> 0) {
- _abort();
- }
- if ($487 >>> 0 < $489 >>> 0) {
- _abort();
} else {
- HEAP32[$487 + 12 >> 2] = $414;
- HEAP32[$486 >> 2] = $414;
- HEAP32[$p_0 + 8 >> 2] = $487;
- HEAP32[$p_0 + 12 >> 2] = $T_0;
- HEAP32[$p_0 + 24 >> 2] = 0;
- break;
+ helper$5 = 1;
}
}
} while (0);
@@ -697,7 +773,7 @@ function _free$2(sp) {
if (($501 | 0) == 0) {
$sp_0_in_i = 536;
} else {
- HEAP32[sp + 656 >> 2] = 5;
+ HEAP32[sp + 704 >> 2] = 5;
break OL;
}
while (1) {
@@ -710,7 +786,7 @@ function _free$2(sp) {
}
HEAP32[28] = -1;
STACKTOP = sp;
- HEAP32[sp + 656 >> 2] = 5;
+ HEAP32[sp + 704 >> 2] = 5;
break OL;
} while (0);
}