summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--demos/scons-embind/SConstruct23
-rw-r--r--demos/scons-embind/bar.cpp2
-rw-r--r--demos/scons-embind/foo.cpp11
-rw-r--r--demos/scons-embind/test.js2
-rw-r--r--docs/splashpres.pdfbin0 -> 131072 bytes
-rwxr-xr-xemcc44
-rwxr-xr-xemscons20
-rw-r--r--scons-tools/closure.py28
-rwxr-xr-xscons-tools/emscripten.py359
-rwxr-xr-xscons-tools/llvm.py33
-rw-r--r--src/analyzer.js5
-rw-r--r--src/determinstic.js8
-rw-r--r--src/embind/embind.js99
-rw-r--r--src/embind/emval.js177
-rw-r--r--src/intertyper.js15
-rw-r--r--src/jsifier.js16
-rw-r--r--src/library.js116
-rw-r--r--src/library_browser.js41
-rw-r--r--src/library_gc.js2
-rw-r--r--src/library_glut.js10
-rw-r--r--src/library_sdl.js12
-rw-r--r--src/parseTools.js50
-rw-r--r--src/postamble.js2
-rw-r--r--src/preamble.js13
-rw-r--r--src/settings.js3
-rw-r--r--src/shell.js1
-rw-r--r--system/include/emscripten/bind.h62
-rw-r--r--system/include/emscripten/emscripten.h8
-rw-r--r--system/include/emscripten/val.h116
-rw-r--r--system/include/emscripten/wire.h81
-rw-r--r--system/include/libcxx/exception4
-rw-r--r--system/lib/embind/bind.cpp1
-rw-r--r--system/lib/libcxx/symbols1
-rw-r--r--tests/cases/emptystruct.ll2
-rw-r--r--tests/cases/muli33.ll114
-rw-r--r--tests/cases/muli33.txt1
-rw-r--r--tests/cases/oob_ta2.ll25
-rw-r--r--tests/cases/philoop.ll305
-rw-r--r--tests/cases/philoop.txt1
-rw-r--r--tests/embind/build_benchmark2
-rw-r--r--tests/embind/embind.benchmark.js35
-rw-r--r--tests/embind/embind.test.js153
-rw-r--r--tests/embind/embind_benchmark.cpp71
-rw-r--r--tests/embind/embind_test.cpp65
-rw-r--r--tests/linpack.c1153
-rwxr-xr-xtests/runner.py492
-rw-r--r--tests/sdl_audio.c4
-rw-r--r--tests/time/src.c5
-rw-r--r--tests/websockets.c2
-rw-r--r--tools/cache.py5
-rw-r--r--tools/eliminator/asm-eliminator-test-output.js4605
-rw-r--r--tools/eliminator/asm-eliminator-test.js6087
-rw-r--r--tools/file_packager.py90
-rw-r--r--tools/js-optimizer.js120
-rw-r--r--tools/shared.py8
-rw-r--r--tools/test-js-optimizer-asm-pre-output.js20
-rw-r--r--tools/test-js-optimizer-asm-pre.js14
-rw-r--r--tools/test-js-optimizer-asm-regs-output.js81
-rw-r--r--tools/test-js-optimizer-asm-regs.js84
60 files changed, 14505 insertions, 405 deletions
diff --git a/AUTHORS b/AUTHORS
index 4cacefeb..368387a7 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -76,4 +76,5 @@ a license to everyone to use it as detailed in LICENSE.)
* John Allwine <jallwine86@gmail.com>
* Martin Gerhardy <martin.gerhardy@gmail.com>
* James Gregory <jgregory@zynga.com> (copyright owned by Zynga, Inc)
+* Dan Gohman <sunfish@google.com> (copyright owned by Google, Inc.)
diff --git a/demos/scons-embind/SConstruct b/demos/scons-embind/SConstruct
new file mode 100644
index 00000000..8afc3e27
--- /dev/null
+++ b/demos/scons-embind/SConstruct
@@ -0,0 +1,23 @@
+env = Environment(
+ toolpath=['../../scons-tools'],
+ tools=['cc', 'c++', 'ar', 'emscripten', 'llvm', 'closure'],
+ LLVM_ROOT='/opt/local/bin',
+ CLANG='clang-mp-3.2',
+ CLANGXX='clang++-mp-3.2',
+ LLVM_LINK='llvm-link-mp-3.2',
+ LLVM_OPT='opt-mp-3.2',
+ LLVM_DIS='llvm-dis-mp-3.2',
+ EMSCRIPTEN_VERSION_FILE=File('build/version_file'),
+ EMSCRIPTEN_SETTINGS={
+ 'ASM_JS': 0,
+ })
+env['BUILDERS']['WrapInModule'] = Builder(
+ action='cp $SOURCE $TARGET',
+)
+
+env.Append()
+a1 = env.Object('build/foo.bc', 'foo.cpp')
+a2 = env.Object('build/bar.bc', 'bar.cpp')
+total = env.LLVMLink('build/thelibrary.bc', [a1, a2])
+
+env.emscripten('build/thelibrary.js', total)
diff --git a/demos/scons-embind/bar.cpp b/demos/scons-embind/bar.cpp
new file mode 100644
index 00000000..a3908014
--- /dev/null
+++ b/demos/scons-embind/bar.cpp
@@ -0,0 +1,2 @@
+void foo() {
+}
diff --git a/demos/scons-embind/foo.cpp b/demos/scons-embind/foo.cpp
new file mode 100644
index 00000000..61be501a
--- /dev/null
+++ b/demos/scons-embind/foo.cpp
@@ -0,0 +1,11 @@
+#include <stdio.h>
+#include <emscripten/bind.h>
+
+void print_some_stuff(int a, float b, const std::string& s) {
+ printf("print_some_stuff: %d, %f, %s\n", a, b, s.c_str());
+}
+
+EMSCRIPTEN_BINDINGS(foo) {
+ emscripten::function("print_some_stuff", &print_some_stuff);
+}
+
diff --git a/demos/scons-embind/test.js b/demos/scons-embind/test.js
new file mode 100644
index 00000000..a6252fd8
--- /dev/null
+++ b/demos/scons-embind/test.js
@@ -0,0 +1,2 @@
+var thelibrary = require('./build/thelibrary.js');
+thelibrary.Module.print_some_stuff(1, 2, 'hello world');
diff --git a/docs/splashpres.pdf b/docs/splashpres.pdf
new file mode 100644
index 00000000..02fa4ea0
--- /dev/null
+++ b/docs/splashpres.pdf
Binary files differ
diff --git a/emcc b/emcc
index 1ed5fcb6..65dec978 100755
--- a/emcc
+++ b/emcc
@@ -28,34 +28,6 @@ Example uses:
so it should relay everything to gcc/g++. You should not define that when
running make, of course.
- * With CMake, the same command will work (with cmake instead of ./configure). You may also be
- able to do the following in your CMakeLists.txt:
-
- SET(CMAKE_C_COMPILER "PATH/emcc")
- SET(CMAKE_CXX_COMPILER "PATH/em++")
- SET(CMAKE_LINKER "PATH/emcc")
- SET(CMAKE_CXX_LINKER "PATH/emcc")
- SET(CMAKE_C_LINK_EXECUTABLE "PATH/emcc")
- SET(CMAKE_CXX_LINK_EXECUTABLE "PATH/emcc")
- SET(CMAKE_AR "PATH/emar")
- SET(CMAKE_RANLIB "PATH/emranlib")
-
- * For SCons the shared.py can be imported like so:
- __file__ = str(Dir('#/project_path_to_emscripten/dummy/dummy'))
- __rootpath__ = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- def path_from_root(*pathelems):
- return os.path.join(__rootpath__, *pathelems)
- sys.path += [path_from_root('')]
- from tools.shared import *
-
- For using the Emscripten compilers/linkers/etc. you can do:
- env = Environment()
- ...
- env.Append(CCFLAGS = COMPILER_OPTS)
- env.Replace(LINK = LLVM_LD)
- env.Replace(LD = LLVM_LD)
- TODO: Document all relevant setup changes
-
After setting that up, run your build system normally.
Note the appearance of em++ instead of emcc
@@ -138,7 +110,7 @@ while response_file:
sys.argv[index:index+1] = extra_args
break
-if len(sys.argv) == 1 or sys.argv[1] == '--help':
+if len(sys.argv) == 1 or '--help' in sys.argv:
this = os.path.basename('em++' if os.environ.get('EMMAKEN_CXX') else 'emcc')
print '''%s [options] file...
@@ -629,7 +601,7 @@ if EMMAKEN_CFLAGS: CC_ADDITIONAL_ARGS += shlex.split(EMMAKEN_CFLAGS)
# ---------------- Utilities ---------------
-SOURCE_SUFFIXES = ('.c', '.cpp', '.cxx', '.cc')
+SOURCE_SUFFIXES = ('.c', '.cpp', '.cxx', '.cc', '.m', '.mm')
BITCODE_SUFFIXES = ('.bc', '.o', '.obj')
DYNAMICLIB_SUFFIXES = ('.dylib', '.so', '.dll')
STATICLIB_SUFFIXES = ('.a',)
@@ -657,7 +629,7 @@ header = False # pre-compiled headers. We fake that by just copying the file
for i in range(1, len(sys.argv)):
arg = sys.argv[i]
if not arg.startswith('-'):
- if arg.endswith('.c'):
+ if arg.endswith(('.c','.m')):
use_cxx = False
if arg.endswith('.h') and sys.argv[i-1] != '-include':
header = True
@@ -932,6 +904,9 @@ try:
prev = newargs[i-1]
if prev in ['-MT', '-install_name', '-I', '-L']: continue # ignore this gcc-style argument
+ if (os.path.islink(arg) and os.path.realpath(arg).endswith(SOURCE_SUFFIXES + BITCODE_SUFFIXES + DYNAMICLIB_SUFFIXES + ASSEMBLY_SUFFIXES)):
+ arg = os.path.realpath(arg)
+
if not arg.startswith('-') and (arg.endswith(SOURCE_SUFFIXES + BITCODE_SUFFIXES + DYNAMICLIB_SUFFIXES + ASSEMBLY_SUFFIXES) or shared.Building.is_ar(arg)): # we already removed -o <target>, so all these should be inputs
newargs[i] = ''
if os.path.exists(arg):
@@ -1019,7 +994,7 @@ try:
for change in settings_changes:
key, value = change.split('=')
if value[0] == '@':
- value = '"' + value + '"'
+ value = '"@' + os.path.abspath(value[1:]) + '"'
exec('shared.Settings.' + key + ' = ' + value)
# Apply effects from settings
@@ -1027,8 +1002,7 @@ try:
assert opt_level >= 1, 'asm.js requires -O1 or above'
if bind:
- shared.Settings.ASM_JS = 0
- logging.warning('disabling asm.js because it is not compatible with embind yet')
+ shared.Settings.RESERVED_FUNCTION_POINTERS = max(shared.Settings.RESERVED_FUNCTION_POINTERS, 10)
if shared.Settings.CORRECT_SIGNS != 1:
logging.warning('setting CORRECT_SIGNS to 1 for asm.js code generation')
shared.Settings.CORRECT_SIGNS = 1
@@ -1047,8 +1021,6 @@ try:
logging.warning('disabling closure because debug info was requested')
closure = False
- if jcache and not keep_js_debug: print >> sys.stderr, 'emcc: warning: it is recommended to run jcache with -g when compiling bitcode to JS'
-
if minify_whitespace is None:
minify_whitespace = opt_level >= 2 and not keep_js_debug
diff --git a/emscons b/emscons
new file mode 100755
index 00000000..2666f18c
--- /dev/null
+++ b/emscons
@@ -0,0 +1,20 @@
+#!/usr/bin/env python2
+
+'''
+Wrapping the scons invocation, EMSCRIPTEN_TOOL_PATH is set in the process
+environment, and can be used to locate the emscripten SCons Tool.
+Example:
+# Load emscripten Tool
+my_env = Environment(tools=['emscripten'], toolpath=[os.environ['EMSCRIPTEN_TOOL_PATH']])
+'''
+
+import os, subprocess, sys
+from tools import shared
+
+tool_path = os.path.join(shared.path_from_root('tools'), 'scons', 'site_scons', 'site_tools', 'emscripten')
+
+env = os.environ.copy()
+env[ 'EMSCRIPTEN_TOOL_PATH' ] = tool_path
+
+exit(subprocess.call(sys.argv[1:], env=env))
+
diff --git a/scons-tools/closure.py b/scons-tools/closure.py
new file mode 100644
index 00000000..8f53e507
--- /dev/null
+++ b/scons-tools/closure.py
@@ -0,0 +1,28 @@
+import os.path
+from SCons.Builder import Builder
+
+def generate(env):
+ def depend_on_closure_compiler(target, source, env):
+ env.Depends(target, env['CLOSURE_COMPILER'])
+ return target, source
+
+ ClosureCompiler = Builder(
+ action='$JAVA $JAVAFLAGS -jar $CLOSURE_COMPILER $CLOSURE_FLAGS --js_output_file $TARGET $SOURCES',
+ emitter=depend_on_closure_compiler
+ )
+
+ closure = os.path.join(
+ os.path.dirname(__file__),
+ '..',
+ 'third_party',
+ 'closure-compiler',
+ 'compiler.jar')
+ closure = env.File(closure)
+
+ env['JAVA'] = 'java'
+ env['CLOSURE_COMPILER'] = closure
+ env.Append(
+ BUILDERS={'ClosureCompiler':ClosureCompiler})
+
+def exists(_env):
+ return True
diff --git a/scons-tools/emscripten.py b/scons-tools/emscripten.py
new file mode 100755
index 00000000..473c51ad
--- /dev/null
+++ b/scons-tools/emscripten.py
@@ -0,0 +1,359 @@
+import hashlib
+import json
+import sys
+import os
+from SCons.Defaults import Delete
+from SCons.Builder import Builder
+from SCons.Scanner import Scanner
+
+def exists(env):
+ return True
+
+def _expand_settings_flags(settings, env):
+ return [
+ ('-s%s=%s' % (KEY, json.dumps(VALUE).replace('"', '\\"')))
+ for KEY, VALUE in settings.items() ]
+
+emscripten_version_files = {}
+
+def build_version_file(env):
+ if not env.subst('$EMSCRIPTEN_VERSION_FILE'):
+ raise AssertionError('Must set EMSCRIPTEN_VERSION_FILE in environment')
+ if not env.subst('$EMSCRIPTEN_TEMP_DIR'):
+ raise AssertionError('Must set EMSCRIPTEN_TEMP_DIR in environment')
+
+ EMSCRIPTEN_DEPENDENCIES = [
+ env.Glob('${EMSCRIPTEN_HOME}/src/*.js'),
+ env.Glob('${EMSCRIPTEN_HOME}/tools/*.py'),
+ '${EMSCRIPTEN_HOME}/emscripten.py',
+ ]
+ if env.subst('$EMSCRIPTEN_SHELL'):
+ EMSCRIPTEN_DEPENDENCIES.append('$EMSCRIPTEN_SHELL')
+
+ def touch_file(target, source, env):
+ m = hashlib.md5()
+ for s in source:
+ m.update(file(s.abspath, 'rb').read())
+ for t in target:
+ file(t.abspath, 'wb').write(m.hexdigest())
+
+ [emscripten_version_file] = env.Command(
+ '$EMSCRIPTEN_VERSION_FILE',
+ EMSCRIPTEN_DEPENDENCIES,
+ touch_file)
+
+ env.AddPostAction(
+ emscripten_version_file,
+ Delete(env.Dir('$EMSCRIPTEN_TEMP_DIR').abspath))
+
+ return emscripten_version_file
+
+def get_emscripten_version_file(env):
+ EMSCRIPTEN_HOME = env.Dir('$EMSCRIPTEN_HOME').abspath
+ try:
+ version_file = emscripten_version_files[EMSCRIPTEN_HOME]
+ except KeyError:
+ version_file = build_version_file(env)
+ emscripten_version_files[EMSCRIPTEN_HOME] = version_file
+ return version_file
+
+def depend_on_emscripten(node, env, path):
+ return [get_emscripten_version_file(env)]
+
+EmscriptenScanner = Scanner(
+ name='emscripten',
+ function=depend_on_emscripten)
+
+def setExtension(filename, extension):
+ return os.path.splitext(filename)[0] + '.' + extension
+
+def emscripten(env, target_js, source_bc):
+ env = env.Clone()
+ def buildName(extension):
+ return setExtension(target_js, extension)
+
+ # for debugging and reading generated code.
+ # not in critical path, uses spare cores.
+ env.LLVMDis(buildName('ll'), source_bc)
+
+ [opt_ll] = env.LLVMOpt(
+ buildName('opt.ll'),
+ source_bc,
+ LLVM_OPT_FLAGS=['-S'])
+
+ [raw_emscripten_js] = env.Emscripten(
+ buildName('raw.js'),
+ [opt_ll])
+
+ [optimized_js] = env.JSOptimizer(
+ buildName('opt.js'),
+ raw_emscripten_js)
+
+ prejs = [
+ env['EMSCRIPTEN_PREJS'],
+ '${EMSCRIPTEN_HOME}/src/embind/emval.js',
+ '${EMSCRIPTEN_HOME}/src/embind/embind.js' ]
+
+ [concatenated_js] = env.Concatenate(
+ buildName('concat.js'),
+ [ prejs,
+ optimized_js,
+ env['EMSCRIPTEN_POSTJS'] ])
+
+ DISABLE_EMSCRIPTEN_WARNINGS = [
+ '--jscomp_error', 'ambiguousFunctionDecl',
+ '--jscomp_error', 'checkDebuggerStatement',
+ '--jscomp_off', 'checkTypes',
+ '--jscomp_off', 'checkVars',
+ '--jscomp_error', 'deprecated',
+ '--jscomp_off', 'duplicate',
+ #'--jscomp_error', 'es5strict',
+ '--jscomp_off', 'missingProperties', # TODO: fix emscripten and turn this one on
+ '--jscomp_error', 'undefinedNames',
+ '--jscomp_off', 'undefinedVars', # TODO: fix emscripten and turn this one on
+ '--jscomp_off', 'uselessCode',
+ '--jscomp_off', 'globalThis',
+ ]
+
+ [iter_global_emscripten_js] = env.Concatenate(
+ buildName('iter.js'),
+ [ prejs,
+ raw_emscripten_js,
+ env['EMSCRIPTEN_POSTJS'] ])
+
+ [global_cc_emscripten_js] = env.ClosureCompiler(
+ buildName('global.closure.js'),
+ concatenated_js,
+ CLOSURE_FLAGS=['--language_in', 'ECMASCRIPT5']+DISABLE_EMSCRIPTEN_WARNINGS+['--formatting', 'PRETTY_PRINT', '--compilation_level', 'SIMPLE_OPTIMIZATIONS'])
+
+ #env.Append(
+ # NODEJSFLAGS=['--max-stack-size=1000000000'],
+ # UGLIFYJSFLAGS=['--stats', '-c', 'warnings=false', '-b'])
+ #env.UglifyJS(
+ # buildName('global.uglify.js'),
+ # concatenated_js)
+
+ [closure_js] = env.ClosureCompiler(
+ buildName('closure.js'),
+ concatenated_js,
+ CLOSURE_FLAGS=['--language_in', 'ECMASCRIPT5']+DISABLE_EMSCRIPTEN_WARNINGS+['--formatting', 'PRETTY_PRINT', '--compilation_level', 'ADVANCED_OPTIMIZATIONS'])
+
+ [global_emscripten_min_js] = env.JSOptimizer(
+ buildName('global.min.js'),
+ closure_js,
+ JS_OPTIMIZER_PASSES=['simplifyExpressionsPost', 'compress', 'last'])
+
+ [emscripten_iteration_js] = env.WrapInModule(
+ buildName('iteration.js'),
+ iter_global_emscripten_js)
+
+ [emscripten_js] = env.WrapInModule(
+ buildName('debug.js'),
+ global_cc_emscripten_js)
+
+ [emscripten_min_js] = env.WrapInModule(
+ buildName('min.js'),
+ global_emscripten_min_js)
+
+ env.InstallAs(buildName('js'), emscripten_js)
+
+ return [emscripten_iteration_js, emscripten_js, emscripten_min_js]
+
+LIBC_SOURCES = [
+ 'system/lib/dlmalloc.c',
+ 'system/lib/libc/musl/src/string/wmemset.c',
+ 'system/lib/libc/musl/src/string/wmemcpy.c',
+]
+
+LIBCXX_SOURCES = [os.path.join('system/lib/libcxx', x) for x in [
+ 'algorithm.cpp',
+ 'bind.cpp',
+ #'chrono.cpp',
+ #'condition_variable.cpp',
+ #'debug.cpp',
+ #'exception.cpp',
+ 'future.cpp',
+ 'hash.cpp',
+ #'ios.cpp',
+ #'iostream.cpp',
+ 'memory.cpp',
+ 'mutex.cpp',
+ 'new.cpp',
+ 'random.cpp',
+ 'regex.cpp',
+ 'stdexcept.cpp',
+ 'string.cpp',
+ 'strstream.cpp',
+ 'system_error.cpp',
+ #'thread.cpp',
+ 'typeinfo.cpp',
+ 'utility.cpp',
+ 'valarray.cpp',
+]]
+
+LIBCXXABI_SOURCES = [os.path.join('system/lib/libcxxabi/src', x) for x in [
+ 'private_typeinfo.cpp'
+]]
+
+# MAJOR HACK ALERT
+# ugh, SCons imports tool .py files multiple times, meaning that global variables aren't really global
+# store our "globals" "privately" on the SCons object :(
+import SCons
+
+def build_libembind(env):
+ emscripten_temp_dir = env.Dir('$EMSCRIPTEN_TEMP_DIR').abspath
+ try:
+ libembind_cache = SCons.__emscripten_libembind_cache
+ except AttributeError:
+ libembind_cache = {}
+ SCons.__emscripten_libembind_cache = libembind_cache
+ try:
+ return libembind_cache[emscripten_temp_dir]
+ except KeyError:
+ pass
+
+ libembind = env.Object(
+ '$EMSCRIPTEN_TEMP_DIR/internal_libs/bind',
+ '$EMSCRIPTEN_HOME/system/lib/embind/bind.cpp')
+ env.Depends(libembind, get_emscripten_version_file(env))
+ libembind_cache[emscripten_temp_dir] = libembind
+ return libembind
+
+def build_libcxx(env):
+ emscripten_temp_dir = env.Dir('$EMSCRIPTEN_TEMP_DIR').abspath
+ try:
+ libcxx_cache = SCons.__emscripten_libcxx_cache
+ except AttributeError:
+ libcxx_cache = {}
+ SCons.__emscripten_libcxx_cache = libcxx_cache
+ try:
+ return libcxx_cache[emscripten_temp_dir]
+ except KeyError:
+ pass
+
+ env = env.Clone()
+ env['CXXFLAGS'] = filter(lambda e: e not in ('-Werror', '-Wall'), env['CXXFLAGS'])
+ env['CCFLAGS'] = filter(lambda e: e not in ('-Werror', '-Wall'), env['CCFLAGS'])
+
+ objs = [
+ env.Object(
+ '${EMSCRIPTEN_TEMP_DIR}/libcxx_objects/' + os.path.splitext(o)[0] + '.bc',
+ '${EMSCRIPTEN_HOME}/' + o)
+ for o in LIBC_SOURCES + LIBCXXABI_SOURCES + LIBCXX_SOURCES]
+ env.Depends(objs, get_emscripten_version_file(env))
+
+ libcxx = env.Library('${EMSCRIPTEN_TEMP_DIR}/internal_libs/libcxx', objs)
+ libcxx_cache[emscripten_temp_dir] = libcxx
+ return libcxx
+
+def generate(env):
+ env.SetDefault(
+ PYTHON=sys.executable,
+ NODEJS='node',
+ JS_ENGINE='$NODEJS',
+ EMSCRIPTEN_FLAGS=['-v', '-j', '--suppressUsageWarning'],
+ EMSCRIPTEN_TEMP_DIR=env.Dir('#/emscripten.tmp'),
+ _expand_settings_flags=_expand_settings_flags,
+ EMSCRIPTEN_PREJS=[],
+ EMSCRIPTEN_POSTJS=[],
+ EMSCRIPTEN_SETTINGS={},
+ _EMSCRIPTEN_SETTINGS_FLAGS='${_expand_settings_flags(EMSCRIPTEN_SETTINGS, __env__)}',
+ JS_OPTIMIZER_PASSES=[],
+ LLVM_OPT_PASSES=['-std-compile-opts', '-std-link-opts'],
+
+ EMSCRIPTEN_HOME=env.Dir(os.path.join(os.path.dirname(__file__), '..')),
+ )
+
+ env.Replace(
+ CC='${LLVM_ROOT}/${CLANG}',
+ CXX='${LLVM_ROOT}/${CLANGXX}',
+ AR='${LLVM_ROOT}/${LLVM_LINK}',
+ ARCOM='$AR -o $TARGET $SOURCES',
+ OBJSUFFIX='.bc',
+ LIBPREFIX='',
+ LIBSUFFIX='.bc',
+ RANLIBCOM='',
+ CCFLAGS=[
+ '-U__STRICT_ANSI__',
+ '-target', 'le32-unknown-nacl',
+ '-nostdinc',
+ '-Wno-#warnings',
+ '-Wno-error=unused-variable',
+ '-Werror',
+ '-Os',
+ '-fno-threadsafe-statics',
+ '-fvisibility=hidden',
+ '-fvisibility-inlines-hidden',
+ '-Xclang', '-nostdinc++',
+ '-Xclang', '-nobuiltininc',
+ '-Xclang', '-nostdsysteminc',
+ '-Xclang', '-isystem$EMSCRIPTEN_HOME/system/include',
+ '-Xclang', '-isystem$EMSCRIPTEN_HOME/system/include/libc',
+ '-Xclang', '-isystem$EMSCRIPTEN_HOME/system/include/libcxx',
+ '-Xclang', '-isystem$EMSCRIPTEN_HOME/system/include/bsd',
+ '-emit-llvm'],
+ CXXFLAGS=['-std=c++11', '-fno-exceptions'],
+ )
+ env.Append(CPPDEFINES=[
+ 'EMSCRIPTEN',
+ '__EMSCRIPTEN__',
+ '__STDC__',
+ '__IEEE_LITTLE_ENDIAN',
+ ])
+
+ env['BUILDERS']['Emscripten'] = Builder(
+ action='$PYTHON ${EMSCRIPTEN_HOME}/emscripten.py $EMSCRIPTEN_FLAGS $_EMSCRIPTEN_SETTINGS_FLAGS --temp-dir=$EMSCRIPTEN_TEMP_DIR --compiler $JS_ENGINE --relooper=third-party/relooper.js $SOURCE > $TARGET',
+ target_scanner=EmscriptenScanner)
+
+ env['BUILDERS']['JSOptimizer'] = Builder(
+ action='$JS_ENGINE ${EMSCRIPTEN_HOME}/tools/js-optimizer.js $SOURCE $JS_OPTIMIZER_PASSES > $TARGET',
+ target_scanner=EmscriptenScanner)
+
+ def depend_on_embedder(target, source, env):
+ env.Depends(target, env['JS_EMBEDDER'])
+ return target, source
+
+ def embed_files_in_js(target, source, env, for_signature):
+ return '$PYTHON $JS_EMBEDDER $SOURCE.srcpath > $TARGET'
+
+ def get_files_in_tree(node, env, path):
+ tree_paths = []
+ for root, dirs, files in os.walk(str(node)):
+ tree_paths += [os.path.join(root, f) for f in files]
+ return [env.File(p) for p in tree_paths]
+
+ env.SetDefault(
+ JS_EMBEDDER=env.File('#/bin/embed_files_in_js.py'))
+
+ FileTreeScanner = Scanner(
+ function=get_files_in_tree,
+ name='FileTreeScanner',
+ recursive=False)
+
+ env['BUILDERS']['EmbedFilesInJS'] = Builder(
+ generator=embed_files_in_js,
+ emitter=depend_on_embedder,
+ source_scanner=FileTreeScanner)
+
+ env.AddMethod(emscripten)
+
+ def ConcatenateAction(target, source, env):
+ [target] = target
+ total = ''.join(file(str(s), 'rb').read() for s in source)
+ file(str(target), 'wb').write(total)
+ env['BUILDERS']['Concatenate'] = Builder(action=ConcatenateAction)
+
+ libembind = build_libembind(env)
+ libcxx = build_libcxx(env)
+
+ # should embind be its own tool?
+ env.Append(
+ CPPPATH=[
+ '${EMSCRIPTEN_HOME}/system/include' ],
+ LIBPATH=['$EMSCRIPTEN_TEMP_DIR/internal_libs'],
+ LIBS=[
+ libembind,
+ libcxx,
+ ],
+ )
+
diff --git a/scons-tools/llvm.py b/scons-tools/llvm.py
new file mode 100755
index 00000000..f272bd16
--- /dev/null
+++ b/scons-tools/llvm.py
@@ -0,0 +1,33 @@
+from SCons.Scanner.Prog import scan
+from SCons.Builder import Builder
+
+def exists(env):
+ return True
+
+def add_libraries(target, source, env):
+ unique = []
+ lib_nodes = set()
+ for x in scan(None, env, tuple(map(env.Dir, env['LIBPATH']))):
+ if x in lib_nodes:
+ continue
+ lib_nodes.add(x)
+ unique.append(x)
+ return (target, source + unique)
+
+def generate(env):
+ env.SetDefault(
+ CLANG='clang',
+ CLANGXX='clang++',
+ LLVM_DIS='llvm-dis',
+ LLVM_OPT='opt',
+ LLVM_LINK='llvm-link')
+
+ env['BUILDERS']['LLVMDis'] = Builder(
+ action='${LLVM_ROOT}/$LLVM_DIS -o=$TARGET $SOURCE')
+
+ env['BUILDERS']['LLVMOpt'] = Builder(
+ action='${LLVM_ROOT}/$LLVM_OPT $LLVM_OPT_FLAGS $LLVM_OPT_PASSES -o=$TARGET $SOURCE')
+
+ env['BUILDERS']['LLVMLink'] = Builder(
+ action='${LLVM_ROOT}/$LLVM_LINK -o=$TARGET $SOURCES',
+ emitter=add_libraries)
diff --git a/src/analyzer.js b/src/analyzer.js
index a131406c..2cc46ab6 100644
--- a/src/analyzer.js
+++ b/src/analyzer.js
@@ -411,8 +411,9 @@ function analyzer(data, sidePass) {
// legalize parameters
legalizeFunctionParameters(value.params);
// legalize return value, if any
- if (value.assignTo && isIllegalType(item.type)) {
- bits = getBits(value.type);
+ var returnType = getReturnType(item.type);
+ if (value.assignTo && isIllegalType(returnType)) {
+ bits = getBits(returnType);
var elements = getLegalVars(item.assignTo, bits);
// legalize return value
value.assignTo = elements[0].ident;
diff --git a/src/determinstic.js b/src/determinstic.js
index 91f98ed9..1ec0bbfe 100644
--- a/src/determinstic.js
+++ b/src/determinstic.js
@@ -10,3 +10,11 @@ Date.now = function() {
};
performance.now = Date.now;
+function hashMemory(id) {
+ var ret = 0;
+ for (var i = 0; i < HEAPU8.length; i++) {
+ ret = (ret*17 + HEAPU8[i])|0;
+ }
+ print(id + ':' + ret);
+}
+
diff --git a/src/embind/embind.js b/src/embind/embind.js
index cadee700..91386c69 100644
--- a/src/embind/embind.js
+++ b/src/embind/embind.js
@@ -131,6 +131,7 @@ function extendError(baseErrorType, errorName) {
// from https://github.com/imvu/imvujs/blob/master/src/function.js
function createNamedFunction(name, body) {
+ name = makeLegalFunctionName(name);
/*jshint evil:true*/
return new Function(
"body",
@@ -270,6 +271,10 @@ function __embind_register_void(rawType, name) {
'fromWireType': function() {
return undefined;
},
+ 'toWireType': function(destructors, o) {
+ // TODO: assert if anything else is given?
+ return undefined;
+ },
});
}
@@ -306,7 +311,7 @@ function __embind_register_integer(primitiveType, name, minRange, maxRange) {
'toWireType': function(destructors, value) {
// todo: Here we have an opportunity for -O3 level "unsafe" optimizations: we could
// avoid the following two if()s and assume value is of proper type.
- if (typeof value !== "number") {
+ if (typeof value !== "number" && typeof value !== "boolean") {
throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name);
}
if (value < minRange || value > maxRange) {
@@ -328,8 +333,8 @@ function __embind_register_float(rawType, name) {
'toWireType': function(destructors, value) {
// todo: Here we have an opportunity for -O3 level "unsafe" optimizations: we could
// avoid the following if() and assume value is of proper type.
- if (typeof value !== "number") {
- throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' +this.name);
+ if (typeof value !== "number" && typeof value !== "boolean") {
+ throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name);
}
return value;
},
@@ -449,6 +454,31 @@ function __embind_register_emval(rawType, name) {
});
}
+function __embind_register_memory_view(rawType, name) {
+ var typeMapping = [
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ ];
+
+ name = readLatin1String(name);
+ registerType(rawType, {
+ name: name,
+ 'fromWireType': function(handle) {
+ var type = HEAPU32[handle >> 2];
+ var size = HEAPU32[(handle >> 2) + 1]; // in elements
+ var data = HEAPU32[(handle >> 2) + 2]; // byte offset into emscripten heap
+ var TA = typeMapping[type];
+ return new TA(HEAP8.buffer, data, size);
+ },
+ });
+}
+
function runDestructors(destructors) {
while (destructors.length) {
var ptr = destructors.pop();
@@ -677,7 +707,7 @@ function __embind_finalize_tuple(rawTupleType) {
},
'toWireType': function(destructors, o) {
if (elementsLength !== o.length) {
- throw new TypeError("Incorrect number of tuple elements");
+ throw new TypeError("Incorrect number of tuple elements for " + reg.name + ": expected=" + elementsLength + ", actual=" + o.length);
}
var ptr = rawConstructor();
for (var i = 0; i < elementsLength; ++i) {
@@ -685,7 +715,7 @@ function __embind_finalize_tuple(rawTupleType) {
}
if (destructors !== null) {
destructors.push(rawDestructor, ptr);
- }
+ }
return ptr;
},
destructorFunction: rawDestructor,
@@ -802,7 +832,9 @@ var genericPointerToWireType = function(destructors, handle) {
if (this.isSmartPointer) {
var ptr = this.rawConstructor();
- destructors.push(this.rawDestructor, ptr);
+ if (destructors !== null) {
+ destructors.push(this.rawDestructor, ptr);
+ }
return ptr;
} else {
return 0;
@@ -854,7 +886,9 @@ var genericPointerToWireType = function(destructors, handle) {
clonedHandle.delete();
})
);
- destructors.push(this.rawDestructor, ptr);
+ if (destructors !== null) {
+ destructors.push(this.rawDestructor, ptr);
+ }
}
break;
@@ -1080,9 +1114,13 @@ ClassHandle.prototype.isAliasOf = function(other) {
return leftClass === rightClass && left === right;
};
+function throwInstanceAlreadyDeleted(obj) {
+ throwBindingError(getInstanceTypeName(obj) + ' instance already deleted');
+}
+
ClassHandle.prototype.clone = function() {
if (!this.$$.ptr) {
- throwBindingError(getInstanceTypeName(this) + ' instance already deleted');
+ throwInstanceAlreadyDeleted(this);
}
var clone = Object.create(Object.getPrototypeOf(this), {
@@ -1104,9 +1142,12 @@ function runDestructor(handle) {
}
}
-ClassHandle.prototype['delete'] = function() {
+ClassHandle.prototype['delete'] = function ClassHandle_delete() {
if (!this.$$.ptr) {
- throwBindingError(getInstanceTypeName(this) + ' instance already deleted');
+ throwInstanceAlreadyDeleted(this);
+ }
+ if (this.$$.deleteScheduled) {
+ throwBindingError('Object already scheduled for deletion');
}
this.$$.count.value -= 1;
@@ -1116,6 +1157,44 @@ ClassHandle.prototype['delete'] = function() {
this.$$.smartPtr = undefined;
this.$$.ptr = undefined;
};
+
+var deletionQueue = [];
+
+ClassHandle.prototype['isDeleted'] = function isDeleted() {
+ return !this.$$.ptr;
+};
+
+ClassHandle.prototype['deleteLater'] = function deleteLater() {
+ if (!this.$$.ptr) {
+ throwInstanceAlreadyDeleted(this);
+ }
+ if (this.$$.deleteScheduled) {
+ throwBindingError('Object already scheduled for deletion');
+ }
+ deletionQueue.push(this);
+ if (deletionQueue.length === 1 && delayFunction) {
+ delayFunction(flushPendingDeletes);
+ }
+ this.$$.deleteScheduled = true;
+ return this;
+};
+
+function flushPendingDeletes() {
+ while (deletionQueue.length) {
+ var obj = deletionQueue.pop();
+ obj.$$.deleteScheduled = false;
+ obj['delete']();
+ }
+}
+Module['flushPendingDeletes'] = flushPendingDeletes;
+
+var delayFunction;
+Module['setDelayFunction'] = function setDelayFunction(fn) {
+ delayFunction = fn;
+ if (deletionQueue.length && delayFunction) {
+ delayFunction(flushPendingDeletes);
+ }
+};
function RegisteredClass(
name,
diff --git a/src/embind/emval.js b/src/embind/emval.js
index c02ffa92..77270597 100644
--- a/src/embind/emval.js
+++ b/src/embind/emval.js
@@ -1,8 +1,12 @@
-/*global Module*/
+/*global Module:true, Runtime*/
/*global HEAP32*/
+/*global new_*/
+/*global createNamedFunction*/
/*global readLatin1String, writeStringToMemory*/
/*global requireRegisteredType, throwBindingError*/
+var Module = Module || {};
+
var _emval_handle_array = [{}]; // reserve zero
var _emval_free_list = [];
@@ -69,14 +73,8 @@ function __emval_incref(handle) {
function __emval_decref(handle) {
if (handle && 0 === --_emval_handle_array[handle].refcount) {
- delete _emval_handle_array[handle];
+ _emval_handle_array[handle] = undefined;
_emval_free_list.push(handle);
-
- var actual_length = _emval_handle_array.length;
- while (actual_length > 0 && _emval_handle_array[actual_length - 1] === undefined) {
- --actual_length;
- }
- _emval_handle_array.length = actual_length;
}
}
@@ -108,44 +106,73 @@ function __emval_take_value(type, v) {
var __newers = {}; // arity -> function
-function __emval_new(handle, argCount, argTypes) {
- requireHandle(handle);
- var args = parseParameters(
- argCount,
- argTypes,
- Array.prototype.slice.call(arguments, 3));
+function craftEmvalAllocator(argCount) {
+ /*This function returns a new function that looks like this:
+ function emval_allocator_3(handle, argTypes, arg0Wired, arg1Wired, arg2Wired) {
+ var argType0 = requireRegisteredType(HEAP32[(argTypes >> 2)], "parameter 0");
+ var arg0 = argType0.fromWireType(arg0Wired);
+ var argType1 = requireRegisteredType(HEAP32[(argTypes >> 2) + 1], "parameter 1");
+ var arg1 = argType1.fromWireType(arg1Wired);
+ var argType2 = requireRegisteredType(HEAP32[(argTypes >> 2) + 2], "parameter 2");
+ var arg2 = argType2.fromWireType(arg2Wired);
+ var constructor = _emval_handle_array[handle].value;
+ var emval = new constructor(arg0, arg1, arg2);
+ return emval;
+ } */
+
+ var args1 = ["requireRegisteredType", "HEAP32", "_emval_handle_array", "__emval_register"];
+ var args2 = [requireRegisteredType, HEAP32, _emval_handle_array, __emval_register];
+
+ var argsList = "";
+ var argsListWired = "";
+ for(var i = 0; i < argCount; ++i) {
+ argsList += (i!==0?", ":"")+"arg"+i; // 'arg0, arg1, ..., argn'
+ argsListWired += ", arg"+i+"Wired"; // ', arg0Wired, arg1Wired, ..., argnWired'
+ }
- // Alas, we are forced to use operator new until WebKit enables
- // constructing typed arrays without new.
- // In WebKit, Uint8Array(10) throws an error.
- // In every other browser, it's identical to new Uint8Array(10).
+ var invokerFnBody =
+ "return function emval_allocator_"+argCount+"(handle, argTypes " + argsListWired + ") {\n";
+ for(var i = 0; i < argCount; ++i) {
+ invokerFnBody +=
+ "var argType"+i+" = requireRegisteredType(HEAP32[(argTypes >> 2) + "+i+"], \"parameter "+i+"\");\n" +
+ "var arg"+i+" = argType"+i+".fromWireType(arg"+i+"Wired);\n";
+ }
+ invokerFnBody +=
+ "var constructor = _emval_handle_array[handle].value;\n" +
+ "var obj = new constructor("+argsList+");\n" +
+ "return __emval_register(obj);\n" +
+ "}\n";
+
+ args1.push(invokerFnBody);
+ var invokerFunction = new_(Function, args1).apply(null, args2);
+ return invokerFunction;
+}
+
+function __emval_new(handle, argCount, argTypes) {
+ requireHandle(handle);
+
var newer = __newers[argCount];
if (!newer) {
- var parameters = new Array(argCount);
- for (var i = 0; i < argCount; ++i) {
- parameters[i] = 'a' + i;
- }
- /*jshint evil:true*/
- newer = __newers[argCount] = new Function(
- ['c'].concat(parameters),
- "return new c(" + parameters.join(',') + ");");
+ newer = craftEmvalAllocator(argCount);
+ __newers[argCount] = newer;
}
-
- var constructor = _emval_handle_array[handle].value;
- var obj = newer.apply(undefined, [constructor].concat(args));
-/*
- // implement what amounts to operator new
- function dummy(){}
- dummy.prototype = constructor.prototype;
- var obj = new constructor;
- var rv = constructor.apply(obj, args);
- if (typeof rv === 'object') {
- obj = rv;
+
+ if (argCount === 0) {
+ return newer(handle, argTypes);
+ } else if (argCount === 1) {
+ return newer(handle, argTypes, arguments[3]);
+ } else if (argCount === 2) {
+ return newer(handle, argTypes, arguments[3], arguments[4]);
+ } else if (argCount === 3) {
+ return newer(handle, argTypes, arguments[3], arguments[4], arguments[5]);
+ } else if (argCount === 4) {
+ return newer(handle, argTypes, arguments[3], arguments[4], arguments[5], arguments[6]);
+ } else {
+ // This is a slow path! (.apply and .splice are slow), so a few specializations are present above.
+ return newer.apply(null, arguments.splice(1));
}
-*/
- return __emval_register(obj);
}
// appease jshint (technically this code uses eval)
@@ -192,38 +219,62 @@ function parseParameters(argCount, argTypes, argWireTypes) {
function __emval_call(handle, argCount, argTypes) {
requireHandle(handle);
+ var types = lookupTypes(argCount, argTypes);
+
+ var args = new Array(argCount);
+ for (var i = 0; i < argCount; ++i) {
+ args[i] = types[i].fromWireType(arguments[3 + i]);
+ }
+
var fn = _emval_handle_array[handle].value;
- var args = parseParameters(
- argCount,
- argTypes,
- Array.prototype.slice.call(arguments, 3));
var rv = fn.apply(undefined, args);
return __emval_register(rv);
}
-function __emval_call_method(handle, name, argCount, argTypes) {
- requireHandle(handle);
- name = getStringOrSymbol(name);
-
- var args = parseParameters(
- argCount,
- argTypes,
- Array.prototype.slice.call(arguments, 4));
- var obj = _emval_handle_array[handle].value;
- var rv = obj[name].apply(obj, args);
- return __emval_register(rv);
+function lookupTypes(argCount, argTypes, argWireTypes) {
+ var a = new Array(argCount);
+ for (var i = 0; i < argCount; ++i) {
+ a[i] = requireRegisteredType(
+ HEAP32[(argTypes >> 2) + i],
+ "parameter " + i);
+ }
+ return a;
}
-function __emval_call_void_method(handle, name, argCount, argTypes) {
- requireHandle(handle);
- name = getStringOrSymbol(name);
+function __emval_get_method_caller(argCount, argTypes) {
+ var types = lookupTypes(argCount, argTypes);
+
+ var retType = types[0];
+ var signatureName = retType.name + "_$" + types.slice(1).map(function (t) { return t.name; }).join("_") + "$";
+
+ var args1 = ["Runtime", "createNamedFunction", "requireHandle", "getStringOrSymbol", "_emval_handle_array", "retType"];
+ var args2 = [Runtime, createNamedFunction, requireHandle, getStringOrSymbol, _emval_handle_array, retType];
- var args = parseParameters(
- argCount,
- argTypes,
- Array.prototype.slice.call(arguments, 4));
- var obj = _emval_handle_array[handle].value;
- obj[name].apply(obj, args);
+ var argsList = ""; // 'arg0, arg1, arg2, ... , argN'
+ var argsListWired = ""; // 'arg0Wired, ..., argNWired'
+ for (var i = 0; i < argCount - 1; ++i) {
+ argsList += (i !== 0 ? ", " : "") + "arg" + i;
+ argsListWired += ", arg" + i + "Wired";
+ args1.push("argType" + i);
+ args2.push(types[1 + i]);
+ }
+
+ var invokerFnBody =
+ "return Runtime.addFunction(createNamedFunction('" + signatureName + "', function (handle, name" + argsListWired + ") {\n" +
+ "requireHandle(handle);\n" +
+ "name = getStringOrSymbol(name);\n";
+
+ for (var i = 0; i < argCount - 1; ++i) {
+ invokerFnBody += "var arg" + i + " = argType" + i + ".fromWireType(arg" + i + "Wired);\n";
+ }
+ invokerFnBody +=
+ "var obj = _emval_handle_array[handle].value;\n" +
+ "return retType.toWireType(null, obj[name](" + argsList + "));\n" +
+ "}));\n";
+
+ args1.push(invokerFnBody);
+ var invokerFunction = new_(Function, args1).apply(null, args2);
+ return invokerFunction;
}
function __emval_has_function(handle, name) {
diff --git a/src/intertyper.js b/src/intertyper.js
index 445c37f4..6da30ae8 100644
--- a/src/intertyper.js
+++ b/src/intertyper.js
@@ -537,12 +537,17 @@ function intertyper(data, sidePass, baseLineNums) {
});
}
} else if (!external) {
- if (item.tokens[3].text == 'c')
- item.tokens.splice(3, 1);
- if (item.tokens[3].text in PARSABLE_LLVM_FUNCTIONS) {
- ret.value = parseLLVMFunctionCall(item.tokens.slice(2));
+ if (item.tokens[3] && item.tokens[3].text != ';') {
+ if (item.tokens[3].text == 'c') {
+ item.tokens.splice(3, 1);
+ }
+ if (item.tokens[3].text in PARSABLE_LLVM_FUNCTIONS) {
+ ret.value = parseLLVMFunctionCall(item.tokens.slice(2));
+ } else {
+ ret.value = scanConst(item.tokens[3], ret.type);
+ }
} else {
- ret.value = scanConst(item.tokens[3], ret.type);
+ ret.value = { intertype: 'value', ident: '0', value: '0', type: ret.type };
}
}
return [ret];
diff --git a/src/jsifier.js b/src/jsifier.js
index 3f52337f..77aff895 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -12,6 +12,8 @@ var RELOOP_IGNORED_LASTS = set('return', 'unreachable', 'resume');
var addedLibraryItems = {};
var asmLibraryFunctions = [];
+var SETJMP_LABEL = -1;
+
// JSifier
function JSify(data, functionsOnly, givenFunctions) {
var mainPass = !functionsOnly;
@@ -730,7 +732,7 @@ function JSify(data, functionsOnly, givenFunctions) {
}).join('\n') + '\n';
if (func.setjmpTable && ASM_JS) {
// emit a label in which we write to the proper local variable, before jumping to the actual label
- ret += ' case -1111: ';
+ ret += ' case ' + SETJMP_LABEL + ': ';
ret += func.setjmpTable.map(function(triple) { // original label, label we created for right after the setjmp, variable setjmp result goes into
return 'if ((setjmpLabel|0) == ' + getLabelId(triple.oldLabel) + ') { ' + triple.assignTo + ' = threwValue; label = ' + triple.newLabel + ' }\n';
}).join(' else ');
@@ -1030,13 +1032,13 @@ function JSify(data, functionsOnly, givenFunctions) {
}
for (var i = 0; i < idents.length; i++) {
if (keys(deps[idents[i]]).length == 0) {
- pre = 'var ' + idents[i] + ' = ' + valueJSes[idents[i]] + ';' + pre;
+ post = 'var ' + idents[i] + ' = ' + valueJSes[idents[i]] + ';' + post;
remove(idents[i]);
continue mainLoop;
}
}
// If we got here, we have circular dependencies, and must break at least one.
- pre = 'var ' + idents[0] + '$phi = ' + valueJSes[idents[0]] + ';' + pre;
+ pre += 'var ' + idents[0] + '$phi = ' + valueJSes[idents[0]] + ';';
post += 'var ' + idents[0] + ' = ' + idents[0] + '$phi;';
remove(idents[0]);
}
@@ -1160,6 +1162,7 @@ function JSify(data, functionsOnly, givenFunctions) {
return ret + ';';
});
makeFuncLineActor('resume', function(item) {
+ if (DISABLE_EXCEPTION_CATCHING) return 'abort()';
if (item.ident == 0) {
// No exception to resume, so we can just bail.
// This is related to issue #917 and http://llvm.org/PR15518
@@ -1181,6 +1184,7 @@ function JSify(data, functionsOnly, givenFunctions) {
if (disabled) {
ret = call_ + ';';
} else if (ASM_JS) {
+ call_ = call_.replace('; return', ''); // we auto-add returns when aborting, but do not need them here
ret = '(__THREW__ = 0,' + call_ + ');';
} else {
ret = '(function() { try { __THREW__ = 0; return '
@@ -1356,7 +1360,7 @@ function JSify(data, functionsOnly, givenFunctions) {
var ignoreFunctionIndexizing = [];
var useJSArgs = (simpleIdent + '__jsargs') in LibraryManager.library;
var hasVarArgs = isVarArgsFunctionType(type);
- var normalArgs = (hasVarArgs && !useJSArgs) ? countNormalArgs(type) : -1;
+ var normalArgs = (hasVarArgs && !useJSArgs) ? countNormalArgs(type, null, true) : -1;
var byPointer = getVarData(funcData, ident);
var byPointerForced = false;
@@ -1487,9 +1491,9 @@ function JSify(data, functionsOnly, givenFunctions) {
}
if (ASM_JS && funcData.setjmpTable) {
- // check if a longjmp was done. If a setjmp happened, check if ours. If ours, go to -111 to handle it.
+ // check if a longjmp was done. If a setjmp happened, check if ours. If ours, go to a special label to handle it.
// otherwise, just return - the call to us must also have been an invoke, so the setjmp propagates that way
- ret += '; if (((__THREW__|0) != 0) & ((threwValue|0) > 0)) { setjmpLabel = ' + asmCoercion('_testSetjmp(' + makeGetValue('__THREW__', 0, 'i32') + ', setjmpTable)', 'i32') + '; if ((setjmpLabel|0) > 0) { label = -1111; break } else return ' + (funcData.returnType != 'void' ? asmCoercion('0', funcData.returnType) : '') + ' } __THREW__ = threwValue = 0;\n';
+ ret += '; if (((__THREW__|0) != 0) & ((threwValue|0) != 0)) { setjmpLabel = ' + asmCoercion('_testSetjmp(' + makeGetValue('__THREW__', 0, 'i32') + ', setjmpTable)', 'i32') + '; if ((setjmpLabel|0) > 0) { label = ' + SETJMP_LABEL + '; break } else return ' + (funcData.returnType != 'void' ? asmCoercion('0', funcData.returnType) : '') + ' } __THREW__ = threwValue = 0;\n';
}
return ret;
diff --git a/src/library.js b/src/library.js
index 344ec8d6..e65754ba 100644
--- a/src/library.js
+++ b/src/library.js
@@ -619,7 +619,7 @@ LibraryManager.library = {
#endif
allocate([ allocate(
{{{ Runtime.QUANTUM_SIZE === 4 ? '[0, 0, 0, 0, _stdin, 0, 0, 0, _stdout, 0, 0, 0, _stderr, 0, 0, 0]' : '[0, _stdin, _stdout, _stderr]' }}},
- 'void*', ALLOC_DYNAMIC) ], 'void*', ALLOC_NONE, {{{ makeGlobalUse('__impure_ptr') }}});
+ 'void*', ALLOC_NORMAL) ], 'void*', ALLOC_NONE, {{{ makeGlobalUse('__impure_ptr') }}});
},
quit: function() {
@@ -3576,14 +3576,14 @@ LibraryManager.library = {
return -1;
},
fscanf__deps: ['$FS', '__setErrNo', '$ERRNO_CODES',
- '_scanString', 'getc', 'ungetc'],
+ '_scanString', 'fgetc', 'fseek', 'ftell'],
fscanf: function(stream, format, varargs) {
// int fscanf(FILE *restrict stream, const char *restrict format, ... );
// http://pubs.opengroup.org/onlinepubs/000095399/functions/scanf.html
if (FS.streams[stream]) {
- var stack = [];
- var get = function() { var ret = _fgetc(stream); stack.push(ret); return ret };
- var unget = function(c) { return _ungetc(stack.pop(), stream) };
+ var i = _ftell(stream), SEEK_SET = 0;
+ var get = function () { i++; return _fgetc(stream); };
+ var unget = function () { _fseek(stream, --i, SEEK_SET); };
return __scanString(format, get, unget, varargs);
} else {
return -1;
@@ -3726,30 +3726,44 @@ LibraryManager.library = {
* this implementation simply uses malloc underneath the call to
* mmap.
*/
+ var MAP_PRIVATE = 2;
+ var allocated = false;
+
if (!_mmap.mappings) _mmap.mappings = {};
+
if (stream == -1) {
var ptr = _malloc(num);
+ if (!ptr) return -1;
+ _memset(ptr, 0, num);
+ allocated = true;
} else {
var info = FS.streams[stream];
if (!info) return -1;
var contents = info.object.contents;
- contents = Array.prototype.slice.call(contents, offset, offset+num);
- ptr = allocate(contents, 'i8', ALLOC_NORMAL);
- }
- // align to page size
- var ret = ptr;
- if (ptr % PAGE_SIZE != 0) {
- var old = ptr;
- ptr = _malloc(num + PAGE_SIZE);
- ret = alignMemoryPage(ptr);
- _memcpy(ret, old, num);
- _free(old);
- }
- if (stream == -1) {
- _memset(ret, 0, num);
+ // Only make a new copy when MAP_PRIVATE is specified.
+ if (flags & MAP_PRIVATE == 0) {
+ // We can't emulate MAP_SHARED when the file is not backed by HEAP.
+ assert(contents.buffer === HEAPU8.buffer);
+ ptr = contents.byteOffset;
+ allocated = false;
+ } else {
+ // Try to avoid unnecessary slices.
+ if (offset > 0 || offset + num < contents.length) {
+ if (contents.subarray) {
+ contents = contents.subarray(offset, offset+num);
+ } else {
+ contents = Array.prototype.slice.call(contents, offset, offset+num);
+ }
+ }
+ ptr = _malloc(num);
+ if (!ptr) return -1;
+ HEAPU8.set(contents, ptr);
+ allocated = true;
+ }
}
- _mmap.mappings[ret] = { malloc: ptr, num: num };
- return ret;
+
+ _mmap.mappings[ptr] = { malloc: ptr, num: num, allocated: allocated };
+ return ptr;
},
__01mmap64_: 'mmap',
@@ -3760,7 +3774,9 @@ LibraryManager.library = {
if (!info) return 0;
if (num == info.num) {
_mmap.mappings[start] = null;
- _free(info.malloc);
+ if (info.allocated) {
+ _free(info.malloc);
+ }
}
return 0;
},
@@ -3902,7 +3918,14 @@ LibraryManager.library = {
str++;
}
}
- }
+ } else if (finalBase==16) {
+ if ({{{ makeGetValue('str', 0, 'i8') }}} == {{{ charCode('0') }}}) {
+ if ({{{ makeGetValue('str+1', 0, 'i8') }}} == {{{ charCode('x') }}} ||
+ {{{ makeGetValue('str+1', 0, 'i8') }}} == {{{ charCode('X') }}}) {
+ str += 2;
+ }
+ }
+ }
if (!finalBase) finalBase = 10;
// Get digits.
@@ -3953,13 +3976,14 @@ LibraryManager.library = {
#if USE_TYPED_ARRAYS == 2
_parseInt64__deps: ['isspace', '__setErrNo', '$ERRNO_CODES', function() { Types.preciseI64MathUsed = 1 }],
_parseInt64: function(str, endptr, base, min, max, unsign) {
- var start = str;
+ var isNegative = false;
// Skip space.
while (_isspace({{{ makeGetValue('str', 0, 'i8') }}})) str++;
-
+
// Check for a plus/minus sign.
if ({{{ makeGetValue('str', 0, 'i8') }}} == {{{ charCode('-') }}}) {
str++;
+ isNegative = true;
} else if ({{{ makeGetValue('str', 0, 'i8') }}} == {{{ charCode('+') }}}) {
str++;
}
@@ -3975,12 +3999,19 @@ LibraryManager.library = {
str += 2;
} else {
finalBase = 8;
- str++;
ok = true; // we saw an initial zero, perhaps the entire thing is just "0"
}
}
- }
+ } else if (finalBase==16) {
+ if ({{{ makeGetValue('str', 0, 'i8') }}} == {{{ charCode('0') }}}) {
+ if ({{{ makeGetValue('str+1', 0, 'i8') }}} == {{{ charCode('x') }}} ||
+ {{{ makeGetValue('str+1', 0, 'i8') }}} == {{{ charCode('X') }}}) {
+ str += 2;
+ }
+ }
+ }
if (!finalBase) finalBase = 10;
+ start = str;
// Get digits.
var chr;
@@ -3993,6 +4024,7 @@ LibraryManager.library = {
ok = true;
}
}
+
if (!ok) {
___setErrNo(ERRNO_CODES.EINVAL);
{{{ makeStructuralReturn(['0', '0']) }}};
@@ -4004,7 +4036,8 @@ LibraryManager.library = {
}
try {
- i64Math.fromString(Pointer_stringify(start, str - start), finalBase, min, max, unsign);
+ var numberString = isNegative ? '-'+Pointer_stringify(start, str - start) : Pointer_stringify(start, str - start);
+ i64Math.fromString(numberString, finalBase, min, max, unsign);
} catch(e) {
___setErrNo(ERRNO_CODES.ERANGE); // not quite correct
}
@@ -5072,7 +5105,13 @@ LibraryManager.library = {
return _malloc(size);
},
__cxa_free_exception: function(ptr) {
- return _free(ptr);
+ try {
+ return _free(ptr);
+ } catch(e) { // XXX FIXME
+#if ASSERTIONS
+ Module.printErr('exception during cxa_free_exception: ' + e);
+#endif
+ }
},
__cxa_throw__sig: 'viii',
__cxa_throw__deps: ['llvm_eh_exception', '_ZSt18uncaught_exceptionv', '__cxa_find_matching_catch'],
@@ -6170,8 +6209,9 @@ LibraryManager.library = {
clock_gettime__deps: ['__timespec_struct_layout'],
clock_gettime: function(clk_id, tp) {
// int clock_gettime(clockid_t clk_id, struct timespec *tp);
- {{{ makeSetValue('tp', '___timespec_struct_layout.tv_sec', '0', 'i32') }}}
- {{{ makeSetValue('tp', '___timespec_struct_layout.tv_nsec', '0', 'i32') }}}
+ var now = Date.now();
+ {{{ makeSetValue('tp', '___timespec_struct_layout.tv_sec', 'Math.floor(now/1000)', 'i32') }}}; // seconds
+ {{{ makeSetValue('tp', '___timespec_struct_layout.tv_nsec', '0', 'i32') }}}; // nanoseconds - not supported
return 0;
},
clock_settime: function(clk_id, tp) {
@@ -6794,19 +6834,17 @@ LibraryManager.library = {
26: 'Text file busy',
18: 'Invalid cross-device link'
},
+ __errno_state: 0,
+ __setErrNo__deps: ['__errno_state'],
+ __setErrNo__postset: '___errno_state = Runtime.staticAlloc(4); {{{ makeSetValue("___errno_state", 0, 0, "i32") }}};',
__setErrNo: function(value) {
// For convenient setting and returning of errno.
- if (!___setErrNo.ret) ___setErrNo.ret = allocate([0], 'i32', ALLOC_NORMAL);
- {{{ makeSetValue('___setErrNo.ret', '0', 'value', 'i32') }}}
+ {{{ makeSetValue('___errno_state', '0', 'value', 'i32') }}}
return value;
},
__errno_location__deps: ['__setErrNo'],
__errno_location: function() {
- if (!___setErrNo.ret) {
- ___setErrNo.ret = allocate([0], 'i32', ALLOC_NORMAL);
- {{{ makeSetValue('___setErrNo.ret', '0', '0', 'i32') }}}
- }
- return ___setErrNo.ret;
+ return ___errno_state;
},
__errno: '__errno_location',
@@ -7563,7 +7601,7 @@ LibraryManager.library = {
},
emscripten_run_script_int: function(ptr) {
- return eval(Pointer_stringify(ptr));
+ return eval(Pointer_stringify(ptr))|0;
},
emscripten_run_script_string: function(ptr) {
diff --git a/src/library_browser.js b/src/library_browser.js
index 5f9c4d06..1a79a49b 100644
--- a/src/library_browser.js
+++ b/src/library_browser.js
@@ -184,7 +184,7 @@ mergeInto(LibraryManager.library, {
};
audio.src = url;
// workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror
- setTimeout(function() {
+ Browser.safeSetTimeout(function() {
finish(audio); // try to use it even though it is not necessarily ready to play
}, 10000);
} else {
@@ -201,7 +201,8 @@ mergeInto(LibraryManager.library, {
canvas['webkitRequestPointerLock'];
canvas.exitPointerLock = document['exitPointerLock'] ||
document['mozExitPointerLock'] ||
- document['webkitExitPointerLock'];
+ document['webkitExitPointerLock'] ||
+ function(){}; // no-op if function does not exist
canvas.exitPointerLock = canvas.exitPointerLock.bind(document);
function pointerLockChange() {
@@ -360,6 +361,30 @@ mergeInto(LibraryManager.library, {
window.requestAnimationFrame(func);
},
+ // generic abort-aware wrapper for an async callback
+ safeCallback: function(func) {
+ return function() {
+ if (!ABORT) return func.apply(null, arguments);
+ };
+ },
+
+ // abort-aware versions
+ safeRequestAnimationFrame: function(func) {
+ Browser.requestAnimationFrame(function() {
+ if (!ABORT) func();
+ });
+ },
+ safeSetTimeout: function(func, timeout) {
+ setTimeout(function() {
+ if (!ABORT) func();
+ }, timeout);
+ },
+ safeSetInterval: function(func, timeout) {
+ setInterval(function() {
+ if (!ABORT) func();
+ }, timeout);
+ },
+
getMovementX: function(event) {
return event['movementX'] ||
event['mozMovementX'] ||
@@ -611,7 +636,7 @@ mergeInto(LibraryManager.library, {
Module['noExitRuntime'] = true;
// TODO: cache these to avoid generating garbage
- setTimeout(function() {
+ Browser.safeSetTimeout(function() {
_emscripten_run_script(script);
}, millis);
},
@@ -620,6 +645,7 @@ mergeInto(LibraryManager.library, {
Module['noExitRuntime'] = true;
Browser.mainLoop.runner = function() {
+ if (ABORT) return;
if (Browser.mainLoop.queue.length > 0) {
var start = Date.now();
var blocker = Browser.mainLoop.queue.shift();
@@ -722,12 +748,17 @@ mergeInto(LibraryManager.library, {
}
if (millis >= 0) {
- setTimeout(wrapper, millis);
+ Browser.safeSetTimeout(wrapper, millis);
} else {
- Browser.requestAnimationFrame(wrapper);
+ Browser.safeRequestAnimationFrame(wrapper);
}
},
+ emscripten_exit_with_live_runtime: function() {
+ Module['noExitRuntime'] = true;
+ throw 'SimulateInfiniteLoop';
+ },
+
emscripten_hide_mouse: function() {
var styleSheet = document.styleSheets[0];
var rules = styleSheet.cssRules;
diff --git a/src/library_gc.js b/src/library_gc.js
index 2a164250..b3dae0e9 100644
--- a/src/library_gc.js
+++ b/src/library_gc.js
@@ -26,7 +26,7 @@ if (GC_SUPPORT) {
_GC_finalizer_notifier = _malloc(4); setValue(_GC_finalizer_notifier, 0, 'i32');
if (ENVIRONMENT_IS_WEB) {
- setInterval(function() {
+ Browser.safeSetInterval(function() {
GC.maybeCollect();
}, 1000);
} else {
diff --git a/src/library_glut.js b/src/library_glut.js
index 35348028..38cfe55b 100644
--- a/src/library_glut.js
+++ b/src/library_glut.js
@@ -322,16 +322,17 @@ var LibraryGLUT = {
var callback = function() {
if (GLUT.idleFunc) {
Runtime.dynCall('v', GLUT.idleFunc);
- window.setTimeout(callback, 0);
+ Browser.safeSetTimeout(callback, 0);
}
}
- if (!GLUT.idleFunc)
- window.setTimeout(callback, 0);
+ if (!GLUT.idleFunc) {
+ Browser.safeSetTimeout(callback, 0);
+ }
GLUT.idleFunc = func;
},
glutTimerFunc: function(msec, func, value) {
- window.setTimeout(function() { Runtime.dynCall('vi', func, [value]); }, msec);
+ Browser.safeSetTimeout(function() { Runtime.dynCall('vi', func, [value]); }, msec);
},
glutDisplayFunc: function(func) {
@@ -419,6 +420,7 @@ var LibraryGLUT = {
glutPostRedisplay: function() {
if (GLUT.displayFunc) {
Browser.requestAnimationFrame(function() {
+ if (ABORT) return;
Runtime.dynCall('v', GLUT.displayFunc);
});
}
diff --git a/src/library_sdl.js b/src/library_sdl.js
index 75544765..4f871f9d 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -694,6 +694,11 @@ var LibrarySDL = {
Module['canvas'].addEventListener(event, SDL.receiveEvent, true);
});
Browser.setCanvasSize(width, height, true);
+ // Free the old surface first.
+ if (SDL.screen) {
+ SDL.freeSurface(SDL.screen);
+ SDL.screen = null;
+ }
SDL.screen = SDL.makeSurface(width, height, flags, true, 'screen');
if (!SDL.addedResizeListener) {
SDL.addedResizeListener = true;
@@ -1197,7 +1202,7 @@ var LibrarySDL = {
SDL_PauseAudio: function(pauseOn) {
if (SDL.audio.paused !== pauseOn) {
- SDL.audio.timer = pauseOn ? SDL.audio.timer && clearInterval(SDL.audio.timer) : setInterval(SDL.audio.caller, 1/35);
+ SDL.audio.timer = pauseOn ? SDL.audio.timer && clearInterval(SDL.audio.timer) : Browser.safeSetInterval(SDL.audio.caller, 1/35);
}
SDL.audio.paused = pauseOn;
},
@@ -1349,6 +1354,9 @@ var LibrarySDL = {
channelInfo.audio = audio = audio.cloneNode(true);
audio.numChannels = info.audio.numChannels;
audio.frequency = info.audio.frequency;
+
+ // TODO: handle N loops. Behavior matches Mix_PlayMusic
+ audio.loop = loops != 0;
if (SDL.channelFinished) {
audio['onended'] = function() { // TODO: cache these
Runtime.getFuncWrapper(SDL.channelFinished, 'vi')(channel);
@@ -1450,7 +1458,7 @@ var LibrarySDL = {
loops = Math.max(loops, 1);
var audio = SDL.audios[id].audio;
if (!audio) return 0;
- audio.loop = loops != 1; // TODO: handle N loops for finite N
+ audio.loop = loops != 0; // TODO: handle N loops for finite N
if (SDL.audios[id].buffer) {
audio["mozWriteAudio"](SDL.audios[id].buffer);
} else {
diff --git a/src/parseTools.js b/src/parseTools.js
index 1a58b4e7..090d85ac 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -129,9 +129,13 @@ function isPointerType(type) {
return type[type.length-1] == '*';
}
+function isArrayType(type) {
+ return /^\[\d+\ x\ (.*)\]/.test(type);
+}
+
function isStructType(type) {
if (isPointerType(type)) return false;
- if (/^\[\d+\ x\ (.*)\]/.test(type)) return true; // [15 x ?] blocks. Like structs
+ if (isArrayType(type)) return true;
if (/<?{ ?[^}]* ?}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types
// See comment in isStructPointerType()
return type[0] == '%';
@@ -286,11 +290,22 @@ function isVarArgsFunctionType(type) {
return type.substr(-varArgsSuffix.length) == varArgsSuffix;
}
-function countNormalArgs(type, out) {
+function getNumLegalizedVars(type) { // how many legalized variables are needed to represent this type
+ if (type in Runtime.FLOAT_TYPES) return 1;
+ return Math.max(getNumIntChunks(type), 1);
+}
+
+function countNormalArgs(type, out, legalized) {
out = out || {};
if (!isFunctionType(type, out)) return -1;
- if (isVarArgsFunctionType(type)) out.numArgs--;
- return out.numArgs;
+ var ret = 0;
+ if (out.segments) {
+ for (var i = 0; i < out.segments.length; i++) {
+ ret += legalized ? getNumLegalizedVars(out.segments[i][0].text) : 1;
+ }
+ }
+ if (isVarArgsFunctionType(type)) ret--;
+ return ret;
}
function addIdent(token) {
@@ -1743,10 +1758,11 @@ function getGetElementPtrIndexes(item) {
indexes.push(getFastValue(Runtime.getNativeTypeSize(type), '*', offset, 'i32'));
}
}
- item.params.slice(2, item.params.length).forEach(function(arg) {
+ item.params.slice(2, item.params.length).forEach(function(arg, i) {
var curr = arg;
// TODO: If index is constant, optimize
var typeData = Types.types[type];
+ assert(typeData || i == item.params.length - 3); // can be null, when we get to the end (a basic type)
if (isStructType(type) && typeData.needsFlattening) {
if (typeData.flatFactor) {
indexes.push(getFastValue(curr, '*', typeData.flatFactor, 'i32'));
@@ -1762,16 +1778,15 @@ function getGetElementPtrIndexes(item) {
indexes.push(curr);
}
}
- if (!isNumber(curr) || parseInt(curr) < 0) {
- // We have a *variable* to index with, or a negative number. In both
- // cases, in theory we might need to do something dynamic here. FIXME?
- // But, most likely all the possible types are the same, so do that case here now...
- for (var i = 1; i < typeData.fields.length; i++) {
- assert(typeData.fields[0] === typeData.fields[i]);
+ if (typeData) {
+ if (isArrayType(type)) {
+ type = typeData.fields[0]; // all the same, so accept even out-of-bounds this way
+ } else {
+ assert(isNumber(curr)); // cannot be dynamic
+ type = typeData.fields[curr];
}
- curr = 0;
+ assert(type);
}
- type = typeData && typeData.fields[curr] ? typeData.fields[curr] : '';
});
var ret = getFastValues(indexes, '+', 'i32');
@@ -2023,12 +2038,19 @@ function processMathop(item) {
}
var bitsBefore = parseInt((item.params[0] ? item.params[0].type : item.type).substr(1)); // remove i to leave the number of bits left after this
var bitsLeft = parseInt(((item.params[1] && item.params[1].ident) ? item.params[1].ident : item.type).substr(1)); // remove i to leave the number of bits left after this operation
+ var rawBits = getBits(item.type);
+ assert(rawBits <= 64);
function integerizeBignum(value) {
return makeInlineCalculation('VALUE-VALUE%1', value, 'tempBigIntI');
}
- if ((type == 'i64' || paramTypes[0] == 'i64' || paramTypes[1] == 'i64' || idents[1] == '(i64)') && USE_TYPED_ARRAYS == 2) {
+ if ((type == 'i64' || paramTypes[0] == 'i64' || paramTypes[1] == 'i64' || idents[1] == '(i64)' || rawBits > 32) && USE_TYPED_ARRAYS == 2) {
+ // this code assumes i64 for the most part
+ if (ASSERTIONS && rawBits < 64) {
+ warnOnce('processMathop processing illegal non-i64 value: ' + [type, paramTypes, idents])
+ }
+
var warnI64_1 = function() {
warnOnce('Arithmetic on 64-bit integers in mode 1 is rounded and flaky, like mode 0!');
};
diff --git a/src/postamble.js b/src/postamble.js
index d0b737f8..49fd9b3e 100644
--- a/src/postamble.js
+++ b/src/postamble.js
@@ -104,7 +104,7 @@ function run(args) {
setTimeout(function() {
Module['setStatus']('');
}, 1);
- doRun();
+ if (!ABORT) doRun();
}, 1);
return 0;
} else {
diff --git a/src/preamble.js b/src/preamble.js
index dbe5e655..4c61a86e 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -231,7 +231,7 @@ var setjmpId = 1; // Used in setjmp/longjmp
var setjmpLabels = {};
#endif
-var ABORT = false;
+var ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()
var undef = 0;
// tempInt is used for 32-bit signed values or smaller. tempBigInt is used
@@ -475,7 +475,11 @@ function allocate(slab, types, allocator, ptr) {
#if USE_TYPED_ARRAYS == 2
if (singleType === 'i8') {
- HEAPU8.set(new Uint8Array(slab), ret);
+ if (slab.subarray || slab.slice) {
+ HEAPU8.set(slab, ret);
+ } else {
+ HEAPU8.set(new Uint8Array(slab), ret);
+ }
return ret;
}
#endif
@@ -809,6 +813,7 @@ function addRunDependency(id) {
if (id) {
assert(!runDependencyTracking[id]);
runDependencyTracking[id] = 1;
+#if ASSERTIONS
if (runDependencyWatcher === null && typeof setInterval !== 'undefined') {
// Check for missing dependencies every few seconds
runDependencyWatcher = setInterval(function() {
@@ -823,8 +828,9 @@ function addRunDependency(id) {
if (shown) {
Module.printErr('(end of list)');
}
- }, 6000);
+ }, 10000);
}
+#endif
} else {
Module.printErr('warning: run dependency added without ID');
}
@@ -873,6 +879,7 @@ var PGOMonitor = {
Module.print('-s DEAD_FUNCTIONS=\'' + JSON.stringify(dead) + '\'\n');
}
};
+Module['PGOMonitor'] = PGOMonitor;
__ATEXIT__.push({ func: function() { PGOMonitor.dump() } });
addPreRun(function() { addRunDependency('pgo') });
#endif
diff --git a/src/settings.js b/src/settings.js
index d3abb06e..c156a40c 100644
--- a/src/settings.js
+++ b/src/settings.js
@@ -238,7 +238,8 @@ var NAMED_GLOBALS = 0; // If 1, we use global variables for globals. Otherwise
// they are referred to by a base plus an offset (called an indexed global),
// saving global variables but adding runtime overhead.
-var EXPORTED_FUNCTIONS = ['_main']; // Functions that are explicitly exported. These functions are kept alive
+var EXPORTED_FUNCTIONS = ['_main', '_malloc'];
+ // Functions that are explicitly exported. These functions are kept alive
// through LLVM dead code elimination, and also made accessible outside of
// the generated code even after running closure compiler (on "Module").
// Note the necessary prefix of "_".
diff --git a/src/shell.js b/src/shell.js
index c8f3644a..20db25a7 100644
--- a/src/shell.js
+++ b/src/shell.js
@@ -1,5 +1,6 @@
try {
this['Module'] = Module;
+ Module.test;
} catch(e) {
this['Module'] = Module = {};
}
diff --git a/system/include/emscripten/bind.h b/system/include/emscripten/bind.h
index 7aa2a55e..cd465e45 100644
--- a/system/include/emscripten/bind.h
+++ b/system/include/emscripten/bind.h
@@ -18,7 +18,6 @@ namespace emscripten {
};
namespace internal {
- typedef void (*GenericFunction)();
typedef long GenericEnumValue;
// Implemented in JavaScript. Don't call these directly.
@@ -60,6 +59,10 @@ namespace emscripten {
TYPEID emvalType,
const char* name);
+ void _embind_register_memory_view(
+ TYPEID memoryViewType,
+ const char* name);
+
void _embind_register_function(
const char* name,
unsigned argCount,
@@ -414,11 +417,10 @@ namespace emscripten {
// TODO: This could do a reinterpret-cast if sizeof(T) === sizeof(void*)
template<typename T>
- inline void* getContext(const T& t) {
+ inline T* getContext(const T& t) {
// not a leak because this is called once per binding
- void* p = malloc(sizeof(T));
- assert(p);
- memcpy(p, &t, sizeof(T));
+ T* p = reinterpret_cast<T*>(malloc(sizeof(T)));
+ new(p) T(t);
return p;
}
@@ -749,38 +751,19 @@ namespace emscripten {
template<typename ReturnType, typename... Args>
ReturnType call(const char* name, Args&&... args) const {
- return Caller<ReturnType, Args...>::call(wrapped, name, std::forward<Args>(args)...);
+ return wrapped.call<ReturnType>(name, std::forward<Args>(args)...);
}
template<typename ReturnType, typename... Args, typename Default>
ReturnType optional_call(const char* name, Default def, Args&&... args) const {
- if (has_function(name)) {
- return Caller<ReturnType, Args...>::call(wrapped, name, std::forward<Args>(args)...);
+ if (wrapped.has_function(name)) {
+ return call<ReturnType>(name, std::forward<Args>(args)...);
} else {
return def();
}
}
private:
- bool has_function(const char* name) const {
- return wrapped.has_function(name);
- }
-
- // this class only exists because you can't partially specialize function templates
- template<typename ReturnType, typename... Args>
- struct Caller {
- static ReturnType call(const val& v, const char* name, Args&&... args) {
- return v.call(name, std::forward<Args>(args)...).template as<ReturnType>();
- }
- };
-
- template<typename... Args>
- struct Caller<void, Args...> {
- static void call(const val& v, const char* name, Args&&... args) {
- v.call_void(name, std::forward<Args>(args)...);
- }
- };
-
val wrapped;
};
@@ -844,23 +827,8 @@ namespace emscripten {
}
};
- template<typename PointerType>
- struct ptr {
- typedef PointerType pointer_type;
- };
-
namespace internal {
template<typename T>
- struct is_ptr {
- enum { value = false };
- };
-
- template<typename T>
- struct is_ptr<ptr<T>> {
- enum { value = true };
- };
-
- template<typename T>
struct SmartPtrIfNeeded {
template<typename U>
SmartPtrIfNeeded(U& cls) {
@@ -881,7 +849,6 @@ namespace emscripten {
public:
class_() = delete;
- template<typename = typename std::enable_if<!internal::is_ptr<ClassType>::value>::type>
explicit class_(const char* name) {
using namespace internal;
@@ -927,16 +894,17 @@ namespace emscripten {
policies...);
}
- template<typename... Args, typename... Policies>
- class_& constructor(ClassType* (*factory)(Args...), Policies...) {
+ template<typename... Args, typename ReturnType, typename... Policies>
+ class_& constructor(ReturnType (*factory)(Args...), Policies...) {
using namespace internal;
- typename WithPolicies<Policies...>::template ArgTypeList<AllowedRawPointer<ClassType>, Args...> args;
+ // TODO: allows all raw pointers... policies need a rethink
+ typename WithPolicies<allow_raw_pointers, Policies...>::template ArgTypeList<ReturnType, Args...> args;
_embind_register_class_constructor(
TypeID<ClassType>::get(),
args.count,
args.types,
- reinterpret_cast<GenericFunction>(&Invoker<ClassType*, Args...>::invoke),
+ reinterpret_cast<GenericFunction>(&Invoker<ReturnType, Args...>::invoke),
reinterpret_cast<GenericFunction>(factory));
return *this;
}
diff --git a/system/include/emscripten/emscripten.h b/system/include/emscripten/emscripten.h
index 61634b0e..77aa1df2 100644
--- a/system/include/emscripten/emscripten.h
+++ b/system/include/emscripten/emscripten.h
@@ -136,6 +136,14 @@ inline void emscripten_async_call(void (*func)(void *), void *arg, int millis) {
#endif
/*
+ * Exits the program immediately, but leaves the runtime alive
+ * so that you can continue to run code later (so global destructors
+ * etc. are not run). This is implicitly performed when you do
+ * an asynchronous operation like emscripten_async_call.
+ */
+extern void emscripten_exit_with_live_runtime();
+
+/*
* Hide the OS mouse cursor over the canvas. Note that SDL's
* SDL_ShowCursor command shows and hides the SDL cursor, not
* the OS one. This command is useful to hide the OS cursor
diff --git a/system/include/emscripten/val.h b/system/include/emscripten/val.h
index edd070e3..b712d164 100644
--- a/system/include/emscripten/val.h
+++ b/system/include/emscripten/val.h
@@ -10,7 +10,6 @@ namespace emscripten {
extern "C" {
void _emval_register_symbol(const char*);
- typedef struct _EM_SIG* EM_SIG;
typedef struct _EM_VAL* EM_VAL;
void _emval_incref(EM_VAL value);
@@ -39,34 +38,67 @@ namespace emscripten {
unsigned argCount,
internal::TYPEID argTypes[]
/*, ... */);
- EM_VAL _emval_call_method(
- EM_VAL value,
- const char* methodName,
- unsigned argCount,
- internal::TYPEID argTypes[]
- /*, ... */);
- void _emval_call_void_method(
- EM_VAL value,
- const char* methodName,
- unsigned argCount,
- internal::TYPEID argTypes[]
- /*, ...*/);
+
+ // DO NOT call this more than once per signature. It will leak function pointer offsets!
+ GenericFunction _emval_get_method_caller(
+ unsigned argCount, // including return value
+ internal::TYPEID argTypes[]);
bool _emval_has_function(
EM_VAL value,
const char* methodName);
}
- }
- template<const char* address>
- struct symbol_registrar {
- symbol_registrar() {
- internal::_emval_register_symbol(address);
- }
- };
+ template<const char* address>
+ struct symbol_registrar {
+ symbol_registrar() {
+ internal::_emval_register_symbol(address);
+ }
+ };
+
+ template<typename ReturnType, typename... Args>
+ struct Signature {
+ typedef typename BindingType<ReturnType>::WireType (*MethodCaller)(EM_VAL value, const char* methodName, typename BindingType<Args>::WireType...);
+
+ static MethodCaller get_method_caller() {
+ static MethodCaller fp = reinterpret_cast<MethodCaller>(init_method_caller());
+ return fp;
+ }
+
+ private:
+ static GenericFunction init_method_caller() {
+ WithPolicies<>::ArgTypeList<ReturnType, Args...> args;
+ return _emval_get_method_caller(args.count, args.types);
+ }
+ };
+
+ template<typename ReturnType, typename... Args>
+ struct MethodCaller {
+ static ReturnType call(EM_VAL handle, const char* methodName, Args&&... args) {
+ auto caller = Signature<ReturnType, Args...>::get_method_caller();
+ auto wireType = caller(
+ handle,
+ methodName,
+ toWireType(std::forward<Args>(args))...);
+ WireDeleter<ReturnType> deleter(wireType);
+ return BindingType<ReturnType>::fromWireType(wireType);
+ }
+ };
+
+ template<typename... Args>
+ struct MethodCaller<void, Args...> {
+ static void call(EM_VAL handle, const char* methodName, Args&&... args) {
+ auto caller = Signature<void, Args...>::get_method_caller();
+ return caller(
+ handle,
+ methodName,
+ toWireType(std::forward<Args>(args))...);
+ }
+ };
+ }
#define EMSCRIPTEN_SYMBOL(name) \
static const char name##_symbol[] = #name; \
- static const symbol_registrar<name##_symbol> name##_registrar
+ static const ::emscripten::internal::symbol_registrar<name##_symbol> name##_registrar
class val {
public:
@@ -158,7 +190,7 @@ namespace emscripten {
}
bool hasOwnProperty(const char* key) const {
- return val::global("Object")["prototype"]["hasOwnProperty"].call("call", *this, val(key)).as<bool>();
+ return val::global("Object")["prototype"]["hasOwnProperty"].call<bool>("call", *this, val(key));
}
template<typename... Args>
@@ -211,45 +243,11 @@ namespace emscripten {
toWireType(std::forward<Args>(args))...));
}
- template<typename ...Args>
- val call(const char* name, Args&&... args) const {
+ template<typename ReturnValue, typename... Args>
+ ReturnValue call(const char* name, Args&&... args) const {
using namespace internal;
- WithPolicies<>::ArgTypeList<Args...> argList;
- typedef EM_VAL (*TypedCall)(
- EM_VAL,
- const char* name,
- unsigned,
- TYPEID argTypes[],
- typename BindingType<Args>::WireType...);
- TypedCall typedCall = reinterpret_cast<TypedCall>(&_emval_call_method);
- return val(
- typedCall(
- handle,
- name,
- argList.count,
- argList.types,
- toWireType(std::forward<Args>(args))...));
- }
-
- template<typename ...Args>
- void call_void(const char* name, Args&&... args) const {
- using namespace internal;
-
- WithPolicies<>::ArgTypeList<Args...> argList;
- typedef void (*TypedCall)(
- EM_VAL,
- const char* name,
- unsigned,
- TYPEID argTypes[],
- typename BindingType<Args>::WireType...);
- TypedCall typedCall = reinterpret_cast<TypedCall>(&_emval_call_void_method);
- return typedCall(
- handle,
- name,
- argList.count,
- argList.types,
- toWireType(std::forward<Args>(args))...);
+ return MethodCaller<ReturnValue, Args...>::call(handle, name, std::forward<Args>(args)...);
}
bool has_function(const char* name) const {
diff --git a/system/include/emscripten/wire.h b/system/include/emscripten/wire.h
index 6fb15fc7..a5892216 100644
--- a/system/include/emscripten/wire.h
+++ b/system/include/emscripten/wire.h
@@ -13,6 +13,8 @@
namespace emscripten {
namespace internal {
+ typedef void (*GenericFunction)();
+
typedef const struct _TYPEID* TYPEID;
// This implementation is technically not legal, as it's not
@@ -146,6 +148,7 @@ namespace emscripten {
template<>
struct BindingType<void> {
+ typedef void WireType;
};
template<>
@@ -309,4 +312,82 @@ namespace emscripten {
WireType wt;
};
}
+
+ struct memory_view {
+ enum class Type {
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Uint32Array,
+ Float32Array,
+ Float64Array,
+ };
+
+ memory_view() = delete;
+ explicit memory_view(size_t size, const void* data)
+ : type(Type::Uint8Array)
+ , size(size)
+ , data(data)
+ {}
+ explicit memory_view(Type type, size_t size, const void* data)
+ : type(type)
+ , size(size)
+ , data(data)
+ {}
+
+ const Type type;
+ const size_t size; // in elements, not bytes
+ const void* const data;
+ };
+
+ inline memory_view typed_memory_view(size_t size, const int8_t* data) {
+ return memory_view(memory_view::Type::Int8Array, size, data);
+ }
+
+ inline memory_view typed_memory_view(size_t size, const uint8_t* data) {
+ return memory_view(memory_view::Type::Uint8Array, size, data);
+ }
+
+ inline memory_view typed_memory_view(size_t size, const int16_t* data) {
+ return memory_view(memory_view::Type::Int16Array, size, data);
+ }
+
+ inline memory_view typed_memory_view(size_t size, const uint16_t* data) {
+ return memory_view(memory_view::Type::Uint16Array, size, data);
+ }
+
+ inline memory_view typed_memory_view(size_t size, const int32_t* data) {
+ return memory_view(memory_view::Type::Int32Array, size, data);
+ }
+
+ inline memory_view typed_memory_view(size_t size, const uint32_t* data) {
+ return memory_view(memory_view::Type::Uint32Array, size, data);
+ }
+
+ inline memory_view typed_memory_view(size_t size, const float* data) {
+ return memory_view(memory_view::Type::Float32Array, size, data);
+ }
+
+ inline memory_view typed_memory_view(size_t size, const double* data) {
+ return memory_view(memory_view::Type::Float64Array, size, data);
+ }
+
+ namespace internal {
+ template<>
+ struct BindingType<memory_view> {
+ // This non-word-sized WireType only works because I
+ // happen to know that clang will pass aggregates as
+ // pointers to stack elements and we never support
+ // converting JavaScript typed arrays back into
+ // memory_view. (That is, fromWireType is not implemented
+ // on the C++ side, nor is toWireType implemented in
+ // JavaScript.)
+ typedef memory_view WireType;
+ static WireType toWireType(const memory_view& mv) {
+ return mv;
+ }
+ };
+ }
}
diff --git a/system/include/libcxx/exception b/system/include/libcxx/exception
index 37bfc57e..102b10d6 100644
--- a/system/include/libcxx/exception
+++ b/system/include/libcxx/exception
@@ -91,8 +91,8 @@ class _LIBCPP_EXCEPTION_ABI exception
{
public:
_LIBCPP_INLINE_VISIBILITY exception() _NOEXCEPT {}
- virtual ~exception() _NOEXCEPT;
- virtual const char* what() const _NOEXCEPT;
+ virtual ~exception() _NOEXCEPT {} // XXX EMSCRIPTEN - implement in header
+ virtual const char* what() const _NOEXCEPT { return "std::exception"; } // XXX EMSCRIPTEN - implement in header
};
class _LIBCPP_EXCEPTION_ABI bad_exception
diff --git a/system/lib/embind/bind.cpp b/system/lib/embind/bind.cpp
index ec1648a9..12264dfd 100644
--- a/system/lib/embind/bind.cpp
+++ b/system/lib/embind/bind.cpp
@@ -59,4 +59,5 @@ EMSCRIPTEN_BINDINGS(native_and_builtin_types) {
_embind_register_std_string(TypeID<std::string>::get(), "std::string");
_embind_register_std_wstring(TypeID<std::wstring>::get(), sizeof(wchar_t), "std::wstring");
_embind_register_emval(TypeID<val>::get(), "emscripten::val");
+ _embind_register_memory_view(TypeID<memory_view>::get(), "emscripten::memory_view");
}
diff --git a/system/lib/libcxx/symbols b/system/lib/libcxx/symbols
index 93dfda65..84f4ddc9 100644
--- a/system/lib/libcxx/symbols
+++ b/system/lib/libcxx/symbols
@@ -2925,4 +2925,3 @@
W _ZTv0_n12_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev
T _ZTv0_n12_NSt3__19strstreamD0Ev
T _ZTv0_n12_NSt3__19strstreamD1Ev
- D llvm.global_ctors
diff --git a/tests/cases/emptystruct.ll b/tests/cases/emptystruct.ll
index 67967e65..ecf0e295 100644
--- a/tests/cases/emptystruct.ll
+++ b/tests/cases/emptystruct.ll
@@ -6,6 +6,8 @@ target triple = "i386-pc-linux-gnu"
@.str = private constant [14 x i8] c"hello, world!\00", align 1 ; [#uses=1]
+@.waka = extern_weak global i8* ; no initializer!
+
define i32 @main() nounwind {
entry:
%z = alloca %struct.s, align 4
diff --git a/tests/cases/muli33.ll b/tests/cases/muli33.ll
new file mode 100644
index 00000000..b33b04f7
--- /dev/null
+++ b/tests/cases/muli33.ll
@@ -0,0 +1,114 @@
+; ModuleID = '/tmp/tmpt0JpDh/a.out.bc'
+target datalayout = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-p:32:32:32-v128:32:32"
+target triple = "le32-unknown-nacl"
+
+@.str = private unnamed_addr constant [7 x i8] c"20\0A91\0A\00", align 1
+@.str1 = private unnamed_addr constant [6 x i8] c"%u %u\00", align 1
+@.str2 = private unnamed_addr constant [10 x i8] c"res = %u\0A\00", align 1
+
+define i32 @main() nounwind {
+ %j = alloca i32, align 4
+ %k4 = alloca i32, align 4
+ %t = alloca [100 x [100 x i32]], align 4
+ store i32 20, i32* %j, align 4
+ store i32 91, i32* %k4, align 4
+ br label %.lr.ph.i
+
+.lr.ph.i: ; preds = %.lr.ph.i, %0
+ %j.07.i = phi i32 [ %7, %.lr.ph.i ], [ 0, %0 ]
+ %1 = and i32 %j.07.i, 1
+ %2 = icmp eq i32 %1, 0
+ %3 = sub i32 0, %j.07.i
+ %.p.i = select i1 %2, i32 %j.07.i, i32 %3
+ %4 = add i32 %.p.i, 8
+ %5 = urem i32 %4, 101
+ %6 = getelementptr inbounds [100 x [100 x i32]]* %t, i32 0, i32 0, i32 %j.07.i
+ store i32 %5, i32* %6, align 4
+ %7 = add i32 %j.07.i, 1
+ %8 = icmp ult i32 %7, 10000
+ br i1 %8, label %.lr.ph.i, label %init.exit
+
+init.exit: ; preds = %.lr.ph.i
+ %9 = call i32 (i8*, i8*, ...)* @sscanf(i8* getelementptr inbounds ([7 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8]* @.str1, i32 0, i32 0), i32* %j, i32* %k4) nounwind
+ store i32 53, i32* %j, align 4
+ br label %.preheader
+
+.preheader: ; preds = %29, %init.exit
+ %indvars.iv23 = phi i32 [ -29, %init.exit ], [ %indvars.iv.next24, %29 ]
+ %indvars.iv21 = phi i32 [ -28, %init.exit ], [ %indvars.iv.next22, %29 ]
+ %indvars.iv19 = phi i32 [ -27, %init.exit ], [ %indvars.iv.next20, %29 ]
+ %indvars.iv17 = phi i32 [ 109, %init.exit ], [ %indvars.iv.next18, %29 ]
+ %indvars.iv15 = phi i32 [ -75923, %init.exit ], [ %indvars.iv.next16, %29 ]
+ %indvars.iv13 = phi i32 [ 5593, %init.exit ], [ %indvars.iv.next14, %29 ]
+ %indvars.iv = phi i32 [ -262, %init.exit ], [ %indvars.iv.next, %29 ]
+ %10 = phi i32 [ 53, %init.exit ], [ %.pre-phi, %29 ]
+ %11 = zext i32 %indvars.iv19 to i33
+ %12 = zext i32 %indvars.iv21 to i33
+ %13 = mul i33 %11, %12
+ %14 = icmp ult i32 %10, 27
+ br i1 %14, label %.lr.ph, label %.preheader._crit_edge
+
+.preheader._crit_edge: ; preds = %.preheader
+ %.pre = add i32 %10, -1
+ br label %29
+
+.lr.ph: ; preds = %.preheader
+ %15 = zext i32 %indvars.iv23 to i33
+ %16 = mul i33 %13, %15
+ %17 = lshr i33 %16, 1
+ %18 = lshr i33 %13, 1
+ %19 = trunc i33 %17 to i32
+ %20 = trunc i33 %18 to i32
+ %21 = mul i32 %19, 1431655766
+ %22 = mul i32 %indvars.iv17, %20
+ %23 = add i32 %10, -1
+ %24 = add i32 %10, 1
+ %25 = getelementptr inbounds [100 x [100 x i32]]* %t, i32 0, i32 %24, i32 %23
+ %.promoted = load i32* %25, align 4
+ %26 = add i32 %.promoted, %indvars.iv15
+ %27 = add i32 %26, %22
+ %28 = add i32 %27, %21
+ store i32 %28, i32* %25, align 4
+ br label %29
+
+.lr.ph.i3.preheader: ; preds = %29
+ store i32 2, i32* %j, align 4
+ store i32 %.lcssa69, i32* %k4, align 4
+ br label %.lr.ph.i3
+
+; <label>:29 ; preds = %.lr.ph, %.preheader._crit_edge
+ %.pre-phi = phi i32 [ %.pre, %.preheader._crit_edge ], [ %23, %.lr.ph ]
+ %.lcssa69 = phi i32 [ %10, %.preheader._crit_edge ], [ 27, %.lr.ph ]
+ %30 = icmp ugt i32 %.pre-phi, 2
+ %indvars.iv.next = add i32 %indvars.iv, 6
+ %indvars.iv.next14 = add i32 %indvars.iv13, %indvars.iv
+ %indvars.iv.next16 = add i32 %indvars.iv15, %indvars.iv13
+ %indvars.iv.next18 = add i32 %indvars.iv17, -2
+ %indvars.iv.next20 = add i32 %indvars.iv19, 1
+ %indvars.iv.next22 = add i32 %indvars.iv21, 1
+ %indvars.iv.next24 = add i32 %indvars.iv23, 1
+ br i1 %30, label %.preheader, label %.lr.ph.i3.preheader
+
+.lr.ph.i3: ; preds = %.lr.ph.i3, %.lr.ph.i3.preheader
+ %sum.07.i = phi i32 [ %37, %.lr.ph.i3 ], [ 0, %.lr.ph.i3.preheader ]
+ %j.06.i = phi i32 [ %38, %.lr.ph.i3 ], [ 0, %.lr.ph.i3.preheader ]
+ %31 = and i32 %j.06.i, 1
+ %32 = icmp eq i32 %31, 0
+ %33 = getelementptr inbounds [100 x [100 x i32]]* %t, i32 0, i32 0, i32 %j.06.i
+ %34 = load i32* %33, align 4
+ %35 = sub i32 0, %34
+ %36 = select i1 %32, i32 %34, i32 %35
+ %37 = add i32 %36, %sum.07.i
+ %38 = add i32 %j.06.i, 1
+ %39 = icmp ult i32 %38, 10000
+ br i1 %39, label %.lr.ph.i3, label %checkSum.exit
+
+checkSum.exit: ; preds = %.lr.ph.i3
+ %40 = add i32 %37, 2
+ %41 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str2, i32 0, i32 0), i32 %40) nounwind
+ ret i32 0
+}
+
+declare i32 @sscanf(i8* nocapture, i8* nocapture, ...) nounwind
+
+declare i32 @printf(i8* nocapture, ...) nounwind
diff --git a/tests/cases/muli33.txt b/tests/cases/muli33.txt
new file mode 100644
index 00000000..21e0231f
--- /dev/null
+++ b/tests/cases/muli33.txt
@@ -0,0 +1 @@
+res = 3164
diff --git a/tests/cases/oob_ta2.ll b/tests/cases/oob_ta2.ll
new file mode 100644
index 00000000..3c94c13c
--- /dev/null
+++ b/tests/cases/oob_ta2.ll
@@ -0,0 +1,25 @@
+; ModuleID = 'tests/hello_world.bc'
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
+target triple = "i386-pc-linux-gnu"
+
+%structy = type { [2 x [10 x i8]] }
+
+@.str1 = private unnamed_addr constant [10 x i8] c"1234567890", align 1
+@.str2 = private unnamed_addr constant [10 x i8] c"wakawaka\0A\00", align 1
+@.stry = private unnamed_addr constant [2 x %structy] { %structy { [10 x i8] @.str1, [10 x i8] @.str2 }, %structy { [10 x i8] @.str1, [10 x i8] @.str2 } }
+
+@.str = private unnamed_addr constant [15 x i8] c"hello, world!\0A\00", align 1 ; [#uses=1 type=[15 x i8]*]
+
+; [#uses=0]
+define i32 @main(i32 %argc, i8** %argv) {
+entry:
+ %retval = alloca i32, align 4 ; [#uses=1 type=i32*]
+ store i32 0, i32* %retval
+ %ind = add i32 %argc, 13
+ %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x %structy]* @.stry, i32 0, i32 2, i32 0, i32 %ind))
+ %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0)) ; [#uses=0 type=i32]
+ ret i32 1 ret i32 1
+}
+
+; [#uses=1]
+declare i32 @printf(i8*, ...)
diff --git a/tests/cases/philoop.ll b/tests/cases/philoop.ll
new file mode 100644
index 00000000..5036c7ba
--- /dev/null
+++ b/tests/cases/philoop.ll
@@ -0,0 +1,305 @@
+; ModuleID = '/tmp/tmpVIBz29/a.out.bc'
+target datalayout = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-p:32:32:32-v128:32:32"
+target triple = "le32-unknown-nacl"
+
+@.str = private unnamed_addr constant [13 x i8] c"99\0A70\0A26\0A97\0A\00", align 1
+@.str1 = private unnamed_addr constant [12 x i8] c"%u %u %u %u\00", align 1
+@.str2 = private unnamed_addr constant [10 x i8] c"res = %u\0A\00", align 1
+
+define i32 @main() nounwind {
+ %jp0 = alloca i32, align 4
+ %i1 = alloca i32, align 4
+ %jq3 = alloca i32, align 4
+ %i = alloca i32, align 4
+ %cq = alloca [100 x i32], align 4
+ %ye = alloca [100 x i32], align 4
+ %g = alloca [100 x i32], align 4
+ %z = alloca [100 x i32], align 4
+ %za = alloca [100 x [100 x i32]], align 4
+ %a0 = alloca [100 x i32], align 4
+ store i32 99, i32* %jp0, align 4
+ store i32 70, i32* %i1, align 4
+ store i32 26, i32* %jq3, align 4
+ store i32 97, i32* %i, align 4
+ br label %.lr.ph.i
+
+.lr.ph.i: ; preds = %.lr.ph.i, %0
+ %j.07.i = phi i32 [ %7, %.lr.ph.i ], [ 0, %0 ]
+ %1 = and i32 %j.07.i, 1
+ %2 = icmp eq i32 %1, 0
+ %3 = sub i32 0, %j.07.i
+ %.p.i = select i1 %2, i32 %j.07.i, i32 %3
+ %4 = add i32 %.p.i, 2
+ %5 = urem i32 %4, 101
+ %6 = getelementptr inbounds [100 x i32]* %cq, i32 0, i32 %j.07.i
+ store i32 %5, i32* %6, align 4
+ %7 = add i32 %j.07.i, 1
+ %8 = icmp ult i32 %7, 100
+ br i1 %8, label %.lr.ph.i, label %.lr.ph.i44.preheader
+
+.lr.ph.i44.preheader: ; preds = %.lr.ph.i
+ %9 = getelementptr inbounds [100 x i32]* %a0, i32 0, i32 0
+ br label %.lr.ph.i44
+
+.lr.ph.i44: ; preds = %.lr.ph.i44, %.lr.ph.i44.preheader
+ %j.07.i42 = phi i32 [ %16, %.lr.ph.i44 ], [ 0, %.lr.ph.i44.preheader ]
+ %10 = and i32 %j.07.i42, 1
+ %11 = icmp eq i32 %10, 0
+ %12 = sub i32 0, %j.07.i42
+ %.p.i43 = select i1 %11, i32 %j.07.i42, i32 %12
+ %13 = add i32 %.p.i43, 90
+ %14 = urem i32 %13, 101
+ %15 = getelementptr inbounds [100 x i32]* %ye, i32 0, i32 %j.07.i42
+ store i32 %14, i32* %15, align 4
+ %16 = add i32 %j.07.i42, 1
+ %17 = icmp ult i32 %16, 100
+ br i1 %17, label %.lr.ph.i44, label %.lr.ph.i40
+
+.lr.ph.i40: ; preds = %.lr.ph.i40, %.lr.ph.i44
+ %j.07.i38 = phi i32 [ %24, %.lr.ph.i40 ], [ 0, %.lr.ph.i44 ]
+ %18 = and i32 %j.07.i38, 1
+ %19 = icmp eq i32 %18, 0
+ %20 = sub i32 0, %j.07.i38
+ %.p.i39 = select i1 %19, i32 %j.07.i38, i32 %20
+ %21 = add i32 %.p.i39, 73
+ %22 = urem i32 %21, 101
+ %23 = getelementptr inbounds [100 x i32]* %g, i32 0, i32 %j.07.i38
+ store i32 %22, i32* %23, align 4
+ %24 = add i32 %j.07.i38, 1
+ %25 = icmp ult i32 %24, 100
+ br i1 %25, label %.lr.ph.i40, label %.lr.ph.i36
+
+.lr.ph.i36: ; preds = %.lr.ph.i36, %.lr.ph.i40
+ %j.07.i34 = phi i32 [ %32, %.lr.ph.i36 ], [ 0, %.lr.ph.i40 ]
+ %26 = and i32 %j.07.i34, 1
+ %27 = icmp eq i32 %26, 0
+ %28 = sub i32 0, %j.07.i34
+ %.p.i35 = select i1 %27, i32 %j.07.i34, i32 %28
+ %29 = add i32 %.p.i35, 54
+ %30 = urem i32 %29, 101
+ %31 = getelementptr inbounds [100 x i32]* %z, i32 0, i32 %j.07.i34
+ store i32 %30, i32* %31, align 4
+ %32 = add i32 %j.07.i34, 1
+ %33 = icmp ult i32 %32, 100
+ br i1 %33, label %.lr.ph.i36, label %.lr.ph.i32
+
+.lr.ph.i32: ; preds = %.lr.ph.i32, %.lr.ph.i36
+ %j.07.i30 = phi i32 [ %40, %.lr.ph.i32 ], [ 0, %.lr.ph.i36 ]
+ %34 = and i32 %j.07.i30, 1
+ %35 = icmp eq i32 %34, 0
+ %36 = sub i32 0, %j.07.i30
+ %.p.i31 = select i1 %35, i32 %j.07.i30, i32 %36
+ %37 = add i32 %.p.i31, 66
+ %38 = urem i32 %37, 101
+ %39 = getelementptr inbounds [100 x [100 x i32]]* %za, i32 0, i32 0, i32 %j.07.i30
+ store i32 %38, i32* %39, align 4
+ %40 = add i32 %j.07.i30, 1
+ %41 = icmp ult i32 %40, 10000
+ br i1 %41, label %.lr.ph.i32, label %.lr.ph.i28
+
+.lr.ph.i28: ; preds = %.lr.ph.i28, %.lr.ph.i32
+ %j.07.i26 = phi i32 [ %48, %.lr.ph.i28 ], [ 0, %.lr.ph.i32 ]
+ %42 = and i32 %j.07.i26, 1
+ %43 = icmp eq i32 %42, 0
+ %44 = sub i32 0, %j.07.i26
+ %.p.i27 = select i1 %43, i32 %j.07.i26, i32 %44
+ %45 = add i32 %.p.i27, 71
+ %46 = urem i32 %45, 101
+ %47 = getelementptr inbounds [100 x i32]* %a0, i32 0, i32 %j.07.i26
+ store i32 %46, i32* %47, align 4
+ %48 = add i32 %j.07.i26, 1
+ %49 = icmp ult i32 %48, 100
+ br i1 %49, label %.lr.ph.i28, label %init.exit29
+
+init.exit29: ; preds = %.lr.ph.i28
+ %50 = call i32 (i8*, i8*, ...)* @sscanf(i8* getelementptr inbounds ([13 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8]* @.str1, i32 0, i32 0), i32* %jp0, i32* %i1, i32* %jq3, i32* %i) nounwind
+ %51 = getelementptr inbounds [100 x i32]* %cq, i32 0, i32 46
+ %52 = load i32* %51, align 4
+ %53 = getelementptr inbounds [100 x i32]* %cq, i32 0, i32 20
+ %54 = load i32* %53, align 4
+ %55 = icmp ult i32 %52, %54
+ br i1 %55, label %.preheader61, label %56
+
+; <label>:56 ; preds = %init.exit29
+ %57 = load i32* %9, align 4
+ %58 = getelementptr inbounds [100 x i32]* %ye, i32 0, i32 24
+ %59 = load i32* %58, align 4
+ %60 = sub i32 %59, %57
+ store i32 %60, i32* %58, align 4
+ br label %.preheader61
+
+.preheader61: ; preds = %56, %init.exit29
+ store i32 2, i32* %jp0, align 4
+ %.phi.trans.insert = getelementptr inbounds [100 x i32]* %cq, i32 0, i32 1
+ %.pre = load i32* %.phi.trans.insert, align 4
+ br label %61
+
+.preheader58: ; preds = %61
+ store i32 80, i32* %jp0, align 4
+ store i32 94, i32* %i1, align 4
+ br label %76
+
+; <label>:61 ; preds = %61, %.preheader61
+ %62 = phi i32 [ %.pre, %.preheader61 ], [ %66, %61 ]
+ %63 = phi i32 [ 2, %.preheader61 ], [ %71, %61 ]
+ %64 = getelementptr inbounds [100 x i32]* %cq, i32 0, i32 %63
+ %65 = load i32* %64, align 4
+ %66 = add i32 %65, -4
+ store i32 %66, i32* %64, align 4
+ %67 = add i32 %63, -1
+ %68 = getelementptr inbounds [100 x i32]* %ye, i32 0, i32 %67
+ %69 = load i32* %68, align 4
+ %70 = mul i32 %62, %69
+ %71 = add i32 %63, 1
+ %72 = getelementptr inbounds [100 x i32]* %g, i32 0, i32 %71
+ %73 = load i32* %72, align 4
+ %74 = sub i32 %73, %70
+ store i32 %74, i32* %72, align 4
+ %75 = icmp ult i32 %71, 80
+ br i1 %75, label %61, label %.preheader58
+
+.preheader55: ; preds = %76
+ store i32 2, i32* %i1, align 4
+ store i32 44, i32* %jq3, align 4
+ br label %.preheader
+
+; <label>:76 ; preds = %76, %.preheader58
+ %77 = phi i32 [ 94, %.preheader58 ], [ %80, %76 ]
+ %78 = getelementptr inbounds [100 x i32]* %ye, i32 0, i32 %77
+ %79 = load i32* %78, align 4
+ %80 = add i32 %77, -1
+ %81 = getelementptr inbounds [100 x i32]* %z, i32 0, i32 %80
+ store i32 %79, i32* %81, align 4
+ %82 = icmp ugt i32 %80, 2
+ br i1 %82, label %76, label %.preheader55
+
+.preheader: ; preds = %95, %.preheader55
+ %83 = phi i32 [ 44, %.preheader55 ], [ %84, %95 ]
+ %84 = add i32 %83, -1
+ %85 = getelementptr inbounds [100 x [100 x i32]]* %za, i32 0, i32 %84, i32 %83
+ %.promoted = load i32* %85, align 4
+ %.pre75 = load i32* %9, align 4
+ %.phi.trans.insert76 = getelementptr inbounds [100 x i32]* %a0, i32 0, i32 1
+ %.pre77 = load i32* %.phi.trans.insert76, align 4
+ br label %86
+
+; <label>:86 ; preds = %86, %.preheader
+ %87 = phi i32 [ %.pre77, %.preheader ], [ %88, %86 ]
+ %88 = phi i32 [ %.pre75, %.preheader ], [ %87, %86 ]
+ %89 = phi i32 [ 1, %.preheader ], [ %92, %86 ]
+ %90 = phi i32 [ %.promoted, %.preheader ], [ %91, %86 ]
+ %91 = mul i32 %90, %87
+ %92 = add i32 %89, 1
+ %93 = getelementptr inbounds [100 x i32]* %a0, i32 0, i32 %92
+ store i32 %88, i32* %93, align 4
+ %94 = icmp ult i32 %92, 46
+ br i1 %94, label %86, label %95
+
+; <label>:95 ; preds = %86
+ store i32 %91, i32* %85, align 4
+ %96 = icmp ugt i32 %84, 1
+ br i1 %96, label %.preheader, label %97
+
+; <label>:97 ; preds = %95
+ store i32 1, i32* %jq3, align 4
+ store i32 46, i32* %i, align 4
+ br label %.lr.ph.i24
+
+.lr.ph.i24: ; preds = %.lr.ph.i24, %97
+ %sum.07.i22 = phi i32 [ %104, %.lr.ph.i24 ], [ 0, %97 ]
+ %j.06.i23 = phi i32 [ %105, %.lr.ph.i24 ], [ 0, %97 ]
+ %98 = and i32 %j.06.i23, 1
+ %99 = icmp eq i32 %98, 0
+ %100 = getelementptr inbounds [100 x i32]* %cq, i32 0, i32 %j.06.i23
+ %101 = load i32* %100, align 4
+ %102 = sub i32 0, %101
+ %103 = select i1 %99, i32 %101, i32 %102
+ %104 = add i32 %103, %sum.07.i22
+ %105 = add i32 %j.06.i23, 1
+ %106 = icmp ult i32 %105, 100
+ br i1 %106, label %.lr.ph.i24, label %.lr.ph.i20
+
+.lr.ph.i20: ; preds = %.lr.ph.i20, %.lr.ph.i24
+ %sum.07.i18 = phi i32 [ %113, %.lr.ph.i20 ], [ 0, %.lr.ph.i24 ]
+ %j.06.i19 = phi i32 [ %114, %.lr.ph.i20 ], [ 0, %.lr.ph.i24 ]
+ %107 = and i32 %j.06.i19, 1
+ %108 = icmp eq i32 %107, 0
+ %109 = getelementptr inbounds [100 x i32]* %ye, i32 0, i32 %j.06.i19
+ %110 = load i32* %109, align 4
+ %111 = sub i32 0, %110
+ %112 = select i1 %108, i32 %110, i32 %111
+ %113 = add i32 %112, %sum.07.i18
+ %114 = add i32 %j.06.i19, 1
+ %115 = icmp ult i32 %114, 100
+ br i1 %115, label %.lr.ph.i20, label %.lr.ph.i16
+
+.lr.ph.i16: ; preds = %.lr.ph.i16, %.lr.ph.i20
+ %sum.07.i14 = phi i32 [ %122, %.lr.ph.i16 ], [ 0, %.lr.ph.i20 ]
+ %j.06.i15 = phi i32 [ %123, %.lr.ph.i16 ], [ 0, %.lr.ph.i20 ]
+ %116 = and i32 %j.06.i15, 1
+ %117 = icmp eq i32 %116, 0
+ %118 = getelementptr inbounds [100 x i32]* %g, i32 0, i32 %j.06.i15
+ %119 = load i32* %118, align 4
+ %120 = sub i32 0, %119
+ %121 = select i1 %117, i32 %119, i32 %120
+ %122 = add i32 %121, %sum.07.i14
+ %123 = add i32 %j.06.i15, 1
+ %124 = icmp ult i32 %123, 100
+ br i1 %124, label %.lr.ph.i16, label %.lr.ph.i12
+
+.lr.ph.i12: ; preds = %.lr.ph.i12, %.lr.ph.i16
+ %sum.07.i10 = phi i32 [ %131, %.lr.ph.i12 ], [ 0, %.lr.ph.i16 ]
+ %j.06.i11 = phi i32 [ %132, %.lr.ph.i12 ], [ 0, %.lr.ph.i16 ]
+ %125 = and i32 %j.06.i11, 1
+ %126 = icmp eq i32 %125, 0
+ %127 = getelementptr inbounds [100 x i32]* %z, i32 0, i32 %j.06.i11
+ %128 = load i32* %127, align 4
+ %129 = sub i32 0, %128
+ %130 = select i1 %126, i32 %128, i32 %129
+ %131 = add i32 %130, %sum.07.i10
+ %132 = add i32 %j.06.i11, 1
+ %133 = icmp ult i32 %132, 100
+ br i1 %133, label %.lr.ph.i12, label %.lr.ph.i8
+
+.lr.ph.i8: ; preds = %.lr.ph.i8, %.lr.ph.i12
+ %sum.07.i6 = phi i32 [ %140, %.lr.ph.i8 ], [ 0, %.lr.ph.i12 ]
+ %j.06.i7 = phi i32 [ %141, %.lr.ph.i8 ], [ 0, %.lr.ph.i12 ]
+ %134 = and i32 %j.06.i7, 1
+ %135 = icmp eq i32 %134, 0
+ %136 = getelementptr inbounds [100 x [100 x i32]]* %za, i32 0, i32 0, i32 %j.06.i7
+ %137 = load i32* %136, align 4
+ %138 = sub i32 0, %137
+ %139 = select i1 %135, i32 %137, i32 %138
+ %140 = add i32 %139, %sum.07.i6
+ %141 = add i32 %j.06.i7, 1
+ %142 = icmp ult i32 %141, 10000
+ br i1 %142, label %.lr.ph.i8, label %.lr.ph.i5
+
+.lr.ph.i5: ; preds = %.lr.ph.i5, %.lr.ph.i8
+ %sum.07.i = phi i32 [ %149, %.lr.ph.i5 ], [ 0, %.lr.ph.i8 ]
+ %j.06.i = phi i32 [ %150, %.lr.ph.i5 ], [ 0, %.lr.ph.i8 ]
+ %143 = and i32 %j.06.i, 1
+ %144 = icmp eq i32 %143, 0
+ %145 = getelementptr inbounds [100 x i32]* %a0, i32 0, i32 %j.06.i
+ %146 = load i32* %145, align 4
+ %147 = sub i32 0, %146
+ %148 = select i1 %144, i32 %146, i32 %147
+ %149 = add i32 %148, %sum.07.i
+ %150 = add i32 %j.06.i, 1
+ %151 = icmp ult i32 %150, 100
+ br i1 %151, label %.lr.ph.i5, label %checkSum.exit
+
+checkSum.exit: ; preds = %.lr.ph.i5
+ %152 = add i32 %104, 82
+ %153 = add i32 %152, %113
+ %154 = sub i32 %153, %122
+ %155 = add i32 %154, %131
+ %156 = sub i32 %155, %140
+ %157 = add i32 %156, %149
+ %158 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str2, i32 0, i32 0), i32 %157) nounwind
+ ret i32 0
+}
+
+declare i32 @sscanf(i8* nocapture, i8* nocapture, ...) nounwind
+
+declare i32 @printf(i8* nocapture, ...) nounwind
diff --git a/tests/cases/philoop.txt b/tests/cases/philoop.txt
new file mode 100644
index 00000000..d5117fe8
--- /dev/null
+++ b/tests/cases/philoop.txt
@@ -0,0 +1 @@
+res = 1962923669
diff --git a/tests/embind/build_benchmark b/tests/embind/build_benchmark
index 6faad18b..3d5d816b 100644
--- a/tests/embind/build_benchmark
+++ b/tests/embind/build_benchmark
@@ -1,2 +1,2 @@
#!/bin/bash
-EMCC_LLVM_TARGET=le32-unknown-nacl ~/projects/emscripten/emcc --minify 0 --bind --post-js embind.benchmark.js -O2 --shell-file shell.html -o embind_benchmark.html embind_benchmark.cpp
+EMCC_LLVM_TARGET=le32-unknown-nacl ../../emcc --minify 0 --bind --post-js embind.benchmark.js -O2 --shell-file shell.html -o embind_benchmark.html embind_benchmark.cpp
diff --git a/tests/embind/embind.benchmark.js b/tests/embind/embind.benchmark.js
index 7b20db88..3669bc28 100644
--- a/tests/embind/embind.benchmark.js
+++ b/tests/embind/embind.benchmark.js
@@ -248,3 +248,38 @@ function _call_through_interface1() {
Module.print("C++ -> JS std::wstring through interface " + N + " iters: " + elapsed + " msecs.");
obj.delete();
}
+
+function _call_through_interface2() {
+ var N = 1000000;
+ var total = 0;
+ var obj = Module['Interface'].implement({
+ call_with_typed_array: function(ta) {
+ total += ta.length;
+ },
+ call_with_memory_view: function(ta) {
+ total += ta.length;
+ },
+ });
+
+ var start = _emscripten_get_now();
+ Module['callInterface2'](N, obj);
+ var elapsed = _emscripten_get_now() - start;
+ Module.print("C++ -> JS typed array instantiation " + N + " iters: " + elapsed + " msecs.");
+
+ var start = _emscripten_get_now();
+ Module['callInterface3'](N, obj);
+ var elapsed = _emscripten_get_now() - start;
+ Module.print("C++ -> JS memory_view instantiation" + N + " iters: " + elapsed + " msecs.");
+ obj.delete();
+}
+
+function _returns_val_benchmark() {
+ var N = 1000000;
+ var v = 1;
+ var start = _emscripten_get_now();
+ for(var i = 0; i < N; ++i) {
+ v = Module['returns_val'](v);
+ }
+ var elapsed = _emscripten_get_now() - start;
+ Module.print("returns_val " + N + " iters: " + elapsed + " msecs");
+}
diff --git a/tests/embind/embind.test.js b/tests/embind/embind.test.js
index 52b2cad8..e60e1ab3 100644
--- a/tests/embind/embind.test.js
+++ b/tests/embind/embind.test.js
@@ -5,6 +5,8 @@ module({
var CheckForLeaks = fixture("check for leaks", function() {
this.setUp(function() {
+ cm.setDelayFunction(undefined);
+
if (typeof INVOKED_FROM_EMSCRIPTEN_TEST_RUNNER === "undefined") { // TODO: Enable this to work in Emscripten runner as well!
cm._mallocDebug(2);
assert.equal(0, cm.count_emval_handles());
@@ -12,6 +14,7 @@ module({
}
});
this.tearDown(function() {
+ cm.flushPendingDeletes();
if (typeof INVOKED_FROM_EMSCRIPTEN_TEST_RUNNER === "undefined") { // TODO: Enable this to work in Emscripten runner as well!
cm._mallocAssertAllMemoryFree();
assert.equal(0, cm.count_emval_handles());
@@ -490,6 +493,15 @@ module({
assert.equal(true, cm.emval_test_not(false));
});
+ test("can pass booleans as integers", function() {
+ assert.equal(1, cm.emval_test_as_unsigned(true));
+ assert.equal(0, cm.emval_test_as_unsigned(false));
+ });
+
+ test("can pass booleans as floats", function() {
+ assert.equal(2, cm.const_ref_adder(true, true));
+ });
+
test("convert double to unsigned", function() {
var rv = cm.emval_test_as_unsigned(1.5);
assert.equal('number', typeof rv);
@@ -672,6 +684,15 @@ module({
c.delete();
});
+ test("access multiple smart ptr ctors", function() {
+ var a = new cm.MultipleSmartCtors(10);
+ assert.equal(a.WhichCtorCalled(), 1);
+ var b = new cm.MultipleCtors(20, 20);
+ assert.equal(b.WhichCtorCalled(), 2);
+ a.delete();
+ b.delete();
+ });
+
test("wrong number of constructor arguments throws", function() {
assert.throws(cm.BindingError, function() { new cm.MultipleCtors(); });
assert.throws(cm.BindingError, function() { new cm.MultipleCtors(1,2,3,4); });
@@ -1559,6 +1580,28 @@ module({
impl.delete();
});
+ test("returning null shared pointer from interfaces implemented in JS code does not leak", function() {
+ var impl = cm.AbstractClass.implement({
+ returnsSharedPtr: function() {
+ return null;
+ }
+ });
+ cm.callReturnsSharedPtrMethod(impl);
+ impl.delete();
+ // Let the memory leak test superfixture check that no leaks occurred.
+ });
+
+ test("returning a new shared pointer from interfaces implemented in JS code does not leak", function() {
+ var impl = cm.AbstractClass.implement({
+ returnsSharedPtr: function() {
+ return cm.embind_test_return_smart_derived_ptr();
+ }
+ });
+ cm.callReturnsSharedPtrMethod(impl);
+ impl.delete();
+ // Let the memory leak test superfixture check that no leaks occurred.
+ });
+
test("void methods work", function() {
var saved = {};
var impl = cm.AbstractClass.implement({
@@ -1728,6 +1771,116 @@ module({
e.delete();
f.delete();
});
+
+ BaseFixture.extend("memory view", function() {
+ test("can pass memory view from C++ to JS", function() {
+ var views = [];
+ cm.callWithMemoryView(function(view) {
+ views.push(view);
+ });
+ assert.equal(3, views.length);
+
+ assert.instanceof(views[0], Uint8Array);
+ assert.equal(8, views[0].length);
+ assert.deepEqual([0, 1, 2, 3, 4, 5, 6, 7], [].slice.call(new Uint8Array(views[0])));
+
+ assert.instanceof(views[1], Float32Array);
+ assert.equal(4, views[1].length);
+ assert.deepEqual([1.5, 2.5, 3.5, 4.5], [].slice.call(views[1]));
+
+ assert.instanceof(views[2], Int16Array);
+ assert.equal(4, views[2].length);
+ assert.deepEqual([1000, 100, 10, 1], [].slice.call(views[2]));
+ });
+ });
+
+ BaseFixture.extend("delete pool", function() {
+ test("can delete objects later", function() {
+ var v = new cm.ValHolder({});
+ v.deleteLater();
+ assert.deepEqual({}, v.getVal());
+ cm.flushPendingDeletes();
+ assert.throws(cm.BindingError, function() {
+ v.getVal();
+ });
+ });
+
+ test("calling deleteLater twice is an error", function() {
+ var v = new cm.ValHolder({});
+ v.deleteLater();
+ assert.throws(cm.BindingError, function() {
+ v.deleteLater();
+ });
+ });
+
+ test("deleteLater returns the object", function() {
+ var v = (new cm.ValHolder({})).deleteLater();
+ assert.deepEqual({}, v.getVal());
+ });
+
+ test("deleteLater throws if object is already deleted", function() {
+ var v = new cm.ValHolder({});
+ v.delete();
+ assert.throws(cm.BindingError, function() {
+ v.deleteLater();
+ });
+ });
+
+ test("delete throws if object is already scheduled for deletion", function() {
+ var v = new cm.ValHolder({});
+ v.deleteLater();
+ assert.throws(cm.BindingError, function() {
+ v.delete();
+ });
+ });
+
+ test("deleteLater invokes delay function", function() {
+ var runLater;
+ cm.setDelayFunction(function(fn) {
+ runLater = fn;
+ });
+
+ var v = new cm.ValHolder({});
+ assert.false(runLater);
+ v.deleteLater();
+ assert.true(runLater);
+ assert.false(v.isDeleted());
+ runLater();
+ assert.true(v.isDeleted());
+ });
+
+ test("deleteLater twice invokes delay function once", function() {
+ var count = 0;
+ var runLater;
+ cm.setDelayFunction(function(fn) {
+ ++count;
+ runLater = fn;
+ });
+
+ (new cm.ValHolder({})).deleteLater();
+ (new cm.ValHolder({})).deleteLater();
+ assert.equal(1, count);
+ runLater();
+ (new cm.ValHolder({})).deleteLater();
+ assert.equal(2, count);
+ });
+
+ test('The delay function is immediately invoked if the deletion queue is not empty', function() {
+ (new cm.ValHolder({})).deleteLater();
+ var count = 0;
+ cm.setDelayFunction(function(fn) {
+ ++count;
+ });
+ assert.equal(1, count);
+ });
+
+ // The idea is that an interactive application would
+ // periodically flush the deleteLater queue by calling
+ //
+ // setDelayFunction(function(fn) {
+ // setTimeout(fn, 0);
+ // });
+ });
});
/* global run_all_tests */
diff --git a/tests/embind/embind_benchmark.cpp b/tests/embind/embind_benchmark.cpp
index b6a834c9..5ae9a6be 100644
--- a/tests/embind/embind_benchmark.cpp
+++ b/tests/embind/embind_benchmark.cpp
@@ -50,6 +50,14 @@ extern void pass_gameobject_ptr_benchmark_embind_js();
extern void call_through_interface0();
extern void call_through_interface1();
+extern void call_through_interface2();
+
+extern void returns_val_benchmark();
+}
+
+emscripten::val returns_val(emscripten::val value)
+{
+ return emscripten::val(value.as<unsigned>() + 1);
}
class Vec3
@@ -135,19 +143,45 @@ class Interface
public:
virtual void call0() = 0;
virtual std::wstring call1(const std::wstring& str1, const std::wstring& str2) = 0;
+ virtual void call_with_typed_array(size_t size, const void*) = 0;
+ virtual void call_with_memory_view(size_t size, const void*) = 0;
};
+EMSCRIPTEN_SYMBOL(HEAP8);
+EMSCRIPTEN_SYMBOL(buffer);
+
+EMSCRIPTEN_SYMBOL(call0);
+EMSCRIPTEN_SYMBOL(call1);
+EMSCRIPTEN_SYMBOL(call_with_typed_array);
+EMSCRIPTEN_SYMBOL(call_with_memory_view);
+EMSCRIPTEN_SYMBOL(Uint8Array);
+
class InterfaceWrapper : public emscripten::wrapper<Interface>
{
public:
EMSCRIPTEN_WRAPPER(InterfaceWrapper);
void call0() override {
- return call<void>("call0");
+ return call<void>(call0_symbol);
}
std::wstring call1(const std::wstring& str1, const std::wstring& str2) {
- return call<std::wstring>("call1", str1, str2);
+ return call<std::wstring>(call1_symbol, str1, str2);
+ }
+
+ void call_with_typed_array(size_t size, const void* data) {
+ return call<void>(
+ call_with_typed_array_symbol,
+ emscripten::val::global(Uint8Array_symbol).new_(
+ emscripten::val::module_property(HEAP8_symbol)[buffer_symbol],
+ reinterpret_cast<uintptr_t>(data),
+ size));
+ }
+
+ void call_with_memory_view(size_t size, const void* data) {
+ return call<void>(
+ call_with_memory_view_symbol,
+ emscripten::memory_view(size, data));
}
};
@@ -180,6 +214,33 @@ void callInterface1(unsigned N, Interface& o) {
}
}
+void callInterface2(unsigned N, Interface& o) {
+ int i = 0;
+ for (unsigned i = 0; i < N; i += 8) {
+ o.call_with_typed_array(sizeof(int), &i);
+ o.call_with_typed_array(sizeof(int), &i);
+ o.call_with_typed_array(sizeof(int), &i);
+ o.call_with_typed_array(sizeof(int), &i);
+ o.call_with_typed_array(sizeof(int), &i);
+ o.call_with_typed_array(sizeof(int), &i);
+ o.call_with_typed_array(sizeof(int), &i);
+ o.call_with_typed_array(sizeof(int), &i);
+ }
+}
+
+void callInterface3(unsigned N, Interface& o) {
+ for (unsigned i = 0; i < N; i += 8) {
+ o.call_with_memory_view(sizeof(int), &i);
+ o.call_with_memory_view(sizeof(int), &i);
+ o.call_with_memory_view(sizeof(int), &i);
+ o.call_with_memory_view(sizeof(int), &i);
+ o.call_with_memory_view(sizeof(int), &i);
+ o.call_with_memory_view(sizeof(int), &i);
+ o.call_with_memory_view(sizeof(int), &i);
+ o.call_with_memory_view(sizeof(int), &i);
+ }
+}
+
EMSCRIPTEN_BINDINGS(benchmark)
{
using namespace emscripten;
@@ -225,6 +286,10 @@ EMSCRIPTEN_BINDINGS(benchmark)
function("callInterface0", &callInterface0);
function("callInterface1", &callInterface1);
+ function("callInterface2", &callInterface2);
+ function("callInterface3", &callInterface3);
+
+ function("returns_val", &returns_val);
}
void __attribute__((noinline)) emscripten_get_now_benchmark(int N)
@@ -435,4 +500,6 @@ int main()
emscripten_get_now();
call_through_interface0();
call_through_interface1();
+ call_through_interface2();
+ returns_val_benchmark();
}
diff --git a/tests/embind/embind_test.cpp b/tests/embind/embind_test.cpp
index 23761efc..3561b8a1 100644
--- a/tests/embind/embind_test.cpp
+++ b/tests/embind/embind_test.cpp
@@ -1084,6 +1084,7 @@ public:
return "optional" + s;
}
+ virtual std::shared_ptr<Derived> returnsSharedPtr() = 0;
virtual void differentArguments(int i, double d, unsigned char f, double q, std::string) = 0;
};
@@ -1103,6 +1104,10 @@ public:
}, s);
}
+ std::shared_ptr<Derived> returnsSharedPtr() {
+ return call<std::shared_ptr<Derived> >("returnsSharedPtr");
+ }
+
void differentArguments(int i, double d, unsigned char f, double q, std::string s) {
return call<void>("differentArguments", i, d, f, q, s);
}
@@ -1116,6 +1121,10 @@ class ConcreteClass : public AbstractClass {
void differentArguments(int i, double d, unsigned char f, double q, std::string s) {
}
+
+ std::shared_ptr<Derived> returnsSharedPtr() {
+ return std::shared_ptr<Derived>();
+ }
};
std::shared_ptr<AbstractClass> getAbstractClass() {
@@ -1130,6 +1139,11 @@ std::string callOptionalMethod(AbstractClass& ac, std::string s) {
return ac.optionalMethod(s);
}
+void callReturnsSharedPtrMethod(AbstractClass& ac) {
+ std::shared_ptr<Derived> sp = ac.returnsSharedPtr();
+ // unused: sp
+}
+
void callDifferentArguments(AbstractClass& ac, int i, double d, unsigned char f, double q, std::string s) {
return ac.differentArguments(i, d, f, q, s);
}
@@ -1145,9 +1159,29 @@ EMSCRIPTEN_BINDINGS(interface_tests) {
function("getAbstractClass", &getAbstractClass);
function("callAbstractMethod", &callAbstractMethod);
function("callOptionalMethod", &callOptionalMethod);
+ function("callReturnsSharedPtrMethod", &callReturnsSharedPtrMethod);
function("callDifferentArguments", &callDifferentArguments);
}
+template<typename T, size_t sizeOfArray>
+constexpr size_t getElementCount(T (&)[sizeOfArray]) {
+ return sizeOfArray;
+}
+
+static void callWithMemoryView(val v) {
+ // static so the JS test can read the memory after callTakeMemoryView runs
+ static unsigned char data[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
+ v(memory_view(getElementCount(data), data));
+ static float f[] = { 1.5f, 2.5f, 3.5f, 4.5f };
+ v(typed_memory_view(getElementCount(f), f));
+ static short s[] = { 1000, 100, 10, 1 };
+ v(typed_memory_view(getElementCount(s), s));
+}
+
+EMSCRIPTEN_BINDINGS(memory_view_tests) {
+ function("callWithMemoryView", &callWithMemoryView);
+}
+
class HasExternalConstructor {
public:
HasExternalConstructor(const std::string& str)
@@ -1831,7 +1865,7 @@ int overloaded_function(int i, int j) {
class MultipleCtors {
public:
- int value;
+ int value = 0;
MultipleCtors(int i) {
value = 1;
@@ -1854,6 +1888,25 @@ public:
}
};
+class MultipleSmartCtors {
+public:
+ int value = 0;
+
+ MultipleSmartCtors(int i) {
+ value = 1;
+ assert(i == 10);
+ }
+ MultipleSmartCtors(int i, int j) {
+ value = 2;
+ assert(i == 20);
+ assert(j == 20);
+ }
+
+ int WhichCtorCalled() const {
+ return value;
+ }
+};
+
class MultipleOverloads {
public:
MultipleOverloads() {}
@@ -1960,7 +2013,15 @@ EMSCRIPTEN_BINDINGS(overloads) {
.constructor<int>()
.constructor<int, int>()
.constructor<int, int, int>()
- .function("WhichCtorCalled", &MultipleCtors::WhichCtorCalled);
+ .function("WhichCtorCalled", &MultipleCtors::WhichCtorCalled)
+ ;
+
+ class_<MultipleSmartCtors>("MultipleSmartCtors")
+ .smart_ptr<std::shared_ptr<MultipleSmartCtors>>()
+ .constructor(&std::make_shared<MultipleSmartCtors, int>)
+ .constructor(&std::make_shared<MultipleSmartCtors, int, int>)
+ .function("WhichCtorCalled", &MultipleSmartCtors::WhichCtorCalled)
+ ;
class_<MultipleOverloads>("MultipleOverloads")
.constructor<>()
diff --git a/tests/linpack.c b/tests/linpack.c
new file mode 100644
index 00000000..363415c3
--- /dev/null
+++ b/tests/linpack.c
@@ -0,0 +1,1153 @@
+/* gcc linpack.c cpuidc64.o cpuida64.o -m64 -lrt -lc -lm -o linpack
+ *
+ * Linpack 100x100 Benchmark In C/C++ For PCs
+ *
+ * Different compilers can produce different floating point numeric
+ * results, probably due to compiling instructions in a different
+ * sequence. As the program checks these, they may need to be changed.
+ * The log file indicates non-standard results and these values can
+ * be copied and pasted into this program. See // Values near the
+ * end of main().
+ *
+ * Different compilers do not optimise the code in the same way.
+ * This can lead to wide variations in benchmark speeds. See results
+ * with MS6 compiler ID and compare with those from same CPUs from
+ * the Watcom compiler generated code.
+ *
+ ***************************************************************************
+*/
+
+#define _CRT_SECURE_NO_WARNINGS 1
+#ifdef WIN32
+#include <Windows.h>
+#else
+#include <sys/time.h>
+#endif
+
+#define UNROLL
+#define DP
+
+#ifdef SP
+#define REAL float
+#define ZERO 0.0
+#define ONE 1.0
+#define PREC "Single"
+#endif
+
+#ifdef DP
+#define REAL double
+#define ZERO 0.0e0
+#define ONE 1.0e0
+#define PREC "Double"
+#endif
+
+#ifdef ROLL
+#define ROLLING "Rolled"
+#endif
+#ifdef UNROLL
+#define ROLLING "Unrolled"
+#endif
+
+ // VERSION
+
+ #ifdef CNNT
+ #define options "Non-optimised"
+ #define opt "0"
+ #else
+// #define options "Optimised"
+ #define options "Opt 3 64 Bit"
+ #define opt "1"
+ #endif
+
+#define NTIMES 10
+
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+#include <time.h>
+
+
+/* this is truly rank, but it's minimally invasive, and lifted in part from the STREAM scores */
+
+static double secs;
+
+#ifndef WIN32
+
+double mysecond()
+{
+ struct timeval tp;
+ struct timezone tzp;
+ int i;
+
+ i = gettimeofday(&tp,&tzp);
+ return ( (double) tp.tv_sec + (double) tp.tv_usec * 1.e-6 );
+}
+#else
+
+double mysecond()
+{
+ static LARGE_INTEGER freq = {0};
+ LARGE_INTEGER count = {0};
+ if(freq.QuadPart == 0LL) {
+ QueryPerformanceFrequency(&freq);
+ }
+ QueryPerformanceCounter(&count);
+ return (double)count.QuadPart / (double)freq.QuadPart;
+}
+
+#endif
+
+void start_time()
+{
+ secs = mysecond();
+}
+
+void end_time()
+{
+ secs = mysecond() - secs;
+}
+
+void print_time (int row);
+void matgen (REAL a[], int lda, int n, REAL b[], REAL *norma);
+void dgefa (REAL a[], int lda, int n, int ipvt[], int *info);
+void dgesl (REAL a[],int lda,int n,int ipvt[],REAL b[],int job);
+void dmxpy (int n1, REAL y[], int n2, int ldm, REAL x[], REAL m[]);
+void daxpy (int n, REAL da, REAL dx[], int incx, REAL dy[], int incy);
+REAL epslon (REAL x);
+int idamax (int n, REAL dx[], int incx);
+void dscal (int n, REAL da, REAL dx[], int incx);
+REAL ddot (int n, REAL dx[], int incx, REAL dy[], int incy);
+
+static REAL atime[9][15];
+double runSecs = 1;
+
+
+int main (int argc, char *argv[])
+{
+ static REAL aa[200*200],a[200*201],b[200],x[200];
+ REAL cray,ops,total,norma,normx;
+ REAL resid,residn,eps,tm2,epsn,x1,x2;
+ REAL mflops;
+ static int ipvt[200],n,i,j,ntimes,info,lda,ldaa;
+ int endit, pass, loop;
+ REAL overhead1, overhead2, time2;
+ REAL max1, max2;
+ char was[5][20];
+ char expect[5][20];
+ char title[5][20];
+ int errors;
+
+
+ printf("\n");
+
+ printf("##########################################\n");
+
+
+
+ lda = 201;
+ ldaa = 200;
+ cray = .056;
+ n = 100;
+
+ fprintf(stdout, "%s ", ROLLING);
+ fprintf(stdout, "%s ", PREC);
+ fprintf(stdout,"Precision Linpack Benchmark - PC Version in 'C/C++'\n\n");
+
+ fprintf(stdout,"Optimisation %s\n\n",options);
+
+ ops = (2.0e0*(n*n*n))/3.0 + 2.0*(n*n);
+
+ matgen(a,lda,n,b,&norma);
+ start_time();
+ dgefa(a,lda,n,ipvt,&info);
+ end_time();
+ atime[0][0] = secs;
+ start_time();
+ dgesl(a,lda,n,ipvt,b,0);
+ end_time();
+ atime[1][0] = secs;
+ total = atime[0][0] + atime[1][0];
+
+/* compute a residual to verify results. */
+
+ for (i = 0; i < n; i++) {
+ x[i] = b[i];
+ }
+ matgen(a,lda,n,b,&norma);
+ for (i = 0; i < n; i++) {
+ b[i] = -b[i];
+ }
+ dmxpy(n,b,n,lda,x,a);
+ resid = 0.0;
+ normx = 0.0;
+ for (i = 0; i < n; i++) {
+ resid = (resid > fabs((double)b[i]))
+ ? resid : fabs((double)b[i]);
+ normx = (normx > fabs((double)x[i]))
+ ? normx : fabs((double)x[i]);
+ }
+ eps = epslon(ONE);
+ residn = resid/( n*norma*normx*eps );
+ epsn = eps;
+ x1 = x[0] - 1;
+ x2 = x[n-1] - 1;
+
+ printf("norm resid resid machep");
+ printf(" x[0]-1 x[n-1]-1\n");
+ printf("%6.1f %17.8e%17.8e%17.8e%17.8e\n\n",
+ (double)residn, (double)resid, (double)epsn,
+ (double)x1, (double)x2);
+
+ printf("Times are reported for matrices of order %5d\n",n);
+ printf("1 pass times for array with leading dimension of%5d\n\n",lda);
+ printf(" dgefa dgesl total Mflops unit");
+ printf(" ratio\n");
+
+ atime[2][0] = total;
+ if (total > 0.0)
+ {
+ atime[3][0] = ops/(1.0e6*total);
+ atime[4][0] = 2.0/atime[3][0];
+ }
+ else
+ {
+ atime[3][0] = 0.0;
+ atime[4][0] = 0.0;
+ }
+ atime[5][0] = total/cray;
+
+ print_time(0);
+
+/************************************************************************
+ * Calculate overhead of executing matgen procedure *
+ ************************************************************************/
+
+ printf("\nCalculating matgen overhead\n");
+ pass = -20;
+ loop = NTIMES;
+ do
+ {
+ start_time();
+ pass = pass + 1;
+ for ( i = 0 ; i < loop ; i++)
+ {
+ matgen(a,lda,n,b,&norma);
+ }
+ end_time();
+ overhead1 = secs;
+ printf("%10d times %6.2f seconds\n", loop, overhead1);
+ if (overhead1 > runSecs)
+ {
+ pass = 0;
+ }
+ if (pass < 0)
+ {
+ if (overhead1 < 0.1)
+ {
+ loop = loop * 10;
+ }
+ else
+ {
+ loop = loop * 2;
+ }
+ }
+ }
+ while (pass < 0);
+
+ overhead1 = overhead1 / (double)loop;
+
+ printf("Overhead for 1 matgen %12.5f seconds\n\n", overhead1);
+
+/************************************************************************
+ * Calculate matgen/dgefa passes for runSecs seconds *
+ ************************************************************************/
+
+ printf("Calculating matgen/dgefa passes for %d seconds\n", (int)runSecs);
+ pass = -20;
+ ntimes = NTIMES;
+ do
+ {
+ start_time();
+ pass = pass + 1;
+ for ( i = 0 ; i < ntimes ; i++)
+ {
+ matgen(a,lda,n,b,&norma);
+ dgefa(a,lda,n,ipvt,&info );
+ }
+ end_time();
+ time2 = secs;
+ printf("%10d times %6.2f seconds\n", ntimes, time2);
+ if (time2 > runSecs)
+ {
+ pass = 0;
+ }
+ if (pass < 0)
+ {
+ if (time2 < 0.1)
+ {
+ ntimes = ntimes * 10;
+ }
+ else
+ {
+ ntimes = ntimes * 2;
+ }
+ }
+ }
+ while (pass < 0);
+
+ ntimes = (int)(runSecs * (double)ntimes / time2);
+ if (ntimes == 0) ntimes = 1;
+
+ printf("Passes used %10d \n\n", ntimes);
+ printf("Times for array with leading dimension of%4d\n\n",lda);
+ printf(" dgefa dgesl total Mflops unit");
+ printf(" ratio\n");
+
+/************************************************************************
+ * Execute 5 passes *
+ ************************************************************************/
+
+ tm2 = ntimes * overhead1;
+ atime[3][6] = 0;
+
+ for (j=1 ; j<6 ; j++)
+ {
+ start_time();
+ for (i = 0; i < ntimes; i++)
+ {
+ matgen(a,lda,n,b,&norma);
+ dgefa(a,lda,n,ipvt,&info );
+ }
+ end_time();
+ atime[0][j] = (secs - tm2)/ntimes;
+
+ start_time();
+ for (i = 0; i < ntimes; i++)
+ {
+ dgesl(a,lda,n,ipvt,b,0);
+ }
+ end_time();
+
+ atime[1][j] = secs/ntimes;
+ total = atime[0][j] + atime[1][j];
+ atime[2][j] = total;
+ atime[3][j] = ops/(1.0e6*total);
+ atime[4][j] = 2.0/atime[3][j];
+ atime[5][j] = total/cray;
+ atime[3][6] = atime[3][6] + atime[3][j];
+
+ print_time(j);
+ }
+ atime[3][6] = atime[3][6] / 5.0;
+ printf("Average %11.2f\n",
+ (double)atime[3][6]);
+
+ printf("\nCalculating matgen2 overhead\n");
+
+/************************************************************************
+ * Calculate overhead of executing matgen procedure *
+ ************************************************************************/
+
+ start_time();
+ for ( i = 0 ; i < loop ; i++)
+ {
+ matgen(aa,ldaa,n,b,&norma);
+ }
+ end_time();
+ overhead2 = secs;
+ overhead2 = overhead2 / (double)loop;
+
+ printf("Overhead for 1 matgen %12.5f seconds\n\n", overhead2);
+ printf("Times for array with leading dimension of%4d\n\n",ldaa);
+ printf(" dgefa dgesl total Mflops unit");
+ printf(" ratio\n");
+
+/************************************************************************
+ * Execute 5 passes *
+ ************************************************************************/
+
+ tm2 = ntimes * overhead2;
+ atime[3][12] = 0;
+
+ for (j=7 ; j<12 ; j++)
+ {
+ start_time();
+ for (i = 0; i < ntimes; i++)
+ {
+ matgen(aa,ldaa,n,b,&norma);
+ dgefa(aa,ldaa,n,ipvt,&info );
+ }
+ end_time();
+ atime[0][j] = (secs - tm2)/ntimes;
+
+ start_time();
+ for (i = 0; i < ntimes; i++)
+ {
+ dgesl(aa,ldaa,n,ipvt,b,0);
+ }
+ end_time();
+ atime[1][j] = secs/ntimes;
+ total = atime[0][j] + atime[1][j];
+ atime[2][j] = total;
+ atime[3][j] = ops/(1.0e6*total);
+ atime[4][j] = 2.0/atime[3][j];
+ atime[5][j] = total/cray;
+ atime[3][12] = atime[3][12] + atime[3][j];
+
+ print_time(j);
+ }
+ atime[3][12] = atime[3][12] / 5.0;
+ printf("Average %11.2f\n",
+ (double)atime[3][12]);
+
+/************************************************************************
+ * Use minimum average as overall Mflops rating *
+ ************************************************************************/
+
+ mflops = atime[3][6];
+ if (atime[3][12] < mflops) mflops = atime[3][12];
+
+ printf("\n");
+ printf( "%s ", ROLLING);
+ printf( "%s ", PREC);
+ printf(" Precision %11.2f Mflops \n\n",mflops);
+
+
+ max1 = 0;
+ for (i=1 ; i<6 ; i++)
+ {
+ if (atime[3][i] > max1) max1 = atime[3][i];
+ }
+
+ max2 = 0;
+ for (i=7 ; i<12 ; i++)
+ {
+ if (atime[3][i] > max2) max2 = atime[3][i];
+ }
+ if (max1 < max2) max2 = max1;
+
+ sprintf(was[0], "%16.1f",(double)residn);
+ sprintf(was[1], "%16.8e",(double)resid);
+ sprintf(was[2], "%16.8e",(double)epsn);
+ sprintf(was[3], "%16.8e",(double)x1);
+ sprintf(was[4], "%16.8e",(double)x2);
+
+/*
+ // Values for Watcom
+
+ sprintf(expect[0], " 0.4");
+ sprintf(expect[1], " 7.41628980e-014");
+ sprintf(expect[2], " 1.00000000e-015");
+ sprintf(expect[3], "-1.49880108e-014");
+ sprintf(expect[4], "-1.89848137e-014");
+ // Values for Visual C++
+
+ sprintf(expect[0], " 1.7");
+ sprintf(expect[1], " 7.41628980e-014");
+ sprintf(expect[2], " 2.22044605e-016");
+ sprintf(expect[3], "-1.49880108e-014");
+ sprintf(expect[4], "-1.89848137e-014");
+
+ // Values for Ubuntu GCC 32 Bit
+
+ sprintf(expect[0], " 1.9");
+ sprintf(expect[1], " 8.39915160e-14");
+ sprintf(expect[2], " 2.22044605e-16");
+ sprintf(expect[3], " -6.22835117e-14");
+ sprintf(expect[4], " -4.16333634e-14");
+*/
+
+ // Values for Ubuntu GCC 32 Bit
+
+ sprintf(expect[0], " 1.7");
+ sprintf(expect[1], " 7.41628980e-14");
+ sprintf(expect[2], " 2.22044605e-16");
+ sprintf(expect[3], " -1.49880108e-14");
+ sprintf(expect[4], " -1.89848137e-14");
+
+ sprintf(title[0], "norm. resid");
+ sprintf(title[1], "resid ");
+ sprintf(title[2], "machep ");
+ sprintf(title[3], "x[0]-1 ");
+ sprintf(title[4], "x[n-1]-1 ");
+
+ if (strtol(opt, NULL, 10) == 0)
+ {
+ sprintf(expect[2], " 8.88178420e-016");
+ }
+ errors = 0;
+
+ printf ("\n");
+}
+
+/*----------------------*/
+void print_time (int row)
+
+{
+printf("%11.5f%11.5f%11.5f%11.2f%11.4f%11.4f\n", (double)atime[0][row],
+ (double)atime[1][row], (double)atime[2][row], (double)atime[3][row],
+ (double)atime[4][row], (double)atime[5][row]);
+ return;
+}
+
+/*----------------------*/
+
+void matgen (REAL a[], int lda, int n, REAL b[], REAL *norma)
+
+
+/* We would like to declare a[][lda], but c does not allow it. In this
+function, references to a[i][j] are written a[lda*i+j]. */
+
+{
+ int init, i, j;
+
+ init = 1325;
+ *norma = 0.0;
+ for (j = 0; j < n; j++) {
+ for (i = 0; i < n; i++) {
+ init = 3125*init % 65536;
+ a[lda*j+i] = (init - 32768.0)/16384.0;
+ *norma = (a[lda*j+i] > *norma) ? a[lda*j+i] : *norma;
+
+ /* alternative for some compilers
+ if (fabs(a[lda*j+i]) > *norma) *norma = fabs(a[lda*j+i]);
+ */
+ }
+ }
+ for (i = 0; i < n; i++) {
+ b[i] = 0.0;
+ }
+ for (j = 0; j < n; j++) {
+ for (i = 0; i < n; i++) {
+ b[i] = b[i] + a[lda*j+i];
+ }
+ }
+ return;
+}
+
+/*----------------------*/
+void dgefa(REAL a[], int lda, int n, int ipvt[], int *info)
+
+
+/* We would like to declare a[][lda], but c does not allow it. In this
+function, references to a[i][j] are written a[lda*i+j]. */
+/*
+ dgefa factors a double precision matrix by gaussian elimination.
+
+ dgefa is usually called by dgeco, but it can be called
+ directly with a saving in time if rcond is not needed.
+ (time for dgeco) = (1 + 9/n)*(time for dgefa) .
+
+ on entry
+
+ a REAL precision[n][lda]
+ the matrix to be factored.
+
+ lda integer
+ the leading dimension of the array a .
+
+ n integer
+ the order of the matrix a .
+
+ on return
+
+ a an upper triangular matrix and the multipliers
+ which were used to obtain it.
+ the factorization can be written a = l*u where
+ l is a product of permutation and unit lower
+ triangular matrices and u is upper triangular.
+
+ ipvt integer[n]
+ an integer vector of pivot indices.
+
+ info integer
+ = 0 normal value.
+ = k if u[k][k] .eq. 0.0 . this is not an error
+ condition for this subroutine, but it does
+ indicate that dgesl or dgedi will divide by zero
+ if called. use rcond in dgeco for a reliable
+ indication of singularity.
+
+ linpack. this version dated 08/14/78 .
+ cleve moler, university of new mexico, argonne national lab.
+
+ functions
+
+ blas daxpy,dscal,idamax
+*/
+
+{
+/* internal variables */
+
+REAL t;
+int j,k,kp1,l,nm1;
+
+
+/* gaussian elimination with partial pivoting */
+
+ *info = 0;
+ nm1 = n - 1;
+ if (nm1 >= 0) {
+ for (k = 0; k < nm1; k++) {
+ kp1 = k + 1;
+
+ /* find l = pivot index */
+
+ l = idamax(n-k,&a[lda*k+k],1) + k;
+ ipvt[k] = l;
+
+ /* zero pivot implies this column already
+ triangularized */
+
+ if (a[lda*k+l] != ZERO) {
+
+ /* interchange if necessary */
+
+ if (l != k) {
+ t = a[lda*k+l];
+ a[lda*k+l] = a[lda*k+k];
+ a[lda*k+k] = t;
+ }
+
+ /* compute multipliers */
+
+ t = -ONE/a[lda*k+k];
+ dscal(n-(k+1),t,&a[lda*k+k+1],1);
+
+ /* row elimination with column indexing */
+
+ for (j = kp1; j < n; j++) {
+ t = a[lda*j+l];
+ if (l != k) {
+ a[lda*j+l] = a[lda*j+k];
+ a[lda*j+k] = t;
+ }
+ daxpy(n-(k+1),t,&a[lda*k+k+1],1,
+ &a[lda*j+k+1],1);
+ }
+ }
+ else {
+ *info = k;
+ }
+ }
+ }
+ ipvt[n-1] = n-1;
+ if (a[lda*(n-1)+(n-1)] == ZERO) *info = n-1;
+ return;
+}
+
+/*----------------------*/
+
+void dgesl(REAL a[],int lda,int n,int ipvt[],REAL b[],int job )
+
+
+/* We would like to declare a[][lda], but c does not allow it. In this
+function, references to a[i][j] are written a[lda*i+j]. */
+
+/*
+ dgesl solves the double precision system
+ a * x = b or trans(a) * x = b
+ using the factors computed by dgeco or dgefa.
+
+ on entry
+
+ a double precision[n][lda]
+ the output from dgeco or dgefa.
+
+ lda integer
+ the leading dimension of the array a .
+
+ n integer
+ the order of the matrix a .
+
+ ipvt integer[n]
+ the pivot vector from dgeco or dgefa.
+
+ b double precision[n]
+ the right hand side vector.
+
+ job integer
+ = 0 to solve a*x = b ,
+ = nonzero to solve trans(a)*x = b where
+ trans(a) is the transpose.
+
+ on return
+
+ b the solution vector x .
+
+ error condition
+
+ a division by zero will occur if the input factor contains a
+ zero on the diagonal. technically this indicates singularity
+ but it is often caused by improper arguments or improper
+ setting of lda . it will not occur if the subroutines are
+ called correctly and if dgeco has set rcond .gt. 0.0
+ or dgefa has set info .eq. 0 .
+
+ to compute inverse(a) * c where c is a matrix
+ with p columns
+ dgeco(a,lda,n,ipvt,rcond,z)
+ if (!rcond is too small){
+ for (j=0,j<p,j++)
+ dgesl(a,lda,n,ipvt,c[j][0],0);
+ }
+
+ linpack. this version dated 08/14/78 .
+ cleve moler, university of new mexico, argonne national lab.
+
+ functions
+
+ blas daxpy,ddot
+*/
+{
+/* internal variables */
+
+ REAL t;
+ int k,kb,l,nm1;
+
+ nm1 = n - 1;
+ if (job == 0) {
+
+ /* job = 0 , solve a * x = b
+ first solve l*y = b */
+
+ if (nm1 >= 1) {
+ for (k = 0; k < nm1; k++) {
+ l = ipvt[k];
+ t = b[l];
+ if (l != k){
+ b[l] = b[k];
+ b[k] = t;
+ }
+ daxpy(n-(k+1),t,&a[lda*k+k+1],1,&b[k+1],1 );
+ }
+ }
+
+ /* now solve u*x = y */
+
+ for (kb = 0; kb < n; kb++) {
+ k = n - (kb + 1);
+ b[k] = b[k]/a[lda*k+k];
+ t = -b[k];
+ daxpy(k,t,&a[lda*k+0],1,&b[0],1 );
+ }
+ }
+ else {
+
+ /* job = nonzero, solve trans(a) * x = b
+ first solve trans(u)*y = b */
+
+ for (k = 0; k < n; k++) {
+ t = ddot(k,&a[lda*k+0],1,&b[0],1);
+ b[k] = (b[k] - t)/a[lda*k+k];
+ }
+
+ /* now solve trans(l)*x = y */
+
+ if (nm1 >= 1) {
+ for (kb = 1; kb < nm1; kb++) {
+ k = n - (kb+1);
+ b[k] = b[k] + ddot(n-(k+1),&a[lda*k+k+1],1,&b[k+1],1);
+ l = ipvt[k];
+ if (l != k) {
+ t = b[l];
+ b[l] = b[k];
+ b[k] = t;
+ }
+ }
+ }
+ }
+ return;
+}
+
+/*----------------------*/
+
+void daxpy(int n, REAL da, REAL dx[], int incx, REAL dy[], int incy)
+/*
+ constant times a vector plus a vector.
+ jack dongarra, linpack, 3/11/78.
+*/
+
+{
+ int i,ix,iy,m,mp1;
+
+ mp1 = 0;
+ m = 0;
+
+ if(n <= 0) return;
+ if (da == ZERO) return;
+
+ if(incx != 1 || incy != 1) {
+
+ /* code for unequal increments or equal increments
+ not equal to 1 */
+
+ ix = 0;
+ iy = 0;
+ if(incx < 0) ix = (-n+1)*incx;
+ if(incy < 0)iy = (-n+1)*incy;
+ for (i = 0;i < n; i++) {
+ dy[iy] = dy[iy] + da*dx[ix];
+ ix = ix + incx;
+ iy = iy + incy;
+
+ }
+ return;
+ }
+
+ /* code for both increments equal to 1 */
+
+
+#ifdef ROLL
+
+ for (i = 0;i < n; i++) {
+ dy[i] = dy[i] + da*dx[i];
+ }
+
+
+#endif
+
+#ifdef UNROLL
+
+ m = n % 4;
+ if ( m != 0) {
+ for (i = 0; i < m; i++)
+ dy[i] = dy[i] + da*dx[i];
+
+ if (n < 4) return;
+ }
+ for (i = m; i < n; i = i + 4) {
+ dy[i] = dy[i] + da*dx[i];
+ dy[i+1] = dy[i+1] + da*dx[i+1];
+ dy[i+2] = dy[i+2] + da*dx[i+2];
+ dy[i+3] = dy[i+3] + da*dx[i+3];
+
+ }
+
+#endif
+return;
+}
+
+/*----------------------*/
+
+REAL ddot(int n, REAL dx[], int incx, REAL dy[], int incy)
+/*
+ forms the dot product of two vectors.
+ jack dongarra, linpack, 3/11/78.
+*/
+
+{
+ REAL dtemp;
+ int i,ix,iy,m,mp1;
+
+ mp1 = 0;
+ m = 0;
+
+ dtemp = ZERO;
+
+ if(n <= 0) return(ZERO);
+
+ if(incx != 1 || incy != 1) {
+
+ /* code for unequal increments or equal increments
+ not equal to 1 */
+
+ ix = 0;
+ iy = 0;
+ if (incx < 0) ix = (-n+1)*incx;
+ if (incy < 0) iy = (-n+1)*incy;
+ for (i = 0;i < n; i++) {
+ dtemp = dtemp + dx[ix]*dy[iy];
+ ix = ix + incx;
+ iy = iy + incy;
+
+ }
+ return(dtemp);
+ }
+
+ /* code for both increments equal to 1 */
+
+
+#ifdef ROLL
+
+ for (i=0;i < n; i++)
+ dtemp = dtemp + dx[i]*dy[i];
+
+ return(dtemp);
+
+#endif
+
+#ifdef UNROLL
+
+
+ m = n % 5;
+ if (m != 0) {
+ for (i = 0; i < m; i++)
+ dtemp = dtemp + dx[i]*dy[i];
+ if (n < 5) return(dtemp);
+ }
+ for (i = m; i < n; i = i + 5) {
+ dtemp = dtemp + dx[i]*dy[i] +
+ dx[i+1]*dy[i+1] + dx[i+2]*dy[i+2] +
+ dx[i+3]*dy[i+3] + dx[i+4]*dy[i+4];
+ }
+ return(dtemp);
+
+#endif
+
+}
+
+/*----------------------*/
+void dscal(int n, REAL da, REAL dx[], int incx)
+
+/* scales a vector by a constant.
+ jack dongarra, linpack, 3/11/78.
+*/
+
+{
+ int i,m,mp1,nincx;
+
+ mp1 = 0;
+ m = 0;
+
+ if(n <= 0)return;
+ if(incx != 1) {
+
+ /* code for increment not equal to 1 */
+
+ nincx = n*incx;
+ for (i = 0; i < nincx; i = i + incx)
+ dx[i] = da*dx[i];
+
+ return;
+ }
+
+ /* code for increment equal to 1 */
+
+
+#ifdef ROLL
+
+ for (i = 0; i < n; i++)
+ dx[i] = da*dx[i];
+
+
+#endif
+
+#ifdef UNROLL
+
+
+ m = n % 5;
+ if (m != 0) {
+ for (i = 0; i < m; i++)
+ dx[i] = da*dx[i];
+ if (n < 5) return;
+ }
+ for (i = m; i < n; i = i + 5){
+ dx[i] = da*dx[i];
+ dx[i+1] = da*dx[i+1];
+ dx[i+2] = da*dx[i+2];
+ dx[i+3] = da*dx[i+3];
+ dx[i+4] = da*dx[i+4];
+ }
+
+#endif
+
+}
+
+/*----------------------*/
+int idamax(int n, REAL dx[], int incx)
+
+/*
+ finds the index of element having max. absolute value.
+ jack dongarra, linpack, 3/11/78.
+*/
+
+
+{
+ REAL dmax;
+ int i, ix, itemp;
+
+ if( n < 1 ) return(-1);
+ if(n ==1 ) return(0);
+ if(incx != 1) {
+
+ /* code for increment not equal to 1 */
+
+ ix = 1;
+ dmax = fabs((double)dx[0]);
+ ix = ix + incx;
+ for (i = 1; i < n; i++) {
+ if(fabs((double)dx[ix]) > dmax) {
+ itemp = i;
+ dmax = fabs((double)dx[ix]);
+ }
+ ix = ix + incx;
+ }
+ }
+ else {
+
+ /* code for increment equal to 1 */
+
+ itemp = 0;
+ dmax = fabs((double)dx[0]);
+ for (i = 1; i < n; i++) {
+ if(fabs((double)dx[i]) > dmax) {
+ itemp = i;
+ dmax = fabs((double)dx[i]);
+ }
+ }
+ }
+ return (itemp);
+}
+
+/*----------------------*/
+REAL epslon (REAL x)
+
+/*
+ estimate unit roundoff in quantities of size x.
+*/
+
+{
+ REAL a,b,c,eps;
+/*
+ this program should function properly on all systems
+ satisfying the following two assumptions,
+ 1. the base used in representing dfloating point
+ numbers is not a power of three.
+ 2. the quantity a in statement 10 is represented to
+ the accuracy used in dfloating point variables
+ that are stored in memory.
+ the statement number 10 and the go to 10 are intended to
+ force optimizing compilers to generate code satisfying
+ assumption 2.
+ under these assumptions, it should be true that,
+ a is not exactly equal to four-thirds,
+ b has a zero for its last bit or digit,
+ c is not exactly equal to one,
+ eps measures the separation of 1.0 from
+ the next larger dfloating point number.
+ the developers of eispack would appreciate being informed
+ about any systems where these assumptions do not hold.
+
+ *****************************************************************
+ this routine is one of the auxiliary routines used by eispack iii
+ to avoid machine dependencies.
+ *****************************************************************
+
+ this version dated 4/6/83.
+*/
+
+ a = 4.0e0/3.0e0;
+ eps = ZERO;
+ while (eps == ZERO) {
+ b = a - ONE;
+ c = b + b + b;
+ eps = fabs((double)(c-ONE));
+ }
+ return(eps*fabs((double)x));
+}
+
+/*----------------------*/
+void dmxpy (int n1, REAL y[], int n2, int ldm, REAL x[], REAL m[])
+
+
+/* We would like to declare m[][ldm], but c does not allow it. In this
+function, references to m[i][j] are written m[ldm*i+j]. */
+
+/*
+ purpose:
+ multiply matrix m times vector x and add the result to vector y.
+
+ parameters:
+
+ n1 integer, number of elements in vector y, and number of rows in
+ matrix m
+
+ y double [n1], vector of length n1 to which is added
+ the product m*x
+
+ n2 integer, number of elements in vector x, and number of columns
+ in matrix m
+
+ ldm integer, leading dimension of array m
+
+ x double [n2], vector of length n2
+
+ m double [ldm][n2], matrix of n1 rows and n2 columns
+
+ ----------------------------------------------------------------------
+*/
+{
+ int j,i,jmin;
+ /* cleanup odd vector */
+
+ j = n2 % 2;
+ if (j >= 1) {
+ j = j - 1;
+ for (i = 0; i < n1; i++)
+ y[i] = (y[i]) + x[j]*m[ldm*j+i];
+ }
+
+ /* cleanup odd group of two vectors */
+
+ j = n2 % 4;
+ if (j >= 2) {
+ j = j - 1;
+ for (i = 0; i < n1; i++)
+ y[i] = ( (y[i])
+ + x[j-1]*m[ldm*(j-1)+i]) + x[j]*m[ldm*j+i];
+ }
+
+ /* cleanup odd group of four vectors */
+
+ j = n2 % 8;
+ if (j >= 4) {
+ j = j - 1;
+ for (i = 0; i < n1; i++)
+ y[i] = ((( (y[i])
+ + x[j-3]*m[ldm*(j-3)+i])
+ + x[j-2]*m[ldm*(j-2)+i])
+ + x[j-1]*m[ldm*(j-1)+i]) + x[j]*m[ldm*j+i];
+ }
+
+ /* cleanup odd group of eight vectors */
+
+ j = n2 % 16;
+ if (j >= 8) {
+ j = j - 1;
+ for (i = 0; i < n1; i++)
+ y[i] = ((((((( (y[i])
+ + x[j-7]*m[ldm*(j-7)+i]) + x[j-6]*m[ldm*(j-6)+i])
+ + x[j-5]*m[ldm*(j-5)+i]) + x[j-4]*m[ldm*(j-4)+i])
+ + x[j-3]*m[ldm*(j-3)+i]) + x[j-2]*m[ldm*(j-2)+i])
+ + x[j-1]*m[ldm*(j-1)+i]) + x[j] *m[ldm*j+i];
+ }
+
+ /* main loop - groups of sixteen vectors */
+
+ jmin = (n2%16)+16;
+ for (j = jmin-1; j < n2; j = j + 16) {
+ for (i = 0; i < n1; i++)
+ y[i] = ((((((((((((((( (y[i])
+ + x[j-15]*m[ldm*(j-15)+i])
+ + x[j-14]*m[ldm*(j-14)+i])
+ + x[j-13]*m[ldm*(j-13)+i])
+ + x[j-12]*m[ldm*(j-12)+i])
+ + x[j-11]*m[ldm*(j-11)+i])
+ + x[j-10]*m[ldm*(j-10)+i])
+ + x[j- 9]*m[ldm*(j- 9)+i])
+ + x[j- 8]*m[ldm*(j- 8)+i])
+ + x[j- 7]*m[ldm*(j- 7)+i])
+ + x[j- 6]*m[ldm*(j- 6)+i])
+ + x[j- 5]*m[ldm*(j- 5)+i])
+ + x[j- 4]*m[ldm*(j- 4)+i])
+ + x[j- 3]*m[ldm*(j- 3)+i])
+ + x[j- 2]*m[ldm*(j- 2)+i])
+ + x[j- 1]*m[ldm*(j- 1)+i])
+ + x[j] *m[ldm*j+i];
+ }
+ return;
+}
+
+
+
diff --git a/tests/runner.py b/tests/runner.py
index f56fd977..6e259f45 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -1179,6 +1179,53 @@ m_divisor is 1091269979
'''
self.do_run(src, 'Succeeded!')
+ def test_i64_varargs(self):
+ if Settings.USE_TYPED_ARRAYS != 2: return self.skip('full i64 stuff only in ta2')
+
+ src = r'''
+ #include <stdio.h>
+ #include <stdint.h>
+ #include <stdarg.h>
+
+ int64_t ccv_cache_generate_signature(char *msg, int len, int64_t sig_start, ...) {
+ if (sig_start < 10123)
+ printf("%s\n", msg+len);
+ va_list v;
+ va_start(v, sig_start);
+ if (sig_start > 1413)
+ printf("%d\n", va_arg(v, int));
+ else
+ printf("nada\n");
+ va_end(v);
+ return len*sig_start*(msg[0]+1);
+ }
+
+ int main(int argc, char **argv)
+ {
+ for (int i = 0; i < argc; i++) {
+ int64_t x;
+ if (i % 123123 == 0)
+ x = ccv_cache_generate_signature(argv[i], i+2, (int64_t)argc*argc, 54.111);
+ else
+ x = ccv_cache_generate_signature(argv[i], i+2, (int64_t)argc*argc, 13);
+ printf("%lld\n", x);
+ }
+ };
+ '''
+ self.do_run(src, '''in/this.program
+nada
+1536
+a
+nada
+5760
+fl
+nada
+6592
+sdfasdfasdf
+nada
+7840
+''', 'waka fleefl asdfasdfasdfasdf'.split(' '))
+
def test_i32_mul_precise(self):
if self.emcc_args == None: return self.skip('needs ta2')
@@ -2405,28 +2452,34 @@ returned |umber one top notchfi FI FO FUM WHEN WHERE WHY HOW WHO|''', ['wowie',
static jmp_buf buf;
void second(void) {
- printf("second\n"); // prints
- longjmp(buf,1); // jumps back to where setjmp was called - making setjmp now return 1
+ printf("second\n");
+ longjmp(buf,-1);
}
void first(void) {
- second();
- printf("first\n"); // does not print
+ printf("first\n"); // prints
+ longjmp(buf,1); // jumps back to where setjmp was called - making setjmp now return 1
}
int main() {
volatile int x = 0;
- if ( ! setjmp(buf) ) {
+ int jmpval = setjmp(buf);
+ if (!jmpval) {
+ x++; // should be properly restored once longjmp jumps back
+ first(); // when executed, setjmp returns 1
+ printf("skipped\n"); // does not print
+ } else if (jmpval == 1) { // when first() jumps back, setjmp returns 1
+ printf("result: %d %d\n", x, jmpval); // prints
x++;
- first(); // when executed, setjmp returns 0
- } else { // when longjmp jumps back, setjmp returns 1
- printf("main: %d\n", x); // prints
+ second(); // when executed, setjmp returns -1
+ } else if (jmpval == -1) { // when second() jumps back, setjmp returns -1
+ printf("result: %d %d\n", x, jmpval); // prints
}
return 0;
}
'''
- self.do_run(src, 'second\nmain: 1\n')
+ self.do_run(src, 'first\nresult: 1 1\nsecond\nresult: 2 -1')
def test_longjmp2(self):
src = r'''
@@ -2976,6 +3029,28 @@ setjmp exception execution path, level: 0, prev_jmp: -1
Exiting setjmp function, level: 0, prev_jmp: -1
''')
+ def test_std_exception(self):
+ if self.emcc_args is None: return self.skip('requires emcc')
+ Settings.DISABLE_EXCEPTION_CATCHING = 0
+ self.emcc_args += ['-s', 'SAFE_HEAP=0']
+
+ src = r'''
+ #include <stdio.h>
+ #include <exception>
+
+ int main()
+ {
+ std::exception e;
+ try {
+ throw e;
+ } catch(std::exception e) {
+ printf("caught std::exception\n");
+ }
+ return 0;
+ }
+ '''
+ self.do_run(src, 'caught std::exception')
+
def test_exit_stack(self):
if self.emcc_args is None: return self.skip('requires emcc')
if Settings.ASM_JS: return self.skip('uses report_stack without exporting')
@@ -4018,7 +4093,7 @@ def process(filename):
int main( int argc, const char *argv[] ) {
unsigned int x = 0xfffffff1;
- x >>= 0; // force it to be unsigned for purpose of checking our switch comparison in signed/unsigned
+ x >>= (argc-1); // force it to be unsigned for purpose of checking our switch comparison in signed/unsigned
printf("*%d,%d,%d,%d,%d,%d*\\n", switcher('a'), switcher('b'), switcher('c'), switcher(x), switcher(-15), switcher('e'));
return 0;
}
@@ -4457,6 +4532,204 @@ The current type of b is: 9
self.do_run(src, '*1*', force_c=True)
+ def test_strtoll_hex(self):
+ # tests strtoll for hex strings (0x...)
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ int main() {
+ const char *STRING = "0x4 -0x3A +0xDEADBEEF";
+ char *end_char;
+
+ // undefined base
+ long long int l1 = strtoll(STRING, &end_char, 0);
+ long long int l2 = strtoll(end_char, &end_char, 0);
+ long long int l3 = strtoll(end_char, NULL, 0);
+
+ // defined base
+ long long int l4 = strtoll(STRING, &end_char, 16);
+ long long int l5 = strtoll(end_char, &end_char, 16);
+ long long int l6 = strtoll(end_char, NULL, 16);
+
+ printf("%d%d%d%d%d%d\n", l1==0x4, l2==-0x3a, l3==0xdeadbeef, l4==0x4, l5==-0x3a, l6==0xdeadbeef);
+ return 0;
+ }
+ '''
+ self.do_run(src, '111111')
+
+ def test_strtoll_dec(self):
+ # tests strtoll for decimal strings (0x...)
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ int main() {
+ const char *STRING = "4 -38 +4711";
+ char *end_char;
+
+ // undefined base
+ long long int l1 = strtoll(STRING, &end_char, 0);
+ long long int l2 = strtoll(end_char, &end_char, 0);
+ long long int l3 = strtoll(end_char, NULL, 0);
+
+ // defined base
+ long long int l4 = strtoll(STRING, &end_char, 10);
+ long long int l5 = strtoll(end_char, &end_char, 10);
+ long long int l6 = strtoll(end_char, NULL, 10);
+
+ printf("%d%d%d%d%d%d\n", l1==4, l2==-38, l3==4711, l4==4, l5==-38, l6==4711);
+ return 0;
+ }
+ '''
+ self.do_run(src, '111111')
+
+ def test_strtoll_bin(self):
+ # tests strtoll for binary strings (0x...)
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ int main() {
+ const char *STRING = "1 -101 +1011";
+ char *end_char;
+
+ // defined base
+ long long int l4 = strtoll(STRING, &end_char, 2);
+ long long int l5 = strtoll(end_char, &end_char, 2);
+ long long int l6 = strtoll(end_char, NULL, 2);
+
+ printf("%d%d%d\n", l4==1, l5==-5, l6==11);
+ return 0;
+ }
+ '''
+ self.do_run(src, '111')
+
+ def test_strtoll_oct(self):
+ # tests strtoll for decimal strings (0x...)
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ int main() {
+ const char *STRING = "0 -035 +04711";
+ char *end_char;
+
+ // undefined base
+ long long int l1 = strtoll(STRING, &end_char, 0);
+ long long int l2 = strtoll(end_char, &end_char, 0);
+ long long int l3 = strtoll(end_char, NULL, 0);
+
+ // defined base
+ long long int l4 = strtoll(STRING, &end_char, 8);
+ long long int l5 = strtoll(end_char, &end_char, 8);
+ long long int l6 = strtoll(end_char, NULL, 8);
+
+ printf("%d%d%d%d%d%d\n", l1==0, l2==-29, l3==2505, l4==0, l5==-29, l6==2505);
+ return 0;
+ }
+ '''
+ self.do_run(src, '111111')
+
+ def test_strtol_hex(self):
+ # tests strtoll for hex strings (0x...)
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ int main() {
+ const char *STRING = "0x4 -0x3A +0xDEAD";
+ char *end_char;
+
+ // undefined base
+ long l1 = strtol(STRING, &end_char, 0);
+ long l2 = strtol(end_char, &end_char, 0);
+ long l3 = strtol(end_char, NULL, 0);
+
+ // defined base
+ long l4 = strtol(STRING, &end_char, 16);
+ long l5 = strtol(end_char, &end_char, 16);
+ long l6 = strtol(end_char, NULL, 16);
+
+ printf("%d%d%d%d%d%d\n", l1==0x4, l2==-0x3a, l3==0xdead, l4==0x4, l5==-0x3a, l6==0xdead);
+ return 0;
+ }
+ '''
+ self.do_run(src, '111111')
+
+ def test_strtol_dec(self):
+ # tests strtoll for decimal strings (0x...)
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ int main() {
+ const char *STRING = "4 -38 +4711";
+ char *end_char;
+
+ // undefined base
+ long l1 = strtol(STRING, &end_char, 0);
+ long l2 = strtol(end_char, &end_char, 0);
+ long l3 = strtol(end_char, NULL, 0);
+
+ // defined base
+ long l4 = strtol(STRING, &end_char, 10);
+ long l5 = strtol(end_char, &end_char, 10);
+ long l6 = strtol(end_char, NULL, 10);
+
+ printf("%d%d%d%d%d%d\n", l1==4, l2==-38, l3==4711, l4==4, l5==-38, l6==4711);
+ return 0;
+ }
+ '''
+ self.do_run(src, '111111')
+
+ def test_strtol_bin(self):
+ # tests strtoll for binary strings (0x...)
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ int main() {
+ const char *STRING = "1 -101 +1011";
+ char *end_char;
+
+ // defined base
+ long l4 = strtol(STRING, &end_char, 2);
+ long l5 = strtol(end_char, &end_char, 2);
+ long l6 = strtol(end_char, NULL, 2);
+
+ printf("%d%d%d\n", l4==1, l5==-5, l6==11);
+ return 0;
+ }
+ '''
+ self.do_run(src, '111')
+
+ def test_strtol_oct(self):
+ # tests strtoll for decimal strings (0x...)
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ int main() {
+ const char *STRING = "0 -035 +04711";
+ char *end_char;
+
+ // undefined base
+ long l1 = strtol(STRING, &end_char, 0);
+ long l2 = strtol(end_char, &end_char, 0);
+ long l3 = strtol(end_char, NULL, 0);
+
+ // defined base
+ long l4 = strtol(STRING, &end_char, 8);
+ long l5 = strtol(end_char, &end_char, 8);
+ long l6 = strtol(end_char, NULL, 8);
+
+ printf("%d%d%d%d%d%d\n", l1==0, l2==-29, l3==2505, l4==0, l5==-29, l6==2505);
+ return 0;
+ }
+ '''
+ self.do_run(src, '111111')
+
def test_atexit(self):
# Confirms they are called in reverse order
src = r'''
@@ -6316,6 +6589,31 @@ def process(filename):
self.emcc_args += ['--embed-file', 'eol.txt']
self.do_run(src, 'SUCCESS\n')
+ def test_fscanf(self):
+ if self.emcc_args is None: return self.skip('requires emcc')
+ open(os.path.join(self.get_dir(), 'three_numbers.txt'), 'w').write('''-1 0.1 -.1''')
+ src = r'''
+ #include <stdio.h>
+ #include <assert.h>
+ #include <float.h>
+ int main()
+ {
+ float x = FLT_MAX, y = FLT_MAX, z = FLT_MAX;
+
+ FILE* fp = fopen("three_numbers.txt", "r");
+ if (fp) {
+ int match = fscanf(fp, " %f %f %f ", &x, &y, &z);
+ printf("match = %d\n", match);
+ printf("x = %0.1f, y = %0.1f, z = %0.1f\n", x, y, z);
+ } else {
+ printf("failed to open three_numbers.txt\n");
+ }
+ return 0;
+ }
+ '''
+ self.emcc_args += ['--embed-file', 'three_numbers.txt']
+ self.do_run(src, 'match = 3\nx = -1.0, y = 0.1, z = -0.1\n')
+
def test_folders(self):
add_pre_run = '''
def process(filename):
@@ -7682,7 +7980,9 @@ void*:16
for (int i = 0; i < 10; i++) {
int* map = (int*)mmap(0, 5000, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANON, -1, 0);
+ /* TODO: Should we align to 4k?
assert(((int)map) % 4096 == 0); // aligned
+ */
assert(munmap(map, 5000) == 0);
}
@@ -7894,7 +8194,7 @@ def process(filename):
if Settings.ASM_JS:
self.banned_js_engines = [NODE_JS] # TODO investigate
- if self.emcc_args is not None and '-O2' in self.emcc_args:
+ if self.emcc_args is not None and '-O2' in self.emcc_args and 'ASM_JS=0' not in self.emcc_args: # without asm, closure minifies Math.imul badly
self.emcc_args += ['--closure', '1'] # Use closure here for some additional coverage
Settings.CORRECT_SIGNS = 1
@@ -8525,9 +8825,43 @@ def process(filename):
open('dead_funcs', 'w').write(pgo_output[pgo_output.find('['):-1])
self.emcc_args += ['-s', 'DEAD_FUNCTIONS=@' + self.in_dir('dead_funcs')]
self.do_run(src, output)
+ self.emcc_args.pop()
+ self.emcc_args.pop()
+ shutil.move(self.in_dir('src.cpp.o.js'), self.in_dir('pgoed2.js'))
+ assert open('pgoed.js').read() == open('pgoed2.js').read()
+
+ # with relative response in settings element itself
+
+ open('dead_funcs', 'w').write(pgo_output[pgo_output.find('['):-1])
+ self.emcc_args += ['-s', 'DEAD_FUNCTIONS=@dead_funcs']
+ self.do_run(src, output)
+ self.emcc_args.pop()
+ self.emcc_args.pop()
shutil.move(self.in_dir('src.cpp.o.js'), self.in_dir('pgoed2.js'))
assert open('pgoed.js').read() == open('pgoed2.js').read()
+ def test_exported_response(self):
+ if self.emcc_args is None: return self.skip('requires emcc')
+
+ src = r'''
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ extern "C" {
+ int other_function() { return 5; }
+ }
+
+ int main() {
+ printf("waka!\n");
+ return 0;
+ }
+ '''
+ open('exps', 'w').write('["_main","_other_function"]')
+
+ self.emcc_args += ['-s', 'EXPORTED_FUNCTIONS=@exps']
+ self.do_run(src, '''waka!''')
+ assert 'other_function' in open('src.cpp.o.js').read()
+
def test_add_function(self):
if self.emcc_args is None: return self.skip('requires emcc')
@@ -8567,6 +8901,28 @@ def process(filename):
Settings.ALIASING_FUNCTION_POINTERS = 1 - Settings.ALIASING_FUNCTION_POINTERS # flip the test
self.do_run(src, '''Hello 7 from JS!''')
+ def test_embind(self):
+ if self.emcc_args is None: return self.skip('requires emcc')
+ Building.COMPILER_TEST_OPTS += ['--bind']
+
+ src = r'''
+ #include<stdio.h>
+ #include<emscripten/val.h>
+
+ using namespace emscripten;
+
+ int main() {
+ val Math = val::global("Math");
+
+ // two ways to call Math.abs
+ printf("abs(-10): %d\n", Math.call<int>("abs", -10));
+ printf("abs(-11): %d\n", Math["abs"](-11).as<int>());
+
+ return 0;
+ }
+ '''
+ self.do_run(src, 'abs(-10): 10\nabs(-11): 11');
+
def test_scriptaclass(self):
if self.emcc_args is None: return self.skip('requires emcc')
@@ -8617,7 +8973,7 @@ def process(filename):
'''
# XXX disable due to possible v8 bug -- self.do_run(src, '*166*\n*ok*', post_build=post)
- if self.emcc_args is not None and '-O2' in self.emcc_args:
+ if self.emcc_args is not None and '-O2' in self.emcc_args and 'ASM_JS=0' not in self.emcc_args: # without asm, closure minifies Math.imul badly
self.emcc_args += ['--closure', '1'] # Use closure here, to test we export things right
# Way 2: use CppHeaderParser
@@ -9950,6 +10306,23 @@ f.close()
self.assertContained('hello from lib', run_js(os.path.join(self.get_dir(), 'a.out.js')))
assert not os.path.exists('a.out') and not os.path.exists('a.exe'), 'Must not leave unneeded linker stubs'
+ def test_symlink(self):
+ open(os.path.join(self.get_dir(), 'foobar.xxx'), 'w').write('int main(){ return 0; }')
+ os.symlink(os.path.join(self.get_dir(), 'foobar.xxx'), os.path.join(self.get_dir(), 'foobar.c'))
+ Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'foobar.c'), '-o', os.path.join(self.get_dir(), 'foobar')], stdout=PIPE, stderr=PIPE).communicate()
+ assert os.path.exists(os.path.join(self.get_dir(), 'foobar'))
+ try_delete(os.path.join(self.get_dir(), 'foobar'))
+ try_delete(os.path.join(self.get_dir(), 'foobar.xxx'))
+ try_delete(os.path.join(self.get_dir(), 'foobar.c'))
+
+ open(os.path.join(self.get_dir(), 'foobar.c'), 'w').write('int main(){ return 0; }')
+ os.symlink(os.path.join(self.get_dir(), 'foobar.c'), os.path.join(self.get_dir(), 'foobar.xxx'))
+ Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'foobar.xxx'), '-o', os.path.join(self.get_dir(), 'foobar')], stdout=PIPE, stderr=PIPE).communicate()
+ assert os.path.exists(os.path.join(self.get_dir(), 'foobar'))
+ try_delete(os.path.join(self.get_dir(), 'foobar'))
+ try_delete(os.path.join(self.get_dir(), 'foobar.xxx'))
+ try_delete(os.path.join(self.get_dir(), 'foobar.c'))
+
def test_multiply_defined_libsymbols(self):
lib = "int mult() { return 1; }"
lib_name = os.path.join(self.get_dir(), 'libA.c')
@@ -11341,7 +11714,9 @@ elif 'browser' in str(sys.argv):
self.run_browser('page.html', '', '/report_result?1')
def test_preload_file(self):
- open(os.path.join(self.get_dir(), 'somefile.txt'), 'w').write('''load me right before running the code please''')
+ absolute_src_path = os.path.join(self.get_dir(), 'somefile.txt').replace('\\', '/')
+ open(absolute_src_path, 'w').write('''load me right before running the code please''')
+
def make_main(path):
print path
open(os.path.join(self.get_dir(), 'main.cpp'), 'w').write(self.with_report_result(r'''
@@ -11360,26 +11735,92 @@ elif 'browser' in str(sys.argv):
REPORT_RESULT();
return 0;
}
- ''' % path))
-
- make_main('somefile.txt')
- Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'main.cpp'), '--preload-file', 'somefile.txt', '-o', 'page.html']).communicate()
- self.run_browser('page.html', 'You should see |load me right before|.', '/report_result?1')
+ ''' % path))
+
+ test_cases = [
+ # (source preload-file string, file on target FS to load)
+ ("somefile.txt", "somefile.txt"),
+ ("./somefile.txt", "somefile.txt"),
+ ("somefile.txt@file.txt", "file.txt"),
+ ("./somefile.txt@file.txt", "file.txt"),
+ ("./somefile.txt@./file.txt", "file.txt"),
+ ("somefile.txt@/file.txt", "file.txt"),
+ ("somefile.txt@/", "somefile.txt"),
+ (absolute_src_path + "@file.txt", "file.txt"),
+ (absolute_src_path + "@/file.txt", "file.txt"),
+ (absolute_src_path + "@/", "somefile.txt"),
+ ("somefile.txt@/directory/file.txt", "/directory/file.txt"),
+ ("somefile.txt@/directory/file.txt", "directory/file.txt"),
+ (absolute_src_path + "@/directory/file.txt", "directory/file.txt")]
+
+ for test in test_cases:
+ (srcpath, dstpath) = test
+ make_main(dstpath)
+ print srcpath
+ Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'main.cpp'), '--preload-file', srcpath, '-o', 'page.html']).communicate()
+ self.run_browser('page.html', 'You should see |load me right before|.', '/report_result?1')
# By absolute path
- make_main(os.path.join(self.get_dir(), 'somefile.txt'))
- Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'main.cpp'), '--preload-file', os.path.join(self.get_dir(), 'somefile.txt'), '-o', 'page.html']).communicate()
+ make_main(absolute_src_path)
+ Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'main.cpp'), '--preload-file', absolute_src_path, '-o', 'page.html']).communicate()
self.run_browser('page.html', 'You should see |load me right before|.', '/report_result?1')
+ # Test subdirectory handling with asset packaging.
+ os.makedirs(os.path.join(self.get_dir(), 'assets/sub/asset1/').replace('\\', '/'))
+ os.makedirs(os.path.join(self.get_dir(), 'assets/sub/asset2/').replace('\\', '/'))
+ open(os.path.join(self.get_dir(), 'assets/sub/asset1/file1.txt'), 'w').write('''load me right before running the code please''')
+ open(os.path.join(self.get_dir(), 'assets/sub/asset2/file2.txt'), 'w').write('''load me right before running the code please''')
+ absolute_assets_src_path = os.path.join(self.get_dir(), 'assets').replace('\\', '/')
+ def make_main_two_files(path1, path2):
+ open(os.path.join(self.get_dir(), 'main.cpp'), 'w').write(self.with_report_result(r'''
+ #include <stdio.h>
+ #include <string.h>
+ #include <emscripten.h>
+ int main() {
+ FILE *f = fopen("%s", "r");
+ char buf[100];
+ fread(buf, 1, 20, f);
+ buf[20] = 0;
+ fclose(f);
+ printf("|%%s|\n", buf);
+
+ int result = !strcmp("load me right before", buf);
+
+ f = fopen("%s", "r");
+ if (f == NULL)
+ result = 0;
+ fclose(f);
+ REPORT_RESULT();
+ return 0;
+ }
+ ''' % (path1, path2)))
+
+ test_cases = [
+ # (source directory to embed, file1 on target FS to load, file2 on target FS to load)
+ ("assets", "assets/sub/asset1/file1.txt", "assets/sub/asset2/file2.txt"),
+ ("assets/", "assets/sub/asset1/file1.txt", "assets/sub/asset2/file2.txt"),
+ ("assets@/", "/sub/asset1/file1.txt", "/sub/asset2/file2.txt"),
+ ("assets/@/", "/sub/asset1/file1.txt", "/sub/asset2/file2.txt"),
+ ("assets@./", "/sub/asset1/file1.txt", "/sub/asset2/file2.txt"),
+ (absolute_assets_src_path + "@/", "/sub/asset1/file1.txt", "/sub/asset2/file2.txt"),
+ (absolute_assets_src_path + "@/assets", "/assets/sub/asset1/file1.txt", "/assets/sub/asset2/file2.txt")]
+
+ for test in test_cases:
+ (srcpath, dstpath1, dstpath2) = test
+ make_main_two_files(dstpath1, dstpath2)
+ print srcpath
+ Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'main.cpp'), '--preload-file', srcpath, '-o', 'page.html']).communicate()
+ self.run_browser('page.html', 'You should see |load me right before|.', '/report_result?1')
+
# Should still work with -o subdir/..
- make_main(os.path.join(self.get_dir(), 'somefile.txt'))
+ make_main(absolute_src_path)
try:
os.mkdir(os.path.join(self.get_dir(), 'dirrey'))
except:
pass
- Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'main.cpp'), '--preload-file', os.path.join(self.get_dir(), 'somefile.txt'), '-o', 'dirrey/page.html']).communicate()
+ Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'main.cpp'), '--preload-file', absolute_src_path, '-o', 'dirrey/page.html']).communicate()
self.run_browser('dirrey/page.html', 'You should see |load me right before|.', '/report_result?1')
# With FS.preloadFile
@@ -12958,6 +13399,11 @@ elif 'benchmark' in str(sys.argv):
src = open(path_from_root('tests', 'life.c'), 'r').read()
self.do_benchmark('life', src, '''--------------------------------''', shared_args=['-std=c99'], force_c=True)
+ def test_linpack(self):
+ def output_parser(output):
+ return 100.0/float(re.search('Unrolled Double Precision +([\d\.]+) Mflops', output).group(1))
+ self.do_benchmark('linpack', open(path_from_root('tests', 'linpack.c')).read(), '''Unrolled Double Precision''', force_c=True, output_parser=output_parser)
+
def test_zzz_java_nbody(self): # tests xmlvm compiled java, including bitcasts of doubles, i64 math, etc.
args = [path_from_root('tests', 'nbody-java', x) for x in os.listdir(path_from_root('tests', 'nbody-java')) if x.endswith('.c')] + \
['-I' + path_from_root('tests', 'nbody-java')]
@@ -12981,7 +13427,7 @@ elif 'benchmark' in str(sys.argv):
def test_zzz_lua_scimark(self):
def output_parser(output):
- return 1.0/float(re.search('\nSciMark +([\d\.]+) ', output).group(1))
+ return 100.0/float(re.search('\nSciMark +([\d\.]+) ', output).group(1))
self.lua('scimark', '[small problem sizes]', output_parser=output_parser)
diff --git a/tests/sdl_audio.c b/tests/sdl_audio.c
index ce3bf5a9..ae1b89e9 100644
--- a/tests/sdl_audio.c
+++ b/tests/sdl_audio.c
@@ -9,7 +9,7 @@ Mix_Chunk *sound, *sound2;
int play2();
int play() {
- int channel = Mix_PlayChannel(-1, sound, 1);
+ int channel = Mix_PlayChannel(-1, sound, 0);
assert(channel == 0);
emscripten_run_script("setTimeout(Module['_play2'], 500)");
@@ -26,7 +26,7 @@ void done(int channel) {
int play2() {
Mix_ChannelFinished(done);
- int channel2 = Mix_PlayChannel(-1, sound2, 1);
+ int channel2 = Mix_PlayChannel(-1, sound2, 0);
assert(channel2 == 1);
return channel2;
}
diff --git a/tests/time/src.c b/tests/time/src.c
index d33885fe..61faedfe 100644
--- a/tests/time/src.c
+++ b/tests/time/src.c
@@ -2,6 +2,8 @@
#include <stdlib.h>
#include <time.h>
#include <string.h>
+#include <assert.h>
+#include <math.h>
int main() {
time_t xmas2002 = 1040786563ll;
@@ -64,6 +66,9 @@ int main() {
// Verify time() returns reasonable value (between 2011 and 2030).
time_t t4 = 0;
time(&t4);
+ timespec ts;
+ assert(clock_gettime(0, &ts) == 0);
+ assert(abs(ts.tv_sec - t4) <= 2);
printf("time: %d\n", t4 > 1309635200ll && t4 < 1893362400ll);
// Verify difftime() calculates accurate time difference.
diff --git a/tests/websockets.c b/tests/websockets.c
index 8e719baa..8882f5ba 100644
--- a/tests/websockets.c
+++ b/tests/websockets.c
@@ -56,7 +56,7 @@ unsigned int get_all_buf(int sock, char* output, unsigned int maxsize)
}
if(n < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
- fprintf(stderr, "error in get_all_buf!");
+ fprintf(stderr, "error in get_all_buf! %d", errno);
exit(EXIT_FAILURE);
}
return offset;
diff --git a/tools/cache.py b/tools/cache.py
index 13a53fe9..c316a1fd 100644
--- a/tools/cache.py
+++ b/tools/cache.py
@@ -49,7 +49,10 @@ class JCache:
def ensure(self):
self.cache.ensure()
if not os.path.exists(self.dirname):
- os.makedirs(self.dirname)
+ try:
+ os.makedirs(self.dirname)
+ except (IOError, OSError):
+ pass
def get_shortkey(self, keys):
if type(keys) not in [list, tuple]:
diff --git a/tools/eliminator/asm-eliminator-test-output.js b/tools/eliminator/asm-eliminator-test-output.js
index 8da7a5bc..41a2c2b6 100644
--- a/tools/eliminator/asm-eliminator-test-output.js
+++ b/tools/eliminator/asm-eliminator-test-output.js
@@ -107,10 +107,9 @@ function label() {
}
}
function switchy() {
- var no = 0, yes = 0, a = 0, b = 0;
+ var yes = 0;
while (1) switch (label | 0) {
case 1:
- no = 100;
break;
case 2:
yes = 111;
@@ -120,8 +119,6 @@ function switchy() {
print(yes / 2);
continue;
case 3:
- a = 5;
- b = a;
break;
}
}
@@ -364,4 +361,4604 @@ function __ZN23b2EdgeAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(
STACKTOP = __stackBase__;
return;
}
+function _java_nio_charset_Charset_forNameInternal___java_lang_String($n1) {
+ $n1 = $n1 | 0;
+ var $_r0_sroa_0 = 0, $_r0_sroa_1 = 0, $_r1_sroa_0 = 0, $_r2_sroa_0 = 0, $_r3_sroa_0 = 0, $_r3_sroa_1 = 0, $_r5_sroa_0 = 0, $local_env_w4567aaac23b1b6 = 0, $local_env_w4567aaac23b1c16 = 0, $local_env_w4567aaac23b1c22 = 0, $local_env_w4567aaac23b1c24 = 0, $local_env_w4567aaac23b1c26 = 0, $local_env_w4567aaac23b1c29 = 0, $local_env_w4567aaac23b1c31 = 0, $local_env_w4567aaac23b1c35 = 0, $local_env_w4567aaac23b1c40 = 0, $local_env_w4567aaac23b1c42 = 0, $local_env_w4567aaac23b1c44 = 0, $local_env_w4567aaac23b1c48 = 0, $local_env_w4567aaac23b1c50 = 0, $5 = 0, $16 = 0, $18 = 0, $19 = 0, $21 = 0, $25 = 0, $40 = 0, $52 = 0, $57 = 0, $61 = 0, $tib1_0_ph_i543 = 0, $72 = 0, $tib1_0_lcssa_i546 = 0, $dimension_tib1_0_lcssa_i547 = 0, $77 = 0, $79 = 0, $dimension_tib1_029_i549 = 0, $82 = 0, $83 = 0, $86 = 0, $88 = 0, $dimension_tib2_024_i551 = 0, $91 = 0, $92 = 0, $95 = 0, $tib2_0_lcssa_in_i553 = 0, $dimension_tib2_0_lcssa_i554 = 0, $tib2_0_lcssa_i555 = 0, $tib1_121_i558 = 0, $i_0_i561 = 0, $113 = 0, $_r1_sroa_0_0_load600 = 0, $119 = 0, $122 = 0, $139 = 0, $145 = 0, $149 = 0, $151 = 0, $153 = 0, $155 = 0, $159 = 0, $170 = 0, $175 = 0, $179 = 0, $tib1_0_ph_i521 = 0, $190 = 0, $tib1_0_lcssa_i524 = 0, $dimension_tib1_0_lcssa_i525 = 0, $195 = 0, $197 = 0, $dimension_tib1_029_i527 = 0, $200 = 0, $201 = 0, $204 = 0, $206 = 0, $dimension_tib2_024_i529 = 0, $209 = 0, $210 = 0, $213 = 0, $tib2_0_lcssa_in_i531 = 0, $dimension_tib2_0_lcssa_i532 = 0, $tib2_0_lcssa_i533 = 0, $tib1_121_i536 = 0, $i_0_i539 = 0, $231 = 0, $238 = 0, $240 = 0, $_r1_sroa_0_0_load = 0, $246 = 0, $249 = 0, $266 = 0, $273 = 0, $275 = 0, $284 = 0, $286 = 0, $290 = 0, $305 = 0, $310 = 0, $323 = 0, $328 = 0, $332 = 0, $tib1_0_ph_i500 = 0, $343 = 0, $tib1_0_lcssa_i503 = 0, $dimension_tib1_0_lcssa_i504 = 0, $348 = 0, $350 = 0, $dimension_tib1_029_i506 = 0, $353 = 0, $354 = 0, $357 = 0, $359 = 0, $dimension_tib2_024_i508 = 0, $362 = 0, $363 = 0, $366 = 0, $tib2_0_lcssa_in_i510 = 0, $dimension_tib2_0_lcssa_i511 = 0, $tib2_0_lcssa_i512 = 0, $tib1_121_i515 = 0, $i_0_i518 = 0, $384 = 0, $392 = 0, $394 = 0, $395 = 0, $397 = 0, $401 = 0, $416 = 0, $424 = 0, $426 = 0, $427 = 0, $429 = 0, $433 = 0, $446 = 0, $451 = 0, $455 = 0, $tib1_0_ph_i479 = 0, $466 = 0, $tib1_0_lcssa_i482 = 0, $dimension_tib1_0_lcssa_i483 = 0, $471 = 0, $473 = 0, $dimension_tib1_029_i485 = 0, $476 = 0, $477 = 0, $480 = 0, $482 = 0, $dimension_tib2_024_i487 = 0, $485 = 0, $486 = 0, $489 = 0, $tib2_0_lcssa_in_i489 = 0, $dimension_tib2_0_lcssa_i490 = 0, $tib2_0_lcssa_i491 = 0, $tib1_121_i494 = 0, $i_0_i497 = 0, $507 = 0, $519 = 0, $521 = 0, $525 = 0, $534 = 0, $539 = 0, $542 = 0, $546 = 0, $548 = 0, $557 = 0, $562 = 0, $566 = 0, $tib1_0_ph_i458 = 0, $577 = 0, $tib1_0_lcssa_i461 = 0, $dimension_tib1_0_lcssa_i462 = 0, $582 = 0, $584 = 0, $dimension_tib1_029_i464 = 0, $587 = 0, $588 = 0, $591 = 0, $593 = 0, $dimension_tib2_024_i466 = 0, $596 = 0, $597 = 0, $600 = 0, $tib2_0_lcssa_in_i468 = 0, $dimension_tib2_0_lcssa_i469 = 0, $tib2_0_lcssa_i470 = 0, $tib1_121_i473 = 0, $i_0_i476 = 0, $618 = 0, $623 = 0, $625 = 0, $629 = 0, $632 = 0, $643 = 0, $644 = 0, $649 = 0, $653 = 0, $tib1_0_ph_i437 = 0, $664 = 0, $tib1_0_lcssa_i440 = 0, $dimension_tib1_0_lcssa_i441 = 0, $669 = 0, $671 = 0, $dimension_tib1_029_i443 = 0, $674 = 0, $675 = 0, $678 = 0, $680 = 0, $dimension_tib2_024_i445 = 0, $683 = 0, $684 = 0, $687 = 0, $tib2_0_lcssa_in_i447 = 0, $dimension_tib2_0_lcssa_i448 = 0, $tib2_0_lcssa_i449 = 0, $tib1_121_i452 = 0, $i_0_i455 = 0, $705 = 0, $711 = 0, $716 = 0, $720 = 0, $tib1_0_ph_i416 = 0, $731 = 0, $tib1_0_lcssa_i419 = 0, $dimension_tib1_0_lcssa_i420 = 0, $736 = 0, $738 = 0, $dimension_tib1_029_i422 = 0, $741 = 0, $742 = 0, $745 = 0, $747 = 0, $dimension_tib2_024_i424 = 0, $750 = 0, $751 = 0, $754 = 0, $tib2_0_lcssa_in_i426 = 0, $dimension_tib2_0_lcssa_i427 = 0, $tib2_0_lcssa_i428 = 0, $tib1_121_i431 = 0, $i_0_i434 = 0, $772 = 0, $780 = 0, $782 = 0, $783 = 0, $785 = 0, $789 = 0, $798 = 0, $808 = 0, $809 = 0, $814 = 0, $818 = 0, $tib1_0_ph_i395 = 0, $829 = 0, $tib1_0_lcssa_i398 = 0, $dimension_tib1_0_lcssa_i399 = 0, $834 = 0, $836 = 0, $dimension_tib1_029_i401 = 0, $839 = 0, $840 = 0, $843 = 0, $845 = 0, $dimension_tib2_024_i403 = 0, $848 = 0, $849 = 0, $852 = 0, $tib2_0_lcssa_in_i405 = 0, $dimension_tib2_0_lcssa_i406 = 0, $tib2_0_lcssa_i407 = 0, $tib1_121_i410 = 0, $i_0_i413 = 0, $870 = 0, $876 = 0, $881 = 0, $885 = 0, $tib1_0_ph_i374 = 0, $896 = 0, $tib1_0_lcssa_i377 = 0, $dimension_tib1_0_lcssa_i378 = 0, $901 = 0, $903 = 0, $dimension_tib1_029_i380 = 0, $906 = 0, $907 = 0, $910 = 0, $912 = 0, $dimension_tib2_024_i382 = 0, $915 = 0, $916 = 0, $919 = 0, $tib2_0_lcssa_in_i384 = 0, $dimension_tib2_0_lcssa_i385 = 0, $tib2_0_lcssa_i386 = 0, $tib1_121_i389 = 0, $i_0_i392 = 0, $937 = 0, $945 = 0, $947 = 0, $948 = 0, $950 = 0, $954 = 0, $_r0_sroa_0_0_load607 = 0, $969 = 0, $974 = 0, $978 = 0, $tib1_0_ph_i353 = 0, $989 = 0, $tib1_0_lcssa_i356 = 0, $dimension_tib1_0_lcssa_i357 = 0, $994 = 0, $996 = 0, $dimension_tib1_029_i359 = 0, $999 = 0, $1000 = 0, $1003 = 0, $1005 = 0, $dimension_tib2_024_i361 = 0, $1008 = 0, $1009 = 0, $1012 = 0, $tib2_0_lcssa_in_i363 = 0, $dimension_tib2_0_lcssa_i364 = 0, $tib2_0_lcssa_i365 = 0, $tib1_121_i368 = 0, $i_0_i371 = 0, $1030 = 0, $1036 = 0, $1038 = 0, $1042 = 0, $1050 = 0, $1056 = 0, $1064 = 0, $1066 = 0, $1067 = 0, $1069 = 0, $1073 = 0, $1083 = 0, $1084 = 0, $1089 = 0, $1093 = 0, $tib1_0_ph_i332 = 0, $1104 = 0, $tib1_0_lcssa_i335 = 0, $dimension_tib1_0_lcssa_i336 = 0, $1109 = 0, $1111 = 0, $dimension_tib1_029_i338 = 0, $1114 = 0, $1115 = 0, $1118 = 0, $1120 = 0, $dimension_tib2_024_i340 = 0, $1123 = 0, $1124 = 0, $1127 = 0, $tib2_0_lcssa_in_i342 = 0, $dimension_tib2_0_lcssa_i343 = 0, $tib2_0_lcssa_i344 = 0, $tib1_121_i347 = 0, $i_0_i350 = 0, $1145 = 0, $1151 = 0, $1156 = 0, $1160 = 0, $tib1_0_ph_i311 = 0, $1171 = 0, $tib1_0_lcssa_i314 = 0, $dimension_tib1_0_lcssa_i315 = 0, $1176 = 0, $1178 = 0, $dimension_tib1_029_i317 = 0, $1181 = 0, $1182 = 0, $1185 = 0, $1187 = 0, $dimension_tib2_024_i319 = 0, $1190 = 0, $1191 = 0, $1194 = 0, $tib2_0_lcssa_in_i321 = 0, $dimension_tib2_0_lcssa_i322 = 0, $tib2_0_lcssa_i323 = 0, $tib1_121_i326 = 0, $i_0_i329 = 0, $1212 = 0, $1222 = 0, $1232 = 0, $1233 = 0, $1238 = 0, $1242 = 0, $tib1_0_ph_i290 = 0, $1253 = 0, $tib1_0_lcssa_i293 = 0, $dimension_tib1_0_lcssa_i294 = 0, $1258 = 0, $1260 = 0, $dimension_tib1_029_i296 = 0, $1263 = 0, $1264 = 0, $1267 = 0, $1269 = 0, $dimension_tib2_024_i298 = 0, $1272 = 0, $1273 = 0, $1276 = 0, $tib2_0_lcssa_in_i300 = 0, $dimension_tib2_0_lcssa_i301 = 0, $tib2_0_lcssa_i302 = 0, $tib1_121_i305 = 0, $i_0_i308 = 0, $1294 = 0, $1300 = 0, $1305 = 0, $1309 = 0, $tib1_0_ph_i269 = 0, $1320 = 0, $tib1_0_lcssa_i272 = 0, $dimension_tib1_0_lcssa_i273 = 0, $1325 = 0, $1327 = 0, $dimension_tib1_029_i275 = 0, $1330 = 0, $1331 = 0, $1334 = 0, $1336 = 0, $dimension_tib2_024_i277 = 0, $1339 = 0, $1340 = 0, $1343 = 0, $tib2_0_lcssa_in_i279 = 0, $dimension_tib2_0_lcssa_i280 = 0, $tib2_0_lcssa_i281 = 0, $tib1_121_i284 = 0, $i_0_i287 = 0, $1361 = 0, $1369 = 0, $1371 = 0, $1372 = 0, $1374 = 0, $1378 = 0, $_r0_sroa_0_0_load604 = 0, $1391 = 0, $1400 = 0, $1401 = 0, $1406 = 0, $1410 = 0, $tib1_0_ph_i248 = 0, $1421 = 0, $tib1_0_lcssa_i251 = 0, $dimension_tib1_0_lcssa_i252 = 0, $1426 = 0, $1428 = 0, $dimension_tib1_029_i254 = 0, $1431 = 0, $1432 = 0, $1435 = 0, $1437 = 0, $dimension_tib2_024_i256 = 0, $1440 = 0, $1441 = 0, $1444 = 0, $tib2_0_lcssa_in_i258 = 0, $dimension_tib2_0_lcssa_i259 = 0, $tib2_0_lcssa_i260 = 0, $tib1_121_i263 = 0, $i_0_i266 = 0, $1462 = 0, $1468 = 0, $1473 = 0, $1477 = 0, $tib1_0_ph_i227 = 0, $1488 = 0, $tib1_0_lcssa_i230 = 0, $dimension_tib1_0_lcssa_i231 = 0, $1493 = 0, $1495 = 0, $dimension_tib1_029_i233 = 0, $1498 = 0, $1499 = 0, $1502 = 0, $1504 = 0, $dimension_tib2_024_i235 = 0, $1507 = 0, $1508 = 0, $1511 = 0, $tib2_0_lcssa_in_i237 = 0, $dimension_tib2_0_lcssa_i238 = 0, $tib2_0_lcssa_i239 = 0, $tib1_121_i242 = 0, $i_0_i245 = 0, $1529 = 0, $1536 = 0, $1538 = 0, $1539 = 0, $1541 = 0, $1545 = 0, $1551 = 0, $1553 = 0, $_r0_sroa_0_0_load602 = 0, $1570 = 0, $1575 = 0, $1579 = 0, $tib1_0_ph_i185 = 0, $1590 = 0, $tib1_0_lcssa_i188 = 0, $dimension_tib1_0_lcssa_i189 = 0, $1595 = 0, $1597 = 0, $dimension_tib1_029_i191 = 0, $1600 = 0, $1601 = 0, $1604 = 0, $1606 = 0, $dimension_tib2_024_i193 = 0, $1609 = 0, $1610 = 0, $1613 = 0, $tib2_0_lcssa_in_i195 = 0, $dimension_tib2_0_lcssa_i196 = 0, $tib2_0_lcssa_i197 = 0, $tib1_121_i200 = 0, $i_0_i203 = 0, $1631 = 0, $1638 = 0, $1640 = 0, $1641 = 0, $1643 = 0, $1647 = 0, $1653 = 0, $1655 = 0, $_r2_sroa_0_0_load = 0, $1666 = 0, $1668 = 0, $1684 = 0, $1689 = 0, $1693 = 0, $tib1_0_ph_i = 0, $1704 = 0, $tib1_0_lcssa_i = 0, $dimension_tib1_0_lcssa_i = 0, $1709 = 0, $1711 = 0, $dimension_tib1_029_i = 0, $1714 = 0, $1715 = 0, $1718 = 0, $1720 = 0, $dimension_tib2_024_i = 0, $1723 = 0, $1724 = 0, $1727 = 0, $tib2_0_lcssa_in_i = 0, $dimension_tib2_0_lcssa_i = 0, $tib2_0_lcssa_i = 0, $tib1_121_i = 0, $i_0_i = 0, $1745 = 0, label = 0, __stackBase__ = 0, setjmpLabel = 0, setjmpTable = 0;
+ __stackBase__ = STACKTOP;
+ STACKTOP = STACKTOP + 536 | 0;
+ label = 1;
+ setjmpLabel = 0;
+ setjmpTable = STACKTOP;
+ STACKTOP = STACKTOP + 168 | 0;
+ HEAP32[setjmpTable >> 2] = 0;
+ while (1) switch (label | 0) {
+ case 1:
+ $_r0_sroa_1 = __stackBase__ | 0;
+ $_r3_sroa_1 = __stackBase__ + 8 | 0;
+ $local_env_w4567aaac23b1b6 = __stackBase__ + 16 | 0;
+ $local_env_w4567aaac23b1c16 = __stackBase__ + 56 | 0;
+ $local_env_w4567aaac23b1c22 = __stackBase__ + 96 | 0;
+ $local_env_w4567aaac23b1c24 = __stackBase__ + 136 | 0;
+ $local_env_w4567aaac23b1c26 = __stackBase__ + 176 | 0;
+ $local_env_w4567aaac23b1c29 = __stackBase__ + 216 | 0;
+ $local_env_w4567aaac23b1c31 = __stackBase__ + 256 | 0;
+ $local_env_w4567aaac23b1c35 = __stackBase__ + 296 | 0;
+ $local_env_w4567aaac23b1c40 = __stackBase__ + 336 | 0;
+ $local_env_w4567aaac23b1c42 = __stackBase__ + 376 | 0;
+ $local_env_w4567aaac23b1c44 = __stackBase__ + 416 | 0;
+ $local_env_w4567aaac23b1c48 = __stackBase__ + 456 | 0;
+ $local_env_w4567aaac23b1c50 = __stackBase__ + 496 | 0;
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 2;
+ break;
+ } else {
+ label = 3;
+ break;
+ }
+ case 2:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 3;
+ break;
+ case 3:
+ $_r5_sroa_0 = $n1;
+ $5 = invoke_ii(556, 709 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0 = $5;
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 4;
+ break;
+ } else {
+ label = 5;
+ break;
+ }
+ case 4:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 5;
+ break;
+ case 5:
+ $_r1_sroa_0 = HEAP32[136048 >> 2] | 0;
+ invoke_ii(202, $_r1_sroa_0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 6;
+ break;
+ } else {
+ label = 7;
+ break;
+ }
+ case 6:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 7;
+ break;
+ case 7:
+ $16 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $18 = invoke_iii(364, $16 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $19 = $local_env_w4567aaac23b1b6;
+ $21 = $18 + 16 | 0;
+ _memcpy($19 | 0, HEAP32[$21 >> 2] | 0 | 0, 40);
+ $25 = _saveSetjmp(HEAP32[$21 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 413;
+ break;
+ case 413:
+ if (($25 | 0) == 0) {
+ label = 8;
+ break;
+ } else {
+ label = 11;
+ break;
+ }
+ case 8:
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 9;
+ break;
+ } else {
+ label = 10;
+ break;
+ }
+ case 9:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 10;
+ break;
+ case 10:
+ $_r0_sroa_0 = HEAP32[140056 >> 2] | 0;
+ $40 = invoke_iii(HEAP32[((HEAP32[($_r0_sroa_0 | 0) >> 2] | 0) + 160 | 0) >> 2] | 0 | 0, $_r0_sroa_0 | 0, $_r5_sroa_0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0 = $40;
+ $_r0_sroa_0 = $_r0_sroa_0;
+ _memcpy(HEAP32[$21 >> 2] | 0 | 0, $19 | 0, 40);
+ if (($_r0_sroa_0 | 0) == 0) {
+ label = 32;
+ break;
+ } else {
+ label = 28;
+ break;
+ }
+ case 11:
+ _memcpy(HEAP32[$21 >> 2] | 0 | 0, $19 | 0, 40);
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 12;
+ break;
+ } else {
+ label = 13;
+ break;
+ }
+ case 12:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 13;
+ break;
+ case 13:
+ $52 = HEAP32[($18 + 20 | 0) >> 2] | 0;
+ if (($52 | 0) == 0) {
+ label = 27;
+ break;
+ } else {
+ label = 14;
+ break;
+ }
+ case 14:
+ $57 = HEAP32[$52 >> 2] | 0;
+ $61 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($57 | 0) == 82712) {
+ label = 15;
+ break;
+ } else {
+ $tib1_0_ph_i543 = $57;
+ label = 16;
+ break;
+ }
+ case 15:
+ $tib1_0_ph_i543 = HEAP32[((HEAP32[($52 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 16;
+ break;
+ case 16:
+ $72 = HEAP32[($tib1_0_ph_i543 + 56 | 0) >> 2] | 0;
+ if (($72 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i547 = 0;
+ $tib1_0_lcssa_i546 = $tib1_0_ph_i543;
+ label = 18;
+ break;
+ } else {
+ $dimension_tib1_029_i549 = 0;
+ $79 = $72;
+ label = 19;
+ break;
+ }
+ case 17:
+ $dimension_tib1_0_lcssa_i547 = $83;
+ $tib1_0_lcssa_i546 = $82;
+ label = 18;
+ break;
+ case 18:
+ $77 = HEAP32[($61 + 56 | 0) >> 2] | 0;
+ if (($77 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i554 = 0;
+ $tib2_0_lcssa_in_i553 = $61;
+ label = 21;
+ break;
+ } else {
+ $dimension_tib2_024_i551 = 0;
+ $88 = $77;
+ label = 20;
+ break;
+ }
+ case 19:
+ $82 = HEAP32[($79 + 8 | 0) >> 2] | 0;
+ $83 = $dimension_tib1_029_i549 + 1 | 0;
+ $86 = HEAP32[($82 + 56 | 0) >> 2] | 0;
+ if (($86 | 0) == 0) {
+ label = 17;
+ break;
+ } else {
+ $dimension_tib1_029_i549 = $83;
+ $79 = $86;
+ label = 19;
+ break;
+ }
+ case 20:
+ $91 = HEAP32[($88 + 8 | 0) >> 2] | 0;
+ $92 = $dimension_tib2_024_i551 + 1 | 0;
+ $95 = HEAP32[($91 + 56 | 0) >> 2] | 0;
+ if (($95 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i554 = $92;
+ $tib2_0_lcssa_in_i553 = $91;
+ label = 21;
+ break;
+ } else {
+ $dimension_tib2_024_i551 = $92;
+ $88 = $95;
+ label = 20;
+ break;
+ }
+ case 21:
+ $tib2_0_lcssa_i555 = $tib2_0_lcssa_in_i553;
+ if (($dimension_tib1_0_lcssa_i547 | 0) < ($dimension_tib2_0_lcssa_i554 | 0) | ($tib1_0_lcssa_i546 | 0) == 0) {
+ label = 27;
+ break;
+ } else {
+ $tib1_121_i558 = $tib1_0_lcssa_i546;
+ label = 22;
+ break;
+ }
+ case 22:
+ if (($tib1_121_i558 | 0) == ($tib2_0_lcssa_i555 | 0)) {
+ label = 54;
+ break;
+ } else {
+ label = 23;
+ break;
+ }
+ case 23:
+ $i_0_i561 = 0;
+ label = 24;
+ break;
+ case 24:
+ if (($i_0_i561 | 0) < (HEAP32[($tib1_121_i558 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 25;
+ break;
+ } else {
+ label = 26;
+ break;
+ }
+ case 25:
+ if ((HEAP32[((HEAP32[($tib1_121_i558 + 112 | 0) >> 2] | 0) + ($i_0_i561 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i555 | 0)) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i561 = $i_0_i561 + 1 | 0;
+ label = 24;
+ break;
+ }
+ case 26:
+ $113 = HEAP32[($tib1_121_i558 + 40 | 0) >> 2] | 0;
+ if (($113 | 0) == 0) {
+ label = 27;
+ break;
+ } else {
+ $tib1_121_i558 = $113;
+ label = 22;
+ break;
+ }
+ case 27:
+ invoke_vii(48, HEAP32[$21 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 28:
+ $_r1_sroa_0_0_load600 = $_r1_sroa_0;
+ $119 = $_r1_sroa_0_0_load600 + 4 | 0;
+ $122 = (HEAP32[$119 >> 2] | 0) + 8 | 0;
+ HEAP32[$122 >> 2] = (HEAP32[$122 >> 2] | 0) - 1 | 0;
+ if ((HEAP32[((HEAP32[$119 >> 2] | 0) + 8 | 0) >> 2] | 0 | 0) == 0) {
+ label = 29;
+ break;
+ } else {
+ label = 31;
+ break;
+ }
+ case 29:
+ invoke_vi(28, $_r1_sroa_0_0_load600 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $139;
+ if (($139 | 0) == 0) {
+ label = 31;
+ break;
+ } else {
+ label = 30;
+ break;
+ }
+ case 30:
+ invoke_iii(268, 31e3 | 0 | 0, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $139, tempInt) | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 31;
+ break;
+ case 31:
+ STACKTOP = __stackBase__;
+ return $_r0_sroa_0 | 0;
+ case 32:
+ $145 = ($_r5_sroa_0 | 0) == 0;
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 33;
+ break;
+ } else {
+ label = 34;
+ break;
+ }
+ case 33:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 34;
+ break;
+ case 34:
+ $149 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $151 = invoke_iii(364, $149 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ if ($145) {
+ label = 35;
+ break;
+ } else {
+ label = 62;
+ break;
+ }
+ case 35:
+ $153 = $local_env_w4567aaac23b1c16;
+ $155 = $151 + 16 | 0;
+ _memcpy($153 | 0, HEAP32[$155 >> 2] | 0 | 0, 40);
+ $159 = _saveSetjmp(HEAP32[$155 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 414;
+ break;
+ case 414:
+ if (($159 | 0) == 0) {
+ label = 36;
+ break;
+ } else {
+ label = 37;
+ break;
+ }
+ case 36:
+ invoke_viiii(14, 16136 | 0 | 0, 11648 | 0 | 0, 126872 | 0 | 0, 1457 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 37:
+ _memcpy(HEAP32[$155 >> 2] | 0 | 0, $153 | 0, 40);
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 38;
+ break;
+ } else {
+ label = 39;
+ break;
+ }
+ case 38:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 39;
+ break;
+ case 39:
+ $170 = HEAP32[($151 + 20 | 0) >> 2] | 0;
+ if (($170 | 0) == 0) {
+ label = 53;
+ break;
+ } else {
+ label = 40;
+ break;
+ }
+ case 40:
+ $175 = HEAP32[$170 >> 2] | 0;
+ $179 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($175 | 0) == 82712) {
+ label = 41;
+ break;
+ } else {
+ $tib1_0_ph_i521 = $175;
+ label = 42;
+ break;
+ }
+ case 41:
+ $tib1_0_ph_i521 = HEAP32[((HEAP32[($170 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 42;
+ break;
+ case 42:
+ $190 = HEAP32[($tib1_0_ph_i521 + 56 | 0) >> 2] | 0;
+ if (($190 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i525 = 0;
+ $tib1_0_lcssa_i524 = $tib1_0_ph_i521;
+ label = 44;
+ break;
+ } else {
+ $dimension_tib1_029_i527 = 0;
+ $197 = $190;
+ label = 45;
+ break;
+ }
+ case 43:
+ $dimension_tib1_0_lcssa_i525 = $201;
+ $tib1_0_lcssa_i524 = $200;
+ label = 44;
+ break;
+ case 44:
+ $195 = HEAP32[($179 + 56 | 0) >> 2] | 0;
+ if (($195 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i532 = 0;
+ $tib2_0_lcssa_in_i531 = $179;
+ label = 47;
+ break;
+ } else {
+ $dimension_tib2_024_i529 = 0;
+ $206 = $195;
+ label = 46;
+ break;
+ }
+ case 45:
+ $200 = HEAP32[($197 + 8 | 0) >> 2] | 0;
+ $201 = $dimension_tib1_029_i527 + 1 | 0;
+ $204 = HEAP32[($200 + 56 | 0) >> 2] | 0;
+ if (($204 | 0) == 0) {
+ label = 43;
+ break;
+ } else {
+ $dimension_tib1_029_i527 = $201;
+ $197 = $204;
+ label = 45;
+ break;
+ }
+ case 46:
+ $209 = HEAP32[($206 + 8 | 0) >> 2] | 0;
+ $210 = $dimension_tib2_024_i529 + 1 | 0;
+ $213 = HEAP32[($209 + 56 | 0) >> 2] | 0;
+ if (($213 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i532 = $210;
+ $tib2_0_lcssa_in_i531 = $209;
+ label = 47;
+ break;
+ } else {
+ $dimension_tib2_024_i529 = $210;
+ $206 = $213;
+ label = 46;
+ break;
+ }
+ case 47:
+ $tib2_0_lcssa_i533 = $tib2_0_lcssa_in_i531;
+ if (($dimension_tib1_0_lcssa_i525 | 0) < ($dimension_tib2_0_lcssa_i532 | 0) | ($tib1_0_lcssa_i524 | 0) == 0) {
+ label = 53;
+ break;
+ } else {
+ $tib1_121_i536 = $tib1_0_lcssa_i524;
+ label = 48;
+ break;
+ }
+ case 48:
+ if (($tib1_121_i536 | 0) == ($tib2_0_lcssa_i533 | 0)) {
+ label = 54;
+ break;
+ } else {
+ label = 49;
+ break;
+ }
+ case 49:
+ $i_0_i539 = 0;
+ label = 50;
+ break;
+ case 50:
+ if (($i_0_i539 | 0) < (HEAP32[($tib1_121_i536 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 51;
+ break;
+ } else {
+ label = 52;
+ break;
+ }
+ case 51:
+ if ((HEAP32[((HEAP32[($tib1_121_i536 + 112 | 0) >> 2] | 0) + ($i_0_i539 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i533 | 0)) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i539 = $i_0_i539 + 1 | 0;
+ label = 50;
+ break;
+ }
+ case 52:
+ $231 = HEAP32[($tib1_121_i536 + 40 | 0) >> 2] | 0;
+ if (($231 | 0) == 0) {
+ label = 53;
+ break;
+ } else {
+ $tib1_121_i536 = $231;
+ label = 48;
+ break;
+ }
+ case 53:
+ invoke_vii(48, HEAP32[$155 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 54:
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 55;
+ break;
+ } else {
+ label = 56;
+ break;
+ }
+ case 55:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 56;
+ break;
+ case 56:
+ $238 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $240 = invoke_iii(364, $238 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0 = HEAP32[($240 + 20 | 0) >> 2] | 0;
+ $_r1_sroa_0_0_load = $_r1_sroa_0;
+ $246 = $_r1_sroa_0_0_load + 4 | 0;
+ $249 = (HEAP32[$246 >> 2] | 0) + 8 | 0;
+ HEAP32[$249 >> 2] = (HEAP32[$249 >> 2] | 0) - 1 | 0;
+ if ((HEAP32[((HEAP32[$246 >> 2] | 0) + 8 | 0) >> 2] | 0 | 0) == 0) {
+ label = 57;
+ break;
+ } else {
+ label = 59;
+ break;
+ }
+ case 57:
+ invoke_vi(28, $_r1_sroa_0_0_load | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $266;
+ if (($266 | 0) == 0) {
+ label = 59;
+ break;
+ } else {
+ label = 58;
+ break;
+ }
+ case 58:
+ invoke_iii(268, 31e3 | 0 | 0, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $266, tempInt) | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 59;
+ break;
+ case 59:
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 60;
+ break;
+ } else {
+ label = 61;
+ break;
+ }
+ case 60:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 61;
+ break;
+ case 61:
+ $273 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $275 = invoke_iii(364, $273 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ HEAP32[($275 + 20 | 0) >> 2] = $_r0_sroa_0;
+ invoke_vii(48, HEAP32[($275 + 16 | 0) >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 62:
+ $284 = $local_env_w4567aaac23b1c22;
+ $286 = $151 + 16 | 0;
+ _memcpy($284 | 0, HEAP32[$286 >> 2] | 0 | 0, 40);
+ $290 = _saveSetjmp(HEAP32[$286 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 415;
+ break;
+ case 415:
+ if (($290 | 0) == 0) {
+ label = 63;
+ break;
+ } else {
+ label = 72;
+ break;
+ }
+ case 63:
+ invoke_vi(44, $_r5_sroa_0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 64;
+ break;
+ } else {
+ label = 65;
+ break;
+ }
+ case 64:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 65;
+ break;
+ case 65:
+ $_r0_sroa_0 = HEAP32[140064 >> 2] | 0;
+ if (($_r0_sroa_0 | 0) == 0) {
+ label = 67;
+ break;
+ } else {
+ label = 66;
+ break;
+ }
+ case 66:
+ _memcpy(HEAP32[$286 >> 2] | 0 | 0, $284 | 0, 40);
+ label = 89;
+ break;
+ case 67:
+ if ((HEAP32[(84292 | 0) >> 2] | 0 | 0) == 0) {
+ label = 68;
+ break;
+ } else {
+ label = 69;
+ break;
+ }
+ case 68:
+ invoke_v(584);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 69;
+ break;
+ case 69:
+ $305 = invoke_ii(338, 20 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ HEAP32[$305 >> 2] = 84288;
+ _memset($305 + 4 | 0 | 0 | 0, 0 | 0 | 0, 16 | 0 | 0);
+ $_r0_sroa_0 = $305;
+ invoke_vi(34, $_r0_sroa_0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $310 = $_r0_sroa_0;
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 70;
+ break;
+ } else {
+ label = 71;
+ break;
+ }
+ case 70:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 71;
+ break;
+ case 71:
+ HEAP32[140064 >> 2] = $310;
+ _memcpy(HEAP32[$286 >> 2] | 0 | 0, $284 | 0, 40);
+ label = 89;
+ break;
+ case 72:
+ _memcpy(HEAP32[$286 >> 2] | 0 | 0, $284 | 0, 40);
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 73;
+ break;
+ } else {
+ label = 74;
+ break;
+ }
+ case 73:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 74;
+ break;
+ case 74:
+ $323 = HEAP32[($151 + 20 | 0) >> 2] | 0;
+ if (($323 | 0) == 0) {
+ label = 88;
+ break;
+ } else {
+ label = 75;
+ break;
+ }
+ case 75:
+ $328 = HEAP32[$323 >> 2] | 0;
+ $332 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($328 | 0) == 82712) {
+ label = 76;
+ break;
+ } else {
+ $tib1_0_ph_i500 = $328;
+ label = 77;
+ break;
+ }
+ case 76:
+ $tib1_0_ph_i500 = HEAP32[((HEAP32[($323 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 77;
+ break;
+ case 77:
+ $343 = HEAP32[($tib1_0_ph_i500 + 56 | 0) >> 2] | 0;
+ if (($343 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i504 = 0;
+ $tib1_0_lcssa_i503 = $tib1_0_ph_i500;
+ label = 79;
+ break;
+ } else {
+ $dimension_tib1_029_i506 = 0;
+ $350 = $343;
+ label = 80;
+ break;
+ }
+ case 78:
+ $dimension_tib1_0_lcssa_i504 = $354;
+ $tib1_0_lcssa_i503 = $353;
+ label = 79;
+ break;
+ case 79:
+ $348 = HEAP32[($332 + 56 | 0) >> 2] | 0;
+ if (($348 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i511 = 0;
+ $tib2_0_lcssa_in_i510 = $332;
+ label = 82;
+ break;
+ } else {
+ $dimension_tib2_024_i508 = 0;
+ $359 = $348;
+ label = 81;
+ break;
+ }
+ case 80:
+ $353 = HEAP32[($350 + 8 | 0) >> 2] | 0;
+ $354 = $dimension_tib1_029_i506 + 1 | 0;
+ $357 = HEAP32[($353 + 56 | 0) >> 2] | 0;
+ if (($357 | 0) == 0) {
+ label = 78;
+ break;
+ } else {
+ $dimension_tib1_029_i506 = $354;
+ $350 = $357;
+ label = 80;
+ break;
+ }
+ case 81:
+ $362 = HEAP32[($359 + 8 | 0) >> 2] | 0;
+ $363 = $dimension_tib2_024_i508 + 1 | 0;
+ $366 = HEAP32[($362 + 56 | 0) >> 2] | 0;
+ if (($366 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i511 = $363;
+ $tib2_0_lcssa_in_i510 = $362;
+ label = 82;
+ break;
+ } else {
+ $dimension_tib2_024_i508 = $363;
+ $359 = $366;
+ label = 81;
+ break;
+ }
+ case 82:
+ $tib2_0_lcssa_i512 = $tib2_0_lcssa_in_i510;
+ if (($dimension_tib1_0_lcssa_i504 | 0) < ($dimension_tib2_0_lcssa_i511 | 0) | ($tib1_0_lcssa_i503 | 0) == 0) {
+ label = 88;
+ break;
+ } else {
+ $tib1_121_i515 = $tib1_0_lcssa_i503;
+ label = 83;
+ break;
+ }
+ case 83:
+ if (($tib1_121_i515 | 0) == ($tib2_0_lcssa_i512 | 0)) {
+ label = 54;
+ break;
+ } else {
+ label = 84;
+ break;
+ }
+ case 84:
+ $i_0_i518 = 0;
+ label = 85;
+ break;
+ case 85:
+ if (($i_0_i518 | 0) < (HEAP32[($tib1_121_i515 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 86;
+ break;
+ } else {
+ label = 87;
+ break;
+ }
+ case 86:
+ if ((HEAP32[((HEAP32[($tib1_121_i515 + 112 | 0) >> 2] | 0) + ($i_0_i518 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i512 | 0)) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i518 = $i_0_i518 + 1 | 0;
+ label = 85;
+ break;
+ }
+ case 87:
+ $384 = HEAP32[($tib1_121_i515 + 40 | 0) >> 2] | 0;
+ if (($384 | 0) == 0) {
+ label = 88;
+ break;
+ } else {
+ $tib1_121_i515 = $384;
+ label = 83;
+ break;
+ }
+ case 88:
+ invoke_vii(48, HEAP32[$286 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 89:
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 90;
+ break;
+ } else {
+ label = 91;
+ break;
+ }
+ case 90:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 91;
+ break;
+ case 91:
+ $392 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $394 = invoke_iii(364, $392 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $395 = $local_env_w4567aaac23b1c24;
+ $397 = $394 + 16 | 0;
+ _memcpy($395 | 0, HEAP32[$397 >> 2] | 0 | 0, 40);
+ $401 = _saveSetjmp(HEAP32[$397 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 416;
+ break;
+ case 416:
+ if (($401 | 0) == 0) {
+ label = 92;
+ break;
+ } else {
+ label = 99;
+ break;
+ }
+ case 92:
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 93;
+ break;
+ } else {
+ label = 94;
+ break;
+ }
+ case 93:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 94;
+ break;
+ case 94:
+ $_r0_sroa_0 = HEAP32[140064 >> 2] | 0;
+ $416 = invoke_iii(HEAP32[((HEAP32[($_r0_sroa_0 | 0) >> 2] | 0) + 144 | 0) >> 2] | 0 | 0, $_r0_sroa_0 | 0, $_r5_sroa_0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0 = $416;
+ if (($_r0_sroa_0 | 0) == 0) {
+ label = 95;
+ break;
+ } else {
+ label = 98;
+ break;
+ }
+ case 95:
+ _memcpy(HEAP32[$397 >> 2] | 0 | 0, $395 | 0, 40);
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 96;
+ break;
+ } else {
+ label = 97;
+ break;
+ }
+ case 96:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 97;
+ break;
+ case 97:
+ $424 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $426 = invoke_iii(364, $424 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $427 = $local_env_w4567aaac23b1c26;
+ $429 = $426 + 16 | 0;
+ _memcpy($427 | 0, HEAP32[$429 >> 2] | 0 | 0, 40);
+ $433 = _saveSetjmp(HEAP32[$429 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 417;
+ break;
+ case 417:
+ if (($433 | 0) == 0) {
+ label = 116;
+ break;
+ } else {
+ label = 127;
+ break;
+ }
+ case 98:
+ invoke_vii(24, $_r0_sroa_0 | 0, $_r5_sroa_0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ _memcpy(HEAP32[$397 >> 2] | 0 | 0, $395 | 0, 40);
+ label = 28;
+ break;
+ case 99:
+ _memcpy(HEAP32[$397 >> 2] | 0 | 0, $395 | 0, 40);
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 100;
+ break;
+ } else {
+ label = 101;
+ break;
+ }
+ case 100:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 101;
+ break;
+ case 101:
+ $446 = HEAP32[($394 + 20 | 0) >> 2] | 0;
+ if (($446 | 0) == 0) {
+ label = 115;
+ break;
+ } else {
+ label = 102;
+ break;
+ }
+ case 102:
+ $451 = HEAP32[$446 >> 2] | 0;
+ $455 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($451 | 0) == 82712) {
+ label = 103;
+ break;
+ } else {
+ $tib1_0_ph_i479 = $451;
+ label = 104;
+ break;
+ }
+ case 103:
+ $tib1_0_ph_i479 = HEAP32[((HEAP32[($446 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 104;
+ break;
+ case 104:
+ $466 = HEAP32[($tib1_0_ph_i479 + 56 | 0) >> 2] | 0;
+ if (($466 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i483 = 0;
+ $tib1_0_lcssa_i482 = $tib1_0_ph_i479;
+ label = 106;
+ break;
+ } else {
+ $dimension_tib1_029_i485 = 0;
+ $473 = $466;
+ label = 107;
+ break;
+ }
+ case 105:
+ $dimension_tib1_0_lcssa_i483 = $477;
+ $tib1_0_lcssa_i482 = $476;
+ label = 106;
+ break;
+ case 106:
+ $471 = HEAP32[($455 + 56 | 0) >> 2] | 0;
+ if (($471 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i490 = 0;
+ $tib2_0_lcssa_in_i489 = $455;
+ label = 109;
+ break;
+ } else {
+ $dimension_tib2_024_i487 = 0;
+ $482 = $471;
+ label = 108;
+ break;
+ }
+ case 107:
+ $476 = HEAP32[($473 + 8 | 0) >> 2] | 0;
+ $477 = $dimension_tib1_029_i485 + 1 | 0;
+ $480 = HEAP32[($476 + 56 | 0) >> 2] | 0;
+ if (($480 | 0) == 0) {
+ label = 105;
+ break;
+ } else {
+ $dimension_tib1_029_i485 = $477;
+ $473 = $480;
+ label = 107;
+ break;
+ }
+ case 108:
+ $485 = HEAP32[($482 + 8 | 0) >> 2] | 0;
+ $486 = $dimension_tib2_024_i487 + 1 | 0;
+ $489 = HEAP32[($485 + 56 | 0) >> 2] | 0;
+ if (($489 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i490 = $486;
+ $tib2_0_lcssa_in_i489 = $485;
+ label = 109;
+ break;
+ } else {
+ $dimension_tib2_024_i487 = $486;
+ $482 = $489;
+ label = 108;
+ break;
+ }
+ case 109:
+ $tib2_0_lcssa_i491 = $tib2_0_lcssa_in_i489;
+ if (($dimension_tib1_0_lcssa_i483 | 0) < ($dimension_tib2_0_lcssa_i490 | 0) | ($tib1_0_lcssa_i482 | 0) == 0) {
+ label = 115;
+ break;
+ } else {
+ $tib1_121_i494 = $tib1_0_lcssa_i482;
+ label = 110;
+ break;
+ }
+ case 110:
+ if (($tib1_121_i494 | 0) == ($tib2_0_lcssa_i491 | 0)) {
+ label = 54;
+ break;
+ } else {
+ label = 111;
+ break;
+ }
+ case 111:
+ $i_0_i497 = 0;
+ label = 112;
+ break;
+ case 112:
+ if (($i_0_i497 | 0) < (HEAP32[($tib1_121_i494 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 113;
+ break;
+ } else {
+ label = 114;
+ break;
+ }
+ case 113:
+ if ((HEAP32[((HEAP32[($tib1_121_i494 + 112 | 0) >> 2] | 0) + ($i_0_i497 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i491 | 0)) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i497 = $i_0_i497 + 1 | 0;
+ label = 112;
+ break;
+ }
+ case 114:
+ $507 = HEAP32[($tib1_121_i494 + 40 | 0) >> 2] | 0;
+ if (($507 | 0) == 0) {
+ label = 115;
+ break;
+ } else {
+ $tib1_121_i494 = $507;
+ label = 110;
+ break;
+ }
+ case 115:
+ invoke_vii(48, HEAP32[$397 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 116:
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 117;
+ break;
+ } else {
+ label = 118;
+ break;
+ }
+ case 117:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 118;
+ break;
+ case 118:
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 119;
+ break;
+ } else {
+ label = 120;
+ break;
+ }
+ case 119:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 120;
+ break;
+ case 120:
+ $519 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $521 = invoke_iii(364, $519 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ if ((HEAP32[(98148 | 0) >> 2] | 0 | 0) == 0) {
+ label = 121;
+ break;
+ } else {
+ label = 122;
+ break;
+ }
+ case 121:
+ invoke_v(408);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 122;
+ break;
+ case 122:
+ $525 = invoke_ii(338, 12 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ HEAP32[$525 >> 2] = 98144;
+ HEAP32[($525 + 4 | 0) >> 2] = 0;
+ HEAP32[($525 + 8 | 0) >> 2] = $521;
+ if ((HEAP32[(97532 | 0) >> 2] | 0 | 0) == 0) {
+ label = 123;
+ break;
+ } else {
+ $534 = 98144;
+ label = 124;
+ break;
+ }
+ case 123:
+ invoke_v(568);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $534 = HEAP32[$525 >> 2] | 0;
+ label = 124;
+ break;
+ case 124:
+ $539 = invoke_ii(HEAP32[(HEAP32[($534 + 116 | 0) >> 2] | 0) >> 2] | 0 | 0, $525 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r2_sroa_0 = $539;
+ _memcpy(HEAP32[$429 >> 2] | 0 | 0, $427 | 0, 40);
+ $542 = ($_r2_sroa_0 | 0) == 0;
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 125;
+ break;
+ } else {
+ label = 126;
+ break;
+ }
+ case 125:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 126;
+ break;
+ case 126:
+ $546 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $548 = invoke_iii(364, $546 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ if ($542) {
+ label = 240;
+ break;
+ } else {
+ label = 144;
+ break;
+ }
+ case 127:
+ _memcpy(HEAP32[$429 >> 2] | 0 | 0, $427 | 0, 40);
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 128;
+ break;
+ } else {
+ label = 129;
+ break;
+ }
+ case 128:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 129;
+ break;
+ case 129:
+ $557 = HEAP32[($426 + 20 | 0) >> 2] | 0;
+ if (($557 | 0) == 0) {
+ label = 143;
+ break;
+ } else {
+ label = 130;
+ break;
+ }
+ case 130:
+ $562 = HEAP32[$557 >> 2] | 0;
+ $566 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($562 | 0) == 82712) {
+ label = 131;
+ break;
+ } else {
+ $tib1_0_ph_i458 = $562;
+ label = 132;
+ break;
+ }
+ case 131:
+ $tib1_0_ph_i458 = HEAP32[((HEAP32[($557 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 132;
+ break;
+ case 132:
+ $577 = HEAP32[($tib1_0_ph_i458 + 56 | 0) >> 2] | 0;
+ if (($577 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i462 = 0;
+ $tib1_0_lcssa_i461 = $tib1_0_ph_i458;
+ label = 134;
+ break;
+ } else {
+ $dimension_tib1_029_i464 = 0;
+ $584 = $577;
+ label = 135;
+ break;
+ }
+ case 133:
+ $dimension_tib1_0_lcssa_i462 = $588;
+ $tib1_0_lcssa_i461 = $587;
+ label = 134;
+ break;
+ case 134:
+ $582 = HEAP32[($566 + 56 | 0) >> 2] | 0;
+ if (($582 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i469 = 0;
+ $tib2_0_lcssa_in_i468 = $566;
+ label = 137;
+ break;
+ } else {
+ $dimension_tib2_024_i466 = 0;
+ $593 = $582;
+ label = 136;
+ break;
+ }
+ case 135:
+ $587 = HEAP32[($584 + 8 | 0) >> 2] | 0;
+ $588 = $dimension_tib1_029_i464 + 1 | 0;
+ $591 = HEAP32[($587 + 56 | 0) >> 2] | 0;
+ if (($591 | 0) == 0) {
+ label = 133;
+ break;
+ } else {
+ $dimension_tib1_029_i464 = $588;
+ $584 = $591;
+ label = 135;
+ break;
+ }
+ case 136:
+ $596 = HEAP32[($593 + 8 | 0) >> 2] | 0;
+ $597 = $dimension_tib2_024_i466 + 1 | 0;
+ $600 = HEAP32[($596 + 56 | 0) >> 2] | 0;
+ if (($600 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i469 = $597;
+ $tib2_0_lcssa_in_i468 = $596;
+ label = 137;
+ break;
+ } else {
+ $dimension_tib2_024_i466 = $597;
+ $593 = $600;
+ label = 136;
+ break;
+ }
+ case 137:
+ $tib2_0_lcssa_i470 = $tib2_0_lcssa_in_i468;
+ if (($dimension_tib1_0_lcssa_i462 | 0) < ($dimension_tib2_0_lcssa_i469 | 0) | ($tib1_0_lcssa_i461 | 0) == 0) {
+ label = 143;
+ break;
+ } else {
+ $tib1_121_i473 = $tib1_0_lcssa_i461;
+ label = 138;
+ break;
+ }
+ case 138:
+ if (($tib1_121_i473 | 0) == ($tib2_0_lcssa_i470 | 0)) {
+ label = 54;
+ break;
+ } else {
+ label = 139;
+ break;
+ }
+ case 139:
+ $i_0_i476 = 0;
+ label = 140;
+ break;
+ case 140:
+ if (($i_0_i476 | 0) < (HEAP32[($tib1_121_i473 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 141;
+ break;
+ } else {
+ label = 142;
+ break;
+ }
+ case 141:
+ if ((HEAP32[((HEAP32[($tib1_121_i473 + 112 | 0) >> 2] | 0) + ($i_0_i476 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i470 | 0)) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i476 = $i_0_i476 + 1 | 0;
+ label = 140;
+ break;
+ }
+ case 142:
+ $618 = HEAP32[($tib1_121_i473 + 40 | 0) >> 2] | 0;
+ if (($618 | 0) == 0) {
+ label = 143;
+ break;
+ } else {
+ $tib1_121_i473 = $618;
+ label = 138;
+ break;
+ }
+ case 143:
+ invoke_vii(48, HEAP32[$429 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 144:
+ $623 = $local_env_w4567aaac23b1c29;
+ $625 = $548 + 16 | 0;
+ _memcpy($623 | 0, HEAP32[$625 >> 2] | 0 | 0, 40);
+ $629 = _saveSetjmp(HEAP32[$625 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 418;
+ break;
+ case 418:
+ if (($629 | 0) == 0) {
+ label = 145;
+ break;
+ } else {
+ label = 146;
+ break;
+ }
+ case 145:
+ $632 = invoke_ii(556, 709 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0 = $632;
+ $_r0_sroa_0 = 0;
+ $_r3_sroa_0 = $_r0_sroa_0;
+ HEAP32[($_r3_sroa_1 | 0) >> 2] = HEAP32[($_r0_sroa_1 | 0) >> 2] | 0;
+ _memcpy(HEAP32[$625 >> 2] | 0 | 0, $623 | 0, 40);
+ label = 179;
+ break;
+ case 146:
+ _memcpy(HEAP32[$625 >> 2] | 0 | 0, $623 | 0, 40);
+ if ((HEAP32[(113236 | 0) >> 2] | 0 | 0) == 0) {
+ label = 147;
+ break;
+ } else {
+ label = 148;
+ break;
+ }
+ case 147:
+ invoke_v(538);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 148;
+ break;
+ case 148:
+ $643 = $548 + 20 | 0;
+ $644 = HEAP32[$643 >> 2] | 0;
+ if (($644 | 0) == 0) {
+ label = 162;
+ break;
+ } else {
+ label = 149;
+ break;
+ }
+ case 149:
+ $649 = HEAP32[$644 >> 2] | 0;
+ $653 = HEAP32[((HEAP32[138672 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($649 | 0) == 82712) {
+ label = 150;
+ break;
+ } else {
+ $tib1_0_ph_i437 = $649;
+ label = 151;
+ break;
+ }
+ case 150:
+ $tib1_0_ph_i437 = HEAP32[((HEAP32[($644 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 151;
+ break;
+ case 151:
+ $664 = HEAP32[($tib1_0_ph_i437 + 56 | 0) >> 2] | 0;
+ if (($664 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i441 = 0;
+ $tib1_0_lcssa_i440 = $tib1_0_ph_i437;
+ label = 153;
+ break;
+ } else {
+ $dimension_tib1_029_i443 = 0;
+ $671 = $664;
+ label = 154;
+ break;
+ }
+ case 152:
+ $dimension_tib1_0_lcssa_i441 = $675;
+ $tib1_0_lcssa_i440 = $674;
+ label = 153;
+ break;
+ case 153:
+ $669 = HEAP32[($653 + 56 | 0) >> 2] | 0;
+ if (($669 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i448 = 0;
+ $tib2_0_lcssa_in_i447 = $653;
+ label = 156;
+ break;
+ } else {
+ $dimension_tib2_024_i445 = 0;
+ $680 = $669;
+ label = 155;
+ break;
+ }
+ case 154:
+ $674 = HEAP32[($671 + 8 | 0) >> 2] | 0;
+ $675 = $dimension_tib1_029_i443 + 1 | 0;
+ $678 = HEAP32[($674 + 56 | 0) >> 2] | 0;
+ if (($678 | 0) == 0) {
+ label = 152;
+ break;
+ } else {
+ $dimension_tib1_029_i443 = $675;
+ $671 = $678;
+ label = 154;
+ break;
+ }
+ case 155:
+ $683 = HEAP32[($680 + 8 | 0) >> 2] | 0;
+ $684 = $dimension_tib2_024_i445 + 1 | 0;
+ $687 = HEAP32[($683 + 56 | 0) >> 2] | 0;
+ if (($687 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i448 = $684;
+ $tib2_0_lcssa_in_i447 = $683;
+ label = 156;
+ break;
+ } else {
+ $dimension_tib2_024_i445 = $684;
+ $680 = $687;
+ label = 155;
+ break;
+ }
+ case 156:
+ $tib2_0_lcssa_i449 = $tib2_0_lcssa_in_i447;
+ if (($dimension_tib1_0_lcssa_i441 | 0) < ($dimension_tib2_0_lcssa_i448 | 0) | ($tib1_0_lcssa_i440 | 0) == 0) {
+ label = 162;
+ break;
+ } else {
+ $tib1_121_i452 = $tib1_0_lcssa_i440;
+ label = 157;
+ break;
+ }
+ case 157:
+ if (($tib1_121_i452 | 0) == ($tib2_0_lcssa_i449 | 0)) {
+ label = 361;
+ break;
+ } else {
+ label = 158;
+ break;
+ }
+ case 158:
+ $i_0_i455 = 0;
+ label = 159;
+ break;
+ case 159:
+ if (($i_0_i455 | 0) < (HEAP32[($tib1_121_i452 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 160;
+ break;
+ } else {
+ label = 161;
+ break;
+ }
+ case 160:
+ if ((HEAP32[((HEAP32[($tib1_121_i452 + 112 | 0) >> 2] | 0) + ($i_0_i455 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i449 | 0)) {
+ label = 361;
+ break;
+ } else {
+ $i_0_i455 = $i_0_i455 + 1 | 0;
+ label = 159;
+ break;
+ }
+ case 161:
+ $705 = HEAP32[($tib1_121_i452 + 40 | 0) >> 2] | 0;
+ if (($705 | 0) == 0) {
+ label = 162;
+ break;
+ } else {
+ $tib1_121_i452 = $705;
+ label = 157;
+ break;
+ }
+ case 162:
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 163;
+ break;
+ } else {
+ label = 164;
+ break;
+ }
+ case 163:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 164;
+ break;
+ case 164:
+ $711 = HEAP32[$643 >> 2] | 0;
+ if (($711 | 0) == 0) {
+ label = 178;
+ break;
+ } else {
+ label = 165;
+ break;
+ }
+ case 165:
+ $716 = HEAP32[$711 >> 2] | 0;
+ $720 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($716 | 0) == 82712) {
+ label = 166;
+ break;
+ } else {
+ $tib1_0_ph_i416 = $716;
+ label = 167;
+ break;
+ }
+ case 166:
+ $tib1_0_ph_i416 = HEAP32[((HEAP32[($711 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 167;
+ break;
+ case 167:
+ $731 = HEAP32[($tib1_0_ph_i416 + 56 | 0) >> 2] | 0;
+ if (($731 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i420 = 0;
+ $tib1_0_lcssa_i419 = $tib1_0_ph_i416;
+ label = 169;
+ break;
+ } else {
+ $dimension_tib1_029_i422 = 0;
+ $738 = $731;
+ label = 170;
+ break;
+ }
+ case 168:
+ $dimension_tib1_0_lcssa_i420 = $742;
+ $tib1_0_lcssa_i419 = $741;
+ label = 169;
+ break;
+ case 169:
+ $736 = HEAP32[($720 + 56 | 0) >> 2] | 0;
+ if (($736 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i427 = 0;
+ $tib2_0_lcssa_in_i426 = $720;
+ label = 172;
+ break;
+ } else {
+ $dimension_tib2_024_i424 = 0;
+ $747 = $736;
+ label = 171;
+ break;
+ }
+ case 170:
+ $741 = HEAP32[($738 + 8 | 0) >> 2] | 0;
+ $742 = $dimension_tib1_029_i422 + 1 | 0;
+ $745 = HEAP32[($741 + 56 | 0) >> 2] | 0;
+ if (($745 | 0) == 0) {
+ label = 168;
+ break;
+ } else {
+ $dimension_tib1_029_i422 = $742;
+ $738 = $745;
+ label = 170;
+ break;
+ }
+ case 171:
+ $750 = HEAP32[($747 + 8 | 0) >> 2] | 0;
+ $751 = $dimension_tib2_024_i424 + 1 | 0;
+ $754 = HEAP32[($750 + 56 | 0) >> 2] | 0;
+ if (($754 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i427 = $751;
+ $tib2_0_lcssa_in_i426 = $750;
+ label = 172;
+ break;
+ } else {
+ $dimension_tib2_024_i424 = $751;
+ $747 = $754;
+ label = 171;
+ break;
+ }
+ case 172:
+ $tib2_0_lcssa_i428 = $tib2_0_lcssa_in_i426;
+ if (($dimension_tib1_0_lcssa_i420 | 0) < ($dimension_tib2_0_lcssa_i427 | 0) | ($tib1_0_lcssa_i419 | 0) == 0) {
+ label = 178;
+ break;
+ } else {
+ $tib1_121_i431 = $tib1_0_lcssa_i419;
+ label = 173;
+ break;
+ }
+ case 173:
+ if (($tib1_121_i431 | 0) == ($tib2_0_lcssa_i428 | 0)) {
+ label = 386;
+ break;
+ } else {
+ label = 174;
+ break;
+ }
+ case 174:
+ $i_0_i434 = 0;
+ label = 175;
+ break;
+ case 175:
+ if (($i_0_i434 | 0) < (HEAP32[($tib1_121_i431 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 176;
+ break;
+ } else {
+ label = 177;
+ break;
+ }
+ case 176:
+ if ((HEAP32[((HEAP32[($tib1_121_i431 + 112 | 0) >> 2] | 0) + ($i_0_i434 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i428 | 0)) {
+ label = 386;
+ break;
+ } else {
+ $i_0_i434 = $i_0_i434 + 1 | 0;
+ label = 175;
+ break;
+ }
+ case 177:
+ $772 = HEAP32[($tib1_121_i431 + 40 | 0) >> 2] | 0;
+ if (($772 | 0) == 0) {
+ label = 178;
+ break;
+ } else {
+ $tib1_121_i431 = $772;
+ label = 173;
+ break;
+ }
+ case 178:
+ invoke_vii(48, HEAP32[$625 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 179:
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 180;
+ break;
+ } else {
+ label = 181;
+ break;
+ }
+ case 180:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 181;
+ break;
+ case 181:
+ $780 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $782 = invoke_iii(364, $780 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $783 = $local_env_w4567aaac23b1c31;
+ $785 = $782 + 16 | 0;
+ _memcpy($783 | 0, HEAP32[$785 >> 2] | 0 | 0, 40);
+ $789 = _saveSetjmp(HEAP32[$785 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 419;
+ break;
+ case 419:
+ if (($789 | 0) == 0) {
+ label = 182;
+ break;
+ } else {
+ label = 183;
+ break;
+ }
+ case 182:
+ $798 = invoke_ii(HEAP32[(HEAP32[((HEAP32[$_r3_sroa_0 >> 2] | 0) + 116 | 0) >> 2] | 0) >> 2] | 0 | 0, $_r3_sroa_0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0 = $798;
+ _memcpy(HEAP32[$785 >> 2] | 0 | 0, $783 | 0, 40);
+ if (($_r0_sroa_0 | 0) == 0) {
+ label = 216;
+ break;
+ } else {
+ label = 322;
+ break;
+ }
+ case 183:
+ _memcpy(HEAP32[$785 >> 2] | 0 | 0, $783 | 0, 40);
+ if ((HEAP32[(113236 | 0) >> 2] | 0 | 0) == 0) {
+ label = 184;
+ break;
+ } else {
+ label = 185;
+ break;
+ }
+ case 184:
+ invoke_v(538);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 185;
+ break;
+ case 185:
+ $808 = $782 + 20 | 0;
+ $809 = HEAP32[$808 >> 2] | 0;
+ if (($809 | 0) == 0) {
+ label = 199;
+ break;
+ } else {
+ label = 186;
+ break;
+ }
+ case 186:
+ $814 = HEAP32[$809 >> 2] | 0;
+ $818 = HEAP32[((HEAP32[138672 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($814 | 0) == 82712) {
+ label = 187;
+ break;
+ } else {
+ $tib1_0_ph_i395 = $814;
+ label = 188;
+ break;
+ }
+ case 187:
+ $tib1_0_ph_i395 = HEAP32[((HEAP32[($809 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 188;
+ break;
+ case 188:
+ $829 = HEAP32[($tib1_0_ph_i395 + 56 | 0) >> 2] | 0;
+ if (($829 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i399 = 0;
+ $tib1_0_lcssa_i398 = $tib1_0_ph_i395;
+ label = 190;
+ break;
+ } else {
+ $dimension_tib1_029_i401 = 0;
+ $836 = $829;
+ label = 191;
+ break;
+ }
+ case 189:
+ $dimension_tib1_0_lcssa_i399 = $840;
+ $tib1_0_lcssa_i398 = $839;
+ label = 190;
+ break;
+ case 190:
+ $834 = HEAP32[($818 + 56 | 0) >> 2] | 0;
+ if (($834 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i406 = 0;
+ $tib2_0_lcssa_in_i405 = $818;
+ label = 193;
+ break;
+ } else {
+ $dimension_tib2_024_i403 = 0;
+ $845 = $834;
+ label = 192;
+ break;
+ }
+ case 191:
+ $839 = HEAP32[($836 + 8 | 0) >> 2] | 0;
+ $840 = $dimension_tib1_029_i401 + 1 | 0;
+ $843 = HEAP32[($839 + 56 | 0) >> 2] | 0;
+ if (($843 | 0) == 0) {
+ label = 189;
+ break;
+ } else {
+ $dimension_tib1_029_i401 = $840;
+ $836 = $843;
+ label = 191;
+ break;
+ }
+ case 192:
+ $848 = HEAP32[($845 + 8 | 0) >> 2] | 0;
+ $849 = $dimension_tib2_024_i403 + 1 | 0;
+ $852 = HEAP32[($848 + 56 | 0) >> 2] | 0;
+ if (($852 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i406 = $849;
+ $tib2_0_lcssa_in_i405 = $848;
+ label = 193;
+ break;
+ } else {
+ $dimension_tib2_024_i403 = $849;
+ $845 = $852;
+ label = 192;
+ break;
+ }
+ case 193:
+ $tib2_0_lcssa_i407 = $tib2_0_lcssa_in_i405;
+ if (($dimension_tib1_0_lcssa_i399 | 0) < ($dimension_tib2_0_lcssa_i406 | 0) | ($tib1_0_lcssa_i398 | 0) == 0) {
+ label = 199;
+ break;
+ } else {
+ $tib1_121_i410 = $tib1_0_lcssa_i398;
+ label = 194;
+ break;
+ }
+ case 194:
+ if (($tib1_121_i410 | 0) == ($tib2_0_lcssa_i407 | 0)) {
+ label = 361;
+ break;
+ } else {
+ label = 195;
+ break;
+ }
+ case 195:
+ $i_0_i413 = 0;
+ label = 196;
+ break;
+ case 196:
+ if (($i_0_i413 | 0) < (HEAP32[($tib1_121_i410 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 197;
+ break;
+ } else {
+ label = 198;
+ break;
+ }
+ case 197:
+ if ((HEAP32[((HEAP32[($tib1_121_i410 + 112 | 0) >> 2] | 0) + ($i_0_i413 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i407 | 0)) {
+ label = 361;
+ break;
+ } else {
+ $i_0_i413 = $i_0_i413 + 1 | 0;
+ label = 196;
+ break;
+ }
+ case 198:
+ $870 = HEAP32[($tib1_121_i410 + 40 | 0) >> 2] | 0;
+ if (($870 | 0) == 0) {
+ label = 199;
+ break;
+ } else {
+ $tib1_121_i410 = $870;
+ label = 194;
+ break;
+ }
+ case 199:
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 200;
+ break;
+ } else {
+ label = 201;
+ break;
+ }
+ case 200:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 201;
+ break;
+ case 201:
+ $876 = HEAP32[$808 >> 2] | 0;
+ if (($876 | 0) == 0) {
+ label = 215;
+ break;
+ } else {
+ label = 202;
+ break;
+ }
+ case 202:
+ $881 = HEAP32[$876 >> 2] | 0;
+ $885 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($881 | 0) == 82712) {
+ label = 203;
+ break;
+ } else {
+ $tib1_0_ph_i374 = $881;
+ label = 204;
+ break;
+ }
+ case 203:
+ $tib1_0_ph_i374 = HEAP32[((HEAP32[($876 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 204;
+ break;
+ case 204:
+ $896 = HEAP32[($tib1_0_ph_i374 + 56 | 0) >> 2] | 0;
+ if (($896 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i378 = 0;
+ $tib1_0_lcssa_i377 = $tib1_0_ph_i374;
+ label = 206;
+ break;
+ } else {
+ $dimension_tib1_029_i380 = 0;
+ $903 = $896;
+ label = 207;
+ break;
+ }
+ case 205:
+ $dimension_tib1_0_lcssa_i378 = $907;
+ $tib1_0_lcssa_i377 = $906;
+ label = 206;
+ break;
+ case 206:
+ $901 = HEAP32[($885 + 56 | 0) >> 2] | 0;
+ if (($901 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i385 = 0;
+ $tib2_0_lcssa_in_i384 = $885;
+ label = 209;
+ break;
+ } else {
+ $dimension_tib2_024_i382 = 0;
+ $912 = $901;
+ label = 208;
+ break;
+ }
+ case 207:
+ $906 = HEAP32[($903 + 8 | 0) >> 2] | 0;
+ $907 = $dimension_tib1_029_i380 + 1 | 0;
+ $910 = HEAP32[($906 + 56 | 0) >> 2] | 0;
+ if (($910 | 0) == 0) {
+ label = 205;
+ break;
+ } else {
+ $dimension_tib1_029_i380 = $907;
+ $903 = $910;
+ label = 207;
+ break;
+ }
+ case 208:
+ $915 = HEAP32[($912 + 8 | 0) >> 2] | 0;
+ $916 = $dimension_tib2_024_i382 + 1 | 0;
+ $919 = HEAP32[($915 + 56 | 0) >> 2] | 0;
+ if (($919 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i385 = $916;
+ $tib2_0_lcssa_in_i384 = $915;
+ label = 209;
+ break;
+ } else {
+ $dimension_tib2_024_i382 = $916;
+ $912 = $919;
+ label = 208;
+ break;
+ }
+ case 209:
+ $tib2_0_lcssa_i386 = $tib2_0_lcssa_in_i384;
+ if (($dimension_tib1_0_lcssa_i378 | 0) < ($dimension_tib2_0_lcssa_i385 | 0) | ($tib1_0_lcssa_i377 | 0) == 0) {
+ label = 215;
+ break;
+ } else {
+ $tib1_121_i389 = $tib1_0_lcssa_i377;
+ label = 210;
+ break;
+ }
+ case 210:
+ if (($tib1_121_i389 | 0) == ($tib2_0_lcssa_i386 | 0)) {
+ label = 386;
+ break;
+ } else {
+ label = 211;
+ break;
+ }
+ case 211:
+ $i_0_i392 = 0;
+ label = 212;
+ break;
+ case 212:
+ if (($i_0_i392 | 0) < (HEAP32[($tib1_121_i389 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 213;
+ break;
+ } else {
+ label = 214;
+ break;
+ }
+ case 213:
+ if ((HEAP32[((HEAP32[($tib1_121_i389 + 112 | 0) >> 2] | 0) + ($i_0_i392 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i386 | 0)) {
+ label = 386;
+ break;
+ } else {
+ $i_0_i392 = $i_0_i392 + 1 | 0;
+ label = 212;
+ break;
+ }
+ case 214:
+ $937 = HEAP32[($tib1_121_i389 + 40 | 0) >> 2] | 0;
+ if (($937 | 0) == 0) {
+ label = 215;
+ break;
+ } else {
+ $tib1_121_i389 = $937;
+ label = 210;
+ break;
+ }
+ case 215:
+ invoke_vii(48, HEAP32[$785 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 216:
+ $_r0_sroa_0 = 0;
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 217;
+ break;
+ } else {
+ label = 218;
+ break;
+ }
+ case 217:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 218;
+ break;
+ case 218:
+ $945 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $947 = invoke_iii(364, $945 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $948 = $local_env_w4567aaac23b1c35;
+ $950 = $947 + 16 | 0;
+ _memcpy($948 | 0, HEAP32[$950 >> 2] | 0 | 0, 40);
+ $954 = _saveSetjmp(HEAP32[$950 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 420;
+ break;
+ case 420:
+ if (($954 | 0) == 0) {
+ label = 219;
+ break;
+ } else {
+ label = 222;
+ break;
+ }
+ case 219:
+ $_r0_sroa_0_0_load607 = $_r0_sroa_0;
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 220;
+ break;
+ } else {
+ label = 221;
+ break;
+ }
+ case 220:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 221;
+ break;
+ case 221:
+ HEAP32[140048 >> 2] = $_r0_sroa_0_0_load607;
+ _memcpy(HEAP32[$950 >> 2] | 0 | 0, $948 | 0, 40);
+ label = 239;
+ break;
+ case 222:
+ _memcpy(HEAP32[$950 >> 2] | 0 | 0, $948 | 0, 40);
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 223;
+ break;
+ } else {
+ label = 224;
+ break;
+ }
+ case 223:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 224;
+ break;
+ case 224:
+ $969 = HEAP32[($947 + 20 | 0) >> 2] | 0;
+ if (($969 | 0) == 0) {
+ label = 238;
+ break;
+ } else {
+ label = 225;
+ break;
+ }
+ case 225:
+ $974 = HEAP32[$969 >> 2] | 0;
+ $978 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($974 | 0) == 82712) {
+ label = 226;
+ break;
+ } else {
+ $tib1_0_ph_i353 = $974;
+ label = 227;
+ break;
+ }
+ case 226:
+ $tib1_0_ph_i353 = HEAP32[((HEAP32[($969 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 227;
+ break;
+ case 227:
+ $989 = HEAP32[($tib1_0_ph_i353 + 56 | 0) >> 2] | 0;
+ if (($989 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i357 = 0;
+ $tib1_0_lcssa_i356 = $tib1_0_ph_i353;
+ label = 229;
+ break;
+ } else {
+ $dimension_tib1_029_i359 = 0;
+ $996 = $989;
+ label = 230;
+ break;
+ }
+ case 228:
+ $dimension_tib1_0_lcssa_i357 = $1000;
+ $tib1_0_lcssa_i356 = $999;
+ label = 229;
+ break;
+ case 229:
+ $994 = HEAP32[($978 + 56 | 0) >> 2] | 0;
+ if (($994 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i364 = 0;
+ $tib2_0_lcssa_in_i363 = $978;
+ label = 232;
+ break;
+ } else {
+ $dimension_tib2_024_i361 = 0;
+ $1005 = $994;
+ label = 231;
+ break;
+ }
+ case 230:
+ $999 = HEAP32[($996 + 8 | 0) >> 2] | 0;
+ $1000 = $dimension_tib1_029_i359 + 1 | 0;
+ $1003 = HEAP32[($999 + 56 | 0) >> 2] | 0;
+ if (($1003 | 0) == 0) {
+ label = 228;
+ break;
+ } else {
+ $dimension_tib1_029_i359 = $1000;
+ $996 = $1003;
+ label = 230;
+ break;
+ }
+ case 231:
+ $1008 = HEAP32[($1005 + 8 | 0) >> 2] | 0;
+ $1009 = $dimension_tib2_024_i361 + 1 | 0;
+ $1012 = HEAP32[($1008 + 56 | 0) >> 2] | 0;
+ if (($1012 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i364 = $1009;
+ $tib2_0_lcssa_in_i363 = $1008;
+ label = 232;
+ break;
+ } else {
+ $dimension_tib2_024_i361 = $1009;
+ $1005 = $1012;
+ label = 231;
+ break;
+ }
+ case 232:
+ $tib2_0_lcssa_i365 = $tib2_0_lcssa_in_i363;
+ if (($dimension_tib1_0_lcssa_i357 | 0) < ($dimension_tib2_0_lcssa_i364 | 0) | ($tib1_0_lcssa_i356 | 0) == 0) {
+ label = 238;
+ break;
+ } else {
+ $tib1_121_i368 = $tib1_0_lcssa_i356;
+ label = 233;
+ break;
+ }
+ case 233:
+ if (($tib1_121_i368 | 0) == ($tib2_0_lcssa_i365 | 0)) {
+ label = 54;
+ break;
+ } else {
+ label = 234;
+ break;
+ }
+ case 234:
+ $i_0_i371 = 0;
+ label = 235;
+ break;
+ case 235:
+ if (($i_0_i371 | 0) < (HEAP32[($tib1_121_i368 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 236;
+ break;
+ } else {
+ label = 237;
+ break;
+ }
+ case 236:
+ if ((HEAP32[((HEAP32[($tib1_121_i368 + 112 | 0) >> 2] | 0) + ($i_0_i371 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i365 | 0)) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i371 = $i_0_i371 + 1 | 0;
+ label = 235;
+ break;
+ }
+ case 237:
+ $1030 = HEAP32[($tib1_121_i368 + 40 | 0) >> 2] | 0;
+ if (($1030 | 0) == 0) {
+ label = 238;
+ break;
+ } else {
+ $tib1_121_i368 = $1030;
+ label = 233;
+ break;
+ }
+ case 238:
+ invoke_vii(48, HEAP32[$950 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 239:
+ $_r0_sroa_0 = 0;
+ label = 28;
+ break;
+ case 240:
+ $1036 = $local_env_w4567aaac23b1c40;
+ $1038 = $548 + 16 | 0;
+ _memcpy($1036 | 0, HEAP32[$1038 >> 2] | 0 | 0, 40);
+ $1042 = _saveSetjmp(HEAP32[$1038 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 421;
+ break;
+ case 421:
+ if (($1042 | 0) == 0) {
+ label = 241;
+ break;
+ } else {
+ label = 253;
+ break;
+ }
+ case 241:
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 242;
+ break;
+ } else {
+ label = 244;
+ break;
+ }
+ case 242:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 243;
+ break;
+ } else {
+ label = 244;
+ break;
+ }
+ case 243:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 244;
+ break;
+ case 244:
+ $1050 = HEAP32[140040 >> 2] | 0;
+ if (($1050 | 0) == 0) {
+ label = 245;
+ break;
+ } else {
+ label = 246;
+ break;
+ }
+ case 245:
+ invoke_viiii(14, 16136 | 0 | 0, 11648 | 0 | 0, 126768 | 0 | 0, 573 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 246:
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 247;
+ break;
+ } else {
+ $1056 = $1050;
+ label = 248;
+ break;
+ }
+ case 247:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1056 = HEAP32[140040 >> 2] | 0;
+ label = 248;
+ break;
+ case 248:
+ $_r0_sroa_0 = $1056;
+ if (($_r0_sroa_0 | 0) == 0) {
+ label = 252;
+ break;
+ } else {
+ label = 249;
+ break;
+ }
+ case 249:
+ _memcpy(HEAP32[$1038 >> 2] | 0 | 0, $1036 | 0, 40);
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 250;
+ break;
+ } else {
+ label = 251;
+ break;
+ }
+ case 250:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 251;
+ break;
+ case 251:
+ $1064 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1066 = invoke_iii(364, $1064 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1067 = $local_env_w4567aaac23b1c42;
+ $1069 = $1066 + 16 | 0;
+ _memcpy($1067 | 0, HEAP32[$1069 >> 2] | 0 | 0, 40);
+ $1073 = _saveSetjmp(HEAP32[$1069 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 422;
+ break;
+ case 422:
+ if (($1073 | 0) == 0) {
+ label = 286;
+ break;
+ } else {
+ label = 289;
+ break;
+ }
+ case 252:
+ invoke_viiii(14, 16136 | 0 | 0, 11648 | 0 | 0, 126872 | 0 | 0, 1581 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 253:
+ _memcpy(HEAP32[$1038 >> 2] | 0 | 0, $1036 | 0, 40);
+ if ((HEAP32[(113236 | 0) >> 2] | 0 | 0) == 0) {
+ label = 254;
+ break;
+ } else {
+ label = 255;
+ break;
+ }
+ case 254:
+ invoke_v(538);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 255;
+ break;
+ case 255:
+ $1083 = $548 + 20 | 0;
+ $1084 = HEAP32[$1083 >> 2] | 0;
+ if (($1084 | 0) == 0) {
+ label = 269;
+ break;
+ } else {
+ label = 256;
+ break;
+ }
+ case 256:
+ $1089 = HEAP32[$1084 >> 2] | 0;
+ $1093 = HEAP32[((HEAP32[138672 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($1089 | 0) == 82712) {
+ label = 257;
+ break;
+ } else {
+ $tib1_0_ph_i332 = $1089;
+ label = 258;
+ break;
+ }
+ case 257:
+ $tib1_0_ph_i332 = HEAP32[((HEAP32[($1084 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 258;
+ break;
+ case 258:
+ $1104 = HEAP32[($tib1_0_ph_i332 + 56 | 0) >> 2] | 0;
+ if (($1104 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i336 = 0;
+ $tib1_0_lcssa_i335 = $tib1_0_ph_i332;
+ label = 260;
+ break;
+ } else {
+ $dimension_tib1_029_i338 = 0;
+ $1111 = $1104;
+ label = 261;
+ break;
+ }
+ case 259:
+ $dimension_tib1_0_lcssa_i336 = $1115;
+ $tib1_0_lcssa_i335 = $1114;
+ label = 260;
+ break;
+ case 260:
+ $1109 = HEAP32[($1093 + 56 | 0) >> 2] | 0;
+ if (($1109 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i343 = 0;
+ $tib2_0_lcssa_in_i342 = $1093;
+ label = 263;
+ break;
+ } else {
+ $dimension_tib2_024_i340 = 0;
+ $1120 = $1109;
+ label = 262;
+ break;
+ }
+ case 261:
+ $1114 = HEAP32[($1111 + 8 | 0) >> 2] | 0;
+ $1115 = $dimension_tib1_029_i338 + 1 | 0;
+ $1118 = HEAP32[($1114 + 56 | 0) >> 2] | 0;
+ if (($1118 | 0) == 0) {
+ label = 259;
+ break;
+ } else {
+ $dimension_tib1_029_i338 = $1115;
+ $1111 = $1118;
+ label = 261;
+ break;
+ }
+ case 262:
+ $1123 = HEAP32[($1120 + 8 | 0) >> 2] | 0;
+ $1124 = $dimension_tib2_024_i340 + 1 | 0;
+ $1127 = HEAP32[($1123 + 56 | 0) >> 2] | 0;
+ if (($1127 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i343 = $1124;
+ $tib2_0_lcssa_in_i342 = $1123;
+ label = 263;
+ break;
+ } else {
+ $dimension_tib2_024_i340 = $1124;
+ $1120 = $1127;
+ label = 262;
+ break;
+ }
+ case 263:
+ $tib2_0_lcssa_i344 = $tib2_0_lcssa_in_i342;
+ if (($dimension_tib1_0_lcssa_i336 | 0) < ($dimension_tib2_0_lcssa_i343 | 0) | ($tib1_0_lcssa_i335 | 0) == 0) {
+ label = 269;
+ break;
+ } else {
+ $tib1_121_i347 = $tib1_0_lcssa_i335;
+ label = 264;
+ break;
+ }
+ case 264:
+ if (($tib1_121_i347 | 0) == ($tib2_0_lcssa_i344 | 0)) {
+ label = 361;
+ break;
+ } else {
+ label = 265;
+ break;
+ }
+ case 265:
+ $i_0_i350 = 0;
+ label = 266;
+ break;
+ case 266:
+ if (($i_0_i350 | 0) < (HEAP32[($tib1_121_i347 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 267;
+ break;
+ } else {
+ label = 268;
+ break;
+ }
+ case 267:
+ if ((HEAP32[((HEAP32[($tib1_121_i347 + 112 | 0) >> 2] | 0) + ($i_0_i350 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i344 | 0)) {
+ label = 361;
+ break;
+ } else {
+ $i_0_i350 = $i_0_i350 + 1 | 0;
+ label = 266;
+ break;
+ }
+ case 268:
+ $1145 = HEAP32[($tib1_121_i347 + 40 | 0) >> 2] | 0;
+ if (($1145 | 0) == 0) {
+ label = 269;
+ break;
+ } else {
+ $tib1_121_i347 = $1145;
+ label = 264;
+ break;
+ }
+ case 269:
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 270;
+ break;
+ } else {
+ label = 271;
+ break;
+ }
+ case 270:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 271;
+ break;
+ case 271:
+ $1151 = HEAP32[$1083 >> 2] | 0;
+ if (($1151 | 0) == 0) {
+ label = 285;
+ break;
+ } else {
+ label = 272;
+ break;
+ }
+ case 272:
+ $1156 = HEAP32[$1151 >> 2] | 0;
+ $1160 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($1156 | 0) == 82712) {
+ label = 273;
+ break;
+ } else {
+ $tib1_0_ph_i311 = $1156;
+ label = 274;
+ break;
+ }
+ case 273:
+ $tib1_0_ph_i311 = HEAP32[((HEAP32[($1151 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 274;
+ break;
+ case 274:
+ $1171 = HEAP32[($tib1_0_ph_i311 + 56 | 0) >> 2] | 0;
+ if (($1171 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i315 = 0;
+ $tib1_0_lcssa_i314 = $tib1_0_ph_i311;
+ label = 276;
+ break;
+ } else {
+ $dimension_tib1_029_i317 = 0;
+ $1178 = $1171;
+ label = 277;
+ break;
+ }
+ case 275:
+ $dimension_tib1_0_lcssa_i315 = $1182;
+ $tib1_0_lcssa_i314 = $1181;
+ label = 276;
+ break;
+ case 276:
+ $1176 = HEAP32[($1160 + 56 | 0) >> 2] | 0;
+ if (($1176 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i322 = 0;
+ $tib2_0_lcssa_in_i321 = $1160;
+ label = 279;
+ break;
+ } else {
+ $dimension_tib2_024_i319 = 0;
+ $1187 = $1176;
+ label = 278;
+ break;
+ }
+ case 277:
+ $1181 = HEAP32[($1178 + 8 | 0) >> 2] | 0;
+ $1182 = $dimension_tib1_029_i317 + 1 | 0;
+ $1185 = HEAP32[($1181 + 56 | 0) >> 2] | 0;
+ if (($1185 | 0) == 0) {
+ label = 275;
+ break;
+ } else {
+ $dimension_tib1_029_i317 = $1182;
+ $1178 = $1185;
+ label = 277;
+ break;
+ }
+ case 278:
+ $1190 = HEAP32[($1187 + 8 | 0) >> 2] | 0;
+ $1191 = $dimension_tib2_024_i319 + 1 | 0;
+ $1194 = HEAP32[($1190 + 56 | 0) >> 2] | 0;
+ if (($1194 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i322 = $1191;
+ $tib2_0_lcssa_in_i321 = $1190;
+ label = 279;
+ break;
+ } else {
+ $dimension_tib2_024_i319 = $1191;
+ $1187 = $1194;
+ label = 278;
+ break;
+ }
+ case 279:
+ $tib2_0_lcssa_i323 = $tib2_0_lcssa_in_i321;
+ if (($dimension_tib1_0_lcssa_i315 | 0) < ($dimension_tib2_0_lcssa_i322 | 0) | ($tib1_0_lcssa_i314 | 0) == 0) {
+ label = 285;
+ break;
+ } else {
+ $tib1_121_i326 = $tib1_0_lcssa_i314;
+ label = 280;
+ break;
+ }
+ case 280:
+ if (($tib1_121_i326 | 0) == ($tib2_0_lcssa_i323 | 0)) {
+ label = 386;
+ break;
+ } else {
+ label = 281;
+ break;
+ }
+ case 281:
+ $i_0_i329 = 0;
+ label = 282;
+ break;
+ case 282:
+ if (($i_0_i329 | 0) < (HEAP32[($tib1_121_i326 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 283;
+ break;
+ } else {
+ label = 284;
+ break;
+ }
+ case 283:
+ if ((HEAP32[((HEAP32[($tib1_121_i326 + 112 | 0) >> 2] | 0) + ($i_0_i329 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i323 | 0)) {
+ label = 386;
+ break;
+ } else {
+ $i_0_i329 = $i_0_i329 + 1 | 0;
+ label = 282;
+ break;
+ }
+ case 284:
+ $1212 = HEAP32[($tib1_121_i326 + 40 | 0) >> 2] | 0;
+ if (($1212 | 0) == 0) {
+ label = 285;
+ break;
+ } else {
+ $tib1_121_i326 = $1212;
+ label = 280;
+ break;
+ }
+ case 285:
+ invoke_vii(48, HEAP32[$1038 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 286:
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 287;
+ break;
+ } else {
+ label = 288;
+ break;
+ }
+ case 287:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 288;
+ break;
+ case 288:
+ $_r0_sroa_0 = HEAP32[140040 >> 2] | 0;
+ $1222 = invoke_ii(556, 709 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r3_sroa_0 = $1222;
+ $_r0_sroa_0 = 0;
+ $_r3_sroa_0 = $_r0_sroa_0;
+ HEAP32[($_r3_sroa_1 | 0) >> 2] = HEAP32[($_r0_sroa_1 | 0) >> 2] | 0;
+ _memcpy(HEAP32[$1069 >> 2] | 0 | 0, $1067 | 0, 40);
+ label = 179;
+ break;
+ case 289:
+ _memcpy(HEAP32[$1069 >> 2] | 0 | 0, $1067 | 0, 40);
+ if ((HEAP32[(113236 | 0) >> 2] | 0 | 0) == 0) {
+ label = 290;
+ break;
+ } else {
+ label = 291;
+ break;
+ }
+ case 290:
+ invoke_v(538);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 291;
+ break;
+ case 291:
+ $1232 = $1066 + 20 | 0;
+ $1233 = HEAP32[$1232 >> 2] | 0;
+ if (($1233 | 0) == 0) {
+ label = 305;
+ break;
+ } else {
+ label = 292;
+ break;
+ }
+ case 292:
+ $1238 = HEAP32[$1233 >> 2] | 0;
+ $1242 = HEAP32[((HEAP32[138672 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($1238 | 0) == 82712) {
+ label = 293;
+ break;
+ } else {
+ $tib1_0_ph_i290 = $1238;
+ label = 294;
+ break;
+ }
+ case 293:
+ $tib1_0_ph_i290 = HEAP32[((HEAP32[($1233 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 294;
+ break;
+ case 294:
+ $1253 = HEAP32[($tib1_0_ph_i290 + 56 | 0) >> 2] | 0;
+ if (($1253 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i294 = 0;
+ $tib1_0_lcssa_i293 = $tib1_0_ph_i290;
+ label = 296;
+ break;
+ } else {
+ $dimension_tib1_029_i296 = 0;
+ $1260 = $1253;
+ label = 297;
+ break;
+ }
+ case 295:
+ $dimension_tib1_0_lcssa_i294 = $1264;
+ $tib1_0_lcssa_i293 = $1263;
+ label = 296;
+ break;
+ case 296:
+ $1258 = HEAP32[($1242 + 56 | 0) >> 2] | 0;
+ if (($1258 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i301 = 0;
+ $tib2_0_lcssa_in_i300 = $1242;
+ label = 299;
+ break;
+ } else {
+ $dimension_tib2_024_i298 = 0;
+ $1269 = $1258;
+ label = 298;
+ break;
+ }
+ case 297:
+ $1263 = HEAP32[($1260 + 8 | 0) >> 2] | 0;
+ $1264 = $dimension_tib1_029_i296 + 1 | 0;
+ $1267 = HEAP32[($1263 + 56 | 0) >> 2] | 0;
+ if (($1267 | 0) == 0) {
+ label = 295;
+ break;
+ } else {
+ $dimension_tib1_029_i296 = $1264;
+ $1260 = $1267;
+ label = 297;
+ break;
+ }
+ case 298:
+ $1272 = HEAP32[($1269 + 8 | 0) >> 2] | 0;
+ $1273 = $dimension_tib2_024_i298 + 1 | 0;
+ $1276 = HEAP32[($1272 + 56 | 0) >> 2] | 0;
+ if (($1276 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i301 = $1273;
+ $tib2_0_lcssa_in_i300 = $1272;
+ label = 299;
+ break;
+ } else {
+ $dimension_tib2_024_i298 = $1273;
+ $1269 = $1276;
+ label = 298;
+ break;
+ }
+ case 299:
+ $tib2_0_lcssa_i302 = $tib2_0_lcssa_in_i300;
+ if (($dimension_tib1_0_lcssa_i294 | 0) < ($dimension_tib2_0_lcssa_i301 | 0) | ($tib1_0_lcssa_i293 | 0) == 0) {
+ label = 305;
+ break;
+ } else {
+ $tib1_121_i305 = $tib1_0_lcssa_i293;
+ label = 300;
+ break;
+ }
+ case 300:
+ if (($tib1_121_i305 | 0) == ($tib2_0_lcssa_i302 | 0)) {
+ label = 361;
+ break;
+ } else {
+ label = 301;
+ break;
+ }
+ case 301:
+ $i_0_i308 = 0;
+ label = 302;
+ break;
+ case 302:
+ if (($i_0_i308 | 0) < (HEAP32[($tib1_121_i305 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 303;
+ break;
+ } else {
+ label = 304;
+ break;
+ }
+ case 303:
+ if ((HEAP32[((HEAP32[($tib1_121_i305 + 112 | 0) >> 2] | 0) + ($i_0_i308 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i302 | 0)) {
+ label = 361;
+ break;
+ } else {
+ $i_0_i308 = $i_0_i308 + 1 | 0;
+ label = 302;
+ break;
+ }
+ case 304:
+ $1294 = HEAP32[($tib1_121_i305 + 40 | 0) >> 2] | 0;
+ if (($1294 | 0) == 0) {
+ label = 305;
+ break;
+ } else {
+ $tib1_121_i305 = $1294;
+ label = 300;
+ break;
+ }
+ case 305:
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 306;
+ break;
+ } else {
+ label = 307;
+ break;
+ }
+ case 306:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 307;
+ break;
+ case 307:
+ $1300 = HEAP32[$1232 >> 2] | 0;
+ if (($1300 | 0) == 0) {
+ label = 321;
+ break;
+ } else {
+ label = 308;
+ break;
+ }
+ case 308:
+ $1305 = HEAP32[$1300 >> 2] | 0;
+ $1309 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($1305 | 0) == 82712) {
+ label = 309;
+ break;
+ } else {
+ $tib1_0_ph_i269 = $1305;
+ label = 310;
+ break;
+ }
+ case 309:
+ $tib1_0_ph_i269 = HEAP32[((HEAP32[($1300 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 310;
+ break;
+ case 310:
+ $1320 = HEAP32[($tib1_0_ph_i269 + 56 | 0) >> 2] | 0;
+ if (($1320 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i273 = 0;
+ $tib1_0_lcssa_i272 = $tib1_0_ph_i269;
+ label = 312;
+ break;
+ } else {
+ $dimension_tib1_029_i275 = 0;
+ $1327 = $1320;
+ label = 313;
+ break;
+ }
+ case 311:
+ $dimension_tib1_0_lcssa_i273 = $1331;
+ $tib1_0_lcssa_i272 = $1330;
+ label = 312;
+ break;
+ case 312:
+ $1325 = HEAP32[($1309 + 56 | 0) >> 2] | 0;
+ if (($1325 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i280 = 0;
+ $tib2_0_lcssa_in_i279 = $1309;
+ label = 315;
+ break;
+ } else {
+ $dimension_tib2_024_i277 = 0;
+ $1336 = $1325;
+ label = 314;
+ break;
+ }
+ case 313:
+ $1330 = HEAP32[($1327 + 8 | 0) >> 2] | 0;
+ $1331 = $dimension_tib1_029_i275 + 1 | 0;
+ $1334 = HEAP32[($1330 + 56 | 0) >> 2] | 0;
+ if (($1334 | 0) == 0) {
+ label = 311;
+ break;
+ } else {
+ $dimension_tib1_029_i275 = $1331;
+ $1327 = $1334;
+ label = 313;
+ break;
+ }
+ case 314:
+ $1339 = HEAP32[($1336 + 8 | 0) >> 2] | 0;
+ $1340 = $dimension_tib2_024_i277 + 1 | 0;
+ $1343 = HEAP32[($1339 + 56 | 0) >> 2] | 0;
+ if (($1343 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i280 = $1340;
+ $tib2_0_lcssa_in_i279 = $1339;
+ label = 315;
+ break;
+ } else {
+ $dimension_tib2_024_i277 = $1340;
+ $1336 = $1343;
+ label = 314;
+ break;
+ }
+ case 315:
+ $tib2_0_lcssa_i281 = $tib2_0_lcssa_in_i279;
+ if (($dimension_tib1_0_lcssa_i273 | 0) < ($dimension_tib2_0_lcssa_i280 | 0) | ($tib1_0_lcssa_i272 | 0) == 0) {
+ label = 321;
+ break;
+ } else {
+ $tib1_121_i284 = $tib1_0_lcssa_i272;
+ label = 316;
+ break;
+ }
+ case 316:
+ if (($tib1_121_i284 | 0) == ($tib2_0_lcssa_i281 | 0)) {
+ label = 386;
+ break;
+ } else {
+ label = 317;
+ break;
+ }
+ case 317:
+ $i_0_i287 = 0;
+ label = 318;
+ break;
+ case 318:
+ if (($i_0_i287 | 0) < (HEAP32[($tib1_121_i284 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 319;
+ break;
+ } else {
+ label = 320;
+ break;
+ }
+ case 319:
+ if ((HEAP32[((HEAP32[($tib1_121_i284 + 112 | 0) >> 2] | 0) + ($i_0_i287 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i281 | 0)) {
+ label = 386;
+ break;
+ } else {
+ $i_0_i287 = $i_0_i287 + 1 | 0;
+ label = 318;
+ break;
+ }
+ case 320:
+ $1361 = HEAP32[($tib1_121_i284 + 40 | 0) >> 2] | 0;
+ if (($1361 | 0) == 0) {
+ label = 321;
+ break;
+ } else {
+ $tib1_121_i284 = $1361;
+ label = 316;
+ break;
+ }
+ case 321:
+ invoke_vii(48, HEAP32[$1069 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 322:
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 323;
+ break;
+ } else {
+ label = 324;
+ break;
+ }
+ case 323:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 324;
+ break;
+ case 324:
+ $1369 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1371 = invoke_iii(364, $1369 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1372 = $local_env_w4567aaac23b1c44;
+ $1374 = $1371 + 16 | 0;
+ _memcpy($1372 | 0, HEAP32[$1374 >> 2] | 0 | 0, 40);
+ $1378 = _saveSetjmp(HEAP32[$1374 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 423;
+ break;
+ case 423:
+ if (($1378 | 0) == 0) {
+ label = 325;
+ break;
+ } else {
+ label = 328;
+ break;
+ }
+ case 325:
+ $_r0_sroa_0 = 1;
+ $_r0_sroa_0_0_load604 = $_r0_sroa_0;
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 326;
+ break;
+ } else {
+ label = 327;
+ break;
+ }
+ case 326:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 327;
+ break;
+ case 327:
+ HEAP32[140048 >> 2] = $_r0_sroa_0_0_load604;
+ $1391 = invoke_ii(HEAP32[((HEAP32[((HEAP32[$_r3_sroa_0 >> 2] | 0) + 116 | 0) >> 2] | 0) + 4 | 0) >> 2] | 0 | 0, $_r3_sroa_0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0 = $1391;
+ invoke_viiii(14, 16136 | 0 | 0, 11648 | 0 | 0, 126872 | 0 | 0, 1630 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 328:
+ _memcpy(HEAP32[$1374 >> 2] | 0 | 0, $1372 | 0, 40);
+ if ((HEAP32[(113236 | 0) >> 2] | 0 | 0) == 0) {
+ label = 329;
+ break;
+ } else {
+ label = 330;
+ break;
+ }
+ case 329:
+ invoke_v(538);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 330;
+ break;
+ case 330:
+ $1400 = $1371 + 20 | 0;
+ $1401 = HEAP32[$1400 >> 2] | 0;
+ if (($1401 | 0) == 0) {
+ label = 344;
+ break;
+ } else {
+ label = 331;
+ break;
+ }
+ case 331:
+ $1406 = HEAP32[$1401 >> 2] | 0;
+ $1410 = HEAP32[((HEAP32[138672 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($1406 | 0) == 82712) {
+ label = 332;
+ break;
+ } else {
+ $tib1_0_ph_i248 = $1406;
+ label = 333;
+ break;
+ }
+ case 332:
+ $tib1_0_ph_i248 = HEAP32[((HEAP32[($1401 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 333;
+ break;
+ case 333:
+ $1421 = HEAP32[($tib1_0_ph_i248 + 56 | 0) >> 2] | 0;
+ if (($1421 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i252 = 0;
+ $tib1_0_lcssa_i251 = $tib1_0_ph_i248;
+ label = 335;
+ break;
+ } else {
+ $dimension_tib1_029_i254 = 0;
+ $1428 = $1421;
+ label = 336;
+ break;
+ }
+ case 334:
+ $dimension_tib1_0_lcssa_i252 = $1432;
+ $tib1_0_lcssa_i251 = $1431;
+ label = 335;
+ break;
+ case 335:
+ $1426 = HEAP32[($1410 + 56 | 0) >> 2] | 0;
+ if (($1426 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i259 = 0;
+ $tib2_0_lcssa_in_i258 = $1410;
+ label = 338;
+ break;
+ } else {
+ $dimension_tib2_024_i256 = 0;
+ $1437 = $1426;
+ label = 337;
+ break;
+ }
+ case 336:
+ $1431 = HEAP32[($1428 + 8 | 0) >> 2] | 0;
+ $1432 = $dimension_tib1_029_i254 + 1 | 0;
+ $1435 = HEAP32[($1431 + 56 | 0) >> 2] | 0;
+ if (($1435 | 0) == 0) {
+ label = 334;
+ break;
+ } else {
+ $dimension_tib1_029_i254 = $1432;
+ $1428 = $1435;
+ label = 336;
+ break;
+ }
+ case 337:
+ $1440 = HEAP32[($1437 + 8 | 0) >> 2] | 0;
+ $1441 = $dimension_tib2_024_i256 + 1 | 0;
+ $1444 = HEAP32[($1440 + 56 | 0) >> 2] | 0;
+ if (($1444 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i259 = $1441;
+ $tib2_0_lcssa_in_i258 = $1440;
+ label = 338;
+ break;
+ } else {
+ $dimension_tib2_024_i256 = $1441;
+ $1437 = $1444;
+ label = 337;
+ break;
+ }
+ case 338:
+ $tib2_0_lcssa_i260 = $tib2_0_lcssa_in_i258;
+ if (($dimension_tib1_0_lcssa_i252 | 0) < ($dimension_tib2_0_lcssa_i259 | 0) | ($tib1_0_lcssa_i251 | 0) == 0) {
+ label = 344;
+ break;
+ } else {
+ $tib1_121_i263 = $tib1_0_lcssa_i251;
+ label = 339;
+ break;
+ }
+ case 339:
+ if (($tib1_121_i263 | 0) == ($tib2_0_lcssa_i260 | 0)) {
+ label = 361;
+ break;
+ } else {
+ label = 340;
+ break;
+ }
+ case 340:
+ $i_0_i266 = 0;
+ label = 341;
+ break;
+ case 341:
+ if (($i_0_i266 | 0) < (HEAP32[($tib1_121_i263 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 342;
+ break;
+ } else {
+ label = 343;
+ break;
+ }
+ case 342:
+ if ((HEAP32[((HEAP32[($tib1_121_i263 + 112 | 0) >> 2] | 0) + ($i_0_i266 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i260 | 0)) {
+ label = 361;
+ break;
+ } else {
+ $i_0_i266 = $i_0_i266 + 1 | 0;
+ label = 341;
+ break;
+ }
+ case 343:
+ $1462 = HEAP32[($tib1_121_i263 + 40 | 0) >> 2] | 0;
+ if (($1462 | 0) == 0) {
+ label = 344;
+ break;
+ } else {
+ $tib1_121_i263 = $1462;
+ label = 339;
+ break;
+ }
+ case 344:
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 345;
+ break;
+ } else {
+ label = 346;
+ break;
+ }
+ case 345:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 346;
+ break;
+ case 346:
+ $1468 = HEAP32[$1400 >> 2] | 0;
+ if (($1468 | 0) == 0) {
+ label = 360;
+ break;
+ } else {
+ label = 347;
+ break;
+ }
+ case 347:
+ $1473 = HEAP32[$1468 >> 2] | 0;
+ $1477 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($1473 | 0) == 82712) {
+ label = 348;
+ break;
+ } else {
+ $tib1_0_ph_i227 = $1473;
+ label = 349;
+ break;
+ }
+ case 348:
+ $tib1_0_ph_i227 = HEAP32[((HEAP32[($1468 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 349;
+ break;
+ case 349:
+ $1488 = HEAP32[($tib1_0_ph_i227 + 56 | 0) >> 2] | 0;
+ if (($1488 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i231 = 0;
+ $tib1_0_lcssa_i230 = $tib1_0_ph_i227;
+ label = 351;
+ break;
+ } else {
+ $dimension_tib1_029_i233 = 0;
+ $1495 = $1488;
+ label = 352;
+ break;
+ }
+ case 350:
+ $dimension_tib1_0_lcssa_i231 = $1499;
+ $tib1_0_lcssa_i230 = $1498;
+ label = 351;
+ break;
+ case 351:
+ $1493 = HEAP32[($1477 + 56 | 0) >> 2] | 0;
+ if (($1493 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i238 = 0;
+ $tib2_0_lcssa_in_i237 = $1477;
+ label = 354;
+ break;
+ } else {
+ $dimension_tib2_024_i235 = 0;
+ $1504 = $1493;
+ label = 353;
+ break;
+ }
+ case 352:
+ $1498 = HEAP32[($1495 + 8 | 0) >> 2] | 0;
+ $1499 = $dimension_tib1_029_i233 + 1 | 0;
+ $1502 = HEAP32[($1498 + 56 | 0) >> 2] | 0;
+ if (($1502 | 0) == 0) {
+ label = 350;
+ break;
+ } else {
+ $dimension_tib1_029_i233 = $1499;
+ $1495 = $1502;
+ label = 352;
+ break;
+ }
+ case 353:
+ $1507 = HEAP32[($1504 + 8 | 0) >> 2] | 0;
+ $1508 = $dimension_tib2_024_i235 + 1 | 0;
+ $1511 = HEAP32[($1507 + 56 | 0) >> 2] | 0;
+ if (($1511 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i238 = $1508;
+ $tib2_0_lcssa_in_i237 = $1507;
+ label = 354;
+ break;
+ } else {
+ $dimension_tib2_024_i235 = $1508;
+ $1504 = $1511;
+ label = 353;
+ break;
+ }
+ case 354:
+ $tib2_0_lcssa_i239 = $tib2_0_lcssa_in_i237;
+ if (($dimension_tib1_0_lcssa_i231 | 0) < ($dimension_tib2_0_lcssa_i238 | 0) | ($tib1_0_lcssa_i230 | 0) == 0) {
+ label = 360;
+ break;
+ } else {
+ $tib1_121_i242 = $tib1_0_lcssa_i230;
+ label = 355;
+ break;
+ }
+ case 355:
+ if (($tib1_121_i242 | 0) == ($tib2_0_lcssa_i239 | 0)) {
+ label = 386;
+ break;
+ } else {
+ label = 356;
+ break;
+ }
+ case 356:
+ $i_0_i245 = 0;
+ label = 357;
+ break;
+ case 357:
+ if (($i_0_i245 | 0) < (HEAP32[($tib1_121_i242 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 358;
+ break;
+ } else {
+ label = 359;
+ break;
+ }
+ case 358:
+ if ((HEAP32[((HEAP32[($tib1_121_i242 + 112 | 0) >> 2] | 0) + ($i_0_i245 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i239 | 0)) {
+ label = 386;
+ break;
+ } else {
+ $i_0_i245 = $i_0_i245 + 1 | 0;
+ label = 357;
+ break;
+ }
+ case 359:
+ $1529 = HEAP32[($tib1_121_i242 + 40 | 0) >> 2] | 0;
+ if (($1529 | 0) == 0) {
+ label = 360;
+ break;
+ } else {
+ $tib1_121_i242 = $1529;
+ label = 355;
+ break;
+ }
+ case 360:
+ invoke_vii(48, HEAP32[$1374 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 361:
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 362;
+ break;
+ } else {
+ label = 363;
+ break;
+ }
+ case 362:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 363;
+ break;
+ case 363:
+ $1536 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1538 = invoke_iii(364, $1536 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1539 = $local_env_w4567aaac23b1c48;
+ $1541 = $1538 + 16 | 0;
+ _memcpy($1539 | 0, HEAP32[$1541 >> 2] | 0 | 0, 40);
+ $1545 = _saveSetjmp(HEAP32[$1541 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 424;
+ break;
+ case 424:
+ if (($1545 | 0) == 0) {
+ label = 364;
+ break;
+ } else {
+ label = 369;
+ break;
+ }
+ case 364:
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 365;
+ break;
+ } else {
+ label = 366;
+ break;
+ }
+ case 365:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 366;
+ break;
+ case 366:
+ $1551 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1553 = invoke_iii(364, $1551 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0 = HEAP32[($1553 + 20 | 0) >> 2] | 0;
+ $_r0_sroa_0 = 0;
+ $_r0_sroa_0_0_load602 = $_r0_sroa_0;
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 367;
+ break;
+ } else {
+ label = 368;
+ break;
+ }
+ case 367:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 368;
+ break;
+ case 368:
+ HEAP32[140048 >> 2] = $_r0_sroa_0_0_load602;
+ _memcpy(HEAP32[$1541 >> 2] | 0 | 0, $1539 | 0, 40);
+ label = 239;
+ break;
+ case 369:
+ _memcpy(HEAP32[$1541 >> 2] | 0 | 0, $1539 | 0, 40);
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 370;
+ break;
+ } else {
+ label = 371;
+ break;
+ }
+ case 370:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 371;
+ break;
+ case 371:
+ $1570 = HEAP32[($1538 + 20 | 0) >> 2] | 0;
+ if (($1570 | 0) == 0) {
+ label = 385;
+ break;
+ } else {
+ label = 372;
+ break;
+ }
+ case 372:
+ $1575 = HEAP32[$1570 >> 2] | 0;
+ $1579 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($1575 | 0) == 82712) {
+ label = 373;
+ break;
+ } else {
+ $tib1_0_ph_i185 = $1575;
+ label = 374;
+ break;
+ }
+ case 373:
+ $tib1_0_ph_i185 = HEAP32[((HEAP32[($1570 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 374;
+ break;
+ case 374:
+ $1590 = HEAP32[($tib1_0_ph_i185 + 56 | 0) >> 2] | 0;
+ if (($1590 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i189 = 0;
+ $tib1_0_lcssa_i188 = $tib1_0_ph_i185;
+ label = 376;
+ break;
+ } else {
+ $dimension_tib1_029_i191 = 0;
+ $1597 = $1590;
+ label = 377;
+ break;
+ }
+ case 375:
+ $dimension_tib1_0_lcssa_i189 = $1601;
+ $tib1_0_lcssa_i188 = $1600;
+ label = 376;
+ break;
+ case 376:
+ $1595 = HEAP32[($1579 + 56 | 0) >> 2] | 0;
+ if (($1595 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i196 = 0;
+ $tib2_0_lcssa_in_i195 = $1579;
+ label = 379;
+ break;
+ } else {
+ $dimension_tib2_024_i193 = 0;
+ $1606 = $1595;
+ label = 378;
+ break;
+ }
+ case 377:
+ $1600 = HEAP32[($1597 + 8 | 0) >> 2] | 0;
+ $1601 = $dimension_tib1_029_i191 + 1 | 0;
+ $1604 = HEAP32[($1600 + 56 | 0) >> 2] | 0;
+ if (($1604 | 0) == 0) {
+ label = 375;
+ break;
+ } else {
+ $dimension_tib1_029_i191 = $1601;
+ $1597 = $1604;
+ label = 377;
+ break;
+ }
+ case 378:
+ $1609 = HEAP32[($1606 + 8 | 0) >> 2] | 0;
+ $1610 = $dimension_tib2_024_i193 + 1 | 0;
+ $1613 = HEAP32[($1609 + 56 | 0) >> 2] | 0;
+ if (($1613 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i196 = $1610;
+ $tib2_0_lcssa_in_i195 = $1609;
+ label = 379;
+ break;
+ } else {
+ $dimension_tib2_024_i193 = $1610;
+ $1606 = $1613;
+ label = 378;
+ break;
+ }
+ case 379:
+ $tib2_0_lcssa_i197 = $tib2_0_lcssa_in_i195;
+ if (($dimension_tib1_0_lcssa_i189 | 0) < ($dimension_tib2_0_lcssa_i196 | 0) | ($tib1_0_lcssa_i188 | 0) == 0) {
+ label = 385;
+ break;
+ } else {
+ $tib1_121_i200 = $tib1_0_lcssa_i188;
+ label = 380;
+ break;
+ }
+ case 380:
+ if (($tib1_121_i200 | 0) == ($tib2_0_lcssa_i197 | 0)) {
+ label = 54;
+ break;
+ } else {
+ label = 381;
+ break;
+ }
+ case 381:
+ $i_0_i203 = 0;
+ label = 382;
+ break;
+ case 382:
+ if (($i_0_i203 | 0) < (HEAP32[($tib1_121_i200 + 108 | 0) >> 2] | 0 | 0)) {
+ label = 383;
+ break;
+ } else {
+ label = 384;
+ break;
+ }
+ case 383:
+ if ((HEAP32[((HEAP32[($tib1_121_i200 + 112 | 0) >> 2] | 0) + ($i_0_i203 << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i197 | 0)) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i203 = $i_0_i203 + 1 | 0;
+ label = 382;
+ break;
+ }
+ case 384:
+ $1631 = HEAP32[($tib1_121_i200 + 40 | 0) >> 2] | 0;
+ if (($1631 | 0) == 0) {
+ label = 385;
+ break;
+ } else {
+ $tib1_121_i200 = $1631;
+ label = 380;
+ break;
+ }
+ case 385:
+ invoke_vii(48, HEAP32[$1541 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 386:
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 387;
+ break;
+ } else {
+ label = 388;
+ break;
+ }
+ case 387:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 388;
+ break;
+ case 388:
+ $1638 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1640 = invoke_iii(364, $1638 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1641 = $local_env_w4567aaac23b1c50;
+ $1643 = $1640 + 16 | 0;
+ _memcpy($1641 | 0, HEAP32[$1643 >> 2] | 0 | 0, 40);
+ $1647 = _saveSetjmp(HEAP32[$1643 >> 2] | 0 | 0, label, setjmpTable) | 0;
+ label = 425;
+ break;
+ case 425:
+ if (($1647 | 0) == 0) {
+ label = 389;
+ break;
+ } else {
+ label = 396;
+ break;
+ }
+ case 389:
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 390;
+ break;
+ } else {
+ label = 391;
+ break;
+ }
+ case 390:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 391;
+ break;
+ case 391:
+ $1653 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1655 = invoke_iii(364, $1653 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0 = HEAP32[($1655 + 20 | 0) >> 2] | 0;
+ $_r2_sroa_0 = 0;
+ $_r2_sroa_0_0_load = $_r2_sroa_0;
+ if ((HEAP32[(98772 | 0) >> 2] | 0 | 0) == 0) {
+ label = 392;
+ break;
+ } else {
+ label = 393;
+ break;
+ }
+ case 392:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 393;
+ break;
+ case 393:
+ HEAP32[140048 >> 2] = $_r2_sroa_0_0_load;
+ if ((HEAP32[(105500 | 0) >> 2] | 0 | 0) == 0) {
+ label = 394;
+ break;
+ } else {
+ label = 395;
+ break;
+ }
+ case 394:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 395;
+ break;
+ case 395:
+ $1666 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1668 = invoke_iii(364, $1666 | 0, 0 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ HEAP32[($1668 + 20 | 0) >> 2] = $_r0_sroa_0;
+ invoke_vii(48, HEAP32[($1668 + 16 | 0) >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 396:
+ _memcpy(HEAP32[$1643 >> 2] | 0 | 0, $1641 | 0, 40);
+ if ((HEAP32[(107740 | 0) >> 2] | 0 | 0) == 0) {
+ label = 397;
+ break;
+ } else {
+ label = 398;
+ break;
+ }
+ case 397:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 398;
+ break;
+ case 398:
+ $1684 = HEAP32[($1640 + 20 | 0) >> 2] | 0;
+ if (($1684 | 0) == 0) {
+ label = 412;
+ break;
+ } else {
+ label = 399;
+ break;
+ }
+ case 399:
+ $1689 = HEAP32[$1684 >> 2] | 0;
+ $1693 = HEAP32[((HEAP32[137616 >> 2] | 0) + 8 | 0) >> 2] | 0;
+ if (($1689 | 0) == 82712) {
+ label = 400;
+ break;
+ } else {
+ $tib1_0_ph_i = $1689;
+ label = 401;
+ break;
+ }
+ case 400:
+ $tib1_0_ph_i = HEAP32[((HEAP32[($1684 + 8 | 0) >> 2] | 0) + 8 | 0) >> 2] | 0;
+ label = 401;
+ break;
+ case 401:
+ $1704 = HEAP32[($tib1_0_ph_i + 56 | 0) >> 2] | 0;
+ if (($1704 | 0) == 0) {
+ $dimension_tib1_0_lcssa_i = 0;
+ $tib1_0_lcssa_i = $tib1_0_ph_i;
+ label = 403;
+ break;
+ } else {
+ $dimension_tib1_029_i = 0;
+ $1711 = $1704;
+ label = 404;
+ break;
+ }
+ case 402:
+ $dimension_tib1_0_lcssa_i = $1715;
+ $tib1_0_lcssa_i = $1714;
+ label = 403;
+ break;
+ case 403:
+ $1709 = HEAP32[($1693 + 56 | 0) >> 2] | 0;
+ if (($1709 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i = 0;
+ $tib2_0_lcssa_in_i = $1693;
+ label = 406;
+ break;
+ } else {
+ $dimension_tib2_024_i = 0;
+ $1720 = $1709;
+ label = 405;
+ break;
+ }
+ case 404:
+ $1714 = HEAP32[($1711 + 8 | 0) >> 2] | 0;
+ $1715 = $dimension_tib1_029_i + 1 | 0;
+ $1718 = HEAP32[($1714 + 56 | 0) >> 2] | 0;
+ if (($1718 | 0) == 0) {
+ label = 402;
+ break;
+ } else {
+ $dimension_tib1_029_i = $1715;
+ $1711 = $1718;
+ label = 404;
+ break;
+ }
+ case 405:
+ $1723 = HEAP32[($1720 + 8 | 0) >> 2] | 0;
+ $1724 = $dimension_tib2_024_i + 1 | 0;
+ $1727 = HEAP32[($1723 + 56 | 0) >> 2] | 0;
+ if (($1727 | 0) == 0) {
+ $dimension_tib2_0_lcssa_i = $1724;
+ $tib2_0_lcssa_in_i = $1723;
+ label = 406;
+ break;
+ } else {
+ $dimension_tib2_024_i = $1724;
+ $1720 = $1727;
+ label = 405;
+ break;
+ }
+ case 406:
+ $tib2_0_lcssa_i = $tib2_0_lcssa_in_i;
+ if (($dimension_tib1_0_lcssa_i | 0) < ($dimension_tib2_0_lcssa_i | 0) | ($tib1_0_lcssa_i | 0) == 0) {
+ label = 412;
+ break;
+ } else {
+ $tib1_121_i = $tib1_0_lcssa_i;
+ label = 407;
+ break;
+ }
+ case 407:
+ if (($tib1_121_i | 0) == ($tib2_0_lcssa_i | 0)) {
+ label = 54;
+ break;
+ } else {
+ label = 408;
+ break;
+ }
+ case 408:
+ $i_0_i = 0;
+ label = 409;
+ break;
+ case 409:
+ if (($i_0_i | 0) < (HEAP32[($tib1_121_i + 108 | 0) >> 2] | 0 | 0)) {
+ label = 410;
+ break;
+ } else {
+ label = 411;
+ break;
+ }
+ case 410:
+ if ((HEAP32[((HEAP32[($tib1_121_i + 112 | 0) >> 2] | 0) + ($i_0_i << 2) | 0) >> 2] | 0 | 0) == ($tib2_0_lcssa_i | 0)) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i = $i_0_i + 1 | 0;
+ label = 409;
+ break;
+ }
+ case 411:
+ $1745 = HEAP32[($tib1_121_i + 40 | 0) >> 2] | 0;
+ if (($1745 | 0) == 0) {
+ label = 412;
+ break;
+ } else {
+ $tib1_121_i = $1745;
+ label = 407;
+ break;
+ }
+ case 412:
+ invoke_vii(48, HEAP32[$1643 >> 2] | 0 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case -1111:
+ if ((setjmpLabel | 0) == 7) {
+ $25 = threwValue;
+ label = 413;
+ } else if ((setjmpLabel | 0) == 35) {
+ $159 = threwValue;
+ label = 414;
+ } else if ((setjmpLabel | 0) == 62) {
+ $290 = threwValue;
+ label = 415;
+ } else if ((setjmpLabel | 0) == 91) {
+ $401 = threwValue;
+ label = 416;
+ } else if ((setjmpLabel | 0) == 97) {
+ $433 = threwValue;
+ label = 417;
+ } else if ((setjmpLabel | 0) == 144) {
+ $629 = threwValue;
+ label = 418;
+ } else if ((setjmpLabel | 0) == 181) {
+ $789 = threwValue;
+ label = 419;
+ } else if ((setjmpLabel | 0) == 218) {
+ $954 = threwValue;
+ label = 420;
+ } else if ((setjmpLabel | 0) == 240) {
+ $1042 = threwValue;
+ label = 421;
+ } else if ((setjmpLabel | 0) == 251) {
+ $1073 = threwValue;
+ label = 422;
+ } else if ((setjmpLabel | 0) == 324) {
+ $1378 = threwValue;
+ label = 423;
+ } else if ((setjmpLabel | 0) == 363) {
+ $1545 = threwValue;
+ label = 424;
+ } else if ((setjmpLabel | 0) == 388) {
+ $1647 = threwValue;
+ label = 425;
+ }
+ __THREW__ = threwValue = 0;
+ break;
+ }
+}
diff --git a/tools/eliminator/asm-eliminator-test.js b/tools/eliminator/asm-eliminator-test.js
index 5f75e9c1..9b9cd3f7 100644
--- a/tools/eliminator/asm-eliminator-test.js
+++ b/tools/eliminator/asm-eliminator-test.js
@@ -593,5 +593,6090 @@ function __ZN23b2EdgeAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_(
STACKTOP = __stackBase__;
return;
}
-// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "__Z11printResultPiS_j", "_segment_holding", "__ZN5identC2EiPKcPci", "_vec2Length", "exc", "label", "confuusion", "tempDouble", "_org_apache_harmony_luni_util_NumberConverter_freeFormat__", "__ZN23b2EdgeAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_"]
+function _java_nio_charset_Charset_forNameInternal___java_lang_String($n1) {
+ $n1 = $n1 | 0;
+ var $_r0_sroa_0 = 0, $_r0_sroa_1 = 0, $_r1_sroa_0 = 0, $_r2_sroa_0 = 0, $_r3_sroa_0 = 0, $_r3_sroa_1 = 0, $_r5_sroa_0 = 0, $local_env_w4567aaac23b1b6 = 0;
+ var $local_env_w4567aaac23b1c16 = 0, $local_env_w4567aaac23b1c22 = 0, $local_env_w4567aaac23b1c24 = 0, $local_env_w4567aaac23b1c26 = 0, $local_env_w4567aaac23b1c29 = 0, $local_env_w4567aaac23b1c31 = 0, $local_env_w4567aaac23b1c35 = 0, $local_env_w4567aaac23b1c40 = 0;
+ var $local_env_w4567aaac23b1c42 = 0, $local_env_w4567aaac23b1c44 = 0, $local_env_w4567aaac23b1c48 = 0, $local_env_w4567aaac23b1c50 = 0, $1 = 0, $2 = 0, $5 = 0, $6 = 0;
+ var $7 = 0, $8 = 0, $11 = 0, $_r1_sroa_0_0_load601 = 0, $12 = 0, $13 = 0, $14 = 0, $16 = 0;
+ var $17$0 = 0, $17$1 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0;
+ var $24 = 0, $25 = 0, $26 = 0, $28 = 0, $29 = 0, $31 = 0, $32 = 0, $_r0_sroa_0_0_load622 = 0;
+ var $33 = 0, $34 = 0, $35 = 0, $36 = 0, $37 = 0, $38 = 0, $_r0_sroa_0_0_load621 = 0, $39 = 0;
+ var $_r5_sroa_0_0_load592 = 0, $40 = 0, $41 = 0, $_r0_sroa_0_0_load620 = 0, $42 = 0, $_r0_sroa_0_0_load619 = 0, $43 = 0, $45 = 0;
+ var $46 = 0, $47 = 0, $50 = 0, $51 = 0, $52 = 0, $53 = 0, $55 = 0, $56 = 0;
+ var $57 = 0, $58 = 0, $59 = 0, $60 = 0, $61 = 0, $62 = 0, $64 = 0, $65 = 0;
+ var $66 = 0, $67 = 0, $68 = 0, $69 = 0, $70 = 0, $tib1_0_ph_i543 = 0, $71 = 0, $72 = 0;
+ var $73 = 0, $74 = 0, $tib1_0_lcssa_i546 = 0, $dimension_tib1_0_lcssa_i547 = 0, $75 = 0, $76 = 0, $77 = 0, $78 = 0;
+ var $79 = 0, $dimension_tib1_029_i549 = 0, $80 = 0, $81 = 0, $82 = 0, $83 = 0, $84 = 0, $85 = 0;
+ var $86 = 0, $87 = 0, $88 = 0, $dimension_tib2_024_i551 = 0, $89 = 0, $90 = 0, $91 = 0, $92 = 0;
+ var $93 = 0, $94 = 0, $95 = 0, $96 = 0, $tib2_0_lcssa_in_i553 = 0, $dimension_tib2_0_lcssa_i554 = 0, $tib2_0_lcssa_i555 = 0, $97 = 0;
+ var $98 = 0, $or_cond_i556 = 0, $tib1_121_i558 = 0, $99 = 0, $100 = 0, $101 = 0, $102 = 0, $i_0_i561 = 0;
+ var $104 = 0, $106 = 0, $107 = 0, $108 = 0, $109 = 0, $110 = 0, $112 = 0, $113 = 0;
+ var $114 = 0, $115 = 0, $116 = 0, $_r1_sroa_0_0_load600 = 0, $118 = 0, $119 = 0, $120 = 0, $121 = 0;
+ var $122 = 0, $123 = 0, $124 = 0, $125 = 0, $126 = 0, $127 = 0, $128 = 0, $129 = 0;
+ var $131 = 0, $132 = 0, $133 = 0, $134 = 0, $135 = 0, $136 = 0, $137 = 0, $138 = 0;
+ var $139 = 0, $140 = 0, $142 = 0, $_r0_sroa_0_0_load618 = 0, $143 = 0, $_r5_sroa_0_0_load591 = 0, $145 = 0, $146 = 0;
+ var $147 = 0, $149 = 0, $150$0 = 0, $150$1 = 0, $151 = 0, $153 = 0, $154 = 0, $155 = 0;
+ var $156 = 0, $157 = 0, $158 = 0, $159 = 0, $160 = 0, $163 = 0, $164 = 0, $165 = 0;
+ var $168 = 0, $169 = 0, $170 = 0, $171 = 0, $173 = 0, $174 = 0, $175 = 0, $176 = 0;
+ var $177 = 0, $178 = 0, $179 = 0, $180 = 0, $182 = 0, $183 = 0, $184 = 0, $185 = 0;
+ var $186 = 0, $187 = 0, $188 = 0, $tib1_0_ph_i521 = 0, $189 = 0, $190 = 0, $191 = 0, $192 = 0;
+ var $tib1_0_lcssa_i524 = 0, $dimension_tib1_0_lcssa_i525 = 0, $193 = 0, $194 = 0, $195 = 0, $196 = 0, $197 = 0, $dimension_tib1_029_i527 = 0;
+ var $198 = 0, $199 = 0, $200 = 0, $201 = 0, $202 = 0, $203 = 0, $204 = 0, $205 = 0;
+ var $206 = 0, $dimension_tib2_024_i529 = 0, $207 = 0, $208 = 0, $209 = 0, $210 = 0, $211 = 0, $212 = 0;
+ var $213 = 0, $214 = 0, $tib2_0_lcssa_in_i531 = 0, $dimension_tib2_0_lcssa_i532 = 0, $tib2_0_lcssa_i533 = 0, $215 = 0, $216 = 0, $or_cond_i534 = 0;
+ var $tib1_121_i536 = 0, $217 = 0, $218 = 0, $219 = 0, $220 = 0, $i_0_i539 = 0, $222 = 0, $224 = 0;
+ var $225 = 0, $226 = 0, $227 = 0, $228 = 0, $230 = 0, $231 = 0, $232 = 0, $233 = 0;
+ var $234 = 0, $235 = 0, $236 = 0, $238 = 0, $239$0 = 0, $239$1 = 0, $240 = 0, $241 = 0;
+ var $242 = 0, $243 = 0, $244 = 0, $_r1_sroa_0_0_load = 0, $245 = 0, $246 = 0, $247 = 0, $248 = 0;
+ var $249 = 0, $250 = 0, $251 = 0, $252 = 0, $253 = 0, $254 = 0, $255 = 0, $256 = 0;
+ var $258 = 0, $259 = 0, $260 = 0, $261 = 0, $262 = 0, $263 = 0, $264 = 0, $265 = 0;
+ var $266 = 0, $267 = 0, $269 = 0, $270 = 0, $271 = 0, $273 = 0, $274$0 = 0, $274$1 = 0;
+ var $275 = 0, $_r0_sroa_0_0_load617 = 0, $276 = 0, $277 = 0, $278 = 0, $279 = 0, $280 = 0, $281 = 0;
+ var $282 = 0, $284 = 0, $285 = 0, $286 = 0, $287 = 0, $288 = 0, $289 = 0, $290 = 0;
+ var $291 = 0, $_r5_sroa_0_0_load590 = 0, $293 = 0, $294 = 0, $296 = 0, $297 = 0, $_r0_sroa_0_0_load616 = 0, $298 = 0;
+ var $300 = 0, $302 = 0, $303 = 0, $305 = 0, $306 = 0, $307 = 0, $308 = 0, $_r0_sroa_0_0_load615 = 0;
+ var $309 = 0, $_r0_sroa_0_0_load614 = 0, $310 = 0, $311 = 0, $312 = 0, $314 = 0, $316 = 0, $317 = 0;
+ var $318 = 0, $321 = 0, $322 = 0, $323 = 0, $324 = 0, $326 = 0, $327 = 0, $328 = 0;
+ var $329 = 0, $330 = 0, $331 = 0, $332 = 0, $333 = 0, $335 = 0, $336 = 0, $337 = 0;
+ var $338 = 0, $339 = 0, $340 = 0, $341 = 0, $tib1_0_ph_i500 = 0, $342 = 0, $343 = 0, $344 = 0;
+ var $345 = 0, $tib1_0_lcssa_i503 = 0, $dimension_tib1_0_lcssa_i504 = 0, $346 = 0, $347 = 0, $348 = 0, $349 = 0, $350 = 0;
+ var $dimension_tib1_029_i506 = 0, $351 = 0, $352 = 0, $353 = 0, $354 = 0, $355 = 0, $356 = 0, $357 = 0;
+ var $358 = 0, $359 = 0, $dimension_tib2_024_i508 = 0, $360 = 0, $361 = 0, $362 = 0, $363 = 0, $364 = 0;
+ var $365 = 0, $366 = 0, $367 = 0, $tib2_0_lcssa_in_i510 = 0, $dimension_tib2_0_lcssa_i511 = 0, $tib2_0_lcssa_i512 = 0, $368 = 0, $369 = 0;
+ var $or_cond_i513 = 0, $tib1_121_i515 = 0, $370 = 0, $371 = 0, $372 = 0, $373 = 0, $i_0_i518 = 0, $375 = 0;
+ var $377 = 0, $378 = 0, $379 = 0, $380 = 0, $381 = 0, $383 = 0, $384 = 0, $385 = 0;
+ var $386 = 0, $387 = 0, $389 = 0, $390 = 0, $392 = 0, $393$0 = 0, $393$1 = 0, $394 = 0;
+ var $395 = 0, $396 = 0, $397 = 0, $398 = 0, $399 = 0, $400 = 0, $401 = 0, $402 = 0;
+ var $404 = 0, $405 = 0, $407 = 0, $408 = 0, $_r0_sroa_0_0_load613 = 0, $409 = 0, $410 = 0, $411 = 0;
+ var $412 = 0, $413 = 0, $414 = 0, $_r0_sroa_0_0_load612 = 0, $415 = 0, $_r5_sroa_0_0_load589 = 0, $416 = 0, $417 = 0;
+ var $_r0_sroa_0_0_load611 = 0, $418 = 0, $420 = 0, $421 = 0, $422 = 0, $424 = 0, $425$0 = 0, $425$1 = 0;
+ var $426 = 0, $427 = 0, $428 = 0, $429 = 0, $430 = 0, $431 = 0, $432 = 0, $433 = 0;
+ var $434 = 0, $_r0_sroa_0_0_load610 = 0, $436 = 0, $_r5_sroa_0_0_load588 = 0, $437 = 0, $439 = 0, $440 = 0, $441 = 0;
+ var $444 = 0, $445 = 0, $446 = 0, $447 = 0, $449 = 0, $450 = 0, $451 = 0, $452 = 0;
+ var $453 = 0, $454 = 0, $455 = 0, $456 = 0, $458 = 0, $459 = 0, $460 = 0, $461 = 0;
+ var $462 = 0, $463 = 0, $464 = 0, $tib1_0_ph_i479 = 0, $465 = 0, $466 = 0, $467 = 0, $468 = 0;
+ var $tib1_0_lcssa_i482 = 0, $dimension_tib1_0_lcssa_i483 = 0, $469 = 0, $470 = 0, $471 = 0, $472 = 0, $473 = 0, $dimension_tib1_029_i485 = 0;
+ var $474 = 0, $475 = 0, $476 = 0, $477 = 0, $478 = 0, $479 = 0, $480 = 0, $481 = 0;
+ var $482 = 0, $dimension_tib2_024_i487 = 0, $483 = 0, $484 = 0, $485 = 0, $486 = 0, $487 = 0, $488 = 0;
+ var $489 = 0, $490 = 0, $tib2_0_lcssa_in_i489 = 0, $dimension_tib2_0_lcssa_i490 = 0, $tib2_0_lcssa_i491 = 0, $491 = 0, $492 = 0, $or_cond_i492 = 0;
+ var $tib1_121_i494 = 0, $493 = 0, $494 = 0, $495 = 0, $496 = 0, $i_0_i497 = 0, $498 = 0, $500 = 0;
+ var $501 = 0, $502 = 0, $503 = 0, $504 = 0, $506 = 0, $507 = 0, $508 = 0, $509 = 0;
+ var $510 = 0, $512 = 0, $513 = 0, $516 = 0, $517 = 0, $519 = 0, $520$0 = 0, $520$1 = 0;
+ var $521 = 0, $522 = 0, $523 = 0, $525 = 0, $526 = 0, $527 = 0, $528 = 0, $529 = 0;
+ var $530 = 0, $531 = 0, $532 = 0, $_phi_trans_insert = 0, $_pre = 0, $534 = 0, $535 = 0, $536 = 0;
+ var $537 = 0, $538 = 0, $539 = 0, $540 = 0, $541 = 0, $_r2_sroa_0_0_load599 = 0, $542 = 0, $543 = 0;
+ var $544 = 0, $546 = 0, $547$0 = 0, $547$1 = 0, $548 = 0, $550 = 0, $551 = 0, $552 = 0;
+ var $555 = 0, $556 = 0, $557 = 0, $558 = 0, $560 = 0, $561 = 0, $562 = 0, $563 = 0;
+ var $564 = 0, $565 = 0, $566 = 0, $567 = 0, $569 = 0, $570 = 0, $571 = 0, $572 = 0;
+ var $573 = 0, $574 = 0, $575 = 0, $tib1_0_ph_i458 = 0, $576 = 0, $577 = 0, $578 = 0, $579 = 0;
+ var $tib1_0_lcssa_i461 = 0, $dimension_tib1_0_lcssa_i462 = 0, $580 = 0, $581 = 0, $582 = 0, $583 = 0, $584 = 0, $dimension_tib1_029_i464 = 0;
+ var $585 = 0, $586 = 0, $587 = 0, $588 = 0, $589 = 0, $590 = 0, $591 = 0, $592 = 0;
+ var $593 = 0, $dimension_tib2_024_i466 = 0, $594 = 0, $595 = 0, $596 = 0, $597 = 0, $598 = 0, $599 = 0;
+ var $600 = 0, $601 = 0, $tib2_0_lcssa_in_i468 = 0, $dimension_tib2_0_lcssa_i469 = 0, $tib2_0_lcssa_i470 = 0, $602 = 0, $603 = 0, $or_cond_i471 = 0;
+ var $tib1_121_i473 = 0, $604 = 0, $605 = 0, $606 = 0, $607 = 0, $i_0_i476 = 0, $609 = 0, $611 = 0;
+ var $612 = 0, $613 = 0, $614 = 0, $615 = 0, $617 = 0, $618 = 0, $619 = 0, $620 = 0;
+ var $621 = 0, $623 = 0, $624 = 0, $625 = 0, $626 = 0, $627 = 0, $628 = 0, $629 = 0;
+ var $630 = 0, $632 = 0, $633 = 0, $_r2_sroa_0_0_load598 = 0, $_r0_sroa_0_0_load609 = 0, $_r0_sroa_0_0_load624 = 0, $634 = 0, $_r0_sroa_1_4__r3_sroa_1_4_idx108_idx = 0;
+ var $_r0_sroa_1_4_idx = 0, $635 = 0, $637 = 0, $638 = 0, $639 = 0, $642 = 0, $643 = 0, $644 = 0;
+ var $645 = 0, $647 = 0, $648 = 0, $649 = 0, $650 = 0, $651 = 0, $652 = 0, $653 = 0;
+ var $654 = 0, $656 = 0, $657 = 0, $658 = 0, $659 = 0, $660 = 0, $661 = 0, $662 = 0;
+ var $tib1_0_ph_i437 = 0, $663 = 0, $664 = 0, $665 = 0, $666 = 0, $tib1_0_lcssa_i440 = 0, $dimension_tib1_0_lcssa_i441 = 0, $667 = 0;
+ var $668 = 0, $669 = 0, $670 = 0, $671 = 0, $dimension_tib1_029_i443 = 0, $672 = 0, $673 = 0, $674 = 0;
+ var $675 = 0, $676 = 0, $677 = 0, $678 = 0, $679 = 0, $680 = 0, $dimension_tib2_024_i445 = 0, $681 = 0;
+ var $682 = 0, $683 = 0, $684 = 0, $685 = 0, $686 = 0, $687 = 0, $688 = 0, $tib2_0_lcssa_in_i447 = 0;
+ var $dimension_tib2_0_lcssa_i448 = 0, $tib2_0_lcssa_i449 = 0, $689 = 0, $690 = 0, $or_cond_i450 = 0, $tib1_121_i452 = 0, $691 = 0, $692 = 0;
+ var $693 = 0, $694 = 0, $i_0_i455 = 0, $696 = 0, $698 = 0, $699 = 0, $700 = 0, $701 = 0;
+ var $702 = 0, $704 = 0, $705 = 0, $706 = 0, $707 = 0, $708 = 0, $711 = 0, $712 = 0;
+ var $714 = 0, $715 = 0, $716 = 0, $717 = 0, $718 = 0, $719 = 0, $720 = 0, $721 = 0;
+ var $723 = 0, $724 = 0, $725 = 0, $726 = 0, $727 = 0, $728 = 0, $729 = 0, $tib1_0_ph_i416 = 0;
+ var $730 = 0, $731 = 0, $732 = 0, $733 = 0, $tib1_0_lcssa_i419 = 0, $dimension_tib1_0_lcssa_i420 = 0, $734 = 0, $735 = 0;
+ var $736 = 0, $737 = 0, $738 = 0, $dimension_tib1_029_i422 = 0, $739 = 0, $740 = 0, $741 = 0, $742 = 0;
+ var $743 = 0, $744 = 0, $745 = 0, $746 = 0, $747 = 0, $dimension_tib2_024_i424 = 0, $748 = 0, $749 = 0;
+ var $750 = 0, $751 = 0, $752 = 0, $753 = 0, $754 = 0, $755 = 0, $tib2_0_lcssa_in_i426 = 0, $dimension_tib2_0_lcssa_i427 = 0;
+ var $tib2_0_lcssa_i428 = 0, $756 = 0, $757 = 0, $or_cond_i429 = 0, $tib1_121_i431 = 0, $758 = 0, $759 = 0, $760 = 0;
+ var $761 = 0, $i_0_i434 = 0, $763 = 0, $765 = 0, $766 = 0, $767 = 0, $768 = 0, $769 = 0;
+ var $771 = 0, $772 = 0, $773 = 0, $774 = 0, $775 = 0, $777 = 0, $778 = 0, $780 = 0;
+ var $781$0 = 0, $781$1 = 0, $782 = 0, $783 = 0, $784 = 0, $785 = 0, $786 = 0, $787 = 0;
+ var $788 = 0, $789 = 0, $790 = 0, $_r3_sroa_0_0_load596 = 0, $792 = 0, $793 = 0, $794 = 0, $795 = 0;
+ var $796 = 0, $797 = 0, $_r3_sroa_0_0_load595 = 0, $798 = 0, $799 = 0, $_r0_sroa_0_0_load608 = 0, $800 = 0, $802 = 0;
+ var $803 = 0, $804 = 0, $807 = 0, $808 = 0, $809 = 0, $810 = 0, $812 = 0, $813 = 0;
+ var $814 = 0, $815 = 0, $816 = 0, $817 = 0, $818 = 0, $819 = 0, $821 = 0, $822 = 0;
+ var $823 = 0, $824 = 0, $825 = 0, $826 = 0, $827 = 0, $tib1_0_ph_i395 = 0, $828 = 0, $829 = 0;
+ var $830 = 0, $831 = 0, $tib1_0_lcssa_i398 = 0, $dimension_tib1_0_lcssa_i399 = 0, $832 = 0, $833 = 0, $834 = 0, $835 = 0;
+ var $836 = 0, $dimension_tib1_029_i401 = 0, $837 = 0, $838 = 0, $839 = 0, $840 = 0, $841 = 0, $842 = 0;
+ var $843 = 0, $844 = 0, $845 = 0, $dimension_tib2_024_i403 = 0, $846 = 0, $847 = 0, $848 = 0, $849 = 0;
+ var $850 = 0, $851 = 0, $852 = 0, $853 = 0, $tib2_0_lcssa_in_i405 = 0, $dimension_tib2_0_lcssa_i406 = 0, $tib2_0_lcssa_i407 = 0, $854 = 0;
+ var $855 = 0, $or_cond_i408 = 0, $tib1_121_i410 = 0, $856 = 0, $857 = 0, $858 = 0, $859 = 0, $i_0_i413 = 0;
+ var $861 = 0, $863 = 0, $864 = 0, $865 = 0, $866 = 0, $867 = 0, $869 = 0, $870 = 0;
+ var $871 = 0, $872 = 0, $873 = 0, $876 = 0, $877 = 0, $879 = 0, $880 = 0, $881 = 0;
+ var $882 = 0, $883 = 0, $884 = 0, $885 = 0, $886 = 0, $888 = 0, $889 = 0, $890 = 0;
+ var $891 = 0, $892 = 0, $893 = 0, $894 = 0, $tib1_0_ph_i374 = 0, $895 = 0, $896 = 0, $897 = 0;
+ var $898 = 0, $tib1_0_lcssa_i377 = 0, $dimension_tib1_0_lcssa_i378 = 0, $899 = 0, $900 = 0, $901 = 0, $902 = 0, $903 = 0;
+ var $dimension_tib1_029_i380 = 0, $904 = 0, $905 = 0, $906 = 0, $907 = 0, $908 = 0, $909 = 0, $910 = 0;
+ var $911 = 0, $912 = 0, $dimension_tib2_024_i382 = 0, $913 = 0, $914 = 0, $915 = 0, $916 = 0, $917 = 0;
+ var $918 = 0, $919 = 0, $920 = 0, $tib2_0_lcssa_in_i384 = 0, $dimension_tib2_0_lcssa_i385 = 0, $tib2_0_lcssa_i386 = 0, $921 = 0, $922 = 0;
+ var $or_cond_i387 = 0, $tib1_121_i389 = 0, $923 = 0, $924 = 0, $925 = 0, $926 = 0, $i_0_i392 = 0, $928 = 0;
+ var $930 = 0, $931 = 0, $932 = 0, $933 = 0, $934 = 0, $936 = 0, $937 = 0, $938 = 0;
+ var $939 = 0, $940 = 0, $942 = 0, $943 = 0, $945 = 0, $946$0 = 0, $946$1 = 0, $947 = 0;
+ var $948 = 0, $949 = 0, $950 = 0, $951 = 0, $952 = 0, $953 = 0, $954 = 0, $955 = 0;
+ var $_r0_sroa_0_0_load607 = 0, $957 = 0, $958 = 0, $960 = 0, $962 = 0, $963 = 0, $964 = 0, $967 = 0;
+ var $968 = 0, $969 = 0, $970 = 0, $972 = 0, $973 = 0, $974 = 0, $975 = 0, $976 = 0;
+ var $977 = 0, $978 = 0, $979 = 0, $981 = 0, $982 = 0, $983 = 0, $984 = 0, $985 = 0;
+ var $986 = 0, $987 = 0, $tib1_0_ph_i353 = 0, $988 = 0, $989 = 0, $990 = 0, $991 = 0, $tib1_0_lcssa_i356 = 0;
+ var $dimension_tib1_0_lcssa_i357 = 0, $992 = 0, $993 = 0, $994 = 0, $995 = 0, $996 = 0, $dimension_tib1_029_i359 = 0, $997 = 0;
+ var $998 = 0, $999 = 0, $1000 = 0, $1001 = 0, $1002 = 0, $1003 = 0, $1004 = 0, $1005 = 0;
+ var $dimension_tib2_024_i361 = 0, $1006 = 0, $1007 = 0, $1008 = 0, $1009 = 0, $1010 = 0, $1011 = 0, $1012 = 0;
+ var $1013 = 0, $tib2_0_lcssa_in_i363 = 0, $dimension_tib2_0_lcssa_i364 = 0, $tib2_0_lcssa_i365 = 0, $1014 = 0, $1015 = 0, $or_cond_i366 = 0, $tib1_121_i368 = 0;
+ var $1016 = 0, $1017 = 0, $1018 = 0, $1019 = 0, $i_0_i371 = 0, $1021 = 0, $1023 = 0, $1024 = 0;
+ var $1025 = 0, $1026 = 0, $1027 = 0, $1029 = 0, $1030 = 0, $1031 = 0, $1032 = 0, $1033 = 0;
+ var $1036 = 0, $1037 = 0, $1038 = 0, $1039 = 0, $1040 = 0, $1041 = 0, $1042 = 0, $1043 = 0;
+ var $1045 = 0, $1046 = 0, $_pr = 0, $1048 = 0, $1050 = 0, $1051 = 0, $1053 = 0, $1054 = 0;
+ var $_pre855 = 0, $1056 = 0, $1057 = 0, $_r0_sroa_0_0_load606 = 0, $1058 = 0, $1060 = 0, $1061 = 0, $1062 = 0;
+ var $1064 = 0, $1065$0 = 0, $1065$1 = 0, $1066 = 0, $1067 = 0, $1068 = 0, $1069 = 0, $1070 = 0;
+ var $1071 = 0, $1072 = 0, $1073 = 0, $1074 = 0, $1077 = 0, $1078 = 0, $1079 = 0, $1082 = 0;
+ var $1083 = 0, $1084 = 0, $1085 = 0, $1087 = 0, $1088 = 0, $1089 = 0, $1090 = 0, $1091 = 0;
+ var $1092 = 0, $1093 = 0, $1094 = 0, $1096 = 0, $1097 = 0, $1098 = 0, $1099 = 0, $1100 = 0;
+ var $1101 = 0, $1102 = 0, $tib1_0_ph_i332 = 0, $1103 = 0, $1104 = 0, $1105 = 0, $1106 = 0, $tib1_0_lcssa_i335 = 0;
+ var $dimension_tib1_0_lcssa_i336 = 0, $1107 = 0, $1108 = 0, $1109 = 0, $1110 = 0, $1111 = 0, $dimension_tib1_029_i338 = 0, $1112 = 0;
+ var $1113 = 0, $1114 = 0, $1115 = 0, $1116 = 0, $1117 = 0, $1118 = 0, $1119 = 0, $1120 = 0;
+ var $dimension_tib2_024_i340 = 0, $1121 = 0, $1122 = 0, $1123 = 0, $1124 = 0, $1125 = 0, $1126 = 0, $1127 = 0;
+ var $1128 = 0, $tib2_0_lcssa_in_i342 = 0, $dimension_tib2_0_lcssa_i343 = 0, $tib2_0_lcssa_i344 = 0, $1129 = 0, $1130 = 0, $or_cond_i345 = 0, $tib1_121_i347 = 0;
+ var $1131 = 0, $1132 = 0, $1133 = 0, $1134 = 0, $i_0_i350 = 0, $1136 = 0, $1138 = 0, $1139 = 0;
+ var $1140 = 0, $1141 = 0, $1142 = 0, $1144 = 0, $1145 = 0, $1146 = 0, $1147 = 0, $1148 = 0;
+ var $1151 = 0, $1152 = 0, $1154 = 0, $1155 = 0, $1156 = 0, $1157 = 0, $1158 = 0, $1159 = 0;
+ var $1160 = 0, $1161 = 0, $1163 = 0, $1164 = 0, $1165 = 0, $1166 = 0, $1167 = 0, $1168 = 0;
+ var $1169 = 0, $tib1_0_ph_i311 = 0, $1170 = 0, $1171 = 0, $1172 = 0, $1173 = 0, $tib1_0_lcssa_i314 = 0, $dimension_tib1_0_lcssa_i315 = 0;
+ var $1174 = 0, $1175 = 0, $1176 = 0, $1177 = 0, $1178 = 0, $dimension_tib1_029_i317 = 0, $1179 = 0, $1180 = 0;
+ var $1181 = 0, $1182 = 0, $1183 = 0, $1184 = 0, $1185 = 0, $1186 = 0, $1187 = 0, $dimension_tib2_024_i319 = 0;
+ var $1188 = 0, $1189 = 0, $1190 = 0, $1191 = 0, $1192 = 0, $1193 = 0, $1194 = 0, $1195 = 0;
+ var $tib2_0_lcssa_in_i321 = 0, $dimension_tib2_0_lcssa_i322 = 0, $tib2_0_lcssa_i323 = 0, $1196 = 0, $1197 = 0, $or_cond_i324 = 0, $tib1_121_i326 = 0, $1198 = 0;
+ var $1199 = 0, $1200 = 0, $1201 = 0, $i_0_i329 = 0, $1203 = 0, $1205 = 0, $1206 = 0, $1207 = 0;
+ var $1208 = 0, $1209 = 0, $1211 = 0, $1212 = 0, $1213 = 0, $1214 = 0, $1215 = 0, $1217 = 0;
+ var $1218 = 0, $1220 = 0, $1221 = 0, $1222 = 0, $_r0_sroa_0_0_load605 = 0, $_r3_sroa_0_0_load594 = 0, $_r0_sroa_0_0_load623 = 0, $1223 = 0;
+ var $_r0_sroa_1_4__r3_sroa_1_4_idx_idx = 0, $_r0_sroa_1_4_idx156 = 0, $1224 = 0, $1226 = 0, $1227 = 0, $1228 = 0, $1231 = 0, $1232 = 0;
+ var $1233 = 0, $1234 = 0, $1236 = 0, $1237 = 0, $1238 = 0, $1239 = 0, $1240 = 0, $1241 = 0;
+ var $1242 = 0, $1243 = 0, $1245 = 0, $1246 = 0, $1247 = 0, $1248 = 0, $1249 = 0, $1250 = 0;
+ var $1251 = 0, $tib1_0_ph_i290 = 0, $1252 = 0, $1253 = 0, $1254 = 0, $1255 = 0, $tib1_0_lcssa_i293 = 0, $dimension_tib1_0_lcssa_i294 = 0;
+ var $1256 = 0, $1257 = 0, $1258 = 0, $1259 = 0, $1260 = 0, $dimension_tib1_029_i296 = 0, $1261 = 0, $1262 = 0;
+ var $1263 = 0, $1264 = 0, $1265 = 0, $1266 = 0, $1267 = 0, $1268 = 0, $1269 = 0, $dimension_tib2_024_i298 = 0;
+ var $1270 = 0, $1271 = 0, $1272 = 0, $1273 = 0, $1274 = 0, $1275 = 0, $1276 = 0, $1277 = 0;
+ var $tib2_0_lcssa_in_i300 = 0, $dimension_tib2_0_lcssa_i301 = 0, $tib2_0_lcssa_i302 = 0, $1278 = 0, $1279 = 0, $or_cond_i303 = 0, $tib1_121_i305 = 0, $1280 = 0;
+ var $1281 = 0, $1282 = 0, $1283 = 0, $i_0_i308 = 0, $1285 = 0, $1287 = 0, $1288 = 0, $1289 = 0;
+ var $1290 = 0, $1291 = 0, $1293 = 0, $1294 = 0, $1295 = 0, $1296 = 0, $1297 = 0, $1300 = 0;
+ var $1301 = 0, $1303 = 0, $1304 = 0, $1305 = 0, $1306 = 0, $1307 = 0, $1308 = 0, $1309 = 0;
+ var $1310 = 0, $1312 = 0, $1313 = 0, $1314 = 0, $1315 = 0, $1316 = 0, $1317 = 0, $1318 = 0;
+ var $tib1_0_ph_i269 = 0, $1319 = 0, $1320 = 0, $1321 = 0, $1322 = 0, $tib1_0_lcssa_i272 = 0, $dimension_tib1_0_lcssa_i273 = 0, $1323 = 0;
+ var $1324 = 0, $1325 = 0, $1326 = 0, $1327 = 0, $dimension_tib1_029_i275 = 0, $1328 = 0, $1329 = 0, $1330 = 0;
+ var $1331 = 0, $1332 = 0, $1333 = 0, $1334 = 0, $1335 = 0, $1336 = 0, $dimension_tib2_024_i277 = 0, $1337 = 0;
+ var $1338 = 0, $1339 = 0, $1340 = 0, $1341 = 0, $1342 = 0, $1343 = 0, $1344 = 0, $tib2_0_lcssa_in_i279 = 0;
+ var $dimension_tib2_0_lcssa_i280 = 0, $tib2_0_lcssa_i281 = 0, $1345 = 0, $1346 = 0, $or_cond_i282 = 0, $tib1_121_i284 = 0, $1347 = 0, $1348 = 0;
+ var $1349 = 0, $1350 = 0, $i_0_i287 = 0, $1352 = 0, $1354 = 0, $1355 = 0, $1356 = 0, $1357 = 0;
+ var $1358 = 0, $1360 = 0, $1361 = 0, $1362 = 0, $1363 = 0, $1364 = 0, $1366 = 0, $1367 = 0;
+ var $1369 = 0, $1370$0 = 0, $1370$1 = 0, $1371 = 0, $1372 = 0, $1373 = 0, $1374 = 0, $1375 = 0;
+ var $1376 = 0, $1377 = 0, $1378 = 0, $1379 = 0, $_r0_sroa_0_0_load604 = 0, $1381 = 0, $1382 = 0, $_r3_sroa_0_0_load593 = 0;
+ var $1384 = 0, $1385 = 0, $1386 = 0, $1387 = 0, $1388 = 0, $1389 = 0, $1390 = 0, $_r3_sroa_0_0_load = 0;
+ var $1391 = 0, $1392 = 0, $1394 = 0, $1395 = 0, $1396 = 0, $1399 = 0, $1400 = 0, $1401 = 0;
+ var $1402 = 0, $1404 = 0, $1405 = 0, $1406 = 0, $1407 = 0, $1408 = 0, $1409 = 0, $1410 = 0;
+ var $1411 = 0, $1413 = 0, $1414 = 0, $1415 = 0, $1416 = 0, $1417 = 0, $1418 = 0, $1419 = 0;
+ var $tib1_0_ph_i248 = 0, $1420 = 0, $1421 = 0, $1422 = 0, $1423 = 0, $tib1_0_lcssa_i251 = 0, $dimension_tib1_0_lcssa_i252 = 0, $1424 = 0;
+ var $1425 = 0, $1426 = 0, $1427 = 0, $1428 = 0, $dimension_tib1_029_i254 = 0, $1429 = 0, $1430 = 0, $1431 = 0;
+ var $1432 = 0, $1433 = 0, $1434 = 0, $1435 = 0, $1436 = 0, $1437 = 0, $dimension_tib2_024_i256 = 0, $1438 = 0;
+ var $1439 = 0, $1440 = 0, $1441 = 0, $1442 = 0, $1443 = 0, $1444 = 0, $1445 = 0, $tib2_0_lcssa_in_i258 = 0;
+ var $dimension_tib2_0_lcssa_i259 = 0, $tib2_0_lcssa_i260 = 0, $1446 = 0, $1447 = 0, $or_cond_i261 = 0, $tib1_121_i263 = 0, $1448 = 0, $1449 = 0;
+ var $1450 = 0, $1451 = 0, $i_0_i266 = 0, $1453 = 0, $1455 = 0, $1456 = 0, $1457 = 0, $1458 = 0;
+ var $1459 = 0, $1461 = 0, $1462 = 0, $1463 = 0, $1464 = 0, $1465 = 0, $1468 = 0, $1469 = 0;
+ var $1471 = 0, $1472 = 0, $1473 = 0, $1474 = 0, $1475 = 0, $1476 = 0, $1477 = 0, $1478 = 0;
+ var $1480 = 0, $1481 = 0, $1482 = 0, $1483 = 0, $1484 = 0, $1485 = 0, $1486 = 0, $tib1_0_ph_i227 = 0;
+ var $1487 = 0, $1488 = 0, $1489 = 0, $1490 = 0, $tib1_0_lcssa_i230 = 0, $dimension_tib1_0_lcssa_i231 = 0, $1491 = 0, $1492 = 0;
+ var $1493 = 0, $1494 = 0, $1495 = 0, $dimension_tib1_029_i233 = 0, $1496 = 0, $1497 = 0, $1498 = 0, $1499 = 0;
+ var $1500 = 0, $1501 = 0, $1502 = 0, $1503 = 0, $1504 = 0, $dimension_tib2_024_i235 = 0, $1505 = 0, $1506 = 0;
+ var $1507 = 0, $1508 = 0, $1509 = 0, $1510 = 0, $1511 = 0, $1512 = 0, $tib2_0_lcssa_in_i237 = 0, $dimension_tib2_0_lcssa_i238 = 0;
+ var $tib2_0_lcssa_i239 = 0, $1513 = 0, $1514 = 0, $or_cond_i240 = 0, $tib1_121_i242 = 0, $1515 = 0, $1516 = 0, $1517 = 0;
+ var $1518 = 0, $i_0_i245 = 0, $1520 = 0, $1522 = 0, $1523 = 0, $1524 = 0, $1525 = 0, $1526 = 0;
+ var $1528 = 0, $1529 = 0, $1530 = 0, $1531 = 0, $1532 = 0, $1533 = 0, $1534 = 0, $1536 = 0;
+ var $1537$0 = 0, $1537$1 = 0, $1538 = 0, $1539 = 0, $1540 = 0, $1541 = 0, $1542 = 0, $1543 = 0;
+ var $1544 = 0, $1545 = 0, $1546 = 0, $1548 = 0, $1549 = 0, $1551 = 0, $1552$0 = 0, $1552$1 = 0;
+ var $1553 = 0, $1554 = 0, $1555 = 0, $1556 = 0, $1557 = 0, $_r0_sroa_0_0_load602 = 0, $1558 = 0, $1559 = 0;
+ var $1561 = 0, $1563 = 0, $1564 = 0, $1565 = 0, $1568 = 0, $1569 = 0, $1570 = 0, $1571 = 0;
+ var $1573 = 0, $1574 = 0, $1575 = 0, $1576 = 0, $1577 = 0, $1578 = 0, $1579 = 0, $1580 = 0;
+ var $1582 = 0, $1583 = 0, $1584 = 0, $1585 = 0, $1586 = 0, $1587 = 0, $1588 = 0, $tib1_0_ph_i185 = 0;
+ var $1589 = 0, $1590 = 0, $1591 = 0, $1592 = 0, $tib1_0_lcssa_i188 = 0, $dimension_tib1_0_lcssa_i189 = 0, $1593 = 0, $1594 = 0;
+ var $1595 = 0, $1596 = 0, $1597 = 0, $dimension_tib1_029_i191 = 0, $1598 = 0, $1599 = 0, $1600 = 0, $1601 = 0;
+ var $1602 = 0, $1603 = 0, $1604 = 0, $1605 = 0, $1606 = 0, $dimension_tib2_024_i193 = 0, $1607 = 0, $1608 = 0;
+ var $1609 = 0, $1610 = 0, $1611 = 0, $1612 = 0, $1613 = 0, $1614 = 0, $tib2_0_lcssa_in_i195 = 0, $dimension_tib2_0_lcssa_i196 = 0;
+ var $tib2_0_lcssa_i197 = 0, $1615 = 0, $1616 = 0, $or_cond_i198 = 0, $tib1_121_i200 = 0, $1617 = 0, $1618 = 0, $1619 = 0;
+ var $1620 = 0, $i_0_i203 = 0, $1622 = 0, $1624 = 0, $1625 = 0, $1626 = 0, $1627 = 0, $1628 = 0;
+ var $1630 = 0, $1631 = 0, $1632 = 0, $1633 = 0, $1634 = 0, $1635 = 0, $1636 = 0, $1638 = 0;
+ var $1639$0 = 0, $1639$1 = 0, $1640 = 0, $1641 = 0, $1642 = 0, $1643 = 0, $1644 = 0, $1645 = 0;
+ var $1646 = 0, $1647 = 0, $1648 = 0, $1650 = 0, $1651 = 0, $1653 = 0, $1654$0 = 0, $1654$1 = 0;
+ var $1655 = 0, $1656 = 0, $1657 = 0, $1658 = 0, $1659 = 0, $_r2_sroa_0_0_load = 0, $1660 = 0, $1661 = 0;
+ var $1663 = 0, $1664 = 0, $1666 = 0, $1667$0 = 0, $1667$1 = 0, $1668 = 0, $_r0_sroa_0_0_load = 0, $1669 = 0;
+ var $1670 = 0, $1671 = 0, $1672 = 0, $1673 = 0, $1674 = 0, $1675 = 0, $1677 = 0, $1678 = 0;
+ var $1679 = 0, $1682 = 0, $1683 = 0, $1684 = 0, $1685 = 0, $1687 = 0, $1688 = 0, $1689 = 0;
+ var $1690 = 0, $1691 = 0, $1692 = 0, $1693 = 0, $1694 = 0, $1696 = 0, $1697 = 0, $1698 = 0;
+ var $1699 = 0, $1700 = 0, $1701 = 0, $1702 = 0, $tib1_0_ph_i = 0, $1703 = 0, $1704 = 0, $1705 = 0;
+ var $1706 = 0, $tib1_0_lcssa_i = 0, $dimension_tib1_0_lcssa_i = 0, $1707 = 0, $1708 = 0, $1709 = 0, $1710 = 0, $1711 = 0;
+ var $dimension_tib1_029_i = 0, $1712 = 0, $1713 = 0, $1714 = 0, $1715 = 0, $1716 = 0, $1717 = 0, $1718 = 0;
+ var $1719 = 0, $1720 = 0, $dimension_tib2_024_i = 0, $1721 = 0, $1722 = 0, $1723 = 0, $1724 = 0, $1725 = 0;
+ var $1726 = 0, $1727 = 0, $1728 = 0, $tib2_0_lcssa_in_i = 0, $dimension_tib2_0_lcssa_i = 0, $tib2_0_lcssa_i = 0, $1729 = 0, $1730 = 0;
+ var $or_cond_i = 0, $tib1_121_i = 0, $1731 = 0, $1732 = 0, $1733 = 0, $1734 = 0, $i_0_i = 0, $1736 = 0;
+ var $1738 = 0, $1739 = 0, $1740 = 0, $1741 = 0, $1742 = 0, $1744 = 0, $1745 = 0, $1746 = 0;
+ var $1747 = 0, $1748 = 0;
+ var label = 0;
+ var __stackBase__ = 0;
+ __stackBase__ = STACKTOP;
+ STACKTOP = STACKTOP + 536 | 0;
+ label = 1;
+ var setjmpLabel = 0;
+ var setjmpTable = STACKTOP;
+ STACKTOP = STACKTOP + 168 | 0;
+ HEAP32[setjmpTable >> 2] = 0;
+ while (1) switch (label | 0) {
+ case 1:
+ $_r0_sroa_1 = __stackBase__ | 0;
+ $_r3_sroa_1 = __stackBase__ + 8 | 0;
+ $local_env_w4567aaac23b1b6 = __stackBase__ + 16 | 0;
+ $local_env_w4567aaac23b1c16 = __stackBase__ + 56 | 0;
+ $local_env_w4567aaac23b1c22 = __stackBase__ + 96 | 0;
+ $local_env_w4567aaac23b1c24 = __stackBase__ + 136 | 0;
+ $local_env_w4567aaac23b1c26 = __stackBase__ + 176 | 0;
+ $local_env_w4567aaac23b1c29 = __stackBase__ + 216 | 0;
+ $local_env_w4567aaac23b1c31 = __stackBase__ + 256 | 0;
+ $local_env_w4567aaac23b1c35 = __stackBase__ + 296 | 0;
+ $local_env_w4567aaac23b1c40 = __stackBase__ + 336 | 0;
+ $local_env_w4567aaac23b1c42 = __stackBase__ + 376 | 0;
+ $local_env_w4567aaac23b1c44 = __stackBase__ + 416 | 0;
+ $local_env_w4567aaac23b1c48 = __stackBase__ + 456 | 0;
+ $local_env_w4567aaac23b1c50 = __stackBase__ + 496 | 0;
+ $1 = HEAP32[(98772 | 0) >> 2] | 0;
+ $2 = ($1 | 0) == 0;
+ if ($2) {
+ label = 2;
+ break;
+ } else {
+ label = 3;
+ break;
+ }
+ case 2:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 3;
+ break;
+ case 3:
+ $_r5_sroa_0 = $n1;
+ $5 = invoke_ii(556, 709 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $6 = $5;
+ $_r0_sroa_0 = $6;
+ $7 = HEAP32[(98772 | 0) >> 2] | 0;
+ $8 = ($7 | 0) == 0;
+ if ($8) {
+ label = 4;
+ break;
+ } else {
+ label = 5;
+ break;
+ }
+ case 4:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 5;
+ break;
+ case 5:
+ $11 = HEAP32[136048 >> 2] | 0;
+ $_r1_sroa_0 = $11;
+ $_r1_sroa_0_0_load601 = $_r1_sroa_0;
+ $12 = invoke_ii(202, $_r1_sroa_0_0_load601 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $13 = HEAP32[(105500 | 0) >> 2] | 0;
+ $14 = ($13 | 0) == 0;
+ if ($14) {
+ label = 6;
+ break;
+ } else {
+ label = 7;
+ break;
+ }
+ case 6:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 7;
+ break;
+ case 7:
+ $16 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $17$0 = $16;
+ $17$1 = 0;
+ $18 = invoke_iii(364, $17$0 | 0, $17$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $19 = $local_env_w4567aaac23b1b6;
+ $20 = $18 + 16 | 0;
+ $21 = $20;
+ $22 = HEAP32[$21 >> 2] | 0;
+ _memcpy($19 | 0, $22 | 0, 40);
+ $23 = HEAP32[$21 >> 2] | 0;
+ $24 = $23;
+ $25 = _saveSetjmp($24 | 0, label, setjmpTable) | 0;
+ label = 413;
+ break;
+ case 413:
+ $26 = ($25 | 0) == 0;
+ if ($26) {
+ label = 8;
+ break;
+ } else {
+ label = 11;
+ break;
+ }
+ case 8:
+ $28 = HEAP32[(98772 | 0) >> 2] | 0;
+ $29 = ($28 | 0) == 0;
+ if ($29) {
+ label = 9;
+ break;
+ } else {
+ label = 10;
+ break;
+ }
+ case 9:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 10;
+ break;
+ case 10:
+ $31 = HEAP32[140056 >> 2] | 0;
+ $32 = $31;
+ $_r0_sroa_0 = $32;
+ $_r0_sroa_0_0_load622 = $_r0_sroa_0;
+ $33 = $_r0_sroa_0_0_load622;
+ $34 = $33 | 0;
+ $35 = HEAP32[$34 >> 2] | 0;
+ $36 = $35 + 160 | 0;
+ $37 = HEAP32[$36 >> 2] | 0;
+ $38 = $37;
+ $_r0_sroa_0_0_load621 = $_r0_sroa_0;
+ $39 = $_r0_sroa_0_0_load621;
+ $_r5_sroa_0_0_load592 = $_r5_sroa_0;
+ $40 = invoke_iii($38 | 0, $39 | 0, $_r5_sroa_0_0_load592 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $41 = $40;
+ $_r0_sroa_0 = $41;
+ $_r0_sroa_0_0_load620 = $_r0_sroa_0;
+ $_r0_sroa_0 = $_r0_sroa_0_0_load620;
+ $42 = HEAP32[$21 >> 2] | 0;
+ _memcpy($42 | 0, $19 | 0, 40);
+ $_r0_sroa_0_0_load619 = $_r0_sroa_0;
+ $43 = ($_r0_sroa_0_0_load619 | 0) == 0;
+ if ($43) {
+ label = 32;
+ break;
+ } else {
+ label = 28;
+ break;
+ }
+ case 11:
+ $45 = HEAP32[$21 >> 2] | 0;
+ _memcpy($45 | 0, $19 | 0, 40);
+ $46 = HEAP32[(107740 | 0) >> 2] | 0;
+ $47 = ($46 | 0) == 0;
+ if ($47) {
+ label = 12;
+ break;
+ } else {
+ label = 13;
+ break;
+ }
+ case 12:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 13;
+ break;
+ case 13:
+ $50 = $18 + 20 | 0;
+ $51 = $50;
+ $52 = HEAP32[$51 >> 2] | 0;
+ $53 = ($52 | 0) == 0;
+ if ($53) {
+ label = 27;
+ break;
+ } else {
+ label = 14;
+ break;
+ }
+ case 14:
+ $55 = HEAP32[137616 >> 2] | 0;
+ $56 = $52;
+ $57 = HEAP32[$56 >> 2] | 0;
+ $58 = $57;
+ $59 = $55 + 8 | 0;
+ $60 = $59;
+ $61 = HEAP32[$60 >> 2] | 0;
+ $62 = ($57 | 0) == 82712;
+ if ($62) {
+ label = 15;
+ break;
+ } else {
+ $tib1_0_ph_i543 = $58;
+ label = 16;
+ break;
+ }
+ case 15:
+ $64 = $52 + 8 | 0;
+ $65 = $64;
+ $66 = HEAP32[$65 >> 2] | 0;
+ $67 = $66 + 8 | 0;
+ $68 = $67;
+ $69 = HEAP32[$68 >> 2] | 0;
+ $70 = $69;
+ $tib1_0_ph_i543 = $70;
+ label = 16;
+ break;
+ case 16:
+ $71 = $tib1_0_ph_i543 + 56 | 0;
+ $72 = HEAP32[$71 >> 2] | 0;
+ $73 = ($72 | 0) == 0;
+ if ($73) {
+ var $dimension_tib1_0_lcssa_i547 = 0;
+ var $tib1_0_lcssa_i546 = $tib1_0_ph_i543;
+ label = 18;
+ break;
+ } else {
+ var $dimension_tib1_029_i549 = 0;
+ var $79 = $72;
+ label = 19;
+ break;
+ }
+ case 17:
+ $74 = $82;
+ var $dimension_tib1_0_lcssa_i547 = $83;
+ var $tib1_0_lcssa_i546 = $74;
+ label = 18;
+ break;
+ case 18:
+ $75 = $61 + 56 | 0;
+ $76 = $75;
+ $77 = HEAP32[$76 >> 2] | 0;
+ $78 = ($77 | 0) == 0;
+ if ($78) {
+ var $dimension_tib2_0_lcssa_i554 = 0;
+ var $tib2_0_lcssa_in_i553 = $61;
+ label = 21;
+ break;
+ } else {
+ var $dimension_tib2_024_i551 = 0;
+ var $88 = $77;
+ label = 20;
+ break;
+ }
+ case 19:
+ $80 = $79 + 8 | 0;
+ $81 = $80;
+ $82 = HEAP32[$81 >> 2] | 0;
+ $83 = $dimension_tib1_029_i549 + 1 | 0;
+ $84 = $82 + 56 | 0;
+ $85 = $84;
+ $86 = HEAP32[$85 >> 2] | 0;
+ $87 = ($86 | 0) == 0;
+ if ($87) {
+ label = 17;
+ break;
+ } else {
+ var $dimension_tib1_029_i549 = $83;
+ var $79 = $86;
+ label = 19;
+ break;
+ }
+ case 20:
+ $89 = $88 + 8 | 0;
+ $90 = $89;
+ $91 = HEAP32[$90 >> 2] | 0;
+ $92 = $dimension_tib2_024_i551 + 1 | 0;
+ $93 = $91 + 56 | 0;
+ $94 = $93;
+ $95 = HEAP32[$94 >> 2] | 0;
+ $96 = ($95 | 0) == 0;
+ if ($96) {
+ var $dimension_tib2_0_lcssa_i554 = $92;
+ var $tib2_0_lcssa_in_i553 = $91;
+ label = 21;
+ break;
+ } else {
+ var $dimension_tib2_024_i551 = $92;
+ var $88 = $95;
+ label = 20;
+ break;
+ }
+ case 21:
+ $tib2_0_lcssa_i555 = $tib2_0_lcssa_in_i553;
+ $97 = ($dimension_tib1_0_lcssa_i547 | 0) < ($dimension_tib2_0_lcssa_i554 | 0);
+ $98 = ($tib1_0_lcssa_i546 | 0) == 0;
+ $or_cond_i556 = $97 | $98;
+ if ($or_cond_i556) {
+ label = 27;
+ break;
+ } else {
+ $tib1_121_i558 = $tib1_0_lcssa_i546;
+ label = 22;
+ break;
+ }
+ case 22:
+ $99 = ($tib1_121_i558 | 0) == ($tib2_0_lcssa_i555 | 0);
+ if ($99) {
+ label = 54;
+ break;
+ } else {
+ label = 23;
+ break;
+ }
+ case 23:
+ $100 = $tib1_121_i558 + 108 | 0;
+ $101 = HEAP32[$100 >> 2] | 0;
+ $102 = $tib1_121_i558 + 112 | 0;
+ $i_0_i561 = 0;
+ label = 24;
+ break;
+ case 24:
+ $104 = ($i_0_i561 | 0) < ($101 | 0);
+ if ($104) {
+ label = 25;
+ break;
+ } else {
+ label = 26;
+ break;
+ }
+ case 25:
+ $106 = HEAP32[$102 >> 2] | 0;
+ $107 = $106 + ($i_0_i561 << 2) | 0;
+ $108 = HEAP32[$107 >> 2] | 0;
+ $109 = ($108 | 0) == ($tib2_0_lcssa_i555 | 0);
+ $110 = $i_0_i561 + 1 | 0;
+ if ($109) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i561 = $110;
+ label = 24;
+ break;
+ }
+ case 26:
+ $112 = $tib1_121_i558 + 40 | 0;
+ $113 = HEAP32[$112 >> 2] | 0;
+ $114 = ($113 | 0) == 0;
+ if ($114) {
+ label = 27;
+ break;
+ } else {
+ $tib1_121_i558 = $113;
+ label = 22;
+ break;
+ }
+ case 27:
+ $115 = HEAP32[$21 >> 2] | 0;
+ $116 = $115;
+ invoke_vii(48, $116 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 28:
+ $_r1_sroa_0_0_load600 = $_r1_sroa_0;
+ $118 = $_r1_sroa_0_0_load600 + 4 | 0;
+ $119 = $118;
+ $120 = HEAP32[$119 >> 2] | 0;
+ $121 = $120 + 8 | 0;
+ $122 = $121;
+ $123 = HEAP32[$122 >> 2] | 0;
+ $124 = $123 - 1 | 0;
+ HEAP32[$122 >> 2] = $124;
+ $125 = HEAP32[$119 >> 2] | 0;
+ $126 = $125 + 8 | 0;
+ $127 = $126;
+ $128 = HEAP32[$127 >> 2] | 0;
+ $129 = ($128 | 0) == 0;
+ if ($129) {
+ label = 29;
+ break;
+ } else {
+ label = 31;
+ break;
+ }
+ case 29:
+ invoke_vi(28, $_r1_sroa_0_0_load600 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $131 = HEAP32[$119 >> 2] | 0;
+ $132 = $131 + 16 | 0;
+ $133 = $132;
+ $134 = HEAP32[$133 >> 2] | 0;
+ $135 = $134 + 8 | 0;
+ $136 = $135;
+ $137 = HEAP32[$136 >> 2] | 0;
+ $138 = $137;
+ $139;
+ $140 = ($139 | 0) == 0;
+ if ($140) {
+ label = 31;
+ break;
+ } else {
+ label = 30;
+ break;
+ }
+ case 30:
+ $142 = invoke_iii(268, 31e3 | 0 | 0, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $139, tempInt) | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 31;
+ break;
+ case 31:
+ $_r0_sroa_0_0_load618 = $_r0_sroa_0;
+ $143 = $_r0_sroa_0_0_load618;
+ STACKTOP = __stackBase__;
+ return $143 | 0;
+ case 32:
+ $_r5_sroa_0_0_load591 = $_r5_sroa_0;
+ $145 = ($_r5_sroa_0_0_load591 | 0) == 0;
+ $146 = HEAP32[(105500 | 0) >> 2] | 0;
+ $147 = ($146 | 0) == 0;
+ if ($147) {
+ label = 33;
+ break;
+ } else {
+ label = 34;
+ break;
+ }
+ case 33:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 34;
+ break;
+ case 34:
+ $149 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $150$0 = $149;
+ $150$1 = 0;
+ $151 = invoke_iii(364, $150$0 | 0, $150$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ if ($145) {
+ label = 35;
+ break;
+ } else {
+ label = 62;
+ break;
+ }
+ case 35:
+ $153 = $local_env_w4567aaac23b1c16;
+ $154 = $151 + 16 | 0;
+ $155 = $154;
+ $156 = HEAP32[$155 >> 2] | 0;
+ _memcpy($153 | 0, $156 | 0, 40);
+ $157 = HEAP32[$155 >> 2] | 0;
+ $158 = $157;
+ $159 = _saveSetjmp($158 | 0, label, setjmpTable) | 0;
+ label = 414;
+ break;
+ case 414:
+ $160 = ($159 | 0) == 0;
+ if ($160) {
+ label = 36;
+ break;
+ } else {
+ label = 37;
+ break;
+ }
+ case 36:
+ invoke_viiii(14, 16136 | 0 | 0, 11648 | 0 | 0, 126872 | 0 | 0, 1457 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 37:
+ $163 = HEAP32[$155 >> 2] | 0;
+ _memcpy($163 | 0, $153 | 0, 40);
+ $164 = HEAP32[(107740 | 0) >> 2] | 0;
+ $165 = ($164 | 0) == 0;
+ if ($165) {
+ label = 38;
+ break;
+ } else {
+ label = 39;
+ break;
+ }
+ case 38:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 39;
+ break;
+ case 39:
+ $168 = $151 + 20 | 0;
+ $169 = $168;
+ $170 = HEAP32[$169 >> 2] | 0;
+ $171 = ($170 | 0) == 0;
+ if ($171) {
+ label = 53;
+ break;
+ } else {
+ label = 40;
+ break;
+ }
+ case 40:
+ $173 = HEAP32[137616 >> 2] | 0;
+ $174 = $170;
+ $175 = HEAP32[$174 >> 2] | 0;
+ $176 = $175;
+ $177 = $173 + 8 | 0;
+ $178 = $177;
+ $179 = HEAP32[$178 >> 2] | 0;
+ $180 = ($175 | 0) == 82712;
+ if ($180) {
+ label = 41;
+ break;
+ } else {
+ $tib1_0_ph_i521 = $176;
+ label = 42;
+ break;
+ }
+ case 41:
+ $182 = $170 + 8 | 0;
+ $183 = $182;
+ $184 = HEAP32[$183 >> 2] | 0;
+ $185 = $184 + 8 | 0;
+ $186 = $185;
+ $187 = HEAP32[$186 >> 2] | 0;
+ $188 = $187;
+ $tib1_0_ph_i521 = $188;
+ label = 42;
+ break;
+ case 42:
+ $189 = $tib1_0_ph_i521 + 56 | 0;
+ $190 = HEAP32[$189 >> 2] | 0;
+ $191 = ($190 | 0) == 0;
+ if ($191) {
+ var $dimension_tib1_0_lcssa_i525 = 0;
+ var $tib1_0_lcssa_i524 = $tib1_0_ph_i521;
+ label = 44;
+ break;
+ } else {
+ var $dimension_tib1_029_i527 = 0;
+ var $197 = $190;
+ label = 45;
+ break;
+ }
+ case 43:
+ $192 = $200;
+ var $dimension_tib1_0_lcssa_i525 = $201;
+ var $tib1_0_lcssa_i524 = $192;
+ label = 44;
+ break;
+ case 44:
+ $193 = $179 + 56 | 0;
+ $194 = $193;
+ $195 = HEAP32[$194 >> 2] | 0;
+ $196 = ($195 | 0) == 0;
+ if ($196) {
+ var $dimension_tib2_0_lcssa_i532 = 0;
+ var $tib2_0_lcssa_in_i531 = $179;
+ label = 47;
+ break;
+ } else {
+ var $dimension_tib2_024_i529 = 0;
+ var $206 = $195;
+ label = 46;
+ break;
+ }
+ case 45:
+ $198 = $197 + 8 | 0;
+ $199 = $198;
+ $200 = HEAP32[$199 >> 2] | 0;
+ $201 = $dimension_tib1_029_i527 + 1 | 0;
+ $202 = $200 + 56 | 0;
+ $203 = $202;
+ $204 = HEAP32[$203 >> 2] | 0;
+ $205 = ($204 | 0) == 0;
+ if ($205) {
+ label = 43;
+ break;
+ } else {
+ var $dimension_tib1_029_i527 = $201;
+ var $197 = $204;
+ label = 45;
+ break;
+ }
+ case 46:
+ $207 = $206 + 8 | 0;
+ $208 = $207;
+ $209 = HEAP32[$208 >> 2] | 0;
+ $210 = $dimension_tib2_024_i529 + 1 | 0;
+ $211 = $209 + 56 | 0;
+ $212 = $211;
+ $213 = HEAP32[$212 >> 2] | 0;
+ $214 = ($213 | 0) == 0;
+ if ($214) {
+ var $dimension_tib2_0_lcssa_i532 = $210;
+ var $tib2_0_lcssa_in_i531 = $209;
+ label = 47;
+ break;
+ } else {
+ var $dimension_tib2_024_i529 = $210;
+ var $206 = $213;
+ label = 46;
+ break;
+ }
+ case 47:
+ $tib2_0_lcssa_i533 = $tib2_0_lcssa_in_i531;
+ $215 = ($dimension_tib1_0_lcssa_i525 | 0) < ($dimension_tib2_0_lcssa_i532 | 0);
+ $216 = ($tib1_0_lcssa_i524 | 0) == 0;
+ $or_cond_i534 = $215 | $216;
+ if ($or_cond_i534) {
+ label = 53;
+ break;
+ } else {
+ $tib1_121_i536 = $tib1_0_lcssa_i524;
+ label = 48;
+ break;
+ }
+ case 48:
+ $217 = ($tib1_121_i536 | 0) == ($tib2_0_lcssa_i533 | 0);
+ if ($217) {
+ label = 54;
+ break;
+ } else {
+ label = 49;
+ break;
+ }
+ case 49:
+ $218 = $tib1_121_i536 + 108 | 0;
+ $219 = HEAP32[$218 >> 2] | 0;
+ $220 = $tib1_121_i536 + 112 | 0;
+ $i_0_i539 = 0;
+ label = 50;
+ break;
+ case 50:
+ $222 = ($i_0_i539 | 0) < ($219 | 0);
+ if ($222) {
+ label = 51;
+ break;
+ } else {
+ label = 52;
+ break;
+ }
+ case 51:
+ $224 = HEAP32[$220 >> 2] | 0;
+ $225 = $224 + ($i_0_i539 << 2) | 0;
+ $226 = HEAP32[$225 >> 2] | 0;
+ $227 = ($226 | 0) == ($tib2_0_lcssa_i533 | 0);
+ $228 = $i_0_i539 + 1 | 0;
+ if ($227) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i539 = $228;
+ label = 50;
+ break;
+ }
+ case 52:
+ $230 = $tib1_121_i536 + 40 | 0;
+ $231 = HEAP32[$230 >> 2] | 0;
+ $232 = ($231 | 0) == 0;
+ if ($232) {
+ label = 53;
+ break;
+ } else {
+ $tib1_121_i536 = $231;
+ label = 48;
+ break;
+ }
+ case 53:
+ $233 = HEAP32[$155 >> 2] | 0;
+ $234 = $233;
+ invoke_vii(48, $234 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 54:
+ $235 = HEAP32[(105500 | 0) >> 2] | 0;
+ $236 = ($235 | 0) == 0;
+ if ($236) {
+ label = 55;
+ break;
+ } else {
+ label = 56;
+ break;
+ }
+ case 55:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 56;
+ break;
+ case 56:
+ $238 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $239$0 = $238;
+ $239$1 = 0;
+ $240 = invoke_iii(364, $239$0 | 0, $239$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $241 = $240 + 20 | 0;
+ $242 = $241;
+ $243 = HEAP32[$242 >> 2] | 0;
+ $244 = $243;
+ $_r0_sroa_0 = $244;
+ $_r1_sroa_0_0_load = $_r1_sroa_0;
+ $245 = $_r1_sroa_0_0_load + 4 | 0;
+ $246 = $245;
+ $247 = HEAP32[$246 >> 2] | 0;
+ $248 = $247 + 8 | 0;
+ $249 = $248;
+ $250 = HEAP32[$249 >> 2] | 0;
+ $251 = $250 - 1 | 0;
+ HEAP32[$249 >> 2] = $251;
+ $252 = HEAP32[$246 >> 2] | 0;
+ $253 = $252 + 8 | 0;
+ $254 = $253;
+ $255 = HEAP32[$254 >> 2] | 0;
+ $256 = ($255 | 0) == 0;
+ if ($256) {
+ label = 57;
+ break;
+ } else {
+ label = 59;
+ break;
+ }
+ case 57:
+ invoke_vi(28, $_r1_sroa_0_0_load | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $258 = HEAP32[$246 >> 2] | 0;
+ $259 = $258 + 16 | 0;
+ $260 = $259;
+ $261 = HEAP32[$260 >> 2] | 0;
+ $262 = $261 + 8 | 0;
+ $263 = $262;
+ $264 = HEAP32[$263 >> 2] | 0;
+ $265 = $264;
+ $266;
+ $267 = ($266 | 0) == 0;
+ if ($267) {
+ label = 59;
+ break;
+ } else {
+ label = 58;
+ break;
+ }
+ case 58:
+ $269 = invoke_iii(268, 31e3 | 0 | 0, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[tempInt >> 2] = $266, tempInt) | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 59;
+ break;
+ case 59:
+ $270 = HEAP32[(105500 | 0) >> 2] | 0;
+ $271 = ($270 | 0) == 0;
+ if ($271) {
+ label = 60;
+ break;
+ } else {
+ label = 61;
+ break;
+ }
+ case 60:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 61;
+ break;
+ case 61:
+ $273 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $274$0 = $273;
+ $274$1 = 0;
+ $275 = invoke_iii(364, $274$0 | 0, $274$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0_0_load617 = $_r0_sroa_0;
+ $276 = $_r0_sroa_0_0_load617;
+ $277 = $275 + 16 | 0;
+ $278 = $275 + 20 | 0;
+ $279 = $278;
+ HEAP32[$279 >> 2] = $276;
+ $280 = $277;
+ $281 = HEAP32[$280 >> 2] | 0;
+ $282 = $281;
+ invoke_vii(48, $282 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 62:
+ $284 = $local_env_w4567aaac23b1c22;
+ $285 = $151 + 16 | 0;
+ $286 = $285;
+ $287 = HEAP32[$286 >> 2] | 0;
+ _memcpy($284 | 0, $287 | 0, 40);
+ $288 = HEAP32[$286 >> 2] | 0;
+ $289 = $288;
+ $290 = _saveSetjmp($289 | 0, label, setjmpTable) | 0;
+ label = 415;
+ break;
+ case 415:
+ $291 = ($290 | 0) == 0;
+ if ($291) {
+ label = 63;
+ break;
+ } else {
+ label = 72;
+ break;
+ }
+ case 63:
+ $_r5_sroa_0_0_load590 = $_r5_sroa_0;
+ invoke_vi(44, $_r5_sroa_0_0_load590 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $293 = HEAP32[(98772 | 0) >> 2] | 0;
+ $294 = ($293 | 0) == 0;
+ if ($294) {
+ label = 64;
+ break;
+ } else {
+ label = 65;
+ break;
+ }
+ case 64:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 65;
+ break;
+ case 65:
+ $296 = HEAP32[140064 >> 2] | 0;
+ $297 = $296;
+ $_r0_sroa_0 = $297;
+ $_r0_sroa_0_0_load616 = $_r0_sroa_0;
+ $298 = ($_r0_sroa_0_0_load616 | 0) == 0;
+ if ($298) {
+ label = 67;
+ break;
+ } else {
+ label = 66;
+ break;
+ }
+ case 66:
+ $300 = HEAP32[$286 >> 2] | 0;
+ _memcpy($300 | 0, $284 | 0, 40);
+ label = 89;
+ break;
+ case 67:
+ $302 = HEAP32[(84292 | 0) >> 2] | 0;
+ $303 = ($302 | 0) == 0;
+ if ($303) {
+ label = 68;
+ break;
+ } else {
+ label = 69;
+ break;
+ }
+ case 68:
+ invoke_v(584);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 69;
+ break;
+ case 69:
+ $305 = invoke_ii(338, 20 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $306 = $305;
+ HEAP32[$306 >> 2] = 84288;
+ $307 = $305 + 4 | 0;
+ _memset($307 | 0 | 0, 0 | 0 | 0, 16 | 0 | 0);
+ $308 = $305;
+ $_r0_sroa_0 = $308;
+ $_r0_sroa_0_0_load615 = $_r0_sroa_0;
+ $309 = $_r0_sroa_0_0_load615;
+ invoke_vi(34, $309 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0_0_load614 = $_r0_sroa_0;
+ $310 = $_r0_sroa_0_0_load614;
+ $311 = HEAP32[(98772 | 0) >> 2] | 0;
+ $312 = ($311 | 0) == 0;
+ if ($312) {
+ label = 70;
+ break;
+ } else {
+ label = 71;
+ break;
+ }
+ case 70:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 71;
+ break;
+ case 71:
+ HEAP32[140064 >> 2] = $310;
+ $314 = HEAP32[$286 >> 2] | 0;
+ _memcpy($314 | 0, $284 | 0, 40);
+ label = 89;
+ break;
+ case 72:
+ $316 = HEAP32[$286 >> 2] | 0;
+ _memcpy($316 | 0, $284 | 0, 40);
+ $317 = HEAP32[(107740 | 0) >> 2] | 0;
+ $318 = ($317 | 0) == 0;
+ if ($318) {
+ label = 73;
+ break;
+ } else {
+ label = 74;
+ break;
+ }
+ case 73:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 74;
+ break;
+ case 74:
+ $321 = $151 + 20 | 0;
+ $322 = $321;
+ $323 = HEAP32[$322 >> 2] | 0;
+ $324 = ($323 | 0) == 0;
+ if ($324) {
+ label = 88;
+ break;
+ } else {
+ label = 75;
+ break;
+ }
+ case 75:
+ $326 = HEAP32[137616 >> 2] | 0;
+ $327 = $323;
+ $328 = HEAP32[$327 >> 2] | 0;
+ $329 = $328;
+ $330 = $326 + 8 | 0;
+ $331 = $330;
+ $332 = HEAP32[$331 >> 2] | 0;
+ $333 = ($328 | 0) == 82712;
+ if ($333) {
+ label = 76;
+ break;
+ } else {
+ $tib1_0_ph_i500 = $329;
+ label = 77;
+ break;
+ }
+ case 76:
+ $335 = $323 + 8 | 0;
+ $336 = $335;
+ $337 = HEAP32[$336 >> 2] | 0;
+ $338 = $337 + 8 | 0;
+ $339 = $338;
+ $340 = HEAP32[$339 >> 2] | 0;
+ $341 = $340;
+ $tib1_0_ph_i500 = $341;
+ label = 77;
+ break;
+ case 77:
+ $342 = $tib1_0_ph_i500 + 56 | 0;
+ $343 = HEAP32[$342 >> 2] | 0;
+ $344 = ($343 | 0) == 0;
+ if ($344) {
+ var $dimension_tib1_0_lcssa_i504 = 0;
+ var $tib1_0_lcssa_i503 = $tib1_0_ph_i500;
+ label = 79;
+ break;
+ } else {
+ var $dimension_tib1_029_i506 = 0;
+ var $350 = $343;
+ label = 80;
+ break;
+ }
+ case 78:
+ $345 = $353;
+ var $dimension_tib1_0_lcssa_i504 = $354;
+ var $tib1_0_lcssa_i503 = $345;
+ label = 79;
+ break;
+ case 79:
+ $346 = $332 + 56 | 0;
+ $347 = $346;
+ $348 = HEAP32[$347 >> 2] | 0;
+ $349 = ($348 | 0) == 0;
+ if ($349) {
+ var $dimension_tib2_0_lcssa_i511 = 0;
+ var $tib2_0_lcssa_in_i510 = $332;
+ label = 82;
+ break;
+ } else {
+ var $dimension_tib2_024_i508 = 0;
+ var $359 = $348;
+ label = 81;
+ break;
+ }
+ case 80:
+ $351 = $350 + 8 | 0;
+ $352 = $351;
+ $353 = HEAP32[$352 >> 2] | 0;
+ $354 = $dimension_tib1_029_i506 + 1 | 0;
+ $355 = $353 + 56 | 0;
+ $356 = $355;
+ $357 = HEAP32[$356 >> 2] | 0;
+ $358 = ($357 | 0) == 0;
+ if ($358) {
+ label = 78;
+ break;
+ } else {
+ var $dimension_tib1_029_i506 = $354;
+ var $350 = $357;
+ label = 80;
+ break;
+ }
+ case 81:
+ $360 = $359 + 8 | 0;
+ $361 = $360;
+ $362 = HEAP32[$361 >> 2] | 0;
+ $363 = $dimension_tib2_024_i508 + 1 | 0;
+ $364 = $362 + 56 | 0;
+ $365 = $364;
+ $366 = HEAP32[$365 >> 2] | 0;
+ $367 = ($366 | 0) == 0;
+ if ($367) {
+ var $dimension_tib2_0_lcssa_i511 = $363;
+ var $tib2_0_lcssa_in_i510 = $362;
+ label = 82;
+ break;
+ } else {
+ var $dimension_tib2_024_i508 = $363;
+ var $359 = $366;
+ label = 81;
+ break;
+ }
+ case 82:
+ $tib2_0_lcssa_i512 = $tib2_0_lcssa_in_i510;
+ $368 = ($dimension_tib1_0_lcssa_i504 | 0) < ($dimension_tib2_0_lcssa_i511 | 0);
+ $369 = ($tib1_0_lcssa_i503 | 0) == 0;
+ $or_cond_i513 = $368 | $369;
+ if ($or_cond_i513) {
+ label = 88;
+ break;
+ } else {
+ $tib1_121_i515 = $tib1_0_lcssa_i503;
+ label = 83;
+ break;
+ }
+ case 83:
+ $370 = ($tib1_121_i515 | 0) == ($tib2_0_lcssa_i512 | 0);
+ if ($370) {
+ label = 54;
+ break;
+ } else {
+ label = 84;
+ break;
+ }
+ case 84:
+ $371 = $tib1_121_i515 + 108 | 0;
+ $372 = HEAP32[$371 >> 2] | 0;
+ $373 = $tib1_121_i515 + 112 | 0;
+ $i_0_i518 = 0;
+ label = 85;
+ break;
+ case 85:
+ $375 = ($i_0_i518 | 0) < ($372 | 0);
+ if ($375) {
+ label = 86;
+ break;
+ } else {
+ label = 87;
+ break;
+ }
+ case 86:
+ $377 = HEAP32[$373 >> 2] | 0;
+ $378 = $377 + ($i_0_i518 << 2) | 0;
+ $379 = HEAP32[$378 >> 2] | 0;
+ $380 = ($379 | 0) == ($tib2_0_lcssa_i512 | 0);
+ $381 = $i_0_i518 + 1 | 0;
+ if ($380) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i518 = $381;
+ label = 85;
+ break;
+ }
+ case 87:
+ $383 = $tib1_121_i515 + 40 | 0;
+ $384 = HEAP32[$383 >> 2] | 0;
+ $385 = ($384 | 0) == 0;
+ if ($385) {
+ label = 88;
+ break;
+ } else {
+ $tib1_121_i515 = $384;
+ label = 83;
+ break;
+ }
+ case 88:
+ $386 = HEAP32[$286 >> 2] | 0;
+ $387 = $386;
+ invoke_vii(48, $387 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 89:
+ $389 = HEAP32[(105500 | 0) >> 2] | 0;
+ $390 = ($389 | 0) == 0;
+ if ($390) {
+ label = 90;
+ break;
+ } else {
+ label = 91;
+ break;
+ }
+ case 90:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 91;
+ break;
+ case 91:
+ $392 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $393$0 = $392;
+ $393$1 = 0;
+ $394 = invoke_iii(364, $393$0 | 0, $393$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $395 = $local_env_w4567aaac23b1c24;
+ $396 = $394 + 16 | 0;
+ $397 = $396;
+ $398 = HEAP32[$397 >> 2] | 0;
+ _memcpy($395 | 0, $398 | 0, 40);
+ $399 = HEAP32[$397 >> 2] | 0;
+ $400 = $399;
+ $401 = _saveSetjmp($400 | 0, label, setjmpTable) | 0;
+ label = 416;
+ break;
+ case 416:
+ $402 = ($401 | 0) == 0;
+ if ($402) {
+ label = 92;
+ break;
+ } else {
+ label = 99;
+ break;
+ }
+ case 92:
+ $404 = HEAP32[(98772 | 0) >> 2] | 0;
+ $405 = ($404 | 0) == 0;
+ if ($405) {
+ label = 93;
+ break;
+ } else {
+ label = 94;
+ break;
+ }
+ case 93:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 94;
+ break;
+ case 94:
+ $407 = HEAP32[140064 >> 2] | 0;
+ $408 = $407;
+ $_r0_sroa_0 = $408;
+ $_r0_sroa_0_0_load613 = $_r0_sroa_0;
+ $409 = $_r0_sroa_0_0_load613;
+ $410 = $409 | 0;
+ $411 = HEAP32[$410 >> 2] | 0;
+ $412 = $411 + 144 | 0;
+ $413 = HEAP32[$412 >> 2] | 0;
+ $414 = $413;
+ $_r0_sroa_0_0_load612 = $_r0_sroa_0;
+ $415 = $_r0_sroa_0_0_load612;
+ $_r5_sroa_0_0_load589 = $_r5_sroa_0;
+ $416 = invoke_iii($414 | 0, $415 | 0, $_r5_sroa_0_0_load589 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $417 = $416;
+ $_r0_sroa_0 = $417;
+ $_r0_sroa_0_0_load611 = $_r0_sroa_0;
+ $418 = ($_r0_sroa_0_0_load611 | 0) == 0;
+ if ($418) {
+ label = 95;
+ break;
+ } else {
+ label = 98;
+ break;
+ }
+ case 95:
+ $420 = HEAP32[$397 >> 2] | 0;
+ _memcpy($420 | 0, $395 | 0, 40);
+ $421 = HEAP32[(105500 | 0) >> 2] | 0;
+ $422 = ($421 | 0) == 0;
+ if ($422) {
+ label = 96;
+ break;
+ } else {
+ label = 97;
+ break;
+ }
+ case 96:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 97;
+ break;
+ case 97:
+ $424 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $425$0 = $424;
+ $425$1 = 0;
+ $426 = invoke_iii(364, $425$0 | 0, $425$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $427 = $local_env_w4567aaac23b1c26;
+ $428 = $426 + 16 | 0;
+ $429 = $428;
+ $430 = HEAP32[$429 >> 2] | 0;
+ _memcpy($427 | 0, $430 | 0, 40);
+ $431 = HEAP32[$429 >> 2] | 0;
+ $432 = $431;
+ $433 = _saveSetjmp($432 | 0, label, setjmpTable) | 0;
+ label = 417;
+ break;
+ case 417:
+ $434 = ($433 | 0) == 0;
+ if ($434) {
+ label = 116;
+ break;
+ } else {
+ label = 127;
+ break;
+ }
+ case 98:
+ $_r0_sroa_0_0_load610 = $_r0_sroa_0;
+ $436 = $_r0_sroa_0_0_load610;
+ $_r5_sroa_0_0_load588 = $_r5_sroa_0;
+ invoke_vii(24, $436 | 0, $_r5_sroa_0_0_load588 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $437 = HEAP32[$397 >> 2] | 0;
+ _memcpy($437 | 0, $395 | 0, 40);
+ label = 28;
+ break;
+ case 99:
+ $439 = HEAP32[$397 >> 2] | 0;
+ _memcpy($439 | 0, $395 | 0, 40);
+ $440 = HEAP32[(107740 | 0) >> 2] | 0;
+ $441 = ($440 | 0) == 0;
+ if ($441) {
+ label = 100;
+ break;
+ } else {
+ label = 101;
+ break;
+ }
+ case 100:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 101;
+ break;
+ case 101:
+ $444 = $394 + 20 | 0;
+ $445 = $444;
+ $446 = HEAP32[$445 >> 2] | 0;
+ $447 = ($446 | 0) == 0;
+ if ($447) {
+ label = 115;
+ break;
+ } else {
+ label = 102;
+ break;
+ }
+ case 102:
+ $449 = HEAP32[137616 >> 2] | 0;
+ $450 = $446;
+ $451 = HEAP32[$450 >> 2] | 0;
+ $452 = $451;
+ $453 = $449 + 8 | 0;
+ $454 = $453;
+ $455 = HEAP32[$454 >> 2] | 0;
+ $456 = ($451 | 0) == 82712;
+ if ($456) {
+ label = 103;
+ break;
+ } else {
+ $tib1_0_ph_i479 = $452;
+ label = 104;
+ break;
+ }
+ case 103:
+ $458 = $446 + 8 | 0;
+ $459 = $458;
+ $460 = HEAP32[$459 >> 2] | 0;
+ $461 = $460 + 8 | 0;
+ $462 = $461;
+ $463 = HEAP32[$462 >> 2] | 0;
+ $464 = $463;
+ $tib1_0_ph_i479 = $464;
+ label = 104;
+ break;
+ case 104:
+ $465 = $tib1_0_ph_i479 + 56 | 0;
+ $466 = HEAP32[$465 >> 2] | 0;
+ $467 = ($466 | 0) == 0;
+ if ($467) {
+ var $dimension_tib1_0_lcssa_i483 = 0;
+ var $tib1_0_lcssa_i482 = $tib1_0_ph_i479;
+ label = 106;
+ break;
+ } else {
+ var $dimension_tib1_029_i485 = 0;
+ var $473 = $466;
+ label = 107;
+ break;
+ }
+ case 105:
+ $468 = $476;
+ var $dimension_tib1_0_lcssa_i483 = $477;
+ var $tib1_0_lcssa_i482 = $468;
+ label = 106;
+ break;
+ case 106:
+ $469 = $455 + 56 | 0;
+ $470 = $469;
+ $471 = HEAP32[$470 >> 2] | 0;
+ $472 = ($471 | 0) == 0;
+ if ($472) {
+ var $dimension_tib2_0_lcssa_i490 = 0;
+ var $tib2_0_lcssa_in_i489 = $455;
+ label = 109;
+ break;
+ } else {
+ var $dimension_tib2_024_i487 = 0;
+ var $482 = $471;
+ label = 108;
+ break;
+ }
+ case 107:
+ $474 = $473 + 8 | 0;
+ $475 = $474;
+ $476 = HEAP32[$475 >> 2] | 0;
+ $477 = $dimension_tib1_029_i485 + 1 | 0;
+ $478 = $476 + 56 | 0;
+ $479 = $478;
+ $480 = HEAP32[$479 >> 2] | 0;
+ $481 = ($480 | 0) == 0;
+ if ($481) {
+ label = 105;
+ break;
+ } else {
+ var $dimension_tib1_029_i485 = $477;
+ var $473 = $480;
+ label = 107;
+ break;
+ }
+ case 108:
+ $483 = $482 + 8 | 0;
+ $484 = $483;
+ $485 = HEAP32[$484 >> 2] | 0;
+ $486 = $dimension_tib2_024_i487 + 1 | 0;
+ $487 = $485 + 56 | 0;
+ $488 = $487;
+ $489 = HEAP32[$488 >> 2] | 0;
+ $490 = ($489 | 0) == 0;
+ if ($490) {
+ var $dimension_tib2_0_lcssa_i490 = $486;
+ var $tib2_0_lcssa_in_i489 = $485;
+ label = 109;
+ break;
+ } else {
+ var $dimension_tib2_024_i487 = $486;
+ var $482 = $489;
+ label = 108;
+ break;
+ }
+ case 109:
+ $tib2_0_lcssa_i491 = $tib2_0_lcssa_in_i489;
+ $491 = ($dimension_tib1_0_lcssa_i483 | 0) < ($dimension_tib2_0_lcssa_i490 | 0);
+ $492 = ($tib1_0_lcssa_i482 | 0) == 0;
+ $or_cond_i492 = $491 | $492;
+ if ($or_cond_i492) {
+ label = 115;
+ break;
+ } else {
+ $tib1_121_i494 = $tib1_0_lcssa_i482;
+ label = 110;
+ break;
+ }
+ case 110:
+ $493 = ($tib1_121_i494 | 0) == ($tib2_0_lcssa_i491 | 0);
+ if ($493) {
+ label = 54;
+ break;
+ } else {
+ label = 111;
+ break;
+ }
+ case 111:
+ $494 = $tib1_121_i494 + 108 | 0;
+ $495 = HEAP32[$494 >> 2] | 0;
+ $496 = $tib1_121_i494 + 112 | 0;
+ $i_0_i497 = 0;
+ label = 112;
+ break;
+ case 112:
+ $498 = ($i_0_i497 | 0) < ($495 | 0);
+ if ($498) {
+ label = 113;
+ break;
+ } else {
+ label = 114;
+ break;
+ }
+ case 113:
+ $500 = HEAP32[$496 >> 2] | 0;
+ $501 = $500 + ($i_0_i497 << 2) | 0;
+ $502 = HEAP32[$501 >> 2] | 0;
+ $503 = ($502 | 0) == ($tib2_0_lcssa_i491 | 0);
+ $504 = $i_0_i497 + 1 | 0;
+ if ($503) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i497 = $504;
+ label = 112;
+ break;
+ }
+ case 114:
+ $506 = $tib1_121_i494 + 40 | 0;
+ $507 = HEAP32[$506 >> 2] | 0;
+ $508 = ($507 | 0) == 0;
+ if ($508) {
+ label = 115;
+ break;
+ } else {
+ $tib1_121_i494 = $507;
+ label = 110;
+ break;
+ }
+ case 115:
+ $509 = HEAP32[$397 >> 2] | 0;
+ $510 = $509;
+ invoke_vii(48, $510 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 116:
+ $512 = HEAP32[(98772 | 0) >> 2] | 0;
+ $513 = ($512 | 0) == 0;
+ if ($513) {
+ label = 117;
+ break;
+ } else {
+ label = 118;
+ break;
+ }
+ case 117:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 118;
+ break;
+ case 118:
+ $516 = HEAP32[(105500 | 0) >> 2] | 0;
+ $517 = ($516 | 0) == 0;
+ if ($517) {
+ label = 119;
+ break;
+ } else {
+ label = 120;
+ break;
+ }
+ case 119:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 120;
+ break;
+ case 120:
+ $519 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $520$0 = $519;
+ $520$1 = 0;
+ $521 = invoke_iii(364, $520$0 | 0, $520$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $522 = HEAP32[(98148 | 0) >> 2] | 0;
+ $523 = ($522 | 0) == 0;
+ if ($523) {
+ label = 121;
+ break;
+ } else {
+ label = 122;
+ break;
+ }
+ case 121:
+ invoke_v(408);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 122;
+ break;
+ case 122:
+ $525 = invoke_ii(338, 12 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $526 = $525;
+ HEAP32[$526 >> 2] = 98144;
+ $527 = $525 + 4 | 0;
+ $528 = $527;
+ HEAP32[$528 >> 2] = 0;
+ $529 = $525 + 8 | 0;
+ $530 = $529;
+ HEAP32[$530 >> 2] = $521;
+ $531 = HEAP32[(97532 | 0) >> 2] | 0;
+ $532 = ($531 | 0) == 0;
+ if ($532) {
+ label = 123;
+ break;
+ } else {
+ $534 = 98144;
+ label = 124;
+ break;
+ }
+ case 123:
+ invoke_v(568);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_phi_trans_insert = $525;
+ $_pre = HEAP32[$_phi_trans_insert >> 2] | 0;
+ $534 = $_pre;
+ label = 124;
+ break;
+ case 124:
+ $535 = $534 + 116 | 0;
+ $536 = HEAP32[$535 >> 2] | 0;
+ $537 = HEAP32[$536 >> 2] | 0;
+ $538 = $537;
+ $539 = invoke_ii($538 | 0, $525 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $540 = $539;
+ $_r2_sroa_0 = $540;
+ $541 = HEAP32[$429 >> 2] | 0;
+ _memcpy($541 | 0, $427 | 0, 40);
+ $_r2_sroa_0_0_load599 = $_r2_sroa_0;
+ $542 = ($_r2_sroa_0_0_load599 | 0) == 0;
+ $543 = HEAP32[(105500 | 0) >> 2] | 0;
+ $544 = ($543 | 0) == 0;
+ if ($544) {
+ label = 125;
+ break;
+ } else {
+ label = 126;
+ break;
+ }
+ case 125:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 126;
+ break;
+ case 126:
+ $546 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $547$0 = $546;
+ $547$1 = 0;
+ $548 = invoke_iii(364, $547$0 | 0, $547$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ if ($542) {
+ label = 240;
+ break;
+ } else {
+ label = 144;
+ break;
+ }
+ case 127:
+ $550 = HEAP32[$429 >> 2] | 0;
+ _memcpy($550 | 0, $427 | 0, 40);
+ $551 = HEAP32[(107740 | 0) >> 2] | 0;
+ $552 = ($551 | 0) == 0;
+ if ($552) {
+ label = 128;
+ break;
+ } else {
+ label = 129;
+ break;
+ }
+ case 128:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 129;
+ break;
+ case 129:
+ $555 = $426 + 20 | 0;
+ $556 = $555;
+ $557 = HEAP32[$556 >> 2] | 0;
+ $558 = ($557 | 0) == 0;
+ if ($558) {
+ label = 143;
+ break;
+ } else {
+ label = 130;
+ break;
+ }
+ case 130:
+ $560 = HEAP32[137616 >> 2] | 0;
+ $561 = $557;
+ $562 = HEAP32[$561 >> 2] | 0;
+ $563 = $562;
+ $564 = $560 + 8 | 0;
+ $565 = $564;
+ $566 = HEAP32[$565 >> 2] | 0;
+ $567 = ($562 | 0) == 82712;
+ if ($567) {
+ label = 131;
+ break;
+ } else {
+ $tib1_0_ph_i458 = $563;
+ label = 132;
+ break;
+ }
+ case 131:
+ $569 = $557 + 8 | 0;
+ $570 = $569;
+ $571 = HEAP32[$570 >> 2] | 0;
+ $572 = $571 + 8 | 0;
+ $573 = $572;
+ $574 = HEAP32[$573 >> 2] | 0;
+ $575 = $574;
+ $tib1_0_ph_i458 = $575;
+ label = 132;
+ break;
+ case 132:
+ $576 = $tib1_0_ph_i458 + 56 | 0;
+ $577 = HEAP32[$576 >> 2] | 0;
+ $578 = ($577 | 0) == 0;
+ if ($578) {
+ var $dimension_tib1_0_lcssa_i462 = 0;
+ var $tib1_0_lcssa_i461 = $tib1_0_ph_i458;
+ label = 134;
+ break;
+ } else {
+ var $dimension_tib1_029_i464 = 0;
+ var $584 = $577;
+ label = 135;
+ break;
+ }
+ case 133:
+ $579 = $587;
+ var $dimension_tib1_0_lcssa_i462 = $588;
+ var $tib1_0_lcssa_i461 = $579;
+ label = 134;
+ break;
+ case 134:
+ $580 = $566 + 56 | 0;
+ $581 = $580;
+ $582 = HEAP32[$581 >> 2] | 0;
+ $583 = ($582 | 0) == 0;
+ if ($583) {
+ var $dimension_tib2_0_lcssa_i469 = 0;
+ var $tib2_0_lcssa_in_i468 = $566;
+ label = 137;
+ break;
+ } else {
+ var $dimension_tib2_024_i466 = 0;
+ var $593 = $582;
+ label = 136;
+ break;
+ }
+ case 135:
+ $585 = $584 + 8 | 0;
+ $586 = $585;
+ $587 = HEAP32[$586 >> 2] | 0;
+ $588 = $dimension_tib1_029_i464 + 1 | 0;
+ $589 = $587 + 56 | 0;
+ $590 = $589;
+ $591 = HEAP32[$590 >> 2] | 0;
+ $592 = ($591 | 0) == 0;
+ if ($592) {
+ label = 133;
+ break;
+ } else {
+ var $dimension_tib1_029_i464 = $588;
+ var $584 = $591;
+ label = 135;
+ break;
+ }
+ case 136:
+ $594 = $593 + 8 | 0;
+ $595 = $594;
+ $596 = HEAP32[$595 >> 2] | 0;
+ $597 = $dimension_tib2_024_i466 + 1 | 0;
+ $598 = $596 + 56 | 0;
+ $599 = $598;
+ $600 = HEAP32[$599 >> 2] | 0;
+ $601 = ($600 | 0) == 0;
+ if ($601) {
+ var $dimension_tib2_0_lcssa_i469 = $597;
+ var $tib2_0_lcssa_in_i468 = $596;
+ label = 137;
+ break;
+ } else {
+ var $dimension_tib2_024_i466 = $597;
+ var $593 = $600;
+ label = 136;
+ break;
+ }
+ case 137:
+ $tib2_0_lcssa_i470 = $tib2_0_lcssa_in_i468;
+ $602 = ($dimension_tib1_0_lcssa_i462 | 0) < ($dimension_tib2_0_lcssa_i469 | 0);
+ $603 = ($tib1_0_lcssa_i461 | 0) == 0;
+ $or_cond_i471 = $602 | $603;
+ if ($or_cond_i471) {
+ label = 143;
+ break;
+ } else {
+ $tib1_121_i473 = $tib1_0_lcssa_i461;
+ label = 138;
+ break;
+ }
+ case 138:
+ $604 = ($tib1_121_i473 | 0) == ($tib2_0_lcssa_i470 | 0);
+ if ($604) {
+ label = 54;
+ break;
+ } else {
+ label = 139;
+ break;
+ }
+ case 139:
+ $605 = $tib1_121_i473 + 108 | 0;
+ $606 = HEAP32[$605 >> 2] | 0;
+ $607 = $tib1_121_i473 + 112 | 0;
+ $i_0_i476 = 0;
+ label = 140;
+ break;
+ case 140:
+ $609 = ($i_0_i476 | 0) < ($606 | 0);
+ if ($609) {
+ label = 141;
+ break;
+ } else {
+ label = 142;
+ break;
+ }
+ case 141:
+ $611 = HEAP32[$607 >> 2] | 0;
+ $612 = $611 + ($i_0_i476 << 2) | 0;
+ $613 = HEAP32[$612 >> 2] | 0;
+ $614 = ($613 | 0) == ($tib2_0_lcssa_i470 | 0);
+ $615 = $i_0_i476 + 1 | 0;
+ if ($614) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i476 = $615;
+ label = 140;
+ break;
+ }
+ case 142:
+ $617 = $tib1_121_i473 + 40 | 0;
+ $618 = HEAP32[$617 >> 2] | 0;
+ $619 = ($618 | 0) == 0;
+ if ($619) {
+ label = 143;
+ break;
+ } else {
+ $tib1_121_i473 = $618;
+ label = 138;
+ break;
+ }
+ case 143:
+ $620 = HEAP32[$429 >> 2] | 0;
+ $621 = $620;
+ invoke_vii(48, $621 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 144:
+ $623 = $local_env_w4567aaac23b1c29;
+ $624 = $548 + 16 | 0;
+ $625 = $624;
+ $626 = HEAP32[$625 >> 2] | 0;
+ _memcpy($623 | 0, $626 | 0, 40);
+ $627 = HEAP32[$625 >> 2] | 0;
+ $628 = $627;
+ $629 = _saveSetjmp($628 | 0, label, setjmpTable) | 0;
+ label = 418;
+ break;
+ case 418:
+ $630 = ($629 | 0) == 0;
+ if ($630) {
+ label = 145;
+ break;
+ } else {
+ label = 146;
+ break;
+ }
+ case 145:
+ $632 = invoke_ii(556, 709 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $633 = $632;
+ $_r0_sroa_0 = $633;
+ $_r2_sroa_0_0_load598 = $_r2_sroa_0;
+ $_r0_sroa_0_0_load609 = $_r0_sroa_0;
+ $_r0_sroa_0 = 0;
+ $_r0_sroa_0_0_load624 = $_r0_sroa_0;
+ $634 = $_r0_sroa_0_0_load624;
+ $_r3_sroa_0 = $634;
+ $_r0_sroa_1_4__r3_sroa_1_4_idx108_idx = $_r3_sroa_1 | 0;
+ $_r0_sroa_1_4_idx = $_r0_sroa_1 | 0;
+ HEAP32[$_r0_sroa_1_4__r3_sroa_1_4_idx108_idx >> 2] = HEAP32[$_r0_sroa_1_4_idx >> 2] | 0;
+ $635 = HEAP32[$625 >> 2] | 0;
+ _memcpy($635 | 0, $623 | 0, 40);
+ label = 179;
+ break;
+ case 146:
+ $637 = HEAP32[$625 >> 2] | 0;
+ _memcpy($637 | 0, $623 | 0, 40);
+ $638 = HEAP32[(113236 | 0) >> 2] | 0;
+ $639 = ($638 | 0) == 0;
+ if ($639) {
+ label = 147;
+ break;
+ } else {
+ label = 148;
+ break;
+ }
+ case 147:
+ invoke_v(538);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 148;
+ break;
+ case 148:
+ $642 = $548 + 20 | 0;
+ $643 = $642;
+ $644 = HEAP32[$643 >> 2] | 0;
+ $645 = ($644 | 0) == 0;
+ if ($645) {
+ label = 162;
+ break;
+ } else {
+ label = 149;
+ break;
+ }
+ case 149:
+ $647 = HEAP32[138672 >> 2] | 0;
+ $648 = $644;
+ $649 = HEAP32[$648 >> 2] | 0;
+ $650 = $649;
+ $651 = $647 + 8 | 0;
+ $652 = $651;
+ $653 = HEAP32[$652 >> 2] | 0;
+ $654 = ($649 | 0) == 82712;
+ if ($654) {
+ label = 150;
+ break;
+ } else {
+ $tib1_0_ph_i437 = $650;
+ label = 151;
+ break;
+ }
+ case 150:
+ $656 = $644 + 8 | 0;
+ $657 = $656;
+ $658 = HEAP32[$657 >> 2] | 0;
+ $659 = $658 + 8 | 0;
+ $660 = $659;
+ $661 = HEAP32[$660 >> 2] | 0;
+ $662 = $661;
+ $tib1_0_ph_i437 = $662;
+ label = 151;
+ break;
+ case 151:
+ $663 = $tib1_0_ph_i437 + 56 | 0;
+ $664 = HEAP32[$663 >> 2] | 0;
+ $665 = ($664 | 0) == 0;
+ if ($665) {
+ var $dimension_tib1_0_lcssa_i441 = 0;
+ var $tib1_0_lcssa_i440 = $tib1_0_ph_i437;
+ label = 153;
+ break;
+ } else {
+ var $dimension_tib1_029_i443 = 0;
+ var $671 = $664;
+ label = 154;
+ break;
+ }
+ case 152:
+ $666 = $674;
+ var $dimension_tib1_0_lcssa_i441 = $675;
+ var $tib1_0_lcssa_i440 = $666;
+ label = 153;
+ break;
+ case 153:
+ $667 = $653 + 56 | 0;
+ $668 = $667;
+ $669 = HEAP32[$668 >> 2] | 0;
+ $670 = ($669 | 0) == 0;
+ if ($670) {
+ var $dimension_tib2_0_lcssa_i448 = 0;
+ var $tib2_0_lcssa_in_i447 = $653;
+ label = 156;
+ break;
+ } else {
+ var $dimension_tib2_024_i445 = 0;
+ var $680 = $669;
+ label = 155;
+ break;
+ }
+ case 154:
+ $672 = $671 + 8 | 0;
+ $673 = $672;
+ $674 = HEAP32[$673 >> 2] | 0;
+ $675 = $dimension_tib1_029_i443 + 1 | 0;
+ $676 = $674 + 56 | 0;
+ $677 = $676;
+ $678 = HEAP32[$677 >> 2] | 0;
+ $679 = ($678 | 0) == 0;
+ if ($679) {
+ label = 152;
+ break;
+ } else {
+ var $dimension_tib1_029_i443 = $675;
+ var $671 = $678;
+ label = 154;
+ break;
+ }
+ case 155:
+ $681 = $680 + 8 | 0;
+ $682 = $681;
+ $683 = HEAP32[$682 >> 2] | 0;
+ $684 = $dimension_tib2_024_i445 + 1 | 0;
+ $685 = $683 + 56 | 0;
+ $686 = $685;
+ $687 = HEAP32[$686 >> 2] | 0;
+ $688 = ($687 | 0) == 0;
+ if ($688) {
+ var $dimension_tib2_0_lcssa_i448 = $684;
+ var $tib2_0_lcssa_in_i447 = $683;
+ label = 156;
+ break;
+ } else {
+ var $dimension_tib2_024_i445 = $684;
+ var $680 = $687;
+ label = 155;
+ break;
+ }
+ case 156:
+ $tib2_0_lcssa_i449 = $tib2_0_lcssa_in_i447;
+ $689 = ($dimension_tib1_0_lcssa_i441 | 0) < ($dimension_tib2_0_lcssa_i448 | 0);
+ $690 = ($tib1_0_lcssa_i440 | 0) == 0;
+ $or_cond_i450 = $689 | $690;
+ if ($or_cond_i450) {
+ label = 162;
+ break;
+ } else {
+ $tib1_121_i452 = $tib1_0_lcssa_i440;
+ label = 157;
+ break;
+ }
+ case 157:
+ $691 = ($tib1_121_i452 | 0) == ($tib2_0_lcssa_i449 | 0);
+ if ($691) {
+ label = 361;
+ break;
+ } else {
+ label = 158;
+ break;
+ }
+ case 158:
+ $692 = $tib1_121_i452 + 108 | 0;
+ $693 = HEAP32[$692 >> 2] | 0;
+ $694 = $tib1_121_i452 + 112 | 0;
+ $i_0_i455 = 0;
+ label = 159;
+ break;
+ case 159:
+ $696 = ($i_0_i455 | 0) < ($693 | 0);
+ if ($696) {
+ label = 160;
+ break;
+ } else {
+ label = 161;
+ break;
+ }
+ case 160:
+ $698 = HEAP32[$694 >> 2] | 0;
+ $699 = $698 + ($i_0_i455 << 2) | 0;
+ $700 = HEAP32[$699 >> 2] | 0;
+ $701 = ($700 | 0) == ($tib2_0_lcssa_i449 | 0);
+ $702 = $i_0_i455 + 1 | 0;
+ if ($701) {
+ label = 361;
+ break;
+ } else {
+ $i_0_i455 = $702;
+ label = 159;
+ break;
+ }
+ case 161:
+ $704 = $tib1_121_i452 + 40 | 0;
+ $705 = HEAP32[$704 >> 2] | 0;
+ $706 = ($705 | 0) == 0;
+ if ($706) {
+ label = 162;
+ break;
+ } else {
+ $tib1_121_i452 = $705;
+ label = 157;
+ break;
+ }
+ case 162:
+ $707 = HEAP32[(107740 | 0) >> 2] | 0;
+ $708 = ($707 | 0) == 0;
+ if ($708) {
+ label = 163;
+ break;
+ } else {
+ label = 164;
+ break;
+ }
+ case 163:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 164;
+ break;
+ case 164:
+ $711 = HEAP32[$643 >> 2] | 0;
+ $712 = ($711 | 0) == 0;
+ if ($712) {
+ label = 178;
+ break;
+ } else {
+ label = 165;
+ break;
+ }
+ case 165:
+ $714 = HEAP32[137616 >> 2] | 0;
+ $715 = $711;
+ $716 = HEAP32[$715 >> 2] | 0;
+ $717 = $716;
+ $718 = $714 + 8 | 0;
+ $719 = $718;
+ $720 = HEAP32[$719 >> 2] | 0;
+ $721 = ($716 | 0) == 82712;
+ if ($721) {
+ label = 166;
+ break;
+ } else {
+ $tib1_0_ph_i416 = $717;
+ label = 167;
+ break;
+ }
+ case 166:
+ $723 = $711 + 8 | 0;
+ $724 = $723;
+ $725 = HEAP32[$724 >> 2] | 0;
+ $726 = $725 + 8 | 0;
+ $727 = $726;
+ $728 = HEAP32[$727 >> 2] | 0;
+ $729 = $728;
+ $tib1_0_ph_i416 = $729;
+ label = 167;
+ break;
+ case 167:
+ $730 = $tib1_0_ph_i416 + 56 | 0;
+ $731 = HEAP32[$730 >> 2] | 0;
+ $732 = ($731 | 0) == 0;
+ if ($732) {
+ var $dimension_tib1_0_lcssa_i420 = 0;
+ var $tib1_0_lcssa_i419 = $tib1_0_ph_i416;
+ label = 169;
+ break;
+ } else {
+ var $dimension_tib1_029_i422 = 0;
+ var $738 = $731;
+ label = 170;
+ break;
+ }
+ case 168:
+ $733 = $741;
+ var $dimension_tib1_0_lcssa_i420 = $742;
+ var $tib1_0_lcssa_i419 = $733;
+ label = 169;
+ break;
+ case 169:
+ $734 = $720 + 56 | 0;
+ $735 = $734;
+ $736 = HEAP32[$735 >> 2] | 0;
+ $737 = ($736 | 0) == 0;
+ if ($737) {
+ var $dimension_tib2_0_lcssa_i427 = 0;
+ var $tib2_0_lcssa_in_i426 = $720;
+ label = 172;
+ break;
+ } else {
+ var $dimension_tib2_024_i424 = 0;
+ var $747 = $736;
+ label = 171;
+ break;
+ }
+ case 170:
+ $739 = $738 + 8 | 0;
+ $740 = $739;
+ $741 = HEAP32[$740 >> 2] | 0;
+ $742 = $dimension_tib1_029_i422 + 1 | 0;
+ $743 = $741 + 56 | 0;
+ $744 = $743;
+ $745 = HEAP32[$744 >> 2] | 0;
+ $746 = ($745 | 0) == 0;
+ if ($746) {
+ label = 168;
+ break;
+ } else {
+ var $dimension_tib1_029_i422 = $742;
+ var $738 = $745;
+ label = 170;
+ break;
+ }
+ case 171:
+ $748 = $747 + 8 | 0;
+ $749 = $748;
+ $750 = HEAP32[$749 >> 2] | 0;
+ $751 = $dimension_tib2_024_i424 + 1 | 0;
+ $752 = $750 + 56 | 0;
+ $753 = $752;
+ $754 = HEAP32[$753 >> 2] | 0;
+ $755 = ($754 | 0) == 0;
+ if ($755) {
+ var $dimension_tib2_0_lcssa_i427 = $751;
+ var $tib2_0_lcssa_in_i426 = $750;
+ label = 172;
+ break;
+ } else {
+ var $dimension_tib2_024_i424 = $751;
+ var $747 = $754;
+ label = 171;
+ break;
+ }
+ case 172:
+ $tib2_0_lcssa_i428 = $tib2_0_lcssa_in_i426;
+ $756 = ($dimension_tib1_0_lcssa_i420 | 0) < ($dimension_tib2_0_lcssa_i427 | 0);
+ $757 = ($tib1_0_lcssa_i419 | 0) == 0;
+ $or_cond_i429 = $756 | $757;
+ if ($or_cond_i429) {
+ label = 178;
+ break;
+ } else {
+ $tib1_121_i431 = $tib1_0_lcssa_i419;
+ label = 173;
+ break;
+ }
+ case 173:
+ $758 = ($tib1_121_i431 | 0) == ($tib2_0_lcssa_i428 | 0);
+ if ($758) {
+ label = 386;
+ break;
+ } else {
+ label = 174;
+ break;
+ }
+ case 174:
+ $759 = $tib1_121_i431 + 108 | 0;
+ $760 = HEAP32[$759 >> 2] | 0;
+ $761 = $tib1_121_i431 + 112 | 0;
+ $i_0_i434 = 0;
+ label = 175;
+ break;
+ case 175:
+ $763 = ($i_0_i434 | 0) < ($760 | 0);
+ if ($763) {
+ label = 176;
+ break;
+ } else {
+ label = 177;
+ break;
+ }
+ case 176:
+ $765 = HEAP32[$761 >> 2] | 0;
+ $766 = $765 + ($i_0_i434 << 2) | 0;
+ $767 = HEAP32[$766 >> 2] | 0;
+ $768 = ($767 | 0) == ($tib2_0_lcssa_i428 | 0);
+ $769 = $i_0_i434 + 1 | 0;
+ if ($768) {
+ label = 386;
+ break;
+ } else {
+ $i_0_i434 = $769;
+ label = 175;
+ break;
+ }
+ case 177:
+ $771 = $tib1_121_i431 + 40 | 0;
+ $772 = HEAP32[$771 >> 2] | 0;
+ $773 = ($772 | 0) == 0;
+ if ($773) {
+ label = 178;
+ break;
+ } else {
+ $tib1_121_i431 = $772;
+ label = 173;
+ break;
+ }
+ case 178:
+ $774 = HEAP32[$625 >> 2] | 0;
+ $775 = $774;
+ invoke_vii(48, $775 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 179:
+ $777 = HEAP32[(105500 | 0) >> 2] | 0;
+ $778 = ($777 | 0) == 0;
+ if ($778) {
+ label = 180;
+ break;
+ } else {
+ label = 181;
+ break;
+ }
+ case 180:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 181;
+ break;
+ case 181:
+ $780 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $781$0 = $780;
+ $781$1 = 0;
+ $782 = invoke_iii(364, $781$0 | 0, $781$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $783 = $local_env_w4567aaac23b1c31;
+ $784 = $782 + 16 | 0;
+ $785 = $784;
+ $786 = HEAP32[$785 >> 2] | 0;
+ _memcpy($783 | 0, $786 | 0, 40);
+ $787 = HEAP32[$785 >> 2] | 0;
+ $788 = $787;
+ $789 = _saveSetjmp($788 | 0, label, setjmpTable) | 0;
+ label = 419;
+ break;
+ case 419:
+ $790 = ($789 | 0) == 0;
+ if ($790) {
+ label = 182;
+ break;
+ } else {
+ label = 183;
+ break;
+ }
+ case 182:
+ $_r3_sroa_0_0_load596 = $_r3_sroa_0;
+ $792 = $_r3_sroa_0_0_load596;
+ $793 = HEAP32[$792 >> 2] | 0;
+ $794 = $793 + 116 | 0;
+ $795 = HEAP32[$794 >> 2] | 0;
+ $796 = HEAP32[$795 >> 2] | 0;
+ $797 = $796;
+ $_r3_sroa_0_0_load595 = $_r3_sroa_0;
+ $798 = invoke_ii($797 | 0, $_r3_sroa_0_0_load595 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0 = $798;
+ $799 = HEAP32[$785 >> 2] | 0;
+ _memcpy($799 | 0, $783 | 0, 40);
+ $_r0_sroa_0_0_load608 = $_r0_sroa_0;
+ $800 = ($_r0_sroa_0_0_load608 | 0) == 0;
+ if ($800) {
+ label = 216;
+ break;
+ } else {
+ label = 322;
+ break;
+ }
+ case 183:
+ $802 = HEAP32[$785 >> 2] | 0;
+ _memcpy($802 | 0, $783 | 0, 40);
+ $803 = HEAP32[(113236 | 0) >> 2] | 0;
+ $804 = ($803 | 0) == 0;
+ if ($804) {
+ label = 184;
+ break;
+ } else {
+ label = 185;
+ break;
+ }
+ case 184:
+ invoke_v(538);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 185;
+ break;
+ case 185:
+ $807 = $782 + 20 | 0;
+ $808 = $807;
+ $809 = HEAP32[$808 >> 2] | 0;
+ $810 = ($809 | 0) == 0;
+ if ($810) {
+ label = 199;
+ break;
+ } else {
+ label = 186;
+ break;
+ }
+ case 186:
+ $812 = HEAP32[138672 >> 2] | 0;
+ $813 = $809;
+ $814 = HEAP32[$813 >> 2] | 0;
+ $815 = $814;
+ $816 = $812 + 8 | 0;
+ $817 = $816;
+ $818 = HEAP32[$817 >> 2] | 0;
+ $819 = ($814 | 0) == 82712;
+ if ($819) {
+ label = 187;
+ break;
+ } else {
+ $tib1_0_ph_i395 = $815;
+ label = 188;
+ break;
+ }
+ case 187:
+ $821 = $809 + 8 | 0;
+ $822 = $821;
+ $823 = HEAP32[$822 >> 2] | 0;
+ $824 = $823 + 8 | 0;
+ $825 = $824;
+ $826 = HEAP32[$825 >> 2] | 0;
+ $827 = $826;
+ $tib1_0_ph_i395 = $827;
+ label = 188;
+ break;
+ case 188:
+ $828 = $tib1_0_ph_i395 + 56 | 0;
+ $829 = HEAP32[$828 >> 2] | 0;
+ $830 = ($829 | 0) == 0;
+ if ($830) {
+ var $dimension_tib1_0_lcssa_i399 = 0;
+ var $tib1_0_lcssa_i398 = $tib1_0_ph_i395;
+ label = 190;
+ break;
+ } else {
+ var $dimension_tib1_029_i401 = 0;
+ var $836 = $829;
+ label = 191;
+ break;
+ }
+ case 189:
+ $831 = $839;
+ var $dimension_tib1_0_lcssa_i399 = $840;
+ var $tib1_0_lcssa_i398 = $831;
+ label = 190;
+ break;
+ case 190:
+ $832 = $818 + 56 | 0;
+ $833 = $832;
+ $834 = HEAP32[$833 >> 2] | 0;
+ $835 = ($834 | 0) == 0;
+ if ($835) {
+ var $dimension_tib2_0_lcssa_i406 = 0;
+ var $tib2_0_lcssa_in_i405 = $818;
+ label = 193;
+ break;
+ } else {
+ var $dimension_tib2_024_i403 = 0;
+ var $845 = $834;
+ label = 192;
+ break;
+ }
+ case 191:
+ $837 = $836 + 8 | 0;
+ $838 = $837;
+ $839 = HEAP32[$838 >> 2] | 0;
+ $840 = $dimension_tib1_029_i401 + 1 | 0;
+ $841 = $839 + 56 | 0;
+ $842 = $841;
+ $843 = HEAP32[$842 >> 2] | 0;
+ $844 = ($843 | 0) == 0;
+ if ($844) {
+ label = 189;
+ break;
+ } else {
+ var $dimension_tib1_029_i401 = $840;
+ var $836 = $843;
+ label = 191;
+ break;
+ }
+ case 192:
+ $846 = $845 + 8 | 0;
+ $847 = $846;
+ $848 = HEAP32[$847 >> 2] | 0;
+ $849 = $dimension_tib2_024_i403 + 1 | 0;
+ $850 = $848 + 56 | 0;
+ $851 = $850;
+ $852 = HEAP32[$851 >> 2] | 0;
+ $853 = ($852 | 0) == 0;
+ if ($853) {
+ var $dimension_tib2_0_lcssa_i406 = $849;
+ var $tib2_0_lcssa_in_i405 = $848;
+ label = 193;
+ break;
+ } else {
+ var $dimension_tib2_024_i403 = $849;
+ var $845 = $852;
+ label = 192;
+ break;
+ }
+ case 193:
+ $tib2_0_lcssa_i407 = $tib2_0_lcssa_in_i405;
+ $854 = ($dimension_tib1_0_lcssa_i399 | 0) < ($dimension_tib2_0_lcssa_i406 | 0);
+ $855 = ($tib1_0_lcssa_i398 | 0) == 0;
+ $or_cond_i408 = $854 | $855;
+ if ($or_cond_i408) {
+ label = 199;
+ break;
+ } else {
+ $tib1_121_i410 = $tib1_0_lcssa_i398;
+ label = 194;
+ break;
+ }
+ case 194:
+ $856 = ($tib1_121_i410 | 0) == ($tib2_0_lcssa_i407 | 0);
+ if ($856) {
+ label = 361;
+ break;
+ } else {
+ label = 195;
+ break;
+ }
+ case 195:
+ $857 = $tib1_121_i410 + 108 | 0;
+ $858 = HEAP32[$857 >> 2] | 0;
+ $859 = $tib1_121_i410 + 112 | 0;
+ $i_0_i413 = 0;
+ label = 196;
+ break;
+ case 196:
+ $861 = ($i_0_i413 | 0) < ($858 | 0);
+ if ($861) {
+ label = 197;
+ break;
+ } else {
+ label = 198;
+ break;
+ }
+ case 197:
+ $863 = HEAP32[$859 >> 2] | 0;
+ $864 = $863 + ($i_0_i413 << 2) | 0;
+ $865 = HEAP32[$864 >> 2] | 0;
+ $866 = ($865 | 0) == ($tib2_0_lcssa_i407 | 0);
+ $867 = $i_0_i413 + 1 | 0;
+ if ($866) {
+ label = 361;
+ break;
+ } else {
+ $i_0_i413 = $867;
+ label = 196;
+ break;
+ }
+ case 198:
+ $869 = $tib1_121_i410 + 40 | 0;
+ $870 = HEAP32[$869 >> 2] | 0;
+ $871 = ($870 | 0) == 0;
+ if ($871) {
+ label = 199;
+ break;
+ } else {
+ $tib1_121_i410 = $870;
+ label = 194;
+ break;
+ }
+ case 199:
+ $872 = HEAP32[(107740 | 0) >> 2] | 0;
+ $873 = ($872 | 0) == 0;
+ if ($873) {
+ label = 200;
+ break;
+ } else {
+ label = 201;
+ break;
+ }
+ case 200:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 201;
+ break;
+ case 201:
+ $876 = HEAP32[$808 >> 2] | 0;
+ $877 = ($876 | 0) == 0;
+ if ($877) {
+ label = 215;
+ break;
+ } else {
+ label = 202;
+ break;
+ }
+ case 202:
+ $879 = HEAP32[137616 >> 2] | 0;
+ $880 = $876;
+ $881 = HEAP32[$880 >> 2] | 0;
+ $882 = $881;
+ $883 = $879 + 8 | 0;
+ $884 = $883;
+ $885 = HEAP32[$884 >> 2] | 0;
+ $886 = ($881 | 0) == 82712;
+ if ($886) {
+ label = 203;
+ break;
+ } else {
+ $tib1_0_ph_i374 = $882;
+ label = 204;
+ break;
+ }
+ case 203:
+ $888 = $876 + 8 | 0;
+ $889 = $888;
+ $890 = HEAP32[$889 >> 2] | 0;
+ $891 = $890 + 8 | 0;
+ $892 = $891;
+ $893 = HEAP32[$892 >> 2] | 0;
+ $894 = $893;
+ $tib1_0_ph_i374 = $894;
+ label = 204;
+ break;
+ case 204:
+ $895 = $tib1_0_ph_i374 + 56 | 0;
+ $896 = HEAP32[$895 >> 2] | 0;
+ $897 = ($896 | 0) == 0;
+ if ($897) {
+ var $dimension_tib1_0_lcssa_i378 = 0;
+ var $tib1_0_lcssa_i377 = $tib1_0_ph_i374;
+ label = 206;
+ break;
+ } else {
+ var $dimension_tib1_029_i380 = 0;
+ var $903 = $896;
+ label = 207;
+ break;
+ }
+ case 205:
+ $898 = $906;
+ var $dimension_tib1_0_lcssa_i378 = $907;
+ var $tib1_0_lcssa_i377 = $898;
+ label = 206;
+ break;
+ case 206:
+ $899 = $885 + 56 | 0;
+ $900 = $899;
+ $901 = HEAP32[$900 >> 2] | 0;
+ $902 = ($901 | 0) == 0;
+ if ($902) {
+ var $dimension_tib2_0_lcssa_i385 = 0;
+ var $tib2_0_lcssa_in_i384 = $885;
+ label = 209;
+ break;
+ } else {
+ var $dimension_tib2_024_i382 = 0;
+ var $912 = $901;
+ label = 208;
+ break;
+ }
+ case 207:
+ $904 = $903 + 8 | 0;
+ $905 = $904;
+ $906 = HEAP32[$905 >> 2] | 0;
+ $907 = $dimension_tib1_029_i380 + 1 | 0;
+ $908 = $906 + 56 | 0;
+ $909 = $908;
+ $910 = HEAP32[$909 >> 2] | 0;
+ $911 = ($910 | 0) == 0;
+ if ($911) {
+ label = 205;
+ break;
+ } else {
+ var $dimension_tib1_029_i380 = $907;
+ var $903 = $910;
+ label = 207;
+ break;
+ }
+ case 208:
+ $913 = $912 + 8 | 0;
+ $914 = $913;
+ $915 = HEAP32[$914 >> 2] | 0;
+ $916 = $dimension_tib2_024_i382 + 1 | 0;
+ $917 = $915 + 56 | 0;
+ $918 = $917;
+ $919 = HEAP32[$918 >> 2] | 0;
+ $920 = ($919 | 0) == 0;
+ if ($920) {
+ var $dimension_tib2_0_lcssa_i385 = $916;
+ var $tib2_0_lcssa_in_i384 = $915;
+ label = 209;
+ break;
+ } else {
+ var $dimension_tib2_024_i382 = $916;
+ var $912 = $919;
+ label = 208;
+ break;
+ }
+ case 209:
+ $tib2_0_lcssa_i386 = $tib2_0_lcssa_in_i384;
+ $921 = ($dimension_tib1_0_lcssa_i378 | 0) < ($dimension_tib2_0_lcssa_i385 | 0);
+ $922 = ($tib1_0_lcssa_i377 | 0) == 0;
+ $or_cond_i387 = $921 | $922;
+ if ($or_cond_i387) {
+ label = 215;
+ break;
+ } else {
+ $tib1_121_i389 = $tib1_0_lcssa_i377;
+ label = 210;
+ break;
+ }
+ case 210:
+ $923 = ($tib1_121_i389 | 0) == ($tib2_0_lcssa_i386 | 0);
+ if ($923) {
+ label = 386;
+ break;
+ } else {
+ label = 211;
+ break;
+ }
+ case 211:
+ $924 = $tib1_121_i389 + 108 | 0;
+ $925 = HEAP32[$924 >> 2] | 0;
+ $926 = $tib1_121_i389 + 112 | 0;
+ $i_0_i392 = 0;
+ label = 212;
+ break;
+ case 212:
+ $928 = ($i_0_i392 | 0) < ($925 | 0);
+ if ($928) {
+ label = 213;
+ break;
+ } else {
+ label = 214;
+ break;
+ }
+ case 213:
+ $930 = HEAP32[$926 >> 2] | 0;
+ $931 = $930 + ($i_0_i392 << 2) | 0;
+ $932 = HEAP32[$931 >> 2] | 0;
+ $933 = ($932 | 0) == ($tib2_0_lcssa_i386 | 0);
+ $934 = $i_0_i392 + 1 | 0;
+ if ($933) {
+ label = 386;
+ break;
+ } else {
+ $i_0_i392 = $934;
+ label = 212;
+ break;
+ }
+ case 214:
+ $936 = $tib1_121_i389 + 40 | 0;
+ $937 = HEAP32[$936 >> 2] | 0;
+ $938 = ($937 | 0) == 0;
+ if ($938) {
+ label = 215;
+ break;
+ } else {
+ $tib1_121_i389 = $937;
+ label = 210;
+ break;
+ }
+ case 215:
+ $939 = HEAP32[$785 >> 2] | 0;
+ $940 = $939;
+ invoke_vii(48, $940 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 216:
+ $_r0_sroa_0 = 0;
+ $942 = HEAP32[(105500 | 0) >> 2] | 0;
+ $943 = ($942 | 0) == 0;
+ if ($943) {
+ label = 217;
+ break;
+ } else {
+ label = 218;
+ break;
+ }
+ case 217:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 218;
+ break;
+ case 218:
+ $945 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $946$0 = $945;
+ $946$1 = 0;
+ $947 = invoke_iii(364, $946$0 | 0, $946$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $948 = $local_env_w4567aaac23b1c35;
+ $949 = $947 + 16 | 0;
+ $950 = $949;
+ $951 = HEAP32[$950 >> 2] | 0;
+ _memcpy($948 | 0, $951 | 0, 40);
+ $952 = HEAP32[$950 >> 2] | 0;
+ $953 = $952;
+ $954 = _saveSetjmp($953 | 0, label, setjmpTable) | 0;
+ label = 420;
+ break;
+ case 420:
+ $955 = ($954 | 0) == 0;
+ if ($955) {
+ label = 219;
+ break;
+ } else {
+ label = 222;
+ break;
+ }
+ case 219:
+ $_r0_sroa_0_0_load607 = $_r0_sroa_0;
+ $957 = HEAP32[(98772 | 0) >> 2] | 0;
+ $958 = ($957 | 0) == 0;
+ if ($958) {
+ label = 220;
+ break;
+ } else {
+ label = 221;
+ break;
+ }
+ case 220:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 221;
+ break;
+ case 221:
+ HEAP32[140048 >> 2] = $_r0_sroa_0_0_load607;
+ $960 = HEAP32[$950 >> 2] | 0;
+ _memcpy($960 | 0, $948 | 0, 40);
+ label = 239;
+ break;
+ case 222:
+ $962 = HEAP32[$950 >> 2] | 0;
+ _memcpy($962 | 0, $948 | 0, 40);
+ $963 = HEAP32[(107740 | 0) >> 2] | 0;
+ $964 = ($963 | 0) == 0;
+ if ($964) {
+ label = 223;
+ break;
+ } else {
+ label = 224;
+ break;
+ }
+ case 223:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 224;
+ break;
+ case 224:
+ $967 = $947 + 20 | 0;
+ $968 = $967;
+ $969 = HEAP32[$968 >> 2] | 0;
+ $970 = ($969 | 0) == 0;
+ if ($970) {
+ label = 238;
+ break;
+ } else {
+ label = 225;
+ break;
+ }
+ case 225:
+ $972 = HEAP32[137616 >> 2] | 0;
+ $973 = $969;
+ $974 = HEAP32[$973 >> 2] | 0;
+ $975 = $974;
+ $976 = $972 + 8 | 0;
+ $977 = $976;
+ $978 = HEAP32[$977 >> 2] | 0;
+ $979 = ($974 | 0) == 82712;
+ if ($979) {
+ label = 226;
+ break;
+ } else {
+ $tib1_0_ph_i353 = $975;
+ label = 227;
+ break;
+ }
+ case 226:
+ $981 = $969 + 8 | 0;
+ $982 = $981;
+ $983 = HEAP32[$982 >> 2] | 0;
+ $984 = $983 + 8 | 0;
+ $985 = $984;
+ $986 = HEAP32[$985 >> 2] | 0;
+ $987 = $986;
+ $tib1_0_ph_i353 = $987;
+ label = 227;
+ break;
+ case 227:
+ $988 = $tib1_0_ph_i353 + 56 | 0;
+ $989 = HEAP32[$988 >> 2] | 0;
+ $990 = ($989 | 0) == 0;
+ if ($990) {
+ var $dimension_tib1_0_lcssa_i357 = 0;
+ var $tib1_0_lcssa_i356 = $tib1_0_ph_i353;
+ label = 229;
+ break;
+ } else {
+ var $dimension_tib1_029_i359 = 0;
+ var $996 = $989;
+ label = 230;
+ break;
+ }
+ case 228:
+ $991 = $999;
+ var $dimension_tib1_0_lcssa_i357 = $1000;
+ var $tib1_0_lcssa_i356 = $991;
+ label = 229;
+ break;
+ case 229:
+ $992 = $978 + 56 | 0;
+ $993 = $992;
+ $994 = HEAP32[$993 >> 2] | 0;
+ $995 = ($994 | 0) == 0;
+ if ($995) {
+ var $dimension_tib2_0_lcssa_i364 = 0;
+ var $tib2_0_lcssa_in_i363 = $978;
+ label = 232;
+ break;
+ } else {
+ var $dimension_tib2_024_i361 = 0;
+ var $1005 = $994;
+ label = 231;
+ break;
+ }
+ case 230:
+ $997 = $996 + 8 | 0;
+ $998 = $997;
+ $999 = HEAP32[$998 >> 2] | 0;
+ $1000 = $dimension_tib1_029_i359 + 1 | 0;
+ $1001 = $999 + 56 | 0;
+ $1002 = $1001;
+ $1003 = HEAP32[$1002 >> 2] | 0;
+ $1004 = ($1003 | 0) == 0;
+ if ($1004) {
+ label = 228;
+ break;
+ } else {
+ var $dimension_tib1_029_i359 = $1000;
+ var $996 = $1003;
+ label = 230;
+ break;
+ }
+ case 231:
+ $1006 = $1005 + 8 | 0;
+ $1007 = $1006;
+ $1008 = HEAP32[$1007 >> 2] | 0;
+ $1009 = $dimension_tib2_024_i361 + 1 | 0;
+ $1010 = $1008 + 56 | 0;
+ $1011 = $1010;
+ $1012 = HEAP32[$1011 >> 2] | 0;
+ $1013 = ($1012 | 0) == 0;
+ if ($1013) {
+ var $dimension_tib2_0_lcssa_i364 = $1009;
+ var $tib2_0_lcssa_in_i363 = $1008;
+ label = 232;
+ break;
+ } else {
+ var $dimension_tib2_024_i361 = $1009;
+ var $1005 = $1012;
+ label = 231;
+ break;
+ }
+ case 232:
+ $tib2_0_lcssa_i365 = $tib2_0_lcssa_in_i363;
+ $1014 = ($dimension_tib1_0_lcssa_i357 | 0) < ($dimension_tib2_0_lcssa_i364 | 0);
+ $1015 = ($tib1_0_lcssa_i356 | 0) == 0;
+ $or_cond_i366 = $1014 | $1015;
+ if ($or_cond_i366) {
+ label = 238;
+ break;
+ } else {
+ $tib1_121_i368 = $tib1_0_lcssa_i356;
+ label = 233;
+ break;
+ }
+ case 233:
+ $1016 = ($tib1_121_i368 | 0) == ($tib2_0_lcssa_i365 | 0);
+ if ($1016) {
+ label = 54;
+ break;
+ } else {
+ label = 234;
+ break;
+ }
+ case 234:
+ $1017 = $tib1_121_i368 + 108 | 0;
+ $1018 = HEAP32[$1017 >> 2] | 0;
+ $1019 = $tib1_121_i368 + 112 | 0;
+ $i_0_i371 = 0;
+ label = 235;
+ break;
+ case 235:
+ $1021 = ($i_0_i371 | 0) < ($1018 | 0);
+ if ($1021) {
+ label = 236;
+ break;
+ } else {
+ label = 237;
+ break;
+ }
+ case 236:
+ $1023 = HEAP32[$1019 >> 2] | 0;
+ $1024 = $1023 + ($i_0_i371 << 2) | 0;
+ $1025 = HEAP32[$1024 >> 2] | 0;
+ $1026 = ($1025 | 0) == ($tib2_0_lcssa_i365 | 0);
+ $1027 = $i_0_i371 + 1 | 0;
+ if ($1026) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i371 = $1027;
+ label = 235;
+ break;
+ }
+ case 237:
+ $1029 = $tib1_121_i368 + 40 | 0;
+ $1030 = HEAP32[$1029 >> 2] | 0;
+ $1031 = ($1030 | 0) == 0;
+ if ($1031) {
+ label = 238;
+ break;
+ } else {
+ $tib1_121_i368 = $1030;
+ label = 233;
+ break;
+ }
+ case 238:
+ $1032 = HEAP32[$950 >> 2] | 0;
+ $1033 = $1032;
+ invoke_vii(48, $1033 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 239:
+ $_r0_sroa_0 = 0;
+ label = 28;
+ break;
+ case 240:
+ $1036 = $local_env_w4567aaac23b1c40;
+ $1037 = $548 + 16 | 0;
+ $1038 = $1037;
+ $1039 = HEAP32[$1038 >> 2] | 0;
+ _memcpy($1036 | 0, $1039 | 0, 40);
+ $1040 = HEAP32[$1038 >> 2] | 0;
+ $1041 = $1040;
+ $1042 = _saveSetjmp($1041 | 0, label, setjmpTable) | 0;
+ label = 421;
+ break;
+ case 421:
+ $1043 = ($1042 | 0) == 0;
+ if ($1043) {
+ label = 241;
+ break;
+ } else {
+ label = 253;
+ break;
+ }
+ case 241:
+ $1045 = HEAP32[(98772 | 0) >> 2] | 0;
+ $1046 = ($1045 | 0) == 0;
+ if ($1046) {
+ label = 242;
+ break;
+ } else {
+ label = 244;
+ break;
+ }
+ case 242:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_pr = HEAP32[(98772 | 0) >> 2] | 0;
+ $1048 = ($_pr | 0) == 0;
+ if ($1048) {
+ label = 243;
+ break;
+ } else {
+ label = 244;
+ break;
+ }
+ case 243:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 244;
+ break;
+ case 244:
+ $1050 = HEAP32[140040 >> 2] | 0;
+ $1051 = ($1050 | 0) == 0;
+ if ($1051) {
+ label = 245;
+ break;
+ } else {
+ label = 246;
+ break;
+ }
+ case 245:
+ invoke_viiii(14, 16136 | 0 | 0, 11648 | 0 | 0, 126768 | 0 | 0, 573 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 246:
+ $1053 = HEAP32[(98772 | 0) >> 2] | 0;
+ $1054 = ($1053 | 0) == 0;
+ if ($1054) {
+ label = 247;
+ break;
+ } else {
+ $1056 = $1050;
+ label = 248;
+ break;
+ }
+ case 247:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_pre855 = HEAP32[140040 >> 2] | 0;
+ $1056 = $_pre855;
+ label = 248;
+ break;
+ case 248:
+ $1057 = $1056;
+ $_r0_sroa_0 = $1057;
+ $_r0_sroa_0_0_load606 = $_r0_sroa_0;
+ $1058 = ($_r0_sroa_0_0_load606 | 0) == 0;
+ if ($1058) {
+ label = 252;
+ break;
+ } else {
+ label = 249;
+ break;
+ }
+ case 249:
+ $1060 = HEAP32[$1038 >> 2] | 0;
+ _memcpy($1060 | 0, $1036 | 0, 40);
+ $1061 = HEAP32[(105500 | 0) >> 2] | 0;
+ $1062 = ($1061 | 0) == 0;
+ if ($1062) {
+ label = 250;
+ break;
+ } else {
+ label = 251;
+ break;
+ }
+ case 250:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 251;
+ break;
+ case 251:
+ $1064 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1065$0 = $1064;
+ $1065$1 = 0;
+ $1066 = invoke_iii(364, $1065$0 | 0, $1065$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1067 = $local_env_w4567aaac23b1c42;
+ $1068 = $1066 + 16 | 0;
+ $1069 = $1068;
+ $1070 = HEAP32[$1069 >> 2] | 0;
+ _memcpy($1067 | 0, $1070 | 0, 40);
+ $1071 = HEAP32[$1069 >> 2] | 0;
+ $1072 = $1071;
+ $1073 = _saveSetjmp($1072 | 0, label, setjmpTable) | 0;
+ label = 422;
+ break;
+ case 422:
+ $1074 = ($1073 | 0) == 0;
+ if ($1074) {
+ label = 286;
+ break;
+ } else {
+ label = 289;
+ break;
+ }
+ case 252:
+ invoke_viiii(14, 16136 | 0 | 0, 11648 | 0 | 0, 126872 | 0 | 0, 1581 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 253:
+ $1077 = HEAP32[$1038 >> 2] | 0;
+ _memcpy($1077 | 0, $1036 | 0, 40);
+ $1078 = HEAP32[(113236 | 0) >> 2] | 0;
+ $1079 = ($1078 | 0) == 0;
+ if ($1079) {
+ label = 254;
+ break;
+ } else {
+ label = 255;
+ break;
+ }
+ case 254:
+ invoke_v(538);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 255;
+ break;
+ case 255:
+ $1082 = $548 + 20 | 0;
+ $1083 = $1082;
+ $1084 = HEAP32[$1083 >> 2] | 0;
+ $1085 = ($1084 | 0) == 0;
+ if ($1085) {
+ label = 269;
+ break;
+ } else {
+ label = 256;
+ break;
+ }
+ case 256:
+ $1087 = HEAP32[138672 >> 2] | 0;
+ $1088 = $1084;
+ $1089 = HEAP32[$1088 >> 2] | 0;
+ $1090 = $1089;
+ $1091 = $1087 + 8 | 0;
+ $1092 = $1091;
+ $1093 = HEAP32[$1092 >> 2] | 0;
+ $1094 = ($1089 | 0) == 82712;
+ if ($1094) {
+ label = 257;
+ break;
+ } else {
+ $tib1_0_ph_i332 = $1090;
+ label = 258;
+ break;
+ }
+ case 257:
+ $1096 = $1084 + 8 | 0;
+ $1097 = $1096;
+ $1098 = HEAP32[$1097 >> 2] | 0;
+ $1099 = $1098 + 8 | 0;
+ $1100 = $1099;
+ $1101 = HEAP32[$1100 >> 2] | 0;
+ $1102 = $1101;
+ $tib1_0_ph_i332 = $1102;
+ label = 258;
+ break;
+ case 258:
+ $1103 = $tib1_0_ph_i332 + 56 | 0;
+ $1104 = HEAP32[$1103 >> 2] | 0;
+ $1105 = ($1104 | 0) == 0;
+ if ($1105) {
+ var $dimension_tib1_0_lcssa_i336 = 0;
+ var $tib1_0_lcssa_i335 = $tib1_0_ph_i332;
+ label = 260;
+ break;
+ } else {
+ var $dimension_tib1_029_i338 = 0;
+ var $1111 = $1104;
+ label = 261;
+ break;
+ }
+ case 259:
+ $1106 = $1114;
+ var $dimension_tib1_0_lcssa_i336 = $1115;
+ var $tib1_0_lcssa_i335 = $1106;
+ label = 260;
+ break;
+ case 260:
+ $1107 = $1093 + 56 | 0;
+ $1108 = $1107;
+ $1109 = HEAP32[$1108 >> 2] | 0;
+ $1110 = ($1109 | 0) == 0;
+ if ($1110) {
+ var $dimension_tib2_0_lcssa_i343 = 0;
+ var $tib2_0_lcssa_in_i342 = $1093;
+ label = 263;
+ break;
+ } else {
+ var $dimension_tib2_024_i340 = 0;
+ var $1120 = $1109;
+ label = 262;
+ break;
+ }
+ case 261:
+ $1112 = $1111 + 8 | 0;
+ $1113 = $1112;
+ $1114 = HEAP32[$1113 >> 2] | 0;
+ $1115 = $dimension_tib1_029_i338 + 1 | 0;
+ $1116 = $1114 + 56 | 0;
+ $1117 = $1116;
+ $1118 = HEAP32[$1117 >> 2] | 0;
+ $1119 = ($1118 | 0) == 0;
+ if ($1119) {
+ label = 259;
+ break;
+ } else {
+ var $dimension_tib1_029_i338 = $1115;
+ var $1111 = $1118;
+ label = 261;
+ break;
+ }
+ case 262:
+ $1121 = $1120 + 8 | 0;
+ $1122 = $1121;
+ $1123 = HEAP32[$1122 >> 2] | 0;
+ $1124 = $dimension_tib2_024_i340 + 1 | 0;
+ $1125 = $1123 + 56 | 0;
+ $1126 = $1125;
+ $1127 = HEAP32[$1126 >> 2] | 0;
+ $1128 = ($1127 | 0) == 0;
+ if ($1128) {
+ var $dimension_tib2_0_lcssa_i343 = $1124;
+ var $tib2_0_lcssa_in_i342 = $1123;
+ label = 263;
+ break;
+ } else {
+ var $dimension_tib2_024_i340 = $1124;
+ var $1120 = $1127;
+ label = 262;
+ break;
+ }
+ case 263:
+ $tib2_0_lcssa_i344 = $tib2_0_lcssa_in_i342;
+ $1129 = ($dimension_tib1_0_lcssa_i336 | 0) < ($dimension_tib2_0_lcssa_i343 | 0);
+ $1130 = ($tib1_0_lcssa_i335 | 0) == 0;
+ $or_cond_i345 = $1129 | $1130;
+ if ($or_cond_i345) {
+ label = 269;
+ break;
+ } else {
+ $tib1_121_i347 = $tib1_0_lcssa_i335;
+ label = 264;
+ break;
+ }
+ case 264:
+ $1131 = ($tib1_121_i347 | 0) == ($tib2_0_lcssa_i344 | 0);
+ if ($1131) {
+ label = 361;
+ break;
+ } else {
+ label = 265;
+ break;
+ }
+ case 265:
+ $1132 = $tib1_121_i347 + 108 | 0;
+ $1133 = HEAP32[$1132 >> 2] | 0;
+ $1134 = $tib1_121_i347 + 112 | 0;
+ $i_0_i350 = 0;
+ label = 266;
+ break;
+ case 266:
+ $1136 = ($i_0_i350 | 0) < ($1133 | 0);
+ if ($1136) {
+ label = 267;
+ break;
+ } else {
+ label = 268;
+ break;
+ }
+ case 267:
+ $1138 = HEAP32[$1134 >> 2] | 0;
+ $1139 = $1138 + ($i_0_i350 << 2) | 0;
+ $1140 = HEAP32[$1139 >> 2] | 0;
+ $1141 = ($1140 | 0) == ($tib2_0_lcssa_i344 | 0);
+ $1142 = $i_0_i350 + 1 | 0;
+ if ($1141) {
+ label = 361;
+ break;
+ } else {
+ $i_0_i350 = $1142;
+ label = 266;
+ break;
+ }
+ case 268:
+ $1144 = $tib1_121_i347 + 40 | 0;
+ $1145 = HEAP32[$1144 >> 2] | 0;
+ $1146 = ($1145 | 0) == 0;
+ if ($1146) {
+ label = 269;
+ break;
+ } else {
+ $tib1_121_i347 = $1145;
+ label = 264;
+ break;
+ }
+ case 269:
+ $1147 = HEAP32[(107740 | 0) >> 2] | 0;
+ $1148 = ($1147 | 0) == 0;
+ if ($1148) {
+ label = 270;
+ break;
+ } else {
+ label = 271;
+ break;
+ }
+ case 270:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 271;
+ break;
+ case 271:
+ $1151 = HEAP32[$1083 >> 2] | 0;
+ $1152 = ($1151 | 0) == 0;
+ if ($1152) {
+ label = 285;
+ break;
+ } else {
+ label = 272;
+ break;
+ }
+ case 272:
+ $1154 = HEAP32[137616 >> 2] | 0;
+ $1155 = $1151;
+ $1156 = HEAP32[$1155 >> 2] | 0;
+ $1157 = $1156;
+ $1158 = $1154 + 8 | 0;
+ $1159 = $1158;
+ $1160 = HEAP32[$1159 >> 2] | 0;
+ $1161 = ($1156 | 0) == 82712;
+ if ($1161) {
+ label = 273;
+ break;
+ } else {
+ $tib1_0_ph_i311 = $1157;
+ label = 274;
+ break;
+ }
+ case 273:
+ $1163 = $1151 + 8 | 0;
+ $1164 = $1163;
+ $1165 = HEAP32[$1164 >> 2] | 0;
+ $1166 = $1165 + 8 | 0;
+ $1167 = $1166;
+ $1168 = HEAP32[$1167 >> 2] | 0;
+ $1169 = $1168;
+ $tib1_0_ph_i311 = $1169;
+ label = 274;
+ break;
+ case 274:
+ $1170 = $tib1_0_ph_i311 + 56 | 0;
+ $1171 = HEAP32[$1170 >> 2] | 0;
+ $1172 = ($1171 | 0) == 0;
+ if ($1172) {
+ var $dimension_tib1_0_lcssa_i315 = 0;
+ var $tib1_0_lcssa_i314 = $tib1_0_ph_i311;
+ label = 276;
+ break;
+ } else {
+ var $dimension_tib1_029_i317 = 0;
+ var $1178 = $1171;
+ label = 277;
+ break;
+ }
+ case 275:
+ $1173 = $1181;
+ var $dimension_tib1_0_lcssa_i315 = $1182;
+ var $tib1_0_lcssa_i314 = $1173;
+ label = 276;
+ break;
+ case 276:
+ $1174 = $1160 + 56 | 0;
+ $1175 = $1174;
+ $1176 = HEAP32[$1175 >> 2] | 0;
+ $1177 = ($1176 | 0) == 0;
+ if ($1177) {
+ var $dimension_tib2_0_lcssa_i322 = 0;
+ var $tib2_0_lcssa_in_i321 = $1160;
+ label = 279;
+ break;
+ } else {
+ var $dimension_tib2_024_i319 = 0;
+ var $1187 = $1176;
+ label = 278;
+ break;
+ }
+ case 277:
+ $1179 = $1178 + 8 | 0;
+ $1180 = $1179;
+ $1181 = HEAP32[$1180 >> 2] | 0;
+ $1182 = $dimension_tib1_029_i317 + 1 | 0;
+ $1183 = $1181 + 56 | 0;
+ $1184 = $1183;
+ $1185 = HEAP32[$1184 >> 2] | 0;
+ $1186 = ($1185 | 0) == 0;
+ if ($1186) {
+ label = 275;
+ break;
+ } else {
+ var $dimension_tib1_029_i317 = $1182;
+ var $1178 = $1185;
+ label = 277;
+ break;
+ }
+ case 278:
+ $1188 = $1187 + 8 | 0;
+ $1189 = $1188;
+ $1190 = HEAP32[$1189 >> 2] | 0;
+ $1191 = $dimension_tib2_024_i319 + 1 | 0;
+ $1192 = $1190 + 56 | 0;
+ $1193 = $1192;
+ $1194 = HEAP32[$1193 >> 2] | 0;
+ $1195 = ($1194 | 0) == 0;
+ if ($1195) {
+ var $dimension_tib2_0_lcssa_i322 = $1191;
+ var $tib2_0_lcssa_in_i321 = $1190;
+ label = 279;
+ break;
+ } else {
+ var $dimension_tib2_024_i319 = $1191;
+ var $1187 = $1194;
+ label = 278;
+ break;
+ }
+ case 279:
+ $tib2_0_lcssa_i323 = $tib2_0_lcssa_in_i321;
+ $1196 = ($dimension_tib1_0_lcssa_i315 | 0) < ($dimension_tib2_0_lcssa_i322 | 0);
+ $1197 = ($tib1_0_lcssa_i314 | 0) == 0;
+ $or_cond_i324 = $1196 | $1197;
+ if ($or_cond_i324) {
+ label = 285;
+ break;
+ } else {
+ $tib1_121_i326 = $tib1_0_lcssa_i314;
+ label = 280;
+ break;
+ }
+ case 280:
+ $1198 = ($tib1_121_i326 | 0) == ($tib2_0_lcssa_i323 | 0);
+ if ($1198) {
+ label = 386;
+ break;
+ } else {
+ label = 281;
+ break;
+ }
+ case 281:
+ $1199 = $tib1_121_i326 + 108 | 0;
+ $1200 = HEAP32[$1199 >> 2] | 0;
+ $1201 = $tib1_121_i326 + 112 | 0;
+ $i_0_i329 = 0;
+ label = 282;
+ break;
+ case 282:
+ $1203 = ($i_0_i329 | 0) < ($1200 | 0);
+ if ($1203) {
+ label = 283;
+ break;
+ } else {
+ label = 284;
+ break;
+ }
+ case 283:
+ $1205 = HEAP32[$1201 >> 2] | 0;
+ $1206 = $1205 + ($i_0_i329 << 2) | 0;
+ $1207 = HEAP32[$1206 >> 2] | 0;
+ $1208 = ($1207 | 0) == ($tib2_0_lcssa_i323 | 0);
+ $1209 = $i_0_i329 + 1 | 0;
+ if ($1208) {
+ label = 386;
+ break;
+ } else {
+ $i_0_i329 = $1209;
+ label = 282;
+ break;
+ }
+ case 284:
+ $1211 = $tib1_121_i326 + 40 | 0;
+ $1212 = HEAP32[$1211 >> 2] | 0;
+ $1213 = ($1212 | 0) == 0;
+ if ($1213) {
+ label = 285;
+ break;
+ } else {
+ $tib1_121_i326 = $1212;
+ label = 280;
+ break;
+ }
+ case 285:
+ $1214 = HEAP32[$1038 >> 2] | 0;
+ $1215 = $1214;
+ invoke_vii(48, $1215 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 286:
+ $1217 = HEAP32[(98772 | 0) >> 2] | 0;
+ $1218 = ($1217 | 0) == 0;
+ if ($1218) {
+ label = 287;
+ break;
+ } else {
+ label = 288;
+ break;
+ }
+ case 287:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 288;
+ break;
+ case 288:
+ $1220 = HEAP32[140040 >> 2] | 0;
+ $1221 = $1220;
+ $_r0_sroa_0 = $1221;
+ $1222 = invoke_ii(556, 709 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r3_sroa_0 = $1222;
+ $_r0_sroa_0_0_load605 = $_r0_sroa_0;
+ $_r3_sroa_0_0_load594 = $_r3_sroa_0;
+ $_r0_sroa_0 = 0;
+ $_r0_sroa_0_0_load623 = $_r0_sroa_0;
+ $1223 = $_r0_sroa_0_0_load623;
+ $_r3_sroa_0 = $1223;
+ $_r0_sroa_1_4__r3_sroa_1_4_idx_idx = $_r3_sroa_1 | 0;
+ $_r0_sroa_1_4_idx156 = $_r0_sroa_1 | 0;
+ HEAP32[$_r0_sroa_1_4__r3_sroa_1_4_idx_idx >> 2] = HEAP32[$_r0_sroa_1_4_idx156 >> 2] | 0;
+ $1224 = HEAP32[$1069 >> 2] | 0;
+ _memcpy($1224 | 0, $1067 | 0, 40);
+ label = 179;
+ break;
+ case 289:
+ $1226 = HEAP32[$1069 >> 2] | 0;
+ _memcpy($1226 | 0, $1067 | 0, 40);
+ $1227 = HEAP32[(113236 | 0) >> 2] | 0;
+ $1228 = ($1227 | 0) == 0;
+ if ($1228) {
+ label = 290;
+ break;
+ } else {
+ label = 291;
+ break;
+ }
+ case 290:
+ invoke_v(538);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 291;
+ break;
+ case 291:
+ $1231 = $1066 + 20 | 0;
+ $1232 = $1231;
+ $1233 = HEAP32[$1232 >> 2] | 0;
+ $1234 = ($1233 | 0) == 0;
+ if ($1234) {
+ label = 305;
+ break;
+ } else {
+ label = 292;
+ break;
+ }
+ case 292:
+ $1236 = HEAP32[138672 >> 2] | 0;
+ $1237 = $1233;
+ $1238 = HEAP32[$1237 >> 2] | 0;
+ $1239 = $1238;
+ $1240 = $1236 + 8 | 0;
+ $1241 = $1240;
+ $1242 = HEAP32[$1241 >> 2] | 0;
+ $1243 = ($1238 | 0) == 82712;
+ if ($1243) {
+ label = 293;
+ break;
+ } else {
+ $tib1_0_ph_i290 = $1239;
+ label = 294;
+ break;
+ }
+ case 293:
+ $1245 = $1233 + 8 | 0;
+ $1246 = $1245;
+ $1247 = HEAP32[$1246 >> 2] | 0;
+ $1248 = $1247 + 8 | 0;
+ $1249 = $1248;
+ $1250 = HEAP32[$1249 >> 2] | 0;
+ $1251 = $1250;
+ $tib1_0_ph_i290 = $1251;
+ label = 294;
+ break;
+ case 294:
+ $1252 = $tib1_0_ph_i290 + 56 | 0;
+ $1253 = HEAP32[$1252 >> 2] | 0;
+ $1254 = ($1253 | 0) == 0;
+ if ($1254) {
+ var $dimension_tib1_0_lcssa_i294 = 0;
+ var $tib1_0_lcssa_i293 = $tib1_0_ph_i290;
+ label = 296;
+ break;
+ } else {
+ var $dimension_tib1_029_i296 = 0;
+ var $1260 = $1253;
+ label = 297;
+ break;
+ }
+ case 295:
+ $1255 = $1263;
+ var $dimension_tib1_0_lcssa_i294 = $1264;
+ var $tib1_0_lcssa_i293 = $1255;
+ label = 296;
+ break;
+ case 296:
+ $1256 = $1242 + 56 | 0;
+ $1257 = $1256;
+ $1258 = HEAP32[$1257 >> 2] | 0;
+ $1259 = ($1258 | 0) == 0;
+ if ($1259) {
+ var $dimension_tib2_0_lcssa_i301 = 0;
+ var $tib2_0_lcssa_in_i300 = $1242;
+ label = 299;
+ break;
+ } else {
+ var $dimension_tib2_024_i298 = 0;
+ var $1269 = $1258;
+ label = 298;
+ break;
+ }
+ case 297:
+ $1261 = $1260 + 8 | 0;
+ $1262 = $1261;
+ $1263 = HEAP32[$1262 >> 2] | 0;
+ $1264 = $dimension_tib1_029_i296 + 1 | 0;
+ $1265 = $1263 + 56 | 0;
+ $1266 = $1265;
+ $1267 = HEAP32[$1266 >> 2] | 0;
+ $1268 = ($1267 | 0) == 0;
+ if ($1268) {
+ label = 295;
+ break;
+ } else {
+ var $dimension_tib1_029_i296 = $1264;
+ var $1260 = $1267;
+ label = 297;
+ break;
+ }
+ case 298:
+ $1270 = $1269 + 8 | 0;
+ $1271 = $1270;
+ $1272 = HEAP32[$1271 >> 2] | 0;
+ $1273 = $dimension_tib2_024_i298 + 1 | 0;
+ $1274 = $1272 + 56 | 0;
+ $1275 = $1274;
+ $1276 = HEAP32[$1275 >> 2] | 0;
+ $1277 = ($1276 | 0) == 0;
+ if ($1277) {
+ var $dimension_tib2_0_lcssa_i301 = $1273;
+ var $tib2_0_lcssa_in_i300 = $1272;
+ label = 299;
+ break;
+ } else {
+ var $dimension_tib2_024_i298 = $1273;
+ var $1269 = $1276;
+ label = 298;
+ break;
+ }
+ case 299:
+ $tib2_0_lcssa_i302 = $tib2_0_lcssa_in_i300;
+ $1278 = ($dimension_tib1_0_lcssa_i294 | 0) < ($dimension_tib2_0_lcssa_i301 | 0);
+ $1279 = ($tib1_0_lcssa_i293 | 0) == 0;
+ $or_cond_i303 = $1278 | $1279;
+ if ($or_cond_i303) {
+ label = 305;
+ break;
+ } else {
+ $tib1_121_i305 = $tib1_0_lcssa_i293;
+ label = 300;
+ break;
+ }
+ case 300:
+ $1280 = ($tib1_121_i305 | 0) == ($tib2_0_lcssa_i302 | 0);
+ if ($1280) {
+ label = 361;
+ break;
+ } else {
+ label = 301;
+ break;
+ }
+ case 301:
+ $1281 = $tib1_121_i305 + 108 | 0;
+ $1282 = HEAP32[$1281 >> 2] | 0;
+ $1283 = $tib1_121_i305 + 112 | 0;
+ $i_0_i308 = 0;
+ label = 302;
+ break;
+ case 302:
+ $1285 = ($i_0_i308 | 0) < ($1282 | 0);
+ if ($1285) {
+ label = 303;
+ break;
+ } else {
+ label = 304;
+ break;
+ }
+ case 303:
+ $1287 = HEAP32[$1283 >> 2] | 0;
+ $1288 = $1287 + ($i_0_i308 << 2) | 0;
+ $1289 = HEAP32[$1288 >> 2] | 0;
+ $1290 = ($1289 | 0) == ($tib2_0_lcssa_i302 | 0);
+ $1291 = $i_0_i308 + 1 | 0;
+ if ($1290) {
+ label = 361;
+ break;
+ } else {
+ $i_0_i308 = $1291;
+ label = 302;
+ break;
+ }
+ case 304:
+ $1293 = $tib1_121_i305 + 40 | 0;
+ $1294 = HEAP32[$1293 >> 2] | 0;
+ $1295 = ($1294 | 0) == 0;
+ if ($1295) {
+ label = 305;
+ break;
+ } else {
+ $tib1_121_i305 = $1294;
+ label = 300;
+ break;
+ }
+ case 305:
+ $1296 = HEAP32[(107740 | 0) >> 2] | 0;
+ $1297 = ($1296 | 0) == 0;
+ if ($1297) {
+ label = 306;
+ break;
+ } else {
+ label = 307;
+ break;
+ }
+ case 306:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 307;
+ break;
+ case 307:
+ $1300 = HEAP32[$1232 >> 2] | 0;
+ $1301 = ($1300 | 0) == 0;
+ if ($1301) {
+ label = 321;
+ break;
+ } else {
+ label = 308;
+ break;
+ }
+ case 308:
+ $1303 = HEAP32[137616 >> 2] | 0;
+ $1304 = $1300;
+ $1305 = HEAP32[$1304 >> 2] | 0;
+ $1306 = $1305;
+ $1307 = $1303 + 8 | 0;
+ $1308 = $1307;
+ $1309 = HEAP32[$1308 >> 2] | 0;
+ $1310 = ($1305 | 0) == 82712;
+ if ($1310) {
+ label = 309;
+ break;
+ } else {
+ $tib1_0_ph_i269 = $1306;
+ label = 310;
+ break;
+ }
+ case 309:
+ $1312 = $1300 + 8 | 0;
+ $1313 = $1312;
+ $1314 = HEAP32[$1313 >> 2] | 0;
+ $1315 = $1314 + 8 | 0;
+ $1316 = $1315;
+ $1317 = HEAP32[$1316 >> 2] | 0;
+ $1318 = $1317;
+ $tib1_0_ph_i269 = $1318;
+ label = 310;
+ break;
+ case 310:
+ $1319 = $tib1_0_ph_i269 + 56 | 0;
+ $1320 = HEAP32[$1319 >> 2] | 0;
+ $1321 = ($1320 | 0) == 0;
+ if ($1321) {
+ var $dimension_tib1_0_lcssa_i273 = 0;
+ var $tib1_0_lcssa_i272 = $tib1_0_ph_i269;
+ label = 312;
+ break;
+ } else {
+ var $dimension_tib1_029_i275 = 0;
+ var $1327 = $1320;
+ label = 313;
+ break;
+ }
+ case 311:
+ $1322 = $1330;
+ var $dimension_tib1_0_lcssa_i273 = $1331;
+ var $tib1_0_lcssa_i272 = $1322;
+ label = 312;
+ break;
+ case 312:
+ $1323 = $1309 + 56 | 0;
+ $1324 = $1323;
+ $1325 = HEAP32[$1324 >> 2] | 0;
+ $1326 = ($1325 | 0) == 0;
+ if ($1326) {
+ var $dimension_tib2_0_lcssa_i280 = 0;
+ var $tib2_0_lcssa_in_i279 = $1309;
+ label = 315;
+ break;
+ } else {
+ var $dimension_tib2_024_i277 = 0;
+ var $1336 = $1325;
+ label = 314;
+ break;
+ }
+ case 313:
+ $1328 = $1327 + 8 | 0;
+ $1329 = $1328;
+ $1330 = HEAP32[$1329 >> 2] | 0;
+ $1331 = $dimension_tib1_029_i275 + 1 | 0;
+ $1332 = $1330 + 56 | 0;
+ $1333 = $1332;
+ $1334 = HEAP32[$1333 >> 2] | 0;
+ $1335 = ($1334 | 0) == 0;
+ if ($1335) {
+ label = 311;
+ break;
+ } else {
+ var $dimension_tib1_029_i275 = $1331;
+ var $1327 = $1334;
+ label = 313;
+ break;
+ }
+ case 314:
+ $1337 = $1336 + 8 | 0;
+ $1338 = $1337;
+ $1339 = HEAP32[$1338 >> 2] | 0;
+ $1340 = $dimension_tib2_024_i277 + 1 | 0;
+ $1341 = $1339 + 56 | 0;
+ $1342 = $1341;
+ $1343 = HEAP32[$1342 >> 2] | 0;
+ $1344 = ($1343 | 0) == 0;
+ if ($1344) {
+ var $dimension_tib2_0_lcssa_i280 = $1340;
+ var $tib2_0_lcssa_in_i279 = $1339;
+ label = 315;
+ break;
+ } else {
+ var $dimension_tib2_024_i277 = $1340;
+ var $1336 = $1343;
+ label = 314;
+ break;
+ }
+ case 315:
+ $tib2_0_lcssa_i281 = $tib2_0_lcssa_in_i279;
+ $1345 = ($dimension_tib1_0_lcssa_i273 | 0) < ($dimension_tib2_0_lcssa_i280 | 0);
+ $1346 = ($tib1_0_lcssa_i272 | 0) == 0;
+ $or_cond_i282 = $1345 | $1346;
+ if ($or_cond_i282) {
+ label = 321;
+ break;
+ } else {
+ $tib1_121_i284 = $tib1_0_lcssa_i272;
+ label = 316;
+ break;
+ }
+ case 316:
+ $1347 = ($tib1_121_i284 | 0) == ($tib2_0_lcssa_i281 | 0);
+ if ($1347) {
+ label = 386;
+ break;
+ } else {
+ label = 317;
+ break;
+ }
+ case 317:
+ $1348 = $tib1_121_i284 + 108 | 0;
+ $1349 = HEAP32[$1348 >> 2] | 0;
+ $1350 = $tib1_121_i284 + 112 | 0;
+ $i_0_i287 = 0;
+ label = 318;
+ break;
+ case 318:
+ $1352 = ($i_0_i287 | 0) < ($1349 | 0);
+ if ($1352) {
+ label = 319;
+ break;
+ } else {
+ label = 320;
+ break;
+ }
+ case 319:
+ $1354 = HEAP32[$1350 >> 2] | 0;
+ $1355 = $1354 + ($i_0_i287 << 2) | 0;
+ $1356 = HEAP32[$1355 >> 2] | 0;
+ $1357 = ($1356 | 0) == ($tib2_0_lcssa_i281 | 0);
+ $1358 = $i_0_i287 + 1 | 0;
+ if ($1357) {
+ label = 386;
+ break;
+ } else {
+ $i_0_i287 = $1358;
+ label = 318;
+ break;
+ }
+ case 320:
+ $1360 = $tib1_121_i284 + 40 | 0;
+ $1361 = HEAP32[$1360 >> 2] | 0;
+ $1362 = ($1361 | 0) == 0;
+ if ($1362) {
+ label = 321;
+ break;
+ } else {
+ $tib1_121_i284 = $1361;
+ label = 316;
+ break;
+ }
+ case 321:
+ $1363 = HEAP32[$1069 >> 2] | 0;
+ $1364 = $1363;
+ invoke_vii(48, $1364 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 322:
+ $1366 = HEAP32[(105500 | 0) >> 2] | 0;
+ $1367 = ($1366 | 0) == 0;
+ if ($1367) {
+ label = 323;
+ break;
+ } else {
+ label = 324;
+ break;
+ }
+ case 323:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 324;
+ break;
+ case 324:
+ $1369 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1370$0 = $1369;
+ $1370$1 = 0;
+ $1371 = invoke_iii(364, $1370$0 | 0, $1370$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1372 = $local_env_w4567aaac23b1c44;
+ $1373 = $1371 + 16 | 0;
+ $1374 = $1373;
+ $1375 = HEAP32[$1374 >> 2] | 0;
+ _memcpy($1372 | 0, $1375 | 0, 40);
+ $1376 = HEAP32[$1374 >> 2] | 0;
+ $1377 = $1376;
+ $1378 = _saveSetjmp($1377 | 0, label, setjmpTable) | 0;
+ label = 423;
+ break;
+ case 423:
+ $1379 = ($1378 | 0) == 0;
+ if ($1379) {
+ label = 325;
+ break;
+ } else {
+ label = 328;
+ break;
+ }
+ case 325:
+ $_r0_sroa_0 = 1;
+ $_r0_sroa_0_0_load604 = $_r0_sroa_0;
+ $1381 = HEAP32[(98772 | 0) >> 2] | 0;
+ $1382 = ($1381 | 0) == 0;
+ if ($1382) {
+ label = 326;
+ break;
+ } else {
+ label = 327;
+ break;
+ }
+ case 326:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 327;
+ break;
+ case 327:
+ HEAP32[140048 >> 2] = $_r0_sroa_0_0_load604;
+ $_r3_sroa_0_0_load593 = $_r3_sroa_0;
+ $1384 = $_r3_sroa_0_0_load593;
+ $1385 = HEAP32[$1384 >> 2] | 0;
+ $1386 = $1385 + 116 | 0;
+ $1387 = HEAP32[$1386 >> 2] | 0;
+ $1388 = $1387 + 4 | 0;
+ $1389 = HEAP32[$1388 >> 2] | 0;
+ $1390 = $1389;
+ $_r3_sroa_0_0_load = $_r3_sroa_0;
+ $1391 = invoke_ii($1390 | 0, $_r3_sroa_0_0_load | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1392 = $1391;
+ $_r0_sroa_0 = $1392;
+ invoke_viiii(14, 16136 | 0 | 0, 11648 | 0 | 0, 126872 | 0 | 0, 1630 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 328:
+ $1394 = HEAP32[$1374 >> 2] | 0;
+ _memcpy($1394 | 0, $1372 | 0, 40);
+ $1395 = HEAP32[(113236 | 0) >> 2] | 0;
+ $1396 = ($1395 | 0) == 0;
+ if ($1396) {
+ label = 329;
+ break;
+ } else {
+ label = 330;
+ break;
+ }
+ case 329:
+ invoke_v(538);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 330;
+ break;
+ case 330:
+ $1399 = $1371 + 20 | 0;
+ $1400 = $1399;
+ $1401 = HEAP32[$1400 >> 2] | 0;
+ $1402 = ($1401 | 0) == 0;
+ if ($1402) {
+ label = 344;
+ break;
+ } else {
+ label = 331;
+ break;
+ }
+ case 331:
+ $1404 = HEAP32[138672 >> 2] | 0;
+ $1405 = $1401;
+ $1406 = HEAP32[$1405 >> 2] | 0;
+ $1407 = $1406;
+ $1408 = $1404 + 8 | 0;
+ $1409 = $1408;
+ $1410 = HEAP32[$1409 >> 2] | 0;
+ $1411 = ($1406 | 0) == 82712;
+ if ($1411) {
+ label = 332;
+ break;
+ } else {
+ $tib1_0_ph_i248 = $1407;
+ label = 333;
+ break;
+ }
+ case 332:
+ $1413 = $1401 + 8 | 0;
+ $1414 = $1413;
+ $1415 = HEAP32[$1414 >> 2] | 0;
+ $1416 = $1415 + 8 | 0;
+ $1417 = $1416;
+ $1418 = HEAP32[$1417 >> 2] | 0;
+ $1419 = $1418;
+ $tib1_0_ph_i248 = $1419;
+ label = 333;
+ break;
+ case 333:
+ $1420 = $tib1_0_ph_i248 + 56 | 0;
+ $1421 = HEAP32[$1420 >> 2] | 0;
+ $1422 = ($1421 | 0) == 0;
+ if ($1422) {
+ var $dimension_tib1_0_lcssa_i252 = 0;
+ var $tib1_0_lcssa_i251 = $tib1_0_ph_i248;
+ label = 335;
+ break;
+ } else {
+ var $dimension_tib1_029_i254 = 0;
+ var $1428 = $1421;
+ label = 336;
+ break;
+ }
+ case 334:
+ $1423 = $1431;
+ var $dimension_tib1_0_lcssa_i252 = $1432;
+ var $tib1_0_lcssa_i251 = $1423;
+ label = 335;
+ break;
+ case 335:
+ $1424 = $1410 + 56 | 0;
+ $1425 = $1424;
+ $1426 = HEAP32[$1425 >> 2] | 0;
+ $1427 = ($1426 | 0) == 0;
+ if ($1427) {
+ var $dimension_tib2_0_lcssa_i259 = 0;
+ var $tib2_0_lcssa_in_i258 = $1410;
+ label = 338;
+ break;
+ } else {
+ var $dimension_tib2_024_i256 = 0;
+ var $1437 = $1426;
+ label = 337;
+ break;
+ }
+ case 336:
+ $1429 = $1428 + 8 | 0;
+ $1430 = $1429;
+ $1431 = HEAP32[$1430 >> 2] | 0;
+ $1432 = $dimension_tib1_029_i254 + 1 | 0;
+ $1433 = $1431 + 56 | 0;
+ $1434 = $1433;
+ $1435 = HEAP32[$1434 >> 2] | 0;
+ $1436 = ($1435 | 0) == 0;
+ if ($1436) {
+ label = 334;
+ break;
+ } else {
+ var $dimension_tib1_029_i254 = $1432;
+ var $1428 = $1435;
+ label = 336;
+ break;
+ }
+ case 337:
+ $1438 = $1437 + 8 | 0;
+ $1439 = $1438;
+ $1440 = HEAP32[$1439 >> 2] | 0;
+ $1441 = $dimension_tib2_024_i256 + 1 | 0;
+ $1442 = $1440 + 56 | 0;
+ $1443 = $1442;
+ $1444 = HEAP32[$1443 >> 2] | 0;
+ $1445 = ($1444 | 0) == 0;
+ if ($1445) {
+ var $dimension_tib2_0_lcssa_i259 = $1441;
+ var $tib2_0_lcssa_in_i258 = $1440;
+ label = 338;
+ break;
+ } else {
+ var $dimension_tib2_024_i256 = $1441;
+ var $1437 = $1444;
+ label = 337;
+ break;
+ }
+ case 338:
+ $tib2_0_lcssa_i260 = $tib2_0_lcssa_in_i258;
+ $1446 = ($dimension_tib1_0_lcssa_i252 | 0) < ($dimension_tib2_0_lcssa_i259 | 0);
+ $1447 = ($tib1_0_lcssa_i251 | 0) == 0;
+ $or_cond_i261 = $1446 | $1447;
+ if ($or_cond_i261) {
+ label = 344;
+ break;
+ } else {
+ $tib1_121_i263 = $tib1_0_lcssa_i251;
+ label = 339;
+ break;
+ }
+ case 339:
+ $1448 = ($tib1_121_i263 | 0) == ($tib2_0_lcssa_i260 | 0);
+ if ($1448) {
+ label = 361;
+ break;
+ } else {
+ label = 340;
+ break;
+ }
+ case 340:
+ $1449 = $tib1_121_i263 + 108 | 0;
+ $1450 = HEAP32[$1449 >> 2] | 0;
+ $1451 = $tib1_121_i263 + 112 | 0;
+ $i_0_i266 = 0;
+ label = 341;
+ break;
+ case 341:
+ $1453 = ($i_0_i266 | 0) < ($1450 | 0);
+ if ($1453) {
+ label = 342;
+ break;
+ } else {
+ label = 343;
+ break;
+ }
+ case 342:
+ $1455 = HEAP32[$1451 >> 2] | 0;
+ $1456 = $1455 + ($i_0_i266 << 2) | 0;
+ $1457 = HEAP32[$1456 >> 2] | 0;
+ $1458 = ($1457 | 0) == ($tib2_0_lcssa_i260 | 0);
+ $1459 = $i_0_i266 + 1 | 0;
+ if ($1458) {
+ label = 361;
+ break;
+ } else {
+ $i_0_i266 = $1459;
+ label = 341;
+ break;
+ }
+ case 343:
+ $1461 = $tib1_121_i263 + 40 | 0;
+ $1462 = HEAP32[$1461 >> 2] | 0;
+ $1463 = ($1462 | 0) == 0;
+ if ($1463) {
+ label = 344;
+ break;
+ } else {
+ $tib1_121_i263 = $1462;
+ label = 339;
+ break;
+ }
+ case 344:
+ $1464 = HEAP32[(107740 | 0) >> 2] | 0;
+ $1465 = ($1464 | 0) == 0;
+ if ($1465) {
+ label = 345;
+ break;
+ } else {
+ label = 346;
+ break;
+ }
+ case 345:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 346;
+ break;
+ case 346:
+ $1468 = HEAP32[$1400 >> 2] | 0;
+ $1469 = ($1468 | 0) == 0;
+ if ($1469) {
+ label = 360;
+ break;
+ } else {
+ label = 347;
+ break;
+ }
+ case 347:
+ $1471 = HEAP32[137616 >> 2] | 0;
+ $1472 = $1468;
+ $1473 = HEAP32[$1472 >> 2] | 0;
+ $1474 = $1473;
+ $1475 = $1471 + 8 | 0;
+ $1476 = $1475;
+ $1477 = HEAP32[$1476 >> 2] | 0;
+ $1478 = ($1473 | 0) == 82712;
+ if ($1478) {
+ label = 348;
+ break;
+ } else {
+ $tib1_0_ph_i227 = $1474;
+ label = 349;
+ break;
+ }
+ case 348:
+ $1480 = $1468 + 8 | 0;
+ $1481 = $1480;
+ $1482 = HEAP32[$1481 >> 2] | 0;
+ $1483 = $1482 + 8 | 0;
+ $1484 = $1483;
+ $1485 = HEAP32[$1484 >> 2] | 0;
+ $1486 = $1485;
+ $tib1_0_ph_i227 = $1486;
+ label = 349;
+ break;
+ case 349:
+ $1487 = $tib1_0_ph_i227 + 56 | 0;
+ $1488 = HEAP32[$1487 >> 2] | 0;
+ $1489 = ($1488 | 0) == 0;
+ if ($1489) {
+ var $dimension_tib1_0_lcssa_i231 = 0;
+ var $tib1_0_lcssa_i230 = $tib1_0_ph_i227;
+ label = 351;
+ break;
+ } else {
+ var $dimension_tib1_029_i233 = 0;
+ var $1495 = $1488;
+ label = 352;
+ break;
+ }
+ case 350:
+ $1490 = $1498;
+ var $dimension_tib1_0_lcssa_i231 = $1499;
+ var $tib1_0_lcssa_i230 = $1490;
+ label = 351;
+ break;
+ case 351:
+ $1491 = $1477 + 56 | 0;
+ $1492 = $1491;
+ $1493 = HEAP32[$1492 >> 2] | 0;
+ $1494 = ($1493 | 0) == 0;
+ if ($1494) {
+ var $dimension_tib2_0_lcssa_i238 = 0;
+ var $tib2_0_lcssa_in_i237 = $1477;
+ label = 354;
+ break;
+ } else {
+ var $dimension_tib2_024_i235 = 0;
+ var $1504 = $1493;
+ label = 353;
+ break;
+ }
+ case 352:
+ $1496 = $1495 + 8 | 0;
+ $1497 = $1496;
+ $1498 = HEAP32[$1497 >> 2] | 0;
+ $1499 = $dimension_tib1_029_i233 + 1 | 0;
+ $1500 = $1498 + 56 | 0;
+ $1501 = $1500;
+ $1502 = HEAP32[$1501 >> 2] | 0;
+ $1503 = ($1502 | 0) == 0;
+ if ($1503) {
+ label = 350;
+ break;
+ } else {
+ var $dimension_tib1_029_i233 = $1499;
+ var $1495 = $1502;
+ label = 352;
+ break;
+ }
+ case 353:
+ $1505 = $1504 + 8 | 0;
+ $1506 = $1505;
+ $1507 = HEAP32[$1506 >> 2] | 0;
+ $1508 = $dimension_tib2_024_i235 + 1 | 0;
+ $1509 = $1507 + 56 | 0;
+ $1510 = $1509;
+ $1511 = HEAP32[$1510 >> 2] | 0;
+ $1512 = ($1511 | 0) == 0;
+ if ($1512) {
+ var $dimension_tib2_0_lcssa_i238 = $1508;
+ var $tib2_0_lcssa_in_i237 = $1507;
+ label = 354;
+ break;
+ } else {
+ var $dimension_tib2_024_i235 = $1508;
+ var $1504 = $1511;
+ label = 353;
+ break;
+ }
+ case 354:
+ $tib2_0_lcssa_i239 = $tib2_0_lcssa_in_i237;
+ $1513 = ($dimension_tib1_0_lcssa_i231 | 0) < ($dimension_tib2_0_lcssa_i238 | 0);
+ $1514 = ($tib1_0_lcssa_i230 | 0) == 0;
+ $or_cond_i240 = $1513 | $1514;
+ if ($or_cond_i240) {
+ label = 360;
+ break;
+ } else {
+ $tib1_121_i242 = $tib1_0_lcssa_i230;
+ label = 355;
+ break;
+ }
+ case 355:
+ $1515 = ($tib1_121_i242 | 0) == ($tib2_0_lcssa_i239 | 0);
+ if ($1515) {
+ label = 386;
+ break;
+ } else {
+ label = 356;
+ break;
+ }
+ case 356:
+ $1516 = $tib1_121_i242 + 108 | 0;
+ $1517 = HEAP32[$1516 >> 2] | 0;
+ $1518 = $tib1_121_i242 + 112 | 0;
+ $i_0_i245 = 0;
+ label = 357;
+ break;
+ case 357:
+ $1520 = ($i_0_i245 | 0) < ($1517 | 0);
+ if ($1520) {
+ label = 358;
+ break;
+ } else {
+ label = 359;
+ break;
+ }
+ case 358:
+ $1522 = HEAP32[$1518 >> 2] | 0;
+ $1523 = $1522 + ($i_0_i245 << 2) | 0;
+ $1524 = HEAP32[$1523 >> 2] | 0;
+ $1525 = ($1524 | 0) == ($tib2_0_lcssa_i239 | 0);
+ $1526 = $i_0_i245 + 1 | 0;
+ if ($1525) {
+ label = 386;
+ break;
+ } else {
+ $i_0_i245 = $1526;
+ label = 357;
+ break;
+ }
+ case 359:
+ $1528 = $tib1_121_i242 + 40 | 0;
+ $1529 = HEAP32[$1528 >> 2] | 0;
+ $1530 = ($1529 | 0) == 0;
+ if ($1530) {
+ label = 360;
+ break;
+ } else {
+ $tib1_121_i242 = $1529;
+ label = 355;
+ break;
+ }
+ case 360:
+ $1531 = HEAP32[$1374 >> 2] | 0;
+ $1532 = $1531;
+ invoke_vii(48, $1532 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 361:
+ $1533 = HEAP32[(105500 | 0) >> 2] | 0;
+ $1534 = ($1533 | 0) == 0;
+ if ($1534) {
+ label = 362;
+ break;
+ } else {
+ label = 363;
+ break;
+ }
+ case 362:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 363;
+ break;
+ case 363:
+ $1536 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1537$0 = $1536;
+ $1537$1 = 0;
+ $1538 = invoke_iii(364, $1537$0 | 0, $1537$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1539 = $local_env_w4567aaac23b1c48;
+ $1540 = $1538 + 16 | 0;
+ $1541 = $1540;
+ $1542 = HEAP32[$1541 >> 2] | 0;
+ _memcpy($1539 | 0, $1542 | 0, 40);
+ $1543 = HEAP32[$1541 >> 2] | 0;
+ $1544 = $1543;
+ $1545 = _saveSetjmp($1544 | 0, label, setjmpTable) | 0;
+ label = 424;
+ break;
+ case 424:
+ $1546 = ($1545 | 0) == 0;
+ if ($1546) {
+ label = 364;
+ break;
+ } else {
+ label = 369;
+ break;
+ }
+ case 364:
+ $1548 = HEAP32[(105500 | 0) >> 2] | 0;
+ $1549 = ($1548 | 0) == 0;
+ if ($1549) {
+ label = 365;
+ break;
+ } else {
+ label = 366;
+ break;
+ }
+ case 365:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 366;
+ break;
+ case 366:
+ $1551 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1552$0 = $1551;
+ $1552$1 = 0;
+ $1553 = invoke_iii(364, $1552$0 | 0, $1552$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1554 = $1553 + 20 | 0;
+ $1555 = $1554;
+ $1556 = HEAP32[$1555 >> 2] | 0;
+ $1557 = $1556;
+ $_r0_sroa_0 = $1557;
+ $_r0_sroa_0 = 0;
+ $_r0_sroa_0_0_load602 = $_r0_sroa_0;
+ $1558 = HEAP32[(98772 | 0) >> 2] | 0;
+ $1559 = ($1558 | 0) == 0;
+ if ($1559) {
+ label = 367;
+ break;
+ } else {
+ label = 368;
+ break;
+ }
+ case 367:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 368;
+ break;
+ case 368:
+ HEAP32[140048 >> 2] = $_r0_sroa_0_0_load602;
+ $1561 = HEAP32[$1541 >> 2] | 0;
+ _memcpy($1561 | 0, $1539 | 0, 40);
+ label = 239;
+ break;
+ case 369:
+ $1563 = HEAP32[$1541 >> 2] | 0;
+ _memcpy($1563 | 0, $1539 | 0, 40);
+ $1564 = HEAP32[(107740 | 0) >> 2] | 0;
+ $1565 = ($1564 | 0) == 0;
+ if ($1565) {
+ label = 370;
+ break;
+ } else {
+ label = 371;
+ break;
+ }
+ case 370:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 371;
+ break;
+ case 371:
+ $1568 = $1538 + 20 | 0;
+ $1569 = $1568;
+ $1570 = HEAP32[$1569 >> 2] | 0;
+ $1571 = ($1570 | 0) == 0;
+ if ($1571) {
+ label = 385;
+ break;
+ } else {
+ label = 372;
+ break;
+ }
+ case 372:
+ $1573 = HEAP32[137616 >> 2] | 0;
+ $1574 = $1570;
+ $1575 = HEAP32[$1574 >> 2] | 0;
+ $1576 = $1575;
+ $1577 = $1573 + 8 | 0;
+ $1578 = $1577;
+ $1579 = HEAP32[$1578 >> 2] | 0;
+ $1580 = ($1575 | 0) == 82712;
+ if ($1580) {
+ label = 373;
+ break;
+ } else {
+ $tib1_0_ph_i185 = $1576;
+ label = 374;
+ break;
+ }
+ case 373:
+ $1582 = $1570 + 8 | 0;
+ $1583 = $1582;
+ $1584 = HEAP32[$1583 >> 2] | 0;
+ $1585 = $1584 + 8 | 0;
+ $1586 = $1585;
+ $1587 = HEAP32[$1586 >> 2] | 0;
+ $1588 = $1587;
+ $tib1_0_ph_i185 = $1588;
+ label = 374;
+ break;
+ case 374:
+ $1589 = $tib1_0_ph_i185 + 56 | 0;
+ $1590 = HEAP32[$1589 >> 2] | 0;
+ $1591 = ($1590 | 0) == 0;
+ if ($1591) {
+ var $dimension_tib1_0_lcssa_i189 = 0;
+ var $tib1_0_lcssa_i188 = $tib1_0_ph_i185;
+ label = 376;
+ break;
+ } else {
+ var $dimension_tib1_029_i191 = 0;
+ var $1597 = $1590;
+ label = 377;
+ break;
+ }
+ case 375:
+ $1592 = $1600;
+ var $dimension_tib1_0_lcssa_i189 = $1601;
+ var $tib1_0_lcssa_i188 = $1592;
+ label = 376;
+ break;
+ case 376:
+ $1593 = $1579 + 56 | 0;
+ $1594 = $1593;
+ $1595 = HEAP32[$1594 >> 2] | 0;
+ $1596 = ($1595 | 0) == 0;
+ if ($1596) {
+ var $dimension_tib2_0_lcssa_i196 = 0;
+ var $tib2_0_lcssa_in_i195 = $1579;
+ label = 379;
+ break;
+ } else {
+ var $dimension_tib2_024_i193 = 0;
+ var $1606 = $1595;
+ label = 378;
+ break;
+ }
+ case 377:
+ $1598 = $1597 + 8 | 0;
+ $1599 = $1598;
+ $1600 = HEAP32[$1599 >> 2] | 0;
+ $1601 = $dimension_tib1_029_i191 + 1 | 0;
+ $1602 = $1600 + 56 | 0;
+ $1603 = $1602;
+ $1604 = HEAP32[$1603 >> 2] | 0;
+ $1605 = ($1604 | 0) == 0;
+ if ($1605) {
+ label = 375;
+ break;
+ } else {
+ var $dimension_tib1_029_i191 = $1601;
+ var $1597 = $1604;
+ label = 377;
+ break;
+ }
+ case 378:
+ $1607 = $1606 + 8 | 0;
+ $1608 = $1607;
+ $1609 = HEAP32[$1608 >> 2] | 0;
+ $1610 = $dimension_tib2_024_i193 + 1 | 0;
+ $1611 = $1609 + 56 | 0;
+ $1612 = $1611;
+ $1613 = HEAP32[$1612 >> 2] | 0;
+ $1614 = ($1613 | 0) == 0;
+ if ($1614) {
+ var $dimension_tib2_0_lcssa_i196 = $1610;
+ var $tib2_0_lcssa_in_i195 = $1609;
+ label = 379;
+ break;
+ } else {
+ var $dimension_tib2_024_i193 = $1610;
+ var $1606 = $1613;
+ label = 378;
+ break;
+ }
+ case 379:
+ $tib2_0_lcssa_i197 = $tib2_0_lcssa_in_i195;
+ $1615 = ($dimension_tib1_0_lcssa_i189 | 0) < ($dimension_tib2_0_lcssa_i196 | 0);
+ $1616 = ($tib1_0_lcssa_i188 | 0) == 0;
+ $or_cond_i198 = $1615 | $1616;
+ if ($or_cond_i198) {
+ label = 385;
+ break;
+ } else {
+ $tib1_121_i200 = $tib1_0_lcssa_i188;
+ label = 380;
+ break;
+ }
+ case 380:
+ $1617 = ($tib1_121_i200 | 0) == ($tib2_0_lcssa_i197 | 0);
+ if ($1617) {
+ label = 54;
+ break;
+ } else {
+ label = 381;
+ break;
+ }
+ case 381:
+ $1618 = $tib1_121_i200 + 108 | 0;
+ $1619 = HEAP32[$1618 >> 2] | 0;
+ $1620 = $tib1_121_i200 + 112 | 0;
+ $i_0_i203 = 0;
+ label = 382;
+ break;
+ case 382:
+ $1622 = ($i_0_i203 | 0) < ($1619 | 0);
+ if ($1622) {
+ label = 383;
+ break;
+ } else {
+ label = 384;
+ break;
+ }
+ case 383:
+ $1624 = HEAP32[$1620 >> 2] | 0;
+ $1625 = $1624 + ($i_0_i203 << 2) | 0;
+ $1626 = HEAP32[$1625 >> 2] | 0;
+ $1627 = ($1626 | 0) == ($tib2_0_lcssa_i197 | 0);
+ $1628 = $i_0_i203 + 1 | 0;
+ if ($1627) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i203 = $1628;
+ label = 382;
+ break;
+ }
+ case 384:
+ $1630 = $tib1_121_i200 + 40 | 0;
+ $1631 = HEAP32[$1630 >> 2] | 0;
+ $1632 = ($1631 | 0) == 0;
+ if ($1632) {
+ label = 385;
+ break;
+ } else {
+ $tib1_121_i200 = $1631;
+ label = 380;
+ break;
+ }
+ case 385:
+ $1633 = HEAP32[$1541 >> 2] | 0;
+ $1634 = $1633;
+ invoke_vii(48, $1634 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 386:
+ $1635 = HEAP32[(105500 | 0) >> 2] | 0;
+ $1636 = ($1635 | 0) == 0;
+ if ($1636) {
+ label = 387;
+ break;
+ } else {
+ label = 388;
+ break;
+ }
+ case 387:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 388;
+ break;
+ case 388:
+ $1638 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1639$0 = $1638;
+ $1639$1 = 0;
+ $1640 = invoke_iii(364, $1639$0 | 0, $1639$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1641 = $local_env_w4567aaac23b1c50;
+ $1642 = $1640 + 16 | 0;
+ $1643 = $1642;
+ $1644 = HEAP32[$1643 >> 2] | 0;
+ _memcpy($1641 | 0, $1644 | 0, 40);
+ $1645 = HEAP32[$1643 >> 2] | 0;
+ $1646 = $1645;
+ $1647 = _saveSetjmp($1646 | 0, label, setjmpTable) | 0;
+ label = 425;
+ break;
+ case 425:
+ $1648 = ($1647 | 0) == 0;
+ if ($1648) {
+ label = 389;
+ break;
+ } else {
+ label = 396;
+ break;
+ }
+ case 389:
+ $1650 = HEAP32[(105500 | 0) >> 2] | 0;
+ $1651 = ($1650 | 0) == 0;
+ if ($1651) {
+ label = 390;
+ break;
+ } else {
+ label = 391;
+ break;
+ }
+ case 390:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 391;
+ break;
+ case 391:
+ $1653 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1654$0 = $1653;
+ $1654$1 = 0;
+ $1655 = invoke_iii(364, $1654$0 | 0, $1654$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1656 = $1655 + 20 | 0;
+ $1657 = $1656;
+ $1658 = HEAP32[$1657 >> 2] | 0;
+ $1659 = $1658;
+ $_r0_sroa_0 = $1659;
+ $_r2_sroa_0 = 0;
+ $_r2_sroa_0_0_load = $_r2_sroa_0;
+ $1660 = HEAP32[(98772 | 0) >> 2] | 0;
+ $1661 = ($1660 | 0) == 0;
+ if ($1661) {
+ label = 392;
+ break;
+ } else {
+ label = 393;
+ break;
+ }
+ case 392:
+ invoke_v(702);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 393;
+ break;
+ case 393:
+ HEAP32[140048 >> 2] = $_r2_sroa_0_0_load;
+ $1663 = HEAP32[(105500 | 0) >> 2] | 0;
+ $1664 = ($1663 | 0) == 0;
+ if ($1664) {
+ label = 394;
+ break;
+ } else {
+ label = 395;
+ break;
+ }
+ case 394:
+ invoke_v(30);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 395;
+ break;
+ case 395:
+ $1666 = invoke_i(70) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $1667$0 = $1666;
+ $1667$1 = 0;
+ $1668 = invoke_iii(364, $1667$0 | 0, $1667$1 | 0) | 0;
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ $_r0_sroa_0_0_load = $_r0_sroa_0;
+ $1669 = $_r0_sroa_0_0_load;
+ $1670 = $1668 + 16 | 0;
+ $1671 = $1668 + 20 | 0;
+ $1672 = $1671;
+ HEAP32[$1672 >> 2] = $1669;
+ $1673 = $1670;
+ $1674 = HEAP32[$1673 >> 2] | 0;
+ $1675 = $1674;
+ invoke_vii(48, $1675 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case 396:
+ $1677 = HEAP32[$1643 >> 2] | 0;
+ _memcpy($1677 | 0, $1641 | 0, 40);
+ $1678 = HEAP32[(107740 | 0) >> 2] | 0;
+ $1679 = ($1678 | 0) == 0;
+ if ($1679) {
+ label = 397;
+ break;
+ } else {
+ label = 398;
+ break;
+ }
+ case 397:
+ invoke_v(374);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ label = 398;
+ break;
+ case 398:
+ $1682 = $1640 + 20 | 0;
+ $1683 = $1682;
+ $1684 = HEAP32[$1683 >> 2] | 0;
+ $1685 = ($1684 | 0) == 0;
+ if ($1685) {
+ label = 412;
+ break;
+ } else {
+ label = 399;
+ break;
+ }
+ case 399:
+ $1687 = HEAP32[137616 >> 2] | 0;
+ $1688 = $1684;
+ $1689 = HEAP32[$1688 >> 2] | 0;
+ $1690 = $1689;
+ $1691 = $1687 + 8 | 0;
+ $1692 = $1691;
+ $1693 = HEAP32[$1692 >> 2] | 0;
+ $1694 = ($1689 | 0) == 82712;
+ if ($1694) {
+ label = 400;
+ break;
+ } else {
+ $tib1_0_ph_i = $1690;
+ label = 401;
+ break;
+ }
+ case 400:
+ $1696 = $1684 + 8 | 0;
+ $1697 = $1696;
+ $1698 = HEAP32[$1697 >> 2] | 0;
+ $1699 = $1698 + 8 | 0;
+ $1700 = $1699;
+ $1701 = HEAP32[$1700 >> 2] | 0;
+ $1702 = $1701;
+ $tib1_0_ph_i = $1702;
+ label = 401;
+ break;
+ case 401:
+ $1703 = $tib1_0_ph_i + 56 | 0;
+ $1704 = HEAP32[$1703 >> 2] | 0;
+ $1705 = ($1704 | 0) == 0;
+ if ($1705) {
+ var $dimension_tib1_0_lcssa_i = 0;
+ var $tib1_0_lcssa_i = $tib1_0_ph_i;
+ label = 403;
+ break;
+ } else {
+ var $dimension_tib1_029_i = 0;
+ var $1711 = $1704;
+ label = 404;
+ break;
+ }
+ case 402:
+ $1706 = $1714;
+ var $dimension_tib1_0_lcssa_i = $1715;
+ var $tib1_0_lcssa_i = $1706;
+ label = 403;
+ break;
+ case 403:
+ $1707 = $1693 + 56 | 0;
+ $1708 = $1707;
+ $1709 = HEAP32[$1708 >> 2] | 0;
+ $1710 = ($1709 | 0) == 0;
+ if ($1710) {
+ var $dimension_tib2_0_lcssa_i = 0;
+ var $tib2_0_lcssa_in_i = $1693;
+ label = 406;
+ break;
+ } else {
+ var $dimension_tib2_024_i = 0;
+ var $1720 = $1709;
+ label = 405;
+ break;
+ }
+ case 404:
+ $1712 = $1711 + 8 | 0;
+ $1713 = $1712;
+ $1714 = HEAP32[$1713 >> 2] | 0;
+ $1715 = $dimension_tib1_029_i + 1 | 0;
+ $1716 = $1714 + 56 | 0;
+ $1717 = $1716;
+ $1718 = HEAP32[$1717 >> 2] | 0;
+ $1719 = ($1718 | 0) == 0;
+ if ($1719) {
+ label = 402;
+ break;
+ } else {
+ var $dimension_tib1_029_i = $1715;
+ var $1711 = $1718;
+ label = 404;
+ break;
+ }
+ case 405:
+ $1721 = $1720 + 8 | 0;
+ $1722 = $1721;
+ $1723 = HEAP32[$1722 >> 2] | 0;
+ $1724 = $dimension_tib2_024_i + 1 | 0;
+ $1725 = $1723 + 56 | 0;
+ $1726 = $1725;
+ $1727 = HEAP32[$1726 >> 2] | 0;
+ $1728 = ($1727 | 0) == 0;
+ if ($1728) {
+ var $dimension_tib2_0_lcssa_i = $1724;
+ var $tib2_0_lcssa_in_i = $1723;
+ label = 406;
+ break;
+ } else {
+ var $dimension_tib2_024_i = $1724;
+ var $1720 = $1727;
+ label = 405;
+ break;
+ }
+ case 406:
+ $tib2_0_lcssa_i = $tib2_0_lcssa_in_i;
+ $1729 = ($dimension_tib1_0_lcssa_i | 0) < ($dimension_tib2_0_lcssa_i | 0);
+ $1730 = ($tib1_0_lcssa_i | 0) == 0;
+ $or_cond_i = $1729 | $1730;
+ if ($or_cond_i) {
+ label = 412;
+ break;
+ } else {
+ $tib1_121_i = $tib1_0_lcssa_i;
+ label = 407;
+ break;
+ }
+ case 407:
+ $1731 = ($tib1_121_i | 0) == ($tib2_0_lcssa_i | 0);
+ if ($1731) {
+ label = 54;
+ break;
+ } else {
+ label = 408;
+ break;
+ }
+ case 408:
+ $1732 = $tib1_121_i + 108 | 0;
+ $1733 = HEAP32[$1732 >> 2] | 0;
+ $1734 = $tib1_121_i + 112 | 0;
+ $i_0_i = 0;
+ label = 409;
+ break;
+ case 409:
+ $1736 = ($i_0_i | 0) < ($1733 | 0);
+ if ($1736) {
+ label = 410;
+ break;
+ } else {
+ label = 411;
+ break;
+ }
+ case 410:
+ $1738 = HEAP32[$1734 >> 2] | 0;
+ $1739 = $1738 + ($i_0_i << 2) | 0;
+ $1740 = HEAP32[$1739 >> 2] | 0;
+ $1741 = ($1740 | 0) == ($tib2_0_lcssa_i | 0);
+ $1742 = $i_0_i + 1 | 0;
+ if ($1741) {
+ label = 54;
+ break;
+ } else {
+ $i_0_i = $1742;
+ label = 409;
+ break;
+ }
+ case 411:
+ $1744 = $tib1_121_i + 40 | 0;
+ $1745 = HEAP32[$1744 >> 2] | 0;
+ $1746 = ($1745 | 0) == 0;
+ if ($1746) {
+ label = 412;
+ break;
+ } else {
+ $tib1_121_i = $1745;
+ label = 407;
+ break;
+ }
+ case 412:
+ $1747 = HEAP32[$1643 >> 2] | 0;
+ $1748 = $1747;
+ invoke_vii(48, $1748 | 0, 0 | 0);
+ if ((__THREW__ | 0) != 0 & (threwValue | 0) != 0) {
+ setjmpLabel = _testSetjmp(HEAP32[__THREW__ >> 2] | 0, setjmpTable) | 0;
+ if ((setjmpLabel | 0) > 0) {
+ label = -1111;
+ break;
+ } else return 0 | 0;
+ }
+ __THREW__ = threwValue = 0;
+ return 0 | 0;
+ case -1111:
+ if ((setjmpLabel | 0) == 7) {
+ $25 = threwValue;
+ label = 413;
+ } else if ((setjmpLabel | 0) == 35) {
+ $159 = threwValue;
+ label = 414;
+ } else if ((setjmpLabel | 0) == 62) {
+ $290 = threwValue;
+ label = 415;
+ } else if ((setjmpLabel | 0) == 91) {
+ $401 = threwValue;
+ label = 416;
+ } else if ((setjmpLabel | 0) == 97) {
+ $433 = threwValue;
+ label = 417;
+ } else if ((setjmpLabel | 0) == 144) {
+ $629 = threwValue;
+ label = 418;
+ } else if ((setjmpLabel | 0) == 181) {
+ $789 = threwValue;
+ label = 419;
+ } else if ((setjmpLabel | 0) == 218) {
+ $954 = threwValue;
+ label = 420;
+ } else if ((setjmpLabel | 0) == 240) {
+ $1042 = threwValue;
+ label = 421;
+ } else if ((setjmpLabel | 0) == 251) {
+ $1073 = threwValue;
+ label = 422;
+ } else if ((setjmpLabel | 0) == 324) {
+ $1378 = threwValue;
+ label = 423;
+ } else if ((setjmpLabel | 0) == 363) {
+ $1545 = threwValue;
+ label = 424;
+ } else if ((setjmpLabel | 0) == 388) {
+ $1647 = threwValue;
+ label = 425;
+ }
+ __THREW__ = threwValue = 0;
+ break;
+ }
+}// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "__Z11printResultPiS_j", "_segment_holding", "__ZN5identC2EiPKcPci", "_vec2Length", "exc", "label", "confuusion", "tempDouble", "_org_apache_harmony_luni_util_NumberConverter_freeFormat__", "__ZN23b2EdgeAndPolygonContact8EvaluateEP10b2ManifoldRK11b2TransformS4_", "_java_nio_charset_Charset_forNameInternal___java_lang_String"]
diff --git a/tools/file_packager.py b/tools/file_packager.py
index ef113cb5..6a8390ad 100644
--- a/tools/file_packager.py
+++ b/tools/file_packager.py
@@ -112,16 +112,20 @@ for arg in sys.argv[1:]:
in_preload = False
in_embed = False
in_compress = 0
- elif in_preload:
- if os.path.isfile(arg) or os.path.isdir(arg):
- data_files.append({ 'name': arg, 'mode': 'preload' })
+ elif in_preload or in_embed:
+ mode = 'preload'
+ if in_embed:
+ mode = 'embed'
+ if '@' in arg:
+ srcpath, dstpath = arg.split('@') # User is specifying destination filename explicitly.
else:
- print >> sys.stderr, 'Warning: ' + arg + ' does not exist, ignoring.'
- elif in_embed:
- if os.path.isfile(arg) or os.path.isdir(arg):
- data_files.append({ 'name': arg, 'mode': 'embed' })
+ srcpath = dstpath = arg # Use source path as destination path.
+ if os.path.isabs(dstpath):
+ print >> sys.stderr, 'Warning: Embedding an absolute file/directory name "' + dstpath + '" to the virtual filesystem. The file will be made available in the path "' + dstpath + '", and not in the root of the generated file system. Use the explicit syntax --preload-file srcpath@dstpath to specify the target location the absolute source path should be directed to.'
+ if os.path.isfile(srcpath) or os.path.isdir(srcpath):
+ data_files.append({ 'srcpath': srcpath, 'dstpath': dstpath, 'mode': mode })
else:
- print >> sys.stderr, 'Warning:' + arg + ' does not exist, ignoring.'
+ print >> sys.stderr, 'Warning: ' + arg + ' does not exist, ignoring.'
elif in_compress:
if in_compress == 1:
Compression.encoder = arg
@@ -147,20 +151,26 @@ function assert(check, msg) {
'''
# Expand directories into individual files
-def add(mode, dirname, names):
+def add(arg, dirname, names):
+ # rootpathsrc: The path name of the root directory on the local FS we are adding to emscripten virtual FS.
+ # rootpathdst: The name we want to make the source path available on the emscripten virtual FS.
+ mode, rootpathsrc, rootpathdst = arg
for name in names:
fullname = os.path.join(dirname, name)
if not os.path.isdir(fullname):
- data_files.append({ 'name': fullname, 'mode': mode })
+ dstpath = os.path.join(rootpathdst, os.path.relpath(fullname, rootpathsrc)) # Convert source filename relative to root directory of target FS.
+ data_files.append({ 'srcpath': fullname, 'dstpath': dstpath, 'mode': mode })
for file_ in data_files:
- if os.path.isdir(file_['name']):
- os.path.walk(file_['name'], add, file_['mode'])
-data_files = filter(lambda file_: not os.path.isdir(file_['name']), data_files)
+ if os.path.isdir(file_['srcpath']):
+ os.path.walk(file_['srcpath'], add, [file_['mode'], file_['srcpath'], file_['dstpath']])
+data_files = filter(lambda file_: not os.path.isdir(file_['srcpath']), data_files)
for file_ in data_files:
- file_['name'] = file_['name'].replace(os.path.sep, '/') # name in the filesystem, native and emulated
- file_['localname'] = file_['name'] # name to actually load from local filesystem, after transformations
+ file_['dstpath'] = file_['dstpath'].replace(os.path.sep, '/') # name in the filesystem, native and emulated
+ if file_['dstpath'].endswith('/'): # If user has submitted a directory name as the destination but omitted the destination filename, use the filename from source file
+ file_['dstpath'] = file_['dstpath'] + os.path.basename(file_['srcpath'])
+ if file_['dstpath'].startswith('./'): file_['dstpath'] = file_['dstpath'][2:] # remove redundant ./ prefix
# Remove duplicates (can occur naively, for example preload dir/, preload dir/subdir/)
seen = {}
@@ -168,7 +178,7 @@ def was_seen(name):
if seen.get(name): return True
seen[name] = 1
return False
-data_files = filter(lambda file_: not was_seen(file_['name']), data_files)
+data_files = filter(lambda file_: not was_seen(file_['dstpath']), data_files)
if AV_WORKAROUND:
random.shuffle(data_files)
@@ -200,20 +210,24 @@ if crunch:
'''
for file_ in data_files:
- if file_['name'].endswith(CRUNCH_INPUT_SUFFIX):
- # Do not crunch if crunched version exists and is more recent than dds source
- crunch_name = unsuffixed(file_['name']) + CRUNCH_OUTPUT_SUFFIX
- file_['localname'] = crunch_name
+ if file_['dstpath'].endswith(CRUNCH_INPUT_SUFFIX):
+ src_dds_name = file_['srcpath']
+ src_crunch_name = unsuffixed(src_dds_name) + CRUNCH_OUTPUT_SUFFIX
+
+ # Preload/embed the .crn version instead of the .dds version, but use the .dds suffix for the target file in the virtual FS.
+ file_['srcpath'] = src_crunch_name
+
try:
- crunch_time = os.stat(crunch_name).st_mtime
- dds_time = os.stat(file_['name']).st_mtime
+ # Do not crunch if crunched version exists and is more recent than dds source
+ crunch_time = os.stat(src_crunch_name).st_mtime
+ dds_time = os.stat(src_dds_name).st_mtime
if dds_time < crunch_time: continue
except:
pass # if one of them does not exist, continue on
# guess at format. this lets us tell crunch to not try to be clever and use odd formats like DXT5_AGBR
try:
- format = Popen(['file', file_['name']], stdout=PIPE).communicate()[0]
+ format = Popen(['file', file_['srcpath']], stdout=PIPE).communicate()[0]
if 'DXT5' in format:
format = ['-dxt5']
elif 'DXT1' in format:
@@ -222,23 +236,22 @@ if crunch:
raise Exception('unknown format')
except:
format = []
- Popen([CRUNCH, '-file', file_['name'], '-quality', crunch] + format, stdout=sys.stderr).communicate()
+ Popen([CRUNCH, '-outsamedir', '-file', src_dds_name, '-quality', crunch] + format, stdout=sys.stderr).communicate()
#if not os.path.exists(os.path.basename(crunch_name)):
# print >> sys.stderr, 'Failed to crunch, perhaps a weird dxt format? Looking for a source PNG for the DDS'
- # Popen([CRUNCH, '-file', unsuffixed(file_['name']) + '.png', '-quality', crunch] + format, stdout=sys.stderr).communicate()
- assert os.path.exists(os.path.basename(crunch_name)), 'crunch failed to generate output'
- shutil.move(os.path.basename(crunch_name), crunch_name) # crunch places files in the current dir
+ # Popen([CRUNCH, '-file', unsuffixed(file_['srcpath']) + '.png', '-quality', crunch] + format, stdout=sys.stderr).communicate()
+ assert os.path.exists(os.path.basename(src_crunch_name)), 'crunch failed to generate output'
# prepend the dds header
- crunched = open(crunch_name, 'rb').read()
- c = open(crunch_name, 'wb')
- c.write(open(file_['name'], 'rb').read()[:DDS_HEADER_SIZE])
+ crunched = open(src_crunch_name, 'rb').read()
+ c = open(src_crunch_name, 'wb')
+ c.write(open(src_dds_name, 'rb').read()[:DDS_HEADER_SIZE])
c.write(crunched)
c.close()
# Set up folders
partial_dirs = []
for file_ in data_files:
- dirname = os.path.dirname(file_['name'])
+ dirname = os.path.dirname(file_['dstpath'])
dirname = dirname.lstrip('/') # absolute paths start with '/', remove that
if dirname != '':
parts = dirname.split('/')
@@ -254,10 +267,10 @@ if has_preloaded:
start = 0
for file_ in data_files:
file_['data_start'] = start
- curr = open(file_['localname'], 'rb').read()
+ curr = open(file_['srcpath'], 'rb').read()
file_['data_end'] = start + len(curr)
if AV_WORKAROUND: curr += '\x00'
- #print >> sys.stderr, 'bundling', file_['name'], file_['localname'], file_['data_start'], file_['data_end']
+ #print >> sys.stderr, 'bundling', file_['srcpath'], file_['dstpath'], file_['data_start'], file_['data_end']
start += len(curr)
data.write(curr)
data.close()
@@ -279,10 +292,10 @@ if has_preloaded:
counter = 0
for file_ in data_files:
- filename = file_['name']
+ filename = file_['dstpath']
if file_['mode'] == 'embed':
# Embed
- data = map(ord, open(file_['localname'], 'rb').read())
+ data = map(ord, open(file_['srcpath'], 'rb').read())
str_data = ''
chunk_size = 10240
while len(data) > 0:
@@ -351,9 +364,12 @@ if has_preloaded:
if file_['mode'] == 'preload':
use_data += '''
curr = DataRequest.prototype.requests['%s'];
- curr.response = byteArray.subarray(%d,%d);
+ var data = byteArray.subarray(%d, %d);
+ var ptr = Module['_malloc'](%d);
+ Module['HEAPU8'].set(data, ptr);
+ curr.response = Module['HEAPU8'].subarray(ptr, ptr + %d);
curr.onload();
- ''' % (file_['name'], file_['data_start'], file_['data_end'])
+ ''' % (file_['dstpath'], file_['data_start'], file_['data_end'], file_['data_end'] - file_['data_start'], file_['data_end'] - file_['data_start'])
use_data += " Module['removeRunDependency']('datafile_%s');\n" % data_target
if Compression.on:
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 32ed1cce..09791150 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -403,6 +403,23 @@ function removeUnneededLabelSettings(ast) {
// Various expression simplifications. Pre run before closure (where we still have metadata), Post run after.
function simplifyExpressionsPre(ast) {
+ // Look for (x&A)<<B>>B and replace it with X&A if possible.
+ function simplifySignExtends(ast) {
+ traverseGenerated(ast, function(node, type) {
+ if (type == 'binary' && node[1] == '>>' && node[3][0] == 'num' &&
+ node[2][0] == 'binary' && node[2][1] == '<<' && node[2][3][0] == 'num' && node[3][1] == node[2][3][1]) {
+ var innerNode = node[2][2];
+ var shifts = node[3][1];
+ if (innerNode[0] == 'binary' && innerNode[1] == '&' && innerNode[3][0] == 'num') {
+ var mask = innerNode[3][1];
+ if (mask << shifts >> shifts == mask) {
+ return innerNode;
+ }
+ }
+ }
+ });
+ }
+
// When there is a bunch of math like (((8+5)|0)+12)|0, only the external |0 is needed, one correction is enough.
// At each node, ((X|0)+Y)|0 can be transformed into (X+Y): The inner corrections are not needed
// TODO: Is the same is true for 0xff, 0xffff?
@@ -592,6 +609,7 @@ function simplifyExpressionsPre(ast) {
});
}
+ simplifySignExtends(ast);
simplifyBitops(ast);
joinAdditions(ast);
// simplifyZeroComp(ast); TODO: investigate performance
@@ -1487,7 +1505,7 @@ function registerize(ast) {
// Replace all var definitions with assignments; we will add var definitions at the top after we registerize
// We also mark local variables - i.e., having a var definition
var localVars = {};
- var hasSwitch = false; // we cannot optimize variables if there is a switch
+ var hasSwitch = false; // we cannot optimize variables if there is a switch, unless in asm mode
traverse(fun, function(node, type) {
if (type == 'var') {
node[1].forEach(function(defined) { localVars[defined[0]] = 1 });
@@ -1578,7 +1596,15 @@ function registerize(ast) {
var varLevels = {};
var possibles = {};
var unoptimizables = {};
- traverse(fun, function(node, type) {
+ function purgeLevel() {
+ // Invalidate all dominating on this level, further users make it unoptimizable
+ for (var name in levelDominations[level]) {
+ varLevels[name] = 0;
+ }
+ levelDominations[level] = null;
+ level--;
+ }
+ traverse(fun, function possibilifier(node, type) {
if (type == 'name') {
var name = node[1];
if (localVars[name]) {
@@ -1599,24 +1625,61 @@ function registerize(ast) {
}
}
} else if (type in CONTROL_FLOW) {
- level++;
- }
- }, function(node, type) {
- if (type in CONTROL_FLOW) {
- // Invalidate all dominating on this level, further users make it unoptimizable
- for (var name in levelDominations[level]) {
- varLevels[name] = 0;
+ // recurse children, in the context of a loop
+ switch(type) {
+ case 'while': case 'do': {
+ traverse(node[1], possibilifier);
+ level++;
+ traverse(node[2], possibilifier);
+ purgeLevel();
+ break;
+ }
+ case 'for': {
+ traverse(node[1], possibilifier);
+ for (var i = 2; i <= 4; i++) {
+ level++;
+ traverse(node[i], possibilifier);
+ purgeLevel();
+ }
+ break;
+ }
+ case 'if': {
+ traverse(node[1], possibilifier);
+ level++;
+ traverse(node[2], possibilifier);
+ purgeLevel();
+ if (node[3]) {
+ level++;
+ traverse(node[3], possibilifier);
+ purgeLevel();
+ }
+ break;
+ }
+ case 'switch': {
+ traverse(node[1], possibilifier);
+ var cases = node[2];
+ for (var i = 0; i < cases.length; i++) {
+ level++;
+ traverse(cases[i][1], possibilifier);
+ purgeLevel();
+ }
+ break;
+ }
+ default: throw dumpAst(node);
}
- levelDominations[level] = null;
- level--;
+ return null; // prevent recursion into children, which we already did
}
});
var optimizables = {};
- if (!hasSwitch) {
+ if (!hasSwitch || asm) {
for (var possible in possibles) {
if (!unoptimizables[possible]) optimizables[possible] = 1;
}
}
+
+ //printErr('optimizables: ' + JSON.stringify(optimizables));
+ //printErr('unoptimizables: ' + JSON.stringify(unoptimizables));
+
// Go through the function's code, assigning 'registers'.
// The only tricky bit is to keep variables locked on a register through loops,
// since they can potentially be returned to. Optimizable variables lock onto
@@ -1776,10 +1839,10 @@ function registerize(ast) {
// In memSafe mode, we are more careful and assume functions can replace HEAP and FUNCTION_TABLE, which
// can happen in ALLOW_MEMORY_GROWTH mode
-var ELIMINATION_SAFE_NODES = set('var', 'assign', 'call', 'if', 'toplevel', 'do', 'return', 'label'); // do is checked carefully, however
+var ELIMINATION_SAFE_NODES = set('var', 'assign', 'call', 'if', 'toplevel', 'do', 'return', 'label', 'switch'); // do is checked carefully, however
var NODES_WITHOUT_ELIMINATION_SIDE_EFFECTS = set('name', 'num', 'string', 'binary', 'sub', 'unary-prefix');
var IGNORABLE_ELIMINATOR_SCAN_NODES = set('num', 'toplevel', 'string', 'break', 'continue', 'dot'); // dot can only be STRING_TABLE.*
-var ABORTING_ELIMINATOR_SCAN_NODES = set('new', 'object', 'function', 'defun', 'switch', 'for', 'while', 'array', 'throw'); // we could handle some of these, TODO, but nontrivial (e.g. for while, the condition is hit multiple times after the body)
+var ABORTING_ELIMINATOR_SCAN_NODES = set('new', 'object', 'function', 'defun', 'for', 'while', 'array', 'throw'); // we could handle some of these, TODO, but nontrivial (e.g. for while, the condition is hit multiple times after the body)
function eliminate(ast, memSafe) {
// Find variables that have a single use, and if they can be eliminated, do so
@@ -1787,7 +1850,6 @@ function eliminate(ast, memSafe) {
if (asm) var asmData = normalizeAsm(func);
//printErr('eliminate in ' + func[1]);
-
// First, find the potentially eliminatable functions: that have one definition and one use
var definitions = {};
var uses = {};
@@ -1841,12 +1903,7 @@ function eliminate(ast, memSafe) {
});
// we cannot eliminate variables if there is a switch
- if (traverse(func, function(node, type) {
- if (type == 'switch') return true;
- })) {
- if (asm) denormalizeAsm(func, asmData);
- return;
- }
+ if (hasSwitch && !asm) return;
var potentials = {}; // local variables with 1 definition and 1 use
var sideEffectFree = {}; // whether a local variable has no side effects in its definition
@@ -2153,13 +2210,14 @@ function eliminate(ast, memSafe) {
invalidateCalls();
callsInvalidated = true;
}
+
allowTracking = false;
traverseInOrder(node[2]); // 2 and 3 could be 'parallel', really..
if (node[3]) traverseInOrder(node[3]);
allowTracking = true;
+
} else {
tracked = {};
- abort = true;
}
} else if (type == 'block') {
var stats = node[1];
@@ -2180,7 +2238,6 @@ function eliminate(ast, memSafe) {
traverseInOrder(node[2]);
} else {
tracked = {};
- abort = true;
}
} else if (type == 'return') {
if (node[1]) traverseInOrder(node[1]);
@@ -2188,6 +2245,17 @@ function eliminate(ast, memSafe) {
traverseInOrder(node[1]);
traverseInOrder(node[2]);
traverseInOrder(node[3]);
+ } else if (type == 'switch') {
+ traverseInOrder(node[1]);
+ var cases = node[2];
+ for (var i = 0; i < cases.length; i++) {
+ var c = cases[i];
+ assert(c[0] === null || c[0][0] == 'num' || (c[0][0] == 'unary-prefix' && c[0][2][0] == 'num'));
+ var stats = c[1];
+ for (var j = 0; j < stats.length; j++) {
+ traverseInOrder(stats[j]);
+ }
+ }
} else {
if (!(type in ABORTING_ELIMINATOR_SCAN_NODES)) {
printErr('unfamiliar eliminator scan node: ' + JSON.stringify(node));
@@ -2234,13 +2302,15 @@ function eliminate(ast, memSafe) {
}
}
traverse(func, function(block) {
- var stats = getStatements(block);
+ // Look for statements, including while-switch pattern
+ var stats = getStatements(block) || (block[0] == 'while' && block[2][0] == 'switch' ? [block[2]] : stats);
if (!stats) return;
+ //printErr('Stats: ' + JSON.stringify(stats).substr(0,100));
tracked = {};
//printErr('new StatBlock');
for (var i = 0; i < stats.length; i++) {
var node = stats[i];
- //printErr('StatBlock[' + i + '] => ' + JSON.stringify(node));
+ //printErr('StatBlock[' + i + '] => ' + JSON.stringify(node).substr(0,100));
var type = node[0];
if (type == 'stat') {
node = node[1];
diff --git a/tools/shared.py b/tools/shared.py
index 321fa073..7d956293 100644
--- a/tools/shared.py
+++ b/tools/shared.py
@@ -631,6 +631,11 @@ def unique_ordered(values): # return a list of unique values in an input list, w
return True
return filter(check, values)
+def expand_response(data):
+ if type(data) == str and data[0] == '@':
+ return json.loads(open(data[1:]).read())
+ return data
+
# Settings. A global singleton. Not pretty, but nicer than passing |, settings| everywhere
class Settings:
@@ -722,6 +727,7 @@ class Building:
env['HOST_CXXFLAGS'] = "-W" #if set to nothing, CXXFLAGS is used, which we don't want
env['PKG_CONFIG_LIBDIR'] = path_from_root('system', 'local', 'lib', 'pkgconfig') + os.path.pathsep + path_from_root('system', 'lib', 'pkgconfig')
env['PKG_CONFIG_PATH'] = os.environ.get ('EM_PKG_CONFIG_PATH') or ''
+ env['EMSCRIPTEN'] = '1'
return env
@staticmethod
@@ -1097,7 +1103,7 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)''' % { 'winfix': '' if not WINDOWS e
@staticmethod
def get_safe_internalize():
- exports = ','.join(map(lambda exp: exp[1:], Settings.EXPORTED_FUNCTIONS))
+ exports = ','.join(map(lambda exp: exp[1:], expand_response(Settings.EXPORTED_FUNCTIONS)))
# internalize carefully, llvm 3.2 will remove even main if not told not to
return ['-internalize', '-internalize-public-api-list=' + exports]
diff --git a/tools/test-js-optimizer-asm-pre-output.js b/tools/test-js-optimizer-asm-pre-output.js
index 72608aa8..ab953e5d 100644
--- a/tools/test-js-optimizer-asm-pre-output.js
+++ b/tools/test-js-optimizer-asm-pre-output.js
@@ -18,7 +18,7 @@ function b($this, $__n) {
}
$4 = $this;
$5 = HEAP8[$4 & 16777215] | 0;
- if (($5 & 1) << 24 >> 24 == 0) {
+ if (($5 & 1) == 0) {
$14 = 10;
$13 = $5;
} else {
@@ -38,14 +38,14 @@ function b($this, $__n) {
} else {
$30 = $13;
}
- if (($30 & 1) << 24 >> 24 == 0) {
+ if (($30 & 1) == 0) {
$38 = $this + 1 | 0;
} else {
$38 = HEAP32[($this + 8 & 16777215) >> 2] | 0;
}
_memset($38 + $23 | 0, 0, $__n | 0, 1, 1213141516);
$40 = $23 + $__n | 0;
- if ((HEAP8[$4 & 16777215] & 1) << 24 >> 24 == 0) {
+ if ((HEAP8[$4 & 16777215] & 1) == 0) {
HEAP8[$4 & 16777215] = $40 << 1 & 255;
} else {
HEAP32[($this + 4 & 16777215) >> 2] = $40;
@@ -93,4 +93,18 @@ function i32_8() {
print(5);
}
}
+function sign_extension_simplification() {
+ if ((HEAP8[$4 & 16777215] & 127) == 0) {
+ print(5);
+ }
+ if ((HEAP8[$4 & 16777215] & 128) << 24 >> 24 == 0) {
+ print(5);
+ }
+ if ((HEAP32[$5 & 16777215] & 32767) == 0) {
+ print(5);
+ }
+ if ((HEAP32[$5 & 16777215] & 32768) << 16 >> 16 == 0) {
+ print(5);
+ }
+}
diff --git a/tools/test-js-optimizer-asm-pre.js b/tools/test-js-optimizer-asm-pre.js
index f2ffaef4..264587d2 100644
--- a/tools/test-js-optimizer-asm-pre.js
+++ b/tools/test-js-optimizer-asm-pre.js
@@ -95,4 +95,18 @@ function i32_8() {
print(5);
}
}
+function sign_extension_simplification() {
+ if ((HEAP8[$4 & 16777215] & 127) << 24 >> 24 == 0) {
+ print(5);
+ }
+ if ((HEAP8[$4 & 16777215] & 128) << 24 >> 24 == 0) {
+ print(5);
+ }
+ if ((HEAP32[$5 & 16777215] & 32767) << 16 >> 16 == 0) {
+ print(5);
+ }
+ if ((HEAP32[$5 & 16777215] & 32768) << 16 >> 16 == 0) {
+ print(5);
+ }
+}
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["a", "b", "rett", "ret2t", "retf", "i32_8"]
diff --git a/tools/test-js-optimizer-asm-regs-output.js b/tools/test-js-optimizer-asm-regs-output.js
index bb6a502b..c2efa506 100644
--- a/tools/test-js-optimizer-asm-regs-output.js
+++ b/tools/test-js-optimizer-asm-regs-output.js
@@ -22,4 +22,85 @@ function stackRestore(i1) {
i1 = i1 | 0;
STACKTOP = i1;
}
+function switchey(d1, i2) {
+ d1 = +d1;
+ i2 = i2 | 0;
+ var i3 = 0, d4 = +0;
+ switch (d1 | 0) {
+ case 0:
+ i2 = d1 + d1 | 0;
+ d1 = d(Math_max(10, Math_min(5, f())));
+ i3 = i2 + 2 | 0;
+ print(i3);
+ d4 = d1 * 5;
+ return d4;
+ case 1:
+ return 20;
+ }
+}
+function switchey2() {
+ var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, d6 = +0, d7 = +0, i8 = 0, i9 = 0;
+ i1 = STACKTOP;
+ STACKTOP = STACKTOP + 8 | 0;
+ i2 = 1;
+ while (1) switch (i2 | 0) {
+ case 1:
+ i3 = i1 | 0;
+ __ZN6RandomC1Ev(i3);
+ i4 = 0;
+ i5 = 0;
+ i2 = 2;
+ break;
+ case 2:
+ d6 = +__ZN6Random3getEf(8, +1);
+ d7 = +__ZN6Random3getEf(i3, +1);
+ _printf(24, (tempInt = STACKTOP, STACKTOP = STACKTOP + 16 | 0, HEAPF64[CHECK_ALIGN_8(tempInt | 0) >> 3] = d6, HEAPF64[CHECK_ALIGN_8(tempInt + 8 | 0) >> 3] = d7, tempInt) | 0);
+ i8 = (d6 != d7 & 1) + i5 | 0;
+ i9 = i4 + 1 | 0;
+ if ((i9 | 0) < 100) {
+ i4 = i9;
+ i5 = i8;
+ i2 = 2;
+ break;
+ } else {
+ i2 = 3;
+ break;
+ }
+ case 3:
+ _printf(16, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[CHECK_ALIGN_4(tempInt | 0) >> 2] = i8, tempInt) | 0);
+ STACKTOP = i1;
+ return 0;
+ }
+ return 0;
+}
+function iffey() {
+ var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, d6 = +0, d7 = +0, i8 = 0, i9 = 0;
+ i1 = STACKTOP;
+ STACKTOP = STACKTOP + 8 | 0;
+ i2 = 1;
+ while (1) {
+ if (i2 | 0) {
+ i3 = i1 | 0;
+ __ZN6RandomC1Ev(i3);
+ i4 = 0;
+ i5 = 0;
+ i2 = 2;
+ } else {
+ d6 = +__ZN6Random3getEf(8, +1);
+ d7 = +__ZN6Random3getEf(i3, +1);
+ _printf(24, (tempInt = STACKTOP, STACKTOP = STACKTOP + 16 | 0, HEAPF64[CHECK_ALIGN_8(tempInt | 0) >> 3] = d6, HEAPF64[CHECK_ALIGN_8(tempInt + 8 | 0) >> 3] = d7, tempInt) | 0);
+ i8 = (d6 != d7 & 1) + i5 | 0;
+ i9 = i4 + 1 | 0;
+ if ((i9 | 0) < 100) {
+ i4 = i9;
+ i5 = i8;
+ i2 = 2;
+ } else {
+ i2 = 3;
+ return 10;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/tools/test-js-optimizer-asm-regs.js b/tools/test-js-optimizer-asm-regs.js
index 4f7e04d4..8c3a1c98 100644
--- a/tools/test-js-optimizer-asm-regs.js
+++ b/tools/test-js-optimizer-asm-regs.js
@@ -24,5 +24,87 @@ function stackRestore(top) {
top = top|0;
STACKTOP = top;
}
-// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "_doit", "stackRestore"]
+function switchey(x, y) {
+ x = +x;
+ y = y | 0;
+ var int1 = 0, int2 = 0; // do not mix the types!
+ var double1 = +0, double2 = +0;
+ switch(x|0) {
+ case 0:
+ int1 = (x+x)|0;
+ double1 = d(Math.max(10, Math_min(5, f())));
+ int2 = (int1+2)|0;
+ print(int2);
+ double2 = double1*5;
+ return double2;
+ case 1:
+ return 20;
+ }
+}
+function switchey2() {
+ var $rng2 = 0, $count_06 = 0, $i_05 = 0, $2 = +0, $3 = +0, $count_1 = 0, $9 = 0, label = 0, __stackBase__ = 0;
+ __stackBase__ = STACKTOP;
+ STACKTOP = STACKTOP + 8 | 0;
+ label = 1;
+ while (1) switch (label | 0) {
+ case 1:
+ $rng2 = __stackBase__ | 0;
+ __ZN6RandomC1Ev($rng2);
+ $i_05 = 0;
+ $count_06 = 0;
+ label = 2;
+ break;
+ case 2:
+ $2 = +__ZN6Random3getEf(8, +1);
+ $3 = +__ZN6Random3getEf($rng2, +1);
+ _printf(24, (tempInt = STACKTOP, STACKTOP = STACKTOP + 16 | 0, HEAPF64[CHECK_ALIGN_8(tempInt | 0) >> 3] = $2, HEAPF64[CHECK_ALIGN_8(tempInt + 8 | 0) >> 3] = $3, tempInt) | 0);
+ $count_1 = ($2 != $3 & 1) + $count_06 | 0;
+ $9 = $i_05 + 1 | 0;
+ if (($9 | 0) < 100) {
+ $i_05 = $9;
+ $count_06 = $count_1;
+ label = 2;
+ break;
+ } else {
+ label = 3;
+ break;
+ }
+ case 3:
+ _printf(16, (tempInt = STACKTOP, STACKTOP = STACKTOP + 8 | 0, HEAP32[CHECK_ALIGN_4(tempInt | 0) >> 2] = $count_1, tempInt) | 0);
+ STACKTOP = __stackBase__;
+ return 0;
+ }
+ return 0;
+}
+function iffey() {
+ var $rng2 = 0, $count_06 = 0, $i_05 = 0, $2 = +0, $3 = +0, $count_1 = 0, $9 = 0, label = 0, __stackBase__ = 0;
+ __stackBase__ = STACKTOP;
+ STACKTOP = STACKTOP + 8 | 0;
+ label = 1;
+ while (1) {
+ if (label | 0) {
+ $rng2 = __stackBase__ | 0;
+ __ZN6RandomC1Ev($rng2);
+ $i_05 = 0;
+ $count_06 = 0;
+ label = 2;
+ } else {
+ $2 = +__ZN6Random3getEf(8, +1);
+ $3 = +__ZN6Random3getEf($rng2, +1);
+ _printf(24, (tempInt = STACKTOP, STACKTOP = STACKTOP + 16 | 0, HEAPF64[CHECK_ALIGN_8(tempInt | 0) >> 3] = $2, HEAPF64[CHECK_ALIGN_8(tempInt + 8 | 0) >> 3] = $3, tempInt) | 0);
+ $count_1 = ($2 != $3 & 1) + $count_06 | 0;
+ $9 = $i_05 + 1 | 0;
+ if (($9 | 0) < 100) {
+ $i_05 = $9;
+ $count_06 = $count_1;
+ label = 2;
+ } else {
+ label = 3;
+ return 10;
+ }
+ }
+ }
+ return 0;
+}
+// EMSCRIPTEN_GENERATED_FUNCTIONS: ["asm", "_doit", "stackRestore", "switchey", "switchey2", "iffey"]