webruby 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/webruby/rake/mruby.rake +1 -0
- data/modules/emscripten/AUTHORS +7 -0
- data/modules/emscripten/LICENSE +26 -0
- data/modules/emscripten/emcc +58 -20
- data/modules/emscripten/emlink.py +2 -265
- data/modules/emscripten/emscripten.py +38 -18
- data/modules/emscripten/scons-tools/emscripten.py +11 -6
- data/modules/emscripten/scons-tools/llvm.py +4 -3
- data/modules/emscripten/src/analyzer.js +32 -13
- data/modules/emscripten/src/embind/embind.js +13 -13
- data/modules/emscripten/src/embind/emval.js +8 -7
- data/modules/emscripten/src/intertyper.js +10 -0
- data/modules/emscripten/src/jsifier.js +28 -6
- data/modules/emscripten/src/library.js +2949 -1322
- data/modules/emscripten/src/library_browser.js +27 -23
- data/modules/emscripten/src/library_egl.js +7 -2
- data/modules/emscripten/src/library_gl.js +15 -2
- data/modules/emscripten/src/library_glut.js +1 -1
- data/modules/emscripten/src/library_jansson.js +1 -1
- data/modules/emscripten/src/library_openal.js +464 -132
- data/modules/emscripten/src/library_path.js +134 -0
- data/modules/emscripten/src/library_sdl.js +222 -50
- data/modules/emscripten/src/modules.js +22 -5
- data/modules/emscripten/src/parseTools.js +13 -2
- data/modules/emscripten/src/postamble.js +60 -34
- data/modules/emscripten/src/preamble.js +67 -18
- data/modules/emscripten/src/relooper/Relooper.cpp +1 -1
- data/modules/emscripten/src/runtime.js +12 -2
- data/modules/emscripten/src/settings.js +869 -826
- data/modules/emscripten/src/shell.js +63 -51
- data/modules/emscripten/src/utility.js +6 -0
- data/modules/emscripten/system/include/bsd/sys/mman.h +1 -1
- data/modules/emscripten/system/include/emscripten/bind.h +28 -28
- data/modules/emscripten/system/include/libc/math.h +8 -0
- data/modules/emscripten/system/include/libc/sys/signal.h +3 -1
- data/modules/emscripten/system/include/libc/sys/stat.h +2 -1
- data/modules/emscripten/system/include/libc/sys/types.h +4 -0
- data/modules/emscripten/system/include/libcxx/CREDITS.TXT +24 -0
- data/modules/emscripten/system/include/libcxx/__bit_reference +27 -8
- data/modules/emscripten/system/include/libcxx/__config +62 -15
- data/modules/emscripten/system/include/libcxx/__debug +5 -1
- data/modules/emscripten/system/include/libcxx/__functional_03 +24 -24
- data/modules/emscripten/system/include/libcxx/__functional_base +22 -4
- data/modules/emscripten/system/include/libcxx/__hash_table +566 -54
- data/modules/emscripten/system/include/libcxx/__locale +11 -3
- data/modules/emscripten/system/include/libcxx/__split_buffer +6 -6
- data/modules/emscripten/system/include/libcxx/__std_stream +58 -30
- data/modules/emscripten/system/include/libcxx/__tree +58 -51
- data/modules/emscripten/system/include/libcxx/__tuple +9 -9
- data/modules/emscripten/system/include/libcxx/algorithm +223 -13
- data/modules/emscripten/system/include/libcxx/array +18 -17
- data/modules/emscripten/system/include/libcxx/atomic +15 -5
- data/modules/emscripten/system/include/libcxx/cctype +2 -2
- data/modules/emscripten/system/include/libcxx/chrono +131 -36
- data/modules/emscripten/system/include/libcxx/cmath +41 -36
- data/modules/emscripten/system/include/libcxx/complex +49 -49
- data/modules/emscripten/system/include/libcxx/cstdio +2 -2
- data/modules/emscripten/system/include/libcxx/cstdlib +5 -5
- data/modules/emscripten/system/include/libcxx/cstring +2 -2
- data/modules/emscripten/system/include/libcxx/cwchar +22 -13
- data/modules/emscripten/system/include/libcxx/deque +27 -14
- data/modules/emscripten/system/include/libcxx/forward_list +36 -35
- data/modules/emscripten/system/include/libcxx/fstream +16 -0
- data/modules/emscripten/system/include/libcxx/functional +348 -23
- data/modules/emscripten/system/include/libcxx/future +66 -0
- data/modules/emscripten/system/include/libcxx/ios +27 -0
- data/modules/emscripten/system/include/libcxx/istream +2 -4
- data/modules/emscripten/system/include/libcxx/iterator +17 -9
- data/modules/emscripten/system/include/libcxx/limits +2 -2
- data/modules/emscripten/system/include/libcxx/list +165 -105
- data/modules/emscripten/system/include/libcxx/locale +154 -43
- data/modules/emscripten/system/include/libcxx/map +165 -224
- data/modules/emscripten/system/include/libcxx/memory +113 -54
- data/modules/emscripten/system/include/libcxx/random +2 -29
- data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/include/libcxx/regex +60 -15
- data/modules/emscripten/system/include/libcxx/sstream +124 -40
- data/modules/emscripten/system/include/libcxx/string +345 -182
- data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +3 -3
- data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -2
- data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +3 -3
- data/modules/emscripten/system/include/libcxx/support/win32/support.h +10 -11
- data/modules/emscripten/system/include/libcxx/thread +2 -2
- data/modules/emscripten/system/include/libcxx/tuple +134 -65
- data/modules/emscripten/system/include/libcxx/type_traits +232 -24
- data/modules/emscripten/system/include/libcxx/unordered_map +314 -161
- data/modules/emscripten/system/include/libcxx/unordered_set +160 -2
- data/modules/emscripten/system/include/libcxx/utility +225 -40
- data/modules/emscripten/system/include/libcxx/vector +52 -57
- data/modules/emscripten/system/include/net/if.h +20 -1
- data/modules/emscripten/system/include/net/netinet/in.h +69 -5
- data/modules/emscripten/system/include/netdb.h +36 -0
- data/modules/emscripten/system/include/sys/ioctl.h +55 -3
- data/modules/emscripten/system/include/sys/select.h +2 -0
- data/modules/emscripten/system/include/sys/sendfile.h +16 -0
- data/modules/emscripten/system/include/sys/socket.h +181 -35
- data/modules/emscripten/system/lib/dlmalloc.c +10 -12
- data/modules/emscripten/system/lib/libc/musl/src/stdlib/ecvt.c +19 -0
- data/modules/emscripten/system/lib/libc/musl/src/stdlib/fcvt.c +25 -0
- data/modules/emscripten/system/lib/libc/musl/src/stdlib/gcvt.c +8 -0
- data/modules/emscripten/system/lib/libcextra.symbols +3 -0
- data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +24 -0
- data/modules/emscripten/system/lib/libcxx/debug.cpp +11 -9
- data/modules/emscripten/system/lib/libcxx/exception.cpp +9 -0
- data/modules/emscripten/system/lib/libcxx/hash.cpp +6 -0
- data/modules/emscripten/system/lib/libcxx/iostream.cpp +4 -4
- data/modules/emscripten/system/lib/libcxx/locale.cpp +91 -42
- data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +1 -1
- data/modules/emscripten/system/lib/libcxx/string.cpp +332 -491
- data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +4 -2
- data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +140 -41
- data/modules/emscripten/system/lib/libcxx/symbols +9 -256
- data/modules/emscripten/system/lib/libcxx/system_error.cpp +3 -0
- data/modules/emscripten/system/lib/libcxx/thread.cpp +16 -3
- data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +12 -2
- data/modules/emscripten/third_party/stb_image.c +4673 -0
- data/modules/emscripten/tools/asm_module.py +273 -0
- data/modules/emscripten/tools/exec_llvm.py +2 -2
- data/modules/emscripten/tools/file_packager.py +36 -16
- data/modules/emscripten/tools/find_bigfuncs.py +9 -9
- data/modules/emscripten/tools/js-optimizer.js +485 -131
- data/modules/emscripten/tools/js_optimizer.py +22 -15
- data/modules/emscripten/tools/merge_asm.py +26 -0
- data/modules/emscripten/tools/nativize_llvm.py +2 -2
- data/modules/emscripten/tools/settings_template_readonly.py +1 -1
- data/modules/emscripten/tools/shared.py +63 -20
- data/modules/emscripten/tools/split_asm.py +30 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline1-output.js +686 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline1.js +263 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline2-output.js +747 -0
- data/modules/emscripten/tools/{test-js-optimizer-asm-outline.js → test-js-optimizer-asm-outline2.js} +1 -1
- data/modules/emscripten/tools/test-js-optimizer-asm-outline3-output.js +28 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline3.js +30 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-pre-output.js +4 -4
- data/modules/mruby/AUTHORS +1 -0
- data/modules/mruby/README.md +4 -2
- data/modules/mruby/build_config.rb +6 -6
- data/modules/mruby/doc/mrbgems/README.md +4 -4
- data/modules/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +1 -1
- data/modules/mruby/examples/mrbgems/c_extension_example/mrbgem.rake +1 -1
- data/modules/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake +1 -1
- data/modules/mruby/include/mrbconf.h +3 -0
- data/modules/mruby/include/mruby/array.h +2 -2
- data/modules/mruby/include/mruby/class.h +4 -4
- data/modules/mruby/include/mruby/compile.h +1 -0
- data/modules/mruby/include/mruby/data.h +1 -1
- data/modules/mruby/include/mruby/hash.h +2 -2
- data/modules/mruby/include/mruby/irep.h +3 -2
- data/modules/mruby/include/mruby/proc.h +1 -1
- data/modules/mruby/include/mruby/range.h +1 -1
- data/modules/mruby/include/mruby/string.h +2 -2
- data/modules/mruby/include/mruby/value.h +43 -26
- data/modules/mruby/include/mruby.h +10 -2
- data/modules/mruby/minirake +2 -2
- data/modules/mruby/mrbgems/mruby-array-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +4 -1
- data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +32 -0
- data/modules/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +13 -5
- data/modules/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-enum-ext/test/enum.rb +10 -11
- data/modules/mruby/mrbgems/mruby-eval/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-exit/mrbgem.rake +4 -0
- data/modules/mruby/mrbgems/mruby-exit/src/mruby-exit.c +24 -0
- data/modules/mruby/mrbgems/mruby-fiber/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +4 -2
- data/modules/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-hash-ext/test/hash.rb +5 -7
- data/modules/mruby/mrbgems/mruby-math/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +2 -2
- data/modules/mruby/mrbgems/mruby-object-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-object-ext/src/object.c +3 -3
- data/modules/mruby/mrbgems/mruby-object-ext/test/nil.rb +3 -3
- data/modules/mruby/mrbgems/mruby-object-ext/test/object.rb +1 -1
- data/modules/mruby/mrbgems/mruby-objectspace/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +36 -37
- data/modules/mruby/mrbgems/mruby-print/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-proc-ext/test/proc.rb +8 -8
- data/modules/mruby/mrbgems/mruby-random/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-range-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-range-ext/test/range.rb +6 -6
- data/modules/mruby/mrbgems/mruby-sprintf/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-string-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-string-ext/test/string.rb +6 -6
- data/modules/mruby/mrbgems/mruby-struct/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +2 -2
- data/modules/mruby/mrbgems/mruby-time/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-time/src/time.c +2 -8
- data/modules/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +10 -10
- data/modules/mruby/mrblib/class.rb +15 -9
- data/modules/mruby/mrblib/string.rb +12 -0
- data/modules/mruby/src/array.c +4 -3
- data/modules/mruby/src/class.c +13 -8
- data/modules/mruby/src/codegen.c +9 -8
- data/modules/mruby/src/error.c +7 -5
- data/modules/mruby/src/error.h +1 -0
- data/modules/mruby/src/etc.c +1 -1
- data/modules/mruby/src/gc.c +163 -128
- data/modules/mruby/src/kernel.c +43 -15
- data/modules/mruby/src/numeric.c +9 -7
- data/modules/mruby/src/object.c +1 -1
- data/modules/mruby/src/parse.y +37 -19
- data/modules/mruby/src/range.c +10 -24
- data/modules/mruby/src/state.c +2 -6
- data/modules/mruby/src/string.c +0 -9
- data/modules/mruby/src/variable.c +2 -2
- data/modules/mruby/src/vm.c +12 -6
- data/modules/mruby/tasks/mrbgem_spec.rake +7 -0
- data/modules/mruby/tasks/mrbgems.rake +2 -1
- data/modules/mruby/tasks/mrbgems_test.rake +1 -1
- data/modules/mruby/tasks/mruby_build.rake +4 -3
- data/modules/mruby/tasks/mruby_build_commands.rake +6 -1
- data/modules/mruby/tasks/mruby_build_gem.rake +2 -2
- data/modules/mruby/tasks/toolchains/androideabi.rake +2 -0
- data/modules/mruby/test/assert.rb +2 -2
- data/modules/mruby/test/t/argumenterror.rb +3 -3
- data/modules/mruby/test/t/array.rb +55 -55
- data/modules/mruby/test/t/basicobject.rb +1 -1
- data/modules/mruby/test/t/bs_block.rb +12 -12
- data/modules/mruby/test/t/class.rb +21 -21
- data/modules/mruby/test/t/enumerable.rb +18 -18
- data/modules/mruby/test/t/exception.rb +20 -20
- data/modules/mruby/test/t/false.rb +3 -3
- data/modules/mruby/test/t/float.rb +40 -40
- data/modules/mruby/test/t/gc.rb +10 -10
- data/modules/mruby/test/t/hash.rb +41 -41
- data/modules/mruby/test/t/indexerror.rb +2 -2
- data/modules/mruby/test/t/integer.rb +41 -41
- data/modules/mruby/test/t/kernel.rb +33 -33
- data/modules/mruby/test/t/literals.rb +82 -82
- data/modules/mruby/test/t/localjumperror.rb +1 -1
- data/modules/mruby/test/t/module.rb +170 -31
- data/modules/mruby/test/t/nameerror.rb +5 -5
- data/modules/mruby/test/t/nil.rb +2 -2
- data/modules/mruby/test/t/nomethoderror.rb +1 -1
- data/modules/mruby/test/t/numeric.rb +5 -5
- data/modules/mruby/test/t/object.rb +2 -2
- data/modules/mruby/test/t/proc.rb +8 -8
- data/modules/mruby/test/t/range.rb +9 -9
- data/modules/mruby/test/t/rangeerror.rb +2 -2
- data/modules/mruby/test/t/runtimeerror.rb +1 -1
- data/modules/mruby/test/t/standarderror.rb +2 -2
- data/modules/mruby/test/t/string.rb +100 -100
- data/modules/mruby/test/t/symbol.rb +5 -5
- data/modules/mruby/test/t/syntax.rb +15 -6
- data/modules/mruby/test/t/true.rb +3 -3
- data/modules/mruby/test/t/typeerror.rb +2 -2
- data/modules/mruby/tools/mrbc/mrbc.c +10 -4
- data/modules/mruby/travis_config.rb +1 -0
- data/scripts/gen_gems_config.rb +5 -1
- metadata +19 -4
- data/modules/emscripten/tools/test-js-optimizer-asm-outline-output.js +0 -570
@@ -0,0 +1,273 @@
|
|
1
|
+
|
2
|
+
import sys, re
|
3
|
+
|
4
|
+
import shared, js_optimizer
|
5
|
+
|
6
|
+
|
7
|
+
class AsmModule():
|
8
|
+
def __init__(self, filename):
|
9
|
+
self.filename = filename
|
10
|
+
self.js = open(filename).read()
|
11
|
+
|
12
|
+
self.start_asm = self.js.find(js_optimizer.start_asm_marker)
|
13
|
+
self.start_funcs = self.js.find(js_optimizer.start_funcs_marker)
|
14
|
+
self.end_funcs = self.js.rfind(js_optimizer.end_funcs_marker)
|
15
|
+
self.end_asm = self.js.rfind(js_optimizer.end_asm_marker)
|
16
|
+
|
17
|
+
# pre and asm
|
18
|
+
self.pre_js = self.js[:self.start_asm]
|
19
|
+
self.asm_js = self.js[self.start_asm:self.end_asm]
|
20
|
+
|
21
|
+
# heap initializer
|
22
|
+
self.staticbump = int(re.search(shared.JS.memory_staticbump_pattern, self.pre_js).group(1))
|
23
|
+
if self.staticbump:
|
24
|
+
self.mem_init_js = re.search(shared.JS.memory_initializer_pattern, self.pre_js).group(0)
|
25
|
+
|
26
|
+
# global initializers
|
27
|
+
global_inits = re.search(shared.JS.global_initializers_pattern, self.pre_js)
|
28
|
+
if global_inits:
|
29
|
+
self.global_inits_js = global_inits.group(0)
|
30
|
+
self.global_inits = map(lambda init: init.split('{')[2][1:].split('(')[0], global_inits.groups(0)[0].split(','))
|
31
|
+
else:
|
32
|
+
self.global_inits_js = ''
|
33
|
+
self.global_inits = []
|
34
|
+
|
35
|
+
# imports (and global variables)
|
36
|
+
first_var = self.js.find('var ', self.js.find('var ', self.start_asm)+4)
|
37
|
+
self.pre_imports_js = self.js[self.start_asm:first_var]
|
38
|
+
self.imports_js = self.js[first_var:self.start_funcs]
|
39
|
+
self.imports = {}
|
40
|
+
for imp in js_optimizer.import_sig.finditer(self.imports_js):
|
41
|
+
key, value = imp.group(0).split('var ')[1][:-1].split('=', 1)
|
42
|
+
self.imports[key.strip()] = value.strip()
|
43
|
+
#print >> sys.stderr, 'imports', self.imports
|
44
|
+
|
45
|
+
# funcs
|
46
|
+
self.funcs_js = self.js[self.start_funcs:self.end_funcs]
|
47
|
+
self.funcs = set([m.group(2) for m in js_optimizer.func_sig.finditer(self.funcs_js)])
|
48
|
+
#print 'funcs', self.funcs
|
49
|
+
|
50
|
+
# tables and exports
|
51
|
+
post_js = self.js[self.end_funcs:self.end_asm]
|
52
|
+
ret = post_js.find('return ')
|
53
|
+
self.tables_js = post_js[:ret]
|
54
|
+
self.exports_js = post_js[ret:]
|
55
|
+
self.tables = self.parse_tables(self.tables_js)
|
56
|
+
self.exports = set([export.strip() for export in self.exports_js[self.exports_js.find('{')+1:self.exports_js.find('}')].split(',')])
|
57
|
+
|
58
|
+
# post
|
59
|
+
self.post_js = self.js[self.end_asm:]
|
60
|
+
self.sendings = {}
|
61
|
+
for sending in [sending.strip() for sending in self.post_js[self.post_js.find('}, { ')+5:self.post_js.find(' }, buffer);')].split(',')]:
|
62
|
+
colon = sending.find(':')
|
63
|
+
self.sendings[sending[:colon].replace('"', '')] = sending[colon+1:].strip()
|
64
|
+
self.module_defs = set(re.findall('var [\w\d_$]+ = Module\["[\w\d_$]+"\] = asm\["[\w\d_$]+"\];\n', self.post_js))
|
65
|
+
|
66
|
+
def relocate_into(self, main):
|
67
|
+
# heap initializer
|
68
|
+
if self.staticbump > 0:
|
69
|
+
new_mem_init = self.mem_init_js[:self.mem_init_js.rfind(', ')] + ', Runtime.GLOBAL_BASE+%d)' % main.staticbump
|
70
|
+
main.pre_js = re.sub(shared.JS.memory_staticbump_pattern, 'STATICTOP = STATIC_BASE + %d;\n' % (main.staticbump + self.staticbump) + new_mem_init, main.pre_js, count=1)
|
71
|
+
|
72
|
+
# Find function name replacements TODO: do not rename duplicate names with duplicate contents, just merge them
|
73
|
+
replacements = {}
|
74
|
+
for func in self.funcs:
|
75
|
+
rep = func
|
76
|
+
while rep in main.funcs:
|
77
|
+
rep += '_'
|
78
|
+
replacements[func] = rep
|
79
|
+
#print >> sys.stderr, 'replacements:', replacements
|
80
|
+
|
81
|
+
# sendings: add invokes for new tables
|
82
|
+
all_sendings = main.sendings
|
83
|
+
added_sending = False
|
84
|
+
for table in self.tables:
|
85
|
+
if table not in main.tables:
|
86
|
+
sig = table[table.rfind('_')+1:]
|
87
|
+
func = 'invoke_%s' % sig
|
88
|
+
all_sendings[func] = func
|
89
|
+
main.pre_js += 'var %s = %s;\n' % (func, shared.JS.make_invoke(sig, named=False))
|
90
|
+
added_sending = True
|
91
|
+
|
92
|
+
# imports
|
93
|
+
all_imports = main.imports
|
94
|
+
for key, value in self.imports.iteritems():
|
95
|
+
if key in self.funcs or key in main.funcs: continue # external function in one module, implemented in the other
|
96
|
+
value_concrete = '.' not in value # env.key means it is an import, an external value, and not a concrete one
|
97
|
+
main_value = main.imports.get(key)
|
98
|
+
main_value_concrete = main_value and '.' not in main_value
|
99
|
+
if value_concrete and main_value_concrete: continue # standard global var
|
100
|
+
if not main_value or value_concrete:
|
101
|
+
if '+' in value:
|
102
|
+
# relocate
|
103
|
+
value = value.replace('(', '').replace(')', '').replace('| 0', '').replace('|0', '').replace(' ', '')
|
104
|
+
left, right = value.split('+')
|
105
|
+
assert left == 'H_BASE'
|
106
|
+
value = str(main.staticbump + int(right))
|
107
|
+
all_imports[key] = value
|
108
|
+
if (value_concrete or main_value_concrete) and key in all_sendings:
|
109
|
+
del all_sendings[key] # import of external value no longer needed
|
110
|
+
main.imports_js = '\n'.join(['var %s = %s;' % (key, value) for key, value in all_imports.iteritems()]) + '\n'
|
111
|
+
|
112
|
+
# check for undefined references to global variables
|
113
|
+
def check_import(key, value):
|
114
|
+
if value.startswith('+') or value.endswith('|0'): # ignore functions
|
115
|
+
if key not in all_sendings:
|
116
|
+
print >> sys.stderr, 'warning: external variable %s is still not defined after linking' % key
|
117
|
+
all_sendings[key] = '0'
|
118
|
+
for key, value in all_imports.iteritems(): check_import(key, value)
|
119
|
+
|
120
|
+
if added_sending:
|
121
|
+
sendings_js = ', '.join(['%s: %s' % (key, value) for key, value in all_sendings.iteritems()])
|
122
|
+
sendings_start = main.post_js.find('}, { ')+5
|
123
|
+
sendings_end = main.post_js.find(' }, buffer);')
|
124
|
+
main.post_js = main.post_js[:sendings_start] + sendings_js + main.post_js[sendings_end:]
|
125
|
+
|
126
|
+
# tables
|
127
|
+
f_bases = {}
|
128
|
+
f_sizes = {}
|
129
|
+
for table, data in self.tables.iteritems():
|
130
|
+
main.tables[table] = self.merge_tables(table, main.tables.get(table), data, replacements, f_bases, f_sizes)
|
131
|
+
main.combine_tables()
|
132
|
+
#print >> sys.stderr, 'f bases', f_bases
|
133
|
+
|
134
|
+
# relocate
|
135
|
+
temp = shared.Building.js_optimizer(self.filename, ['asm', 'relocate', 'last'], extra_info={
|
136
|
+
'replacements': replacements,
|
137
|
+
'fBases': f_bases,
|
138
|
+
'hBase': main.staticbump
|
139
|
+
})
|
140
|
+
#print >> sys.stderr, 'relocated side into', temp
|
141
|
+
relocated_funcs = AsmModule(temp)
|
142
|
+
shared.try_delete(temp)
|
143
|
+
main.extra_funcs_js = relocated_funcs.funcs_js.replace(js_optimizer.start_funcs_marker, '\n')
|
144
|
+
|
145
|
+
# update function table uses
|
146
|
+
ft_marker = 'FUNCTION_TABLE_'
|
147
|
+
|
148
|
+
def update_fts(what):
|
149
|
+
updates = []
|
150
|
+
i = 1 # avoid seeing marker in recursion
|
151
|
+
while 1:
|
152
|
+
i = what.find(ft_marker, i)
|
153
|
+
if i < 0: break;
|
154
|
+
start = i
|
155
|
+
end = what.find('[', start)
|
156
|
+
table = what[i:end]
|
157
|
+
if table not in f_sizes:
|
158
|
+
# table was not modified
|
159
|
+
i += len(ft_marker)
|
160
|
+
continue
|
161
|
+
nesting = 1
|
162
|
+
while nesting > 0:
|
163
|
+
next = what.find(']', end+1)
|
164
|
+
nesting -= 1
|
165
|
+
nesting += what.count('[', end+1, next)
|
166
|
+
end = next
|
167
|
+
assert end > 0
|
168
|
+
mask = what.rfind('&', start, end)
|
169
|
+
assert mask > 0 and end - mask <= 13
|
170
|
+
fixed = update_fts(what[start:mask+1] + str(f_sizes[table]-1) + ']')
|
171
|
+
updates.append((start, end, fixed))
|
172
|
+
i = end # additional function table uses were done by recursion
|
173
|
+
# apply updates
|
174
|
+
if len(updates) == 0: return what
|
175
|
+
parts = []
|
176
|
+
so_far = 0
|
177
|
+
for i in range(len(updates)):
|
178
|
+
start, end, fixed = updates[i]
|
179
|
+
parts.append(what[so_far:start])
|
180
|
+
parts.append(fixed)
|
181
|
+
so_far = end+1
|
182
|
+
parts.append(what[so_far:])
|
183
|
+
return ''.join(parts)
|
184
|
+
|
185
|
+
main.funcs_js = update_fts(main.funcs_js)
|
186
|
+
main.extra_funcs_js = update_fts(main.extra_funcs_js)
|
187
|
+
|
188
|
+
# global initializers
|
189
|
+
if self.global_inits:
|
190
|
+
my_global_inits = map(lambda init: replacements[init] if init in replacements else init, self.global_inits)
|
191
|
+
all_global_inits = map(lambda init: '{ func: function() { %s() } }' % init, main.global_inits + my_global_inits)
|
192
|
+
all_global_inits_js = '/* global initializers */ __ATINIT__.push(' + ','.join(all_global_inits) + ');'
|
193
|
+
if main.global_inits:
|
194
|
+
target = main.global_inits_js
|
195
|
+
else:
|
196
|
+
target = '// === Body ===\n'
|
197
|
+
all_global_inits_js = target + all_global_inits_js
|
198
|
+
main.pre_js = main.pre_js.replace(target, all_global_inits_js)
|
199
|
+
|
200
|
+
# exports
|
201
|
+
def rep_exp(export):
|
202
|
+
key, value = export.split(':')
|
203
|
+
if key in replacements:
|
204
|
+
repped = replacements[key]
|
205
|
+
return repped + ': ' + repped
|
206
|
+
return export
|
207
|
+
my_exports = map(rep_exp, self.exports)
|
208
|
+
exports = main.exports.union(my_exports)
|
209
|
+
main.exports_js = 'return {' + ','.join(list(exports)) + '};\n})\n'
|
210
|
+
|
211
|
+
# post
|
212
|
+
def rep_def(deff):
|
213
|
+
key = deff.split(' ')[1]
|
214
|
+
if key in replacements:
|
215
|
+
rep = replacements[key]
|
216
|
+
return 'var %s = Module["%s"] = asm["%s"];\n' % (rep, rep, rep)
|
217
|
+
return deff
|
218
|
+
my_module_defs = map(rep_def, self.module_defs)
|
219
|
+
new_module_defs = set(my_module_defs).difference(main.module_defs)
|
220
|
+
if len(new_module_defs) > 0:
|
221
|
+
position = main.post_js.find('Runtime.') # Runtime is the start of the hardcoded ones
|
222
|
+
main.post_js = main.post_js[:position] + ''.join(list(new_module_defs)) + '\n' + main.post_js[position:]
|
223
|
+
|
224
|
+
def write(self, out):
|
225
|
+
f = open(out, 'w')
|
226
|
+
f.write(self.pre_js)
|
227
|
+
f.write(self.pre_imports_js)
|
228
|
+
f.write(self.imports_js)
|
229
|
+
f.write(self.funcs_js)
|
230
|
+
f.write(self.extra_funcs_js)
|
231
|
+
f.write(self.tables_js)
|
232
|
+
f.write(self.exports_js)
|
233
|
+
f.write(self.post_js)
|
234
|
+
f.close()
|
235
|
+
|
236
|
+
# Utilities
|
237
|
+
|
238
|
+
def parse_tables(self, js):
|
239
|
+
tables = {}
|
240
|
+
parts = js.split(';')
|
241
|
+
for part in parts:
|
242
|
+
if '=' not in part: continue
|
243
|
+
part = part.split('var ')[1]
|
244
|
+
name, data = part.split('=')
|
245
|
+
tables[name.strip()] = data.strip()
|
246
|
+
return tables
|
247
|
+
|
248
|
+
def merge_tables(self, table, main, side, replacements, f_bases, f_sizes):
|
249
|
+
sig = table.split('_')[-1]
|
250
|
+
side = side[1:-1].split(',')
|
251
|
+
side = map(lambda f: replacements[f] if f in replacements else f, side)
|
252
|
+
if not main:
|
253
|
+
f_bases[sig] = 0
|
254
|
+
f_sizes[table] = len(side)
|
255
|
+
return '[' + ','.join(side) + ']'
|
256
|
+
main = main[1:-1].split(',')
|
257
|
+
# TODO: handle non-aliasing case too
|
258
|
+
assert len(main) % 2 == 0
|
259
|
+
f_bases[sig] = len(main)
|
260
|
+
ret = main + side
|
261
|
+
size = 2
|
262
|
+
while size < len(ret): size *= 2
|
263
|
+
aborter = ret[1] # we can assume odd indexes have an aborting function with the right signature
|
264
|
+
ret = ret + [aborter]*(size - len(ret))
|
265
|
+
assert len(ret) == size
|
266
|
+
f_sizes[table] = size
|
267
|
+
return '[' + ','.join(ret) + ']'
|
268
|
+
|
269
|
+
def combine_tables(self):
|
270
|
+
self.tables_js = '// EMSCRIPTEN_END_FUNCS\n'
|
271
|
+
for table, data in self.tables.iteritems():
|
272
|
+
self.tables_js += 'var %s = %s;\n' % (table, data)
|
273
|
+
|
@@ -39,12 +39,12 @@ def path_from_root(*pathelems):
|
|
39
39
|
sys.path += [path_from_root('')]
|
40
40
|
from tools.shared import *
|
41
41
|
|
42
|
-
Popen([LLVM_OPT, sys.argv[1], '-strip-debug', '-o
|
42
|
+
Popen([LLVM_OPT, sys.argv[1], '-strip-debug', '-o', sys.argv[1]+'.clean.bc']).communicate()[0]
|
43
43
|
|
44
44
|
# Execute with empty environment - just like the JS script will have
|
45
45
|
Popen([LLVM_INTERPRETER, sys.argv[1]+'.clean.bc'] + sys.argv[2:], env={'HOME': '.'}).communicate()[0]
|
46
46
|
|
47
|
-
#Popen([LLVM_COMPILER, '-march=c', sys.argv[1], '-o
|
47
|
+
#Popen([LLVM_COMPILER, '-march=c', sys.argv[1], '-o', sys.argv[1]+'.cbe.c']).communicate()[0]
|
48
48
|
#Popen(['gcc', sys.argv[1]+'.cbe.c', '-lstdc++']).communicate()[0]
|
49
49
|
#Popen(['./a.out'] + sys.argv[2:]).communicate()[0]
|
50
50
|
|
@@ -122,8 +122,6 @@ for arg in sys.argv[1:]:
|
|
122
122
|
srcpath, dstpath = arg.split('@') # User is specifying destination filename explicitly.
|
123
123
|
else:
|
124
124
|
srcpath = dstpath = arg # Use source path as destination path.
|
125
|
-
if os.path.isabs(dstpath):
|
126
|
-
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.'
|
127
125
|
if os.path.isfile(srcpath) or os.path.isdir(srcpath):
|
128
126
|
data_files.append({ 'srcpath': srcpath, 'dstpath': dstpath, 'mode': mode })
|
129
127
|
else:
|
@@ -198,11 +196,28 @@ for file_ in data_files:
|
|
198
196
|
os.path.walk(file_['srcpath'], add, [file_['mode'], file_['srcpath'], file_['dstpath']])
|
199
197
|
data_files = filter(lambda file_: not os.path.isdir(file_['srcpath']), data_files)
|
200
198
|
|
199
|
+
# Absolutize paths, and check that they make sense
|
200
|
+
curr_abspath = os.path.abspath(os.getcwd())
|
201
|
+
for file_ in data_files:
|
202
|
+
if file_['srcpath'] == file_['dstpath']:
|
203
|
+
# This file was not defined with src@dst, so we inferred the destination from the source. In that case,
|
204
|
+
# we require that the destination not be under the current location
|
205
|
+
path = file_['dstpath']
|
206
|
+
abspath = os.path.abspath(path)
|
207
|
+
if DEBUG: print >> sys.stderr, path, abspath, curr_abspath
|
208
|
+
if not abspath.startswith(curr_abspath):
|
209
|
+
print >> sys.stderr, 'Error: Embedding "%s" which is below the current directory "%s". This is invalid since the current directory becomes the root that the generated code will see' % (path, curr_abspath)
|
210
|
+
sys.exit(1)
|
211
|
+
file_['dstpath'] = abspath[len(curr_abspath)+1:]
|
212
|
+
if os.path.isabs(path):
|
213
|
+
print >> sys.stderr, 'Warning: Embedding an absolute file/directory name "' + path + '" to the virtual filesystem. The file will be made available in the relative path "' + file_['dstpath'] + '". You can use the explicit syntax --preload-file srcpath@dstpath to explicitly specify the target location the absolute source path should be directed to.'
|
214
|
+
|
201
215
|
for file_ in data_files:
|
202
216
|
file_['dstpath'] = file_['dstpath'].replace(os.path.sep, '/') # name in the filesystem, native and emulated
|
203
217
|
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
|
204
218
|
file_['dstpath'] = file_['dstpath'] + os.path.basename(file_['srcpath'])
|
205
|
-
|
219
|
+
# make destination path always relative to the root
|
220
|
+
file_['dstpath'] = os.path.normpath(os.path.join('/', file_['dstpath']))
|
206
221
|
if DEBUG:
|
207
222
|
print >> sys.stderr, 'Packaging file "' + file_['srcpath'] + '" to VFS in path "' + file_['dstpath'] + '".'
|
208
223
|
|
@@ -327,19 +342,24 @@ if has_preloaded:
|
|
327
342
|
counter = 0
|
328
343
|
for file_ in data_files:
|
329
344
|
filename = file_['dstpath']
|
345
|
+
dirname = os.path.dirname(filename)
|
346
|
+
basename = os.path.basename(filename)
|
330
347
|
if file_['mode'] == 'embed':
|
331
348
|
# Embed
|
332
349
|
data = map(ord, open(file_['srcpath'], 'rb').read())
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
350
|
+
if not data:
|
351
|
+
str_data = '[]'
|
352
|
+
else:
|
353
|
+
str_data = ''
|
354
|
+
chunk_size = 10240
|
355
|
+
while len(data) > 0:
|
356
|
+
chunk = data[:chunk_size]
|
357
|
+
data = data[chunk_size:]
|
358
|
+
if not str_data:
|
359
|
+
str_data = str(chunk)
|
360
|
+
else:
|
361
|
+
str_data += '.concat(' + str(chunk) + ')'
|
362
|
+
code += '''Module['FS_createDataFile']('%s', '%s', %s, true, true);\n''' % (dirname, basename, str_data)
|
343
363
|
elif file_['mode'] == 'preload':
|
344
364
|
# Preload
|
345
365
|
varname = 'filePreload%d' % counter
|
@@ -372,7 +392,7 @@ for file_ in data_files:
|
|
372
392
|
assert(arrayBuffer, 'Loading file %(filename)s failed.');
|
373
393
|
var byteArray = !arrayBuffer.subarray ? new Uint8Array(arrayBuffer) : arrayBuffer;
|
374
394
|
%(prepare)s
|
375
|
-
Module['FS_createPreloadedFile']('
|
395
|
+
Module['FS_createPreloadedFile']('%(dirname)s', '%(basename)s', byteArray, true, true, function() {
|
376
396
|
%(finish)s
|
377
397
|
}%(fail)s);
|
378
398
|
};
|
@@ -382,8 +402,8 @@ for file_ in data_files:
|
|
382
402
|
'request': 'DataRequest', # In the past we also supported XHRs here
|
383
403
|
'varname': varname,
|
384
404
|
'filename': filename,
|
385
|
-
'dirname':
|
386
|
-
'basename':
|
405
|
+
'dirname': dirname,
|
406
|
+
'basename': basename,
|
387
407
|
'prepare': prepare,
|
388
408
|
'finish': finish,
|
389
409
|
'fail': '' if filename[-4:] not in AUDIO_SUFFIXES else ''', function() { Module['removeRunDependency']('fp %s') }''' % filename # workaround for chromium bug 124926 (still no audio with this, but at least we don't hang)
|
@@ -1,23 +1,23 @@
|
|
1
1
|
'''
|
2
|
-
Simple tool to find big functions in an .ll file.
|
2
|
+
Simple tool to find big functions in an .ll file.
|
3
3
|
'''
|
4
4
|
|
5
5
|
import os, sys, re
|
6
6
|
|
7
7
|
filename = sys.argv[1]
|
8
8
|
i = 0
|
9
|
-
maxx = -1
|
10
|
-
maxxest = '?'
|
11
9
|
start = -1
|
12
|
-
curr =
|
10
|
+
curr = None
|
11
|
+
data = []
|
13
12
|
for line in open(filename):
|
14
13
|
i += 1
|
15
14
|
if line.startswith('function '):
|
16
15
|
start = i
|
17
16
|
curr = line
|
18
|
-
elif line.startswith('}'):
|
17
|
+
elif line.startswith('}') and curr:
|
19
18
|
size = i - start
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
print
|
19
|
+
data.append([curr, size])
|
20
|
+
curr = None
|
21
|
+
data.sort(lambda x, y: x[1] - y[1])
|
22
|
+
print ''.join(['%6d : %s' % (x[1], x[0]) for x in data])
|
23
|
+
|