webruby 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (258) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webruby/rake/mruby.rake +1 -0
  3. data/modules/emscripten/AUTHORS +7 -0
  4. data/modules/emscripten/LICENSE +26 -0
  5. data/modules/emscripten/emcc +58 -20
  6. data/modules/emscripten/emlink.py +2 -265
  7. data/modules/emscripten/emscripten.py +38 -18
  8. data/modules/emscripten/scons-tools/emscripten.py +11 -6
  9. data/modules/emscripten/scons-tools/llvm.py +4 -3
  10. data/modules/emscripten/src/analyzer.js +32 -13
  11. data/modules/emscripten/src/embind/embind.js +13 -13
  12. data/modules/emscripten/src/embind/emval.js +8 -7
  13. data/modules/emscripten/src/intertyper.js +10 -0
  14. data/modules/emscripten/src/jsifier.js +28 -6
  15. data/modules/emscripten/src/library.js +2949 -1322
  16. data/modules/emscripten/src/library_browser.js +27 -23
  17. data/modules/emscripten/src/library_egl.js +7 -2
  18. data/modules/emscripten/src/library_gl.js +15 -2
  19. data/modules/emscripten/src/library_glut.js +1 -1
  20. data/modules/emscripten/src/library_jansson.js +1 -1
  21. data/modules/emscripten/src/library_openal.js +464 -132
  22. data/modules/emscripten/src/library_path.js +134 -0
  23. data/modules/emscripten/src/library_sdl.js +222 -50
  24. data/modules/emscripten/src/modules.js +22 -5
  25. data/modules/emscripten/src/parseTools.js +13 -2
  26. data/modules/emscripten/src/postamble.js +60 -34
  27. data/modules/emscripten/src/preamble.js +67 -18
  28. data/modules/emscripten/src/relooper/Relooper.cpp +1 -1
  29. data/modules/emscripten/src/runtime.js +12 -2
  30. data/modules/emscripten/src/settings.js +869 -826
  31. data/modules/emscripten/src/shell.js +63 -51
  32. data/modules/emscripten/src/utility.js +6 -0
  33. data/modules/emscripten/system/include/bsd/sys/mman.h +1 -1
  34. data/modules/emscripten/system/include/emscripten/bind.h +28 -28
  35. data/modules/emscripten/system/include/libc/math.h +8 -0
  36. data/modules/emscripten/system/include/libc/sys/signal.h +3 -1
  37. data/modules/emscripten/system/include/libc/sys/stat.h +2 -1
  38. data/modules/emscripten/system/include/libc/sys/types.h +4 -0
  39. data/modules/emscripten/system/include/libcxx/CREDITS.TXT +24 -0
  40. data/modules/emscripten/system/include/libcxx/__bit_reference +27 -8
  41. data/modules/emscripten/system/include/libcxx/__config +62 -15
  42. data/modules/emscripten/system/include/libcxx/__debug +5 -1
  43. data/modules/emscripten/system/include/libcxx/__functional_03 +24 -24
  44. data/modules/emscripten/system/include/libcxx/__functional_base +22 -4
  45. data/modules/emscripten/system/include/libcxx/__hash_table +566 -54
  46. data/modules/emscripten/system/include/libcxx/__locale +11 -3
  47. data/modules/emscripten/system/include/libcxx/__split_buffer +6 -6
  48. data/modules/emscripten/system/include/libcxx/__std_stream +58 -30
  49. data/modules/emscripten/system/include/libcxx/__tree +58 -51
  50. data/modules/emscripten/system/include/libcxx/__tuple +9 -9
  51. data/modules/emscripten/system/include/libcxx/algorithm +223 -13
  52. data/modules/emscripten/system/include/libcxx/array +18 -17
  53. data/modules/emscripten/system/include/libcxx/atomic +15 -5
  54. data/modules/emscripten/system/include/libcxx/cctype +2 -2
  55. data/modules/emscripten/system/include/libcxx/chrono +131 -36
  56. data/modules/emscripten/system/include/libcxx/cmath +41 -36
  57. data/modules/emscripten/system/include/libcxx/complex +49 -49
  58. data/modules/emscripten/system/include/libcxx/cstdio +2 -2
  59. data/modules/emscripten/system/include/libcxx/cstdlib +5 -5
  60. data/modules/emscripten/system/include/libcxx/cstring +2 -2
  61. data/modules/emscripten/system/include/libcxx/cwchar +22 -13
  62. data/modules/emscripten/system/include/libcxx/deque +27 -14
  63. data/modules/emscripten/system/include/libcxx/forward_list +36 -35
  64. data/modules/emscripten/system/include/libcxx/fstream +16 -0
  65. data/modules/emscripten/system/include/libcxx/functional +348 -23
  66. data/modules/emscripten/system/include/libcxx/future +66 -0
  67. data/modules/emscripten/system/include/libcxx/ios +27 -0
  68. data/modules/emscripten/system/include/libcxx/istream +2 -4
  69. data/modules/emscripten/system/include/libcxx/iterator +17 -9
  70. data/modules/emscripten/system/include/libcxx/limits +2 -2
  71. data/modules/emscripten/system/include/libcxx/list +165 -105
  72. data/modules/emscripten/system/include/libcxx/locale +154 -43
  73. data/modules/emscripten/system/include/libcxx/map +165 -224
  74. data/modules/emscripten/system/include/libcxx/memory +113 -54
  75. data/modules/emscripten/system/include/libcxx/random +2 -29
  76. data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
  77. data/modules/emscripten/system/include/libcxx/regex +60 -15
  78. data/modules/emscripten/system/include/libcxx/sstream +124 -40
  79. data/modules/emscripten/system/include/libcxx/string +345 -182
  80. data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +3 -3
  81. data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -2
  82. data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +3 -3
  83. data/modules/emscripten/system/include/libcxx/support/win32/support.h +10 -11
  84. data/modules/emscripten/system/include/libcxx/thread +2 -2
  85. data/modules/emscripten/system/include/libcxx/tuple +134 -65
  86. data/modules/emscripten/system/include/libcxx/type_traits +232 -24
  87. data/modules/emscripten/system/include/libcxx/unordered_map +314 -161
  88. data/modules/emscripten/system/include/libcxx/unordered_set +160 -2
  89. data/modules/emscripten/system/include/libcxx/utility +225 -40
  90. data/modules/emscripten/system/include/libcxx/vector +52 -57
  91. data/modules/emscripten/system/include/net/if.h +20 -1
  92. data/modules/emscripten/system/include/net/netinet/in.h +69 -5
  93. data/modules/emscripten/system/include/netdb.h +36 -0
  94. data/modules/emscripten/system/include/sys/ioctl.h +55 -3
  95. data/modules/emscripten/system/include/sys/select.h +2 -0
  96. data/modules/emscripten/system/include/sys/sendfile.h +16 -0
  97. data/modules/emscripten/system/include/sys/socket.h +181 -35
  98. data/modules/emscripten/system/lib/dlmalloc.c +10 -12
  99. data/modules/emscripten/system/lib/libc/musl/src/stdlib/ecvt.c +19 -0
  100. data/modules/emscripten/system/lib/libc/musl/src/stdlib/fcvt.c +25 -0
  101. data/modules/emscripten/system/lib/libc/musl/src/stdlib/gcvt.c +8 -0
  102. data/modules/emscripten/system/lib/libcextra.symbols +3 -0
  103. data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +24 -0
  104. data/modules/emscripten/system/lib/libcxx/debug.cpp +11 -9
  105. data/modules/emscripten/system/lib/libcxx/exception.cpp +9 -0
  106. data/modules/emscripten/system/lib/libcxx/hash.cpp +6 -0
  107. data/modules/emscripten/system/lib/libcxx/iostream.cpp +4 -4
  108. data/modules/emscripten/system/lib/libcxx/locale.cpp +91 -42
  109. data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
  110. data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +1 -1
  111. data/modules/emscripten/system/lib/libcxx/string.cpp +332 -491
  112. data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +4 -2
  113. data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +140 -41
  114. data/modules/emscripten/system/lib/libcxx/symbols +9 -256
  115. data/modules/emscripten/system/lib/libcxx/system_error.cpp +3 -0
  116. data/modules/emscripten/system/lib/libcxx/thread.cpp +16 -3
  117. data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +12 -2
  118. data/modules/emscripten/third_party/stb_image.c +4673 -0
  119. data/modules/emscripten/tools/asm_module.py +273 -0
  120. data/modules/emscripten/tools/exec_llvm.py +2 -2
  121. data/modules/emscripten/tools/file_packager.py +36 -16
  122. data/modules/emscripten/tools/find_bigfuncs.py +9 -9
  123. data/modules/emscripten/tools/js-optimizer.js +485 -131
  124. data/modules/emscripten/tools/js_optimizer.py +22 -15
  125. data/modules/emscripten/tools/merge_asm.py +26 -0
  126. data/modules/emscripten/tools/nativize_llvm.py +2 -2
  127. data/modules/emscripten/tools/settings_template_readonly.py +1 -1
  128. data/modules/emscripten/tools/shared.py +63 -20
  129. data/modules/emscripten/tools/split_asm.py +30 -0
  130. data/modules/emscripten/tools/test-js-optimizer-asm-outline1-output.js +686 -0
  131. data/modules/emscripten/tools/test-js-optimizer-asm-outline1.js +263 -0
  132. data/modules/emscripten/tools/test-js-optimizer-asm-outline2-output.js +747 -0
  133. data/modules/emscripten/tools/{test-js-optimizer-asm-outline.js → test-js-optimizer-asm-outline2.js} +1 -1
  134. data/modules/emscripten/tools/test-js-optimizer-asm-outline3-output.js +28 -0
  135. data/modules/emscripten/tools/test-js-optimizer-asm-outline3.js +30 -0
  136. data/modules/emscripten/tools/test-js-optimizer-asm-pre-output.js +4 -4
  137. data/modules/mruby/AUTHORS +1 -0
  138. data/modules/mruby/README.md +4 -2
  139. data/modules/mruby/build_config.rb +6 -6
  140. data/modules/mruby/doc/mrbgems/README.md +4 -4
  141. data/modules/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +1 -1
  142. data/modules/mruby/examples/mrbgems/c_extension_example/mrbgem.rake +1 -1
  143. data/modules/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake +1 -1
  144. data/modules/mruby/include/mrbconf.h +3 -0
  145. data/modules/mruby/include/mruby/array.h +2 -2
  146. data/modules/mruby/include/mruby/class.h +4 -4
  147. data/modules/mruby/include/mruby/compile.h +1 -0
  148. data/modules/mruby/include/mruby/data.h +1 -1
  149. data/modules/mruby/include/mruby/hash.h +2 -2
  150. data/modules/mruby/include/mruby/irep.h +3 -2
  151. data/modules/mruby/include/mruby/proc.h +1 -1
  152. data/modules/mruby/include/mruby/range.h +1 -1
  153. data/modules/mruby/include/mruby/string.h +2 -2
  154. data/modules/mruby/include/mruby/value.h +43 -26
  155. data/modules/mruby/include/mruby.h +10 -2
  156. data/modules/mruby/minirake +2 -2
  157. data/modules/mruby/mrbgems/mruby-array-ext/mrbgem.rake +1 -1
  158. data/modules/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +4 -1
  159. data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +32 -0
  160. data/modules/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -1
  161. data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +13 -5
  162. data/modules/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +1 -1
  163. data/modules/mruby/mrbgems/mruby-enum-ext/test/enum.rb +10 -11
  164. data/modules/mruby/mrbgems/mruby-eval/mrbgem.rake +1 -1
  165. data/modules/mruby/mrbgems/mruby-exit/mrbgem.rake +4 -0
  166. data/modules/mruby/mrbgems/mruby-exit/src/mruby-exit.c +24 -0
  167. data/modules/mruby/mrbgems/mruby-fiber/mrbgem.rake +1 -1
  168. data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +4 -2
  169. data/modules/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +1 -1
  170. data/modules/mruby/mrbgems/mruby-hash-ext/test/hash.rb +5 -7
  171. data/modules/mruby/mrbgems/mruby-math/mrbgem.rake +1 -1
  172. data/modules/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +1 -1
  173. data/modules/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +2 -2
  174. data/modules/mruby/mrbgems/mruby-object-ext/mrbgem.rake +1 -1
  175. data/modules/mruby/mrbgems/mruby-object-ext/src/object.c +3 -3
  176. data/modules/mruby/mrbgems/mruby-object-ext/test/nil.rb +3 -3
  177. data/modules/mruby/mrbgems/mruby-object-ext/test/object.rb +1 -1
  178. data/modules/mruby/mrbgems/mruby-objectspace/mrbgem.rake +1 -1
  179. data/modules/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +36 -37
  180. data/modules/mruby/mrbgems/mruby-print/mrbgem.rake +1 -1
  181. data/modules/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +1 -1
  182. data/modules/mruby/mrbgems/mruby-proc-ext/test/proc.rb +8 -8
  183. data/modules/mruby/mrbgems/mruby-random/mrbgem.rake +1 -1
  184. data/modules/mruby/mrbgems/mruby-range-ext/mrbgem.rake +1 -1
  185. data/modules/mruby/mrbgems/mruby-range-ext/test/range.rb +6 -6
  186. data/modules/mruby/mrbgems/mruby-sprintf/mrbgem.rake +1 -1
  187. data/modules/mruby/mrbgems/mruby-string-ext/mrbgem.rake +1 -1
  188. data/modules/mruby/mrbgems/mruby-string-ext/test/string.rb +6 -6
  189. data/modules/mruby/mrbgems/mruby-struct/mrbgem.rake +1 -1
  190. data/modules/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +1 -1
  191. data/modules/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +2 -2
  192. data/modules/mruby/mrbgems/mruby-time/mrbgem.rake +1 -1
  193. data/modules/mruby/mrbgems/mruby-time/src/time.c +2 -8
  194. data/modules/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +1 -1
  195. data/modules/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +10 -10
  196. data/modules/mruby/mrblib/class.rb +15 -9
  197. data/modules/mruby/mrblib/string.rb +12 -0
  198. data/modules/mruby/src/array.c +4 -3
  199. data/modules/mruby/src/class.c +13 -8
  200. data/modules/mruby/src/codegen.c +9 -8
  201. data/modules/mruby/src/error.c +7 -5
  202. data/modules/mruby/src/error.h +1 -0
  203. data/modules/mruby/src/etc.c +1 -1
  204. data/modules/mruby/src/gc.c +163 -128
  205. data/modules/mruby/src/kernel.c +43 -15
  206. data/modules/mruby/src/numeric.c +9 -7
  207. data/modules/mruby/src/object.c +1 -1
  208. data/modules/mruby/src/parse.y +37 -19
  209. data/modules/mruby/src/range.c +10 -24
  210. data/modules/mruby/src/state.c +2 -6
  211. data/modules/mruby/src/string.c +0 -9
  212. data/modules/mruby/src/variable.c +2 -2
  213. data/modules/mruby/src/vm.c +12 -6
  214. data/modules/mruby/tasks/mrbgem_spec.rake +7 -0
  215. data/modules/mruby/tasks/mrbgems.rake +2 -1
  216. data/modules/mruby/tasks/mrbgems_test.rake +1 -1
  217. data/modules/mruby/tasks/mruby_build.rake +4 -3
  218. data/modules/mruby/tasks/mruby_build_commands.rake +6 -1
  219. data/modules/mruby/tasks/mruby_build_gem.rake +2 -2
  220. data/modules/mruby/tasks/toolchains/androideabi.rake +2 -0
  221. data/modules/mruby/test/assert.rb +2 -2
  222. data/modules/mruby/test/t/argumenterror.rb +3 -3
  223. data/modules/mruby/test/t/array.rb +55 -55
  224. data/modules/mruby/test/t/basicobject.rb +1 -1
  225. data/modules/mruby/test/t/bs_block.rb +12 -12
  226. data/modules/mruby/test/t/class.rb +21 -21
  227. data/modules/mruby/test/t/enumerable.rb +18 -18
  228. data/modules/mruby/test/t/exception.rb +20 -20
  229. data/modules/mruby/test/t/false.rb +3 -3
  230. data/modules/mruby/test/t/float.rb +40 -40
  231. data/modules/mruby/test/t/gc.rb +10 -10
  232. data/modules/mruby/test/t/hash.rb +41 -41
  233. data/modules/mruby/test/t/indexerror.rb +2 -2
  234. data/modules/mruby/test/t/integer.rb +41 -41
  235. data/modules/mruby/test/t/kernel.rb +33 -33
  236. data/modules/mruby/test/t/literals.rb +82 -82
  237. data/modules/mruby/test/t/localjumperror.rb +1 -1
  238. data/modules/mruby/test/t/module.rb +170 -31
  239. data/modules/mruby/test/t/nameerror.rb +5 -5
  240. data/modules/mruby/test/t/nil.rb +2 -2
  241. data/modules/mruby/test/t/nomethoderror.rb +1 -1
  242. data/modules/mruby/test/t/numeric.rb +5 -5
  243. data/modules/mruby/test/t/object.rb +2 -2
  244. data/modules/mruby/test/t/proc.rb +8 -8
  245. data/modules/mruby/test/t/range.rb +9 -9
  246. data/modules/mruby/test/t/rangeerror.rb +2 -2
  247. data/modules/mruby/test/t/runtimeerror.rb +1 -1
  248. data/modules/mruby/test/t/standarderror.rb +2 -2
  249. data/modules/mruby/test/t/string.rb +100 -100
  250. data/modules/mruby/test/t/symbol.rb +5 -5
  251. data/modules/mruby/test/t/syntax.rb +15 -6
  252. data/modules/mruby/test/t/true.rb +3 -3
  253. data/modules/mruby/test/t/typeerror.rb +2 -2
  254. data/modules/mruby/tools/mrbc/mrbc.c +10 -4
  255. data/modules/mruby/travis_config.rb +1 -0
  256. data/scripts/gen_gems_config.rb +5 -1
  257. metadata +19 -4
  258. 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=' + sys.argv[1]+'.clean.bc']).communicate()[0]
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=' + sys.argv[1]+'.cbe.c']).communicate()[0]
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
- if file_['dstpath'].startswith('./'): file_['dstpath'] = file_['dstpath'][2:] # remove redundant ./ prefix
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
- str_data = ''
334
- chunk_size = 10240
335
- while len(data) > 0:
336
- chunk = data[:chunk_size]
337
- data = data[chunk_size:]
338
- if not str_data:
339
- str_data = str(chunk)
340
- else:
341
- str_data += '.concat(' + str(chunk) + ')'
342
- code += '''Module['FS_createDataFile']('/%s', '%s', %s, true, true);\n''' % (os.path.dirname(filename), os.path.basename(filename), str_data)
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']('/%(dirname)s', '%(basename)s', byteArray, true, true, function() {
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': os.path.dirname(filename),
386
- 'basename': os.path.basename(filename),
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. Anything over i64 is of interest.
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
- if size > maxx:
21
- maxx = size
22
- maxxest = curr
23
- print maxx, 'lines in', maxxest
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
+