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,134 @@
1
+ mergeInto(LibraryManager.library, {
2
+ $PATH__deps: ['$FS'],
3
+ $PATH: {
4
+ // split a filename into [root, dir, basename, ext], unix version
5
+ // 'root' is just a slash, or nothing.
6
+ splitPath: function(filename) {
7
+ var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
8
+ return splitPathRe.exec(filename).slice(1);
9
+ },
10
+ normalizeArray: function(parts, allowAboveRoot) {
11
+ // if the path tries to go above the root, `up` ends up > 0
12
+ var up = 0;
13
+ for (var i = parts.length - 1; i >= 0; i--) {
14
+ var last = parts[i];
15
+ if (last === '.') {
16
+ parts.splice(i, 1);
17
+ } else if (last === '..') {
18
+ parts.splice(i, 1);
19
+ up++;
20
+ } else if (up) {
21
+ parts.splice(i, 1);
22
+ up--;
23
+ }
24
+ }
25
+ // if the path is allowed to go above the root, restore leading ..s
26
+ if (allowAboveRoot) {
27
+ for (; up--; up) {
28
+ parts.unshift('..');
29
+ }
30
+ }
31
+ return parts;
32
+ },
33
+ normalize: function(path) {
34
+ var isAbsolute = path.charAt(0) === '/',
35
+ trailingSlash = path.substr(-1) === '/';
36
+ // Normalize the path
37
+ path = PATH.normalizeArray(path.split('/').filter(function(p) {
38
+ return !!p;
39
+ }), !isAbsolute).join('/');
40
+ if (!path && !isAbsolute) {
41
+ path = '.';
42
+ }
43
+ if (path && trailingSlash) {
44
+ path += '/';
45
+ }
46
+ return (isAbsolute ? '/' : '') + path;
47
+ },
48
+ dirname: function(path) {
49
+ var result = PATH.splitPath(path),
50
+ root = result[0],
51
+ dir = result[1];
52
+ if (!root && !dir) {
53
+ // No dirname whatsoever
54
+ return '.';
55
+ }
56
+ if (dir) {
57
+ // It has a dirname, strip trailing slash
58
+ dir = dir.substr(0, dir.length - 1);
59
+ }
60
+ return root + dir;
61
+ },
62
+ basename: function(path, ext) {
63
+ // EMSCRIPTEN return '/'' for '/', not an empty string
64
+ if (path === '/') return '/';
65
+ var f = PATH.splitPath(path)[2];
66
+ if (ext && f.substr(-1 * ext.length) === ext) {
67
+ f = f.substr(0, f.length - ext.length);
68
+ }
69
+ return f;
70
+ },
71
+ join: function() {
72
+ var paths = Array.prototype.slice.call(arguments, 0);
73
+ return PATH.normalize(paths.filter(function(p, index) {
74
+ if (typeof p !== 'string') {
75
+ throw new TypeError('Arguments to path.join must be strings');
76
+ }
77
+ return p;
78
+ }).join('/'));
79
+ },
80
+ resolve: function() {
81
+ var resolvedPath = '',
82
+ resolvedAbsolute = false;
83
+ for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
84
+ var path = (i >= 0) ? arguments[i] : FS.cwd();
85
+ // Skip empty and invalid entries
86
+ if (typeof path !== 'string') {
87
+ throw new TypeError('Arguments to path.resolve must be strings');
88
+ } else if (!path) {
89
+ continue;
90
+ }
91
+ resolvedPath = path + '/' + resolvedPath;
92
+ resolvedAbsolute = path.charAt(0) === '/';
93
+ }
94
+ // At this point the path should be resolved to a full absolute path, but
95
+ // handle relative paths to be safe (might happen when process.cwd() fails)
96
+ resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {
97
+ return !!p;
98
+ }), !resolvedAbsolute).join('/');
99
+ return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
100
+ },
101
+ relative: function(from, to) {
102
+ from = PATH.resolve(from).substr(1);
103
+ to = PATH.resolve(to).substr(1);
104
+ function trim(arr) {
105
+ var start = 0;
106
+ for (; start < arr.length; start++) {
107
+ if (arr[start] !== '') break;
108
+ }
109
+ var end = arr.length - 1;
110
+ for (; end >= 0; end--) {
111
+ if (arr[end] !== '') break;
112
+ }
113
+ if (start > end) return [];
114
+ return arr.slice(start, end - start + 1);
115
+ }
116
+ var fromParts = trim(from.split('/'));
117
+ var toParts = trim(to.split('/'));
118
+ var length = Math.min(fromParts.length, toParts.length);
119
+ var samePartsLength = length;
120
+ for (var i = 0; i < length; i++) {
121
+ if (fromParts[i] !== toParts[i]) {
122
+ samePartsLength = i;
123
+ break;
124
+ }
125
+ }
126
+ var outputParts = [];
127
+ for (var i = samePartsLength; i < fromParts.length; i++) {
128
+ outputParts.push('..');
129
+ }
130
+ outputParts = outputParts.concat(toParts.slice(samePartsLength));
131
+ return outputParts.join('/');
132
+ }
133
+ }
134
+ });
@@ -10,7 +10,7 @@
10
10
  // or otherwise).
11
11
 
12
12
  var LibrarySDL = {
13
- $SDL__deps: ['$FS', '$Browser'],
13
+ $SDL__deps: ['$FS', '$PATH', '$Browser'],
14
14
  $SDL: {
15
15
  defaults: {
16
16
  width: 320,
@@ -28,6 +28,7 @@ var LibrarySDL = {
28
28
 
29
29
  // The currently preloaded audio elements ready to be played
30
30
  audios: [null],
31
+ rwops: [null],
31
32
  // The currently playing audio element. There's only one music track.
32
33
  music: {
33
34
  audio: null,
@@ -275,6 +276,8 @@ var LibrarySDL = {
275
276
  {{{ makeSetValue('surf+Runtime.QUANTUM_SIZE*5', '0', 'buffer', 'void*') }}} // SDL_Surface.pixels
276
277
  {{{ makeSetValue('surf+Runtime.QUANTUM_SIZE*6', '0', '0', 'i32*') }}} // SDL_Surface.offset
277
278
 
279
+ {{{ makeSetValue('surf+Runtime.QUANTUM_SIZE*14', '0', '1', 'i32') }}}
280
+
278
281
  {{{ makeSetValue('pixelFormat + SDL.structs.PixelFormat.format', '0', '-2042224636', 'i32') }}} // SDL_PIXELFORMAT_RGBA8888
279
282
  {{{ makeSetValue('pixelFormat + SDL.structs.PixelFormat.palette', '0', '0', 'i32') }}} // TODO
280
283
  {{{ makeSetValue('pixelFormat + SDL.structs.PixelFormat.BitsPerPixel', '0', 'bpp * 8', 'i8') }}}
@@ -315,7 +318,7 @@ var LibrarySDL = {
315
318
  usePageCanvas: usePageCanvas,
316
319
  source: source,
317
320
 
318
- isFlagSet: function (flag) {
321
+ isFlagSet: function(flag) {
319
322
  return flags & flag;
320
323
  }
321
324
  };
@@ -361,6 +364,13 @@ var LibrarySDL = {
361
364
  },
362
365
 
363
366
  freeSurface: function(surf) {
367
+ var refcountPointer = surf + Runtime.QUANTUM_SIZE * 14;
368
+ var refcount = {{{ makeGetValue('refcountPointer', '0', 'i32') }}};
369
+ if (refcount > 1) {
370
+ {{{ makeSetValue('refcountPointer', '0', 'refcount - 1', 'i32') }}};
371
+ return;
372
+ }
373
+
364
374
  var info = SDL.surfaces[surf];
365
375
  if (!info.usePageCanvas && info.canvas) SDL.canvasPool.push(info.canvas);
366
376
  _free(info.buffer);
@@ -939,7 +949,10 @@ var LibrarySDL = {
939
949
  // TODO
940
950
  },
941
951
 
942
- SDL_GetKeyboardState: function() {
952
+ SDL_GetKeyboardState: function(numKeys) {
953
+ if (numKeys) {
954
+ {{{ makeSetValue('numKeys', 0, 0x10000, 'i32') }}};
955
+ }
943
956
  return SDL.keyboardState;
944
957
  },
945
958
 
@@ -1096,7 +1109,11 @@ var LibrarySDL = {
1096
1109
  return ret;
1097
1110
  },
1098
1111
 
1112
+ rotozoomSurface__deps: ['zoomSurface'],
1099
1113
  rotozoomSurface: function(src, angle, zoom, smooth) {
1114
+ if (angle % 360 === 0) {
1115
+ return _zoomSurface(src, zoom, zoom, smooth);
1116
+ }
1100
1117
  var srcData = SDL.surfaces[src];
1101
1118
  var w = srcData.width * zoom;
1102
1119
  var h = srcData.height * zoom;
@@ -1221,42 +1238,131 @@ var LibrarySDL = {
1221
1238
  return flags; // We support JPG, PNG, TIF because browsers do
1222
1239
  },
1223
1240
 
1224
- IMG_Load__deps: ['SDL_LockSurface'],
1225
- IMG_Load: function(filename) {
1226
- filename = FS.standardizePath(Pointer_stringify(filename));
1227
- if (filename[0] == '/') {
1228
- // Convert the path to relative
1229
- filename = filename.substr(1);
1230
- }
1231
- var raw = Module["preloadedImages"][filename];
1232
- if (!raw) {
1233
- if (raw === null) Module.printErr('Trying to reuse preloaded image, but freePreloadedMediaOnUse is set!');
1234
- Runtime.warnOnce('Cannot find preloaded image ' + filename);
1235
- return 0;
1236
- }
1237
- if (Module['freePreloadedMediaOnUse']) {
1238
- Module["preloadedImages"][filename] = null;
1239
- }
1240
- var surf = SDL.makeSurface(raw.width, raw.height, 0, false, 'load:' + filename);
1241
- var surfData = SDL.surfaces[surf];
1242
- surfData.ctx.globalCompositeOperation = "copy";
1243
- surfData.ctx.drawImage(raw, 0, 0, raw.width, raw.height, 0, 0, raw.width, raw.height);
1244
- surfData.ctx.globalCompositeOperation = "source-over";
1245
- // XXX SDL does not specify that loaded images must have available pixel data, in fact
1246
- // there are cases where you just want to blit them, so you just need the hardware
1247
- // accelerated version. However, code everywhere seems to assume that the pixels
1248
- // are in fact available, so we retrieve it here. This does add overhead though.
1249
- _SDL_LockSurface(surf);
1250
- surfData.locked--; // The surface is not actually locked in this hack
1251
- if (SDL.GL) {
1252
- // After getting the pixel data, we can free the canvas and context if we do not need to do 2D canvas blitting
1253
- surfData.canvas = surfData.ctx = null;
1241
+ IMG_Load_RW__deps: ['SDL_LockSurface', 'SDL_FreeRW'],
1242
+ IMG_Load_RW: function(rwopsID, freeSrc) {
1243
+ try {
1244
+ // stb_image integration support
1245
+ var cleanup = function() {
1246
+ if (rwops && freeSrc) _SDL_FreeRW(rwopsID);
1247
+ };
1248
+ function addCleanup(func) {
1249
+ var old = cleanup;
1250
+ cleanup = function() {
1251
+ old();
1252
+ func();
1253
+ }
1254
+ }
1255
+ function callStbImage(func, params) {
1256
+ var x = Module['_malloc']({{{ QUANTUM_SIZE }}});
1257
+ var y = Module['_malloc']({{{ QUANTUM_SIZE }}});
1258
+ var comp = Module['_malloc']({{{ QUANTUM_SIZE }}});
1259
+ addCleanup(function() {
1260
+ Module['_free'](x);
1261
+ Module['_free'](y);
1262
+ Module['_free'](comp);
1263
+ if (data) Module['_stbi_image_free'](data);
1264
+ });
1265
+ var data = Module['_' + func].apply(null, params.concat([x, y, comp, 0]));
1266
+ if (!data) return null;
1267
+ return {
1268
+ rawData: true,
1269
+ data: data,
1270
+ width: {{{ makeGetValue('x', 0, 'i32') }}},
1271
+ height: {{{ makeGetValue('y', 0, 'i32') }}},
1272
+ size: {{{ makeGetValue('x', 0, 'i32') }}} * {{{ makeGetValue('y', 0, 'i32') }}} * {{{ makeGetValue('comp', 0, 'i32') }}},
1273
+ bpp: {{{ makeGetValue('comp', 0, 'i32') }}}
1274
+ };
1275
+ }
1276
+
1277
+ var rwops = SDL.rwops[rwopsID];
1278
+ if (rwops === undefined) {
1279
+ return 0;
1280
+ }
1281
+
1282
+ var filename = rwops.filename;
1283
+ if (filename === undefined) {
1284
+ #if STB_IMAGE
1285
+ var raw = callStbImage('stbi_load_from_memory', [rwops.bytes, rwops.count]);
1286
+ if (!raw) return 0;
1287
+ #else
1288
+ Runtime.warnOnce('Only file names that have been preloaded are supported for IMG_Load_RW. Consider using STB_IMAGE=1 if you want synchronous image decoding (see settings.js)');
1289
+ return 0;
1290
+ #endif
1291
+ }
1292
+
1293
+ if (!raw) {
1294
+ filename = PATH.resolve(filename);
1295
+ var raw = Module["preloadedImages"][filename];
1296
+ if (!raw) {
1297
+ if (raw === null) Module.printErr('Trying to reuse preloaded image, but freePreloadedMediaOnUse is set!');
1298
+ #if STB_IMAGE
1299
+ var name = Module['_malloc'](filename.length+1);
1300
+ writeStringToMemory(filename, name);
1301
+ addCleanup(function() {
1302
+ Module['_free'](name);
1303
+ });
1304
+ var raw = callStbImage('stbi_load', [name]);
1305
+ if (!raw) return 0;
1306
+ #else
1307
+ Runtime.warnOnce('Cannot find preloaded image ' + filename);
1308
+ Runtime.warnOnce('Cannot find preloaded image ' + filename + '. Consider using STB_IMAGE=1 if you want synchronous image decoding (see settings.js)');
1309
+ return 0;
1310
+ #endif
1311
+ } else if (Module['freePreloadedMediaOnUse']) {
1312
+ Module["preloadedImages"][filename] = null;
1313
+ }
1314
+ }
1315
+
1316
+ var surf = SDL.makeSurface(raw.width, raw.height, 0, false, 'load:' + filename);
1317
+ var surfData = SDL.surfaces[surf];
1318
+ surfData.ctx.globalCompositeOperation = "copy";
1319
+ if (!raw.rawData) {
1320
+ surfData.ctx.drawImage(raw, 0, 0, raw.width, raw.height, 0, 0, raw.width, raw.height);
1321
+ } else {
1322
+ var imageData = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height);
1323
+ if (raw.bpp == 4) {
1324
+ imageData.data.set({{{ makeHEAPView('U8', 'raw.data', 'raw.data+raw.size') }}});
1325
+ } else if (raw.bpp == 3) {
1326
+ var pixels = raw.size/3;
1327
+ var data = imageData.data;
1328
+ var sourcePtr = raw.data;
1329
+ var destPtr = 0;
1330
+ for (var i = 0; i < pixels; i++) {
1331
+ data[destPtr++] = {{{ makeGetValue('sourcePtr++', 0, 'i8', null, 1) }}};
1332
+ data[destPtr++] = {{{ makeGetValue('sourcePtr++', 0, 'i8', null, 1) }}};
1333
+ data[destPtr++] = {{{ makeGetValue('sourcePtr++', 0, 'i8', null, 1) }}};
1334
+ data[destPtr++] = 255;
1335
+ }
1336
+ } else {
1337
+ Module.printErr('cannot handle bpp ' + raw.bpp);
1338
+ return 0;
1339
+ }
1340
+ surfData.ctx.putImageData(imageData, 0, 0);
1341
+ }
1342
+ surfData.ctx.globalCompositeOperation = "source-over";
1343
+ // XXX SDL does not specify that loaded images must have available pixel data, in fact
1344
+ // there are cases where you just want to blit them, so you just need the hardware
1345
+ // accelerated version. However, code everywhere seems to assume that the pixels
1346
+ // are in fact available, so we retrieve it here. This does add overhead though.
1347
+ _SDL_LockSurface(surf);
1348
+ surfData.locked--; // The surface is not actually locked in this hack
1349
+ if (SDL.GL) {
1350
+ // After getting the pixel data, we can free the canvas and context if we do not need to do 2D canvas blitting
1351
+ surfData.canvas = surfData.ctx = null;
1352
+ }
1353
+ return surf;
1354
+ } finally {
1355
+ cleanup();
1254
1356
  }
1255
- return surf;
1256
1357
  },
1257
1358
  SDL_LoadBMP: 'IMG_Load',
1258
- SDL_LoadBMP_RW: 'IMG_Load',
1259
- IMG_Load_RW: 'IMG_Load',
1359
+ SDL_LoadBMP_RW: 'IMG_Load_RW',
1360
+ IMG_Load__deps: ['IMG_Load_RW', 'SDL_RWFromFile'],
1361
+ IMG_Load: function(filename){
1362
+ var rwops = _SDL_RWFromFile(filename);
1363
+ var result = _IMG_Load_RW(rwops, 1);
1364
+ return result;
1365
+ },
1260
1366
 
1261
1367
  // SDL_Audio
1262
1368
 
@@ -1392,22 +1498,61 @@ var LibrarySDL = {
1392
1498
  return 0; // error
1393
1499
  },
1394
1500
 
1395
- Mix_LoadWAV_RW: function(filename, freesrc) {
1396
- filename = FS.standardizePath(Pointer_stringify(filename));
1397
- var raw = Module["preloadedAudios"][filename];
1398
- if (!raw) {
1399
- if (raw === null) Module.printErr('Trying to reuse preloaded audio, but freePreloadedMediaOnUse is set!');
1400
- Runtime.warnOnce('Cannot find preloaded audio ' + filename);
1501
+ Mix_LoadWAV_RW: function(rwopsID, freesrc) {
1502
+ var rwops = SDL.rwops[rwopsID];
1503
+
1504
+ if (rwops === undefined)
1505
+ return 0;
1506
+
1507
+ var filename = '';
1508
+ var audio;
1509
+ var bytes;
1510
+
1511
+ if (rwops.filename !== undefined) {
1512
+ filename = PATH.resolve(rwops.filename);
1513
+ var raw = Module["preloadedAudios"][filename];
1514
+ if (!raw) {
1515
+ if (raw === null) Module.printErr('Trying to reuse preloaded audio, but freePreloadedMediaOnUse is set!');
1516
+ Runtime.warnOnce('Cannot find preloaded audio ' + filename);
1517
+
1518
+ // see if we can read the file-contents from the in-memory FS
1519
+ var fileObject = FS.findObject(filename);
1520
+
1521
+ if (fileObject === null) Module.printErr('Couldn\'t find file for: ' + filename);
1522
+
1523
+ // We found the file. Load the contents
1524
+ if (fileObject && !fileObject.isFolder && fileObject.read) {
1525
+ bytes = fileObject.contents;
1526
+ } else {
1527
+ return 0;
1528
+ }
1529
+ }
1530
+ if (Module['freePreloadedMediaOnUse']) {
1531
+ Module["preloadedAudios"][filename] = null;
1532
+ }
1533
+ audio = raw;
1534
+ }
1535
+ else if (rwops.bytes !== undefined) {
1536
+ bytes = HEAPU8.subarray(rwops.bytes, rwops.bytes + rwops.count);
1537
+ }
1538
+ else {
1401
1539
  return 0;
1402
1540
  }
1403
- if (Module['freePreloadedMediaOnUse']) {
1404
- Module["preloadedAudios"][filename] = null;
1541
+
1542
+ // Here, we didn't find a preloaded audio but we either were passed a filepath for
1543
+ // which we loaded bytes, or we were passed some bytes
1544
+ if (audio === undefined && bytes) {
1545
+ var blob = new Blob([new Uint8Array(bytes)], {type: rwops.mimetype});
1546
+ var url = URL.createObjectURL(blob);
1547
+ audio = new Audio();
1548
+ audio.src = url;
1405
1549
  }
1550
+
1406
1551
  var id = SDL.audios.length;
1407
1552
  // Keep the loaded audio in the audio arrays, ready for playback
1408
1553
  SDL.audios.push({
1409
1554
  source: filename,
1410
- audio: raw
1555
+ audio: audio
1411
1556
  });
1412
1557
  return id;
1413
1558
  },
@@ -1567,8 +1712,14 @@ var LibrarySDL = {
1567
1712
  return SDL.setGetVolume(SDL.music, volume);
1568
1713
  },
1569
1714
 
1570
- Mix_LoadMUS: 'Mix_LoadWAV_RW',
1571
1715
  Mix_LoadMUS_RW: 'Mix_LoadWAV_RW',
1716
+ Mix_LoadMUS__deps: ['Mix_LoadMUS_RW', 'SDL_RWFromFile', 'SDL_FreeRW'],
1717
+ Mix_LoadMUS: function(filename) {
1718
+ var rwops = _SDL_RWFromFile(filename);
1719
+ var result = _Mix_LoadMUS_RW(rwops);
1720
+ _SDL_FreeRW(rwops);
1721
+ return result;
1722
+ },
1572
1723
 
1573
1724
  Mix_FreeMusic: 'Mix_FreeChunk',
1574
1725
 
@@ -1760,6 +1911,11 @@ var LibrarySDL = {
1760
1911
  return Math.floor(fontData.size*0.02); // XXX
1761
1912
  },
1762
1913
 
1914
+ TTF_FontHeight: function(font) {
1915
+ var fontData = SDL.fonts[font];
1916
+ return fontData.size;
1917
+ },
1918
+
1763
1919
  // SDL gfx
1764
1920
 
1765
1921
  $SDL_gfx: {
@@ -1951,7 +2107,7 @@ var LibrarySDL = {
1951
2107
  return -1;
1952
2108
  },
1953
2109
 
1954
- SDL_SetGammaRamp: function (redTable, greenTable, blueTable) {
2110
+ SDL_SetGammaRamp: function(redTable, greenTable, blueTable) {
1955
2111
  return -1;
1956
2112
  },
1957
2113
 
@@ -1967,8 +2123,25 @@ var LibrarySDL = {
1967
2123
 
1968
2124
  SDL_InitSubSystem: function(flags) { return 0 },
1969
2125
 
1970
- SDL_RWFromFile: function(filename, mode) {
1971
- return filename; // XXX We just forward the filename
2126
+ SDL_RWFromConstMem: function(mem, size) {
2127
+ var id = SDL.rwops.length; // TODO: recycle ids when they are null
2128
+ SDL.rwops.push({ bytes: mem, count: size });
2129
+ return id;
2130
+ },
2131
+ SDL_RWFromMem: 'SDL_RWFromConstMem',
2132
+
2133
+ SDL_RWFromFile: function(_name, mode) {
2134
+ var id = SDL.rwops.length; // TODO: recycle ids when they are null
2135
+ var name = Pointer_stringify(_name)
2136
+ SDL.rwops.push({ filename: name, mimetype: Browser.getMimetype(name) });
2137
+ return id;
2138
+ },
2139
+
2140
+ SDL_FreeRW: function(rwopsID) {
2141
+ SDL.rwops[rwopsID] = null;
2142
+ while (SDL.rwops.length > 0 && SDL.rwops[SDL.rwops.length-1] === null) {
2143
+ SDL.rwops.pop();
2144
+ }
1972
2145
  },
1973
2146
 
1974
2147
  SDL_EnableUNICODE: function(on) {
@@ -1995,7 +2168,6 @@ var LibrarySDL = {
1995
2168
  SDL_GetThreadID: function() { throw 'SDL_GetThreadID' },
1996
2169
  SDL_ThreadID: function() { throw 'SDL_ThreadID' },
1997
2170
  SDL_AllocRW: function() { throw 'SDL_AllocRW: TODO' },
1998
- SDL_FreeRW: function() { throw 'SDL_FreeRW: TODO' },
1999
2171
  SDL_CondBroadcast: function() { throw 'SDL_CondBroadcast: TODO' },
2000
2172
  SDL_CondWaitTimeout: function() { throw 'SDL_CondWaitTimeout: TODO' },
2001
2173
  SDL_WM_IconifyWindow: function() { throw 'SDL_WM_IconifyWindow TODO' },
@@ -46,7 +46,9 @@ var Debugging = {
46
46
  var form3ab = new RegExp(/^!(\d+) = metadata !{i32 \d+, (?:metadata !\d+|i32 \d+|null), metadata !(\d+).*$/);
47
47
  var form3ac = new RegExp(/^!(\d+) = metadata !{i32 \d+, (?:metadata !\d+|null), metadata !"[^"]*", metadata !(\d+)[^\[]*.*$/);
48
48
  var form3ad = new RegExp(/^!(\d+) = metadata !{i32 \d+, (?:i32 \d+|null), (?:i32 \d+|null), metadata !"[^"]*", metadata !"[^"]*", metadata !"[^"]*", metadata !(\d+),.*$/);
49
- var form3b = new RegExp(/^!(\d+) = metadata !{i32 \d+, metadata !"([^"]+)", metadata !"([^"]*)", (metadata !\d+|null)}.*$/);
49
+ var form3ae = new RegExp(/^!(\d+) = metadata !{i32 \d+, metadata !(\d+).*$/);
50
+ // LLVM 3.3 drops the first and last parameters.
51
+ var form3b = new RegExp(/^!(\d+) = metadata !{(?:i32 \d+, )?metadata !"([^"]+)", metadata !"([^"]*)"(?:, (metadata !\d+|null))?}.*$/);
50
52
  var form3c = new RegExp(/^!(\d+) = metadata !{\w+\d* !?(\d+)[^\d].*$/);
51
53
  var form4 = new RegExp(/^!llvm.dbg.[\w\.]+ = .*$/);
52
54
  var form5 = new RegExp(/^!(\d+) = metadata !{.*$/);
@@ -75,7 +77,7 @@ var Debugging = {
75
77
  lines[i] = ';'; // return an empty line, to keep line numbers of subsequent lines the same
76
78
  continue;
77
79
  }
78
- calc = form3a.exec(line) || form3ab.exec(line) || form3ac.exec(line) || form3ad.exec(line);
80
+ calc = form3a.exec(line) || form3ab.exec(line) || form3ac.exec(line) || form3ad.exec(line) || form3ae.exec(line);
79
81
  if (calc) {
80
82
  metadataToParentMetadata[calc[1]] = calc[2];
81
83
  lines[i] = ';';
@@ -252,12 +254,26 @@ var Functions = {
252
254
  for (var i = 0; i < argTypes.length; i++) {
253
255
  var type = argTypes[i];
254
256
  if (!type) break; // varargs
255
- sig += isIntImplemented(type) ? (getBits(type) == 64 ? 'ii' : 'i') : 'f'; // legalized i64s will be i32s
257
+ if (type in Runtime.FLOAT_TYPES) {
258
+ sig += 'f';
259
+ } else {
260
+ var chunks = getNumIntChunks(type);
261
+ for (var j = 0; j < chunks; j++) sig += 'i';
262
+ }
256
263
  }
257
264
  if (hasVarArgs) sig += 'i';
258
265
  return sig;
259
266
  },
260
267
 
268
+ getSignatureReturnType: function(sig) {
269
+ switch(sig[0]) {
270
+ case 'v': return 'void';
271
+ case 'i': return 'i32';
272
+ case 'f': return 'double';
273
+ default: throw 'what is this sig? ' + sig;
274
+ }
275
+ },
276
+
261
277
  // Mark a function as needing indexing. Python will coordinate them all
262
278
  getIndex: function(ident, doNotCreate, sig) {
263
279
  if (doNotCreate && !(ident in this.indexedFunctions)) {
@@ -408,7 +424,7 @@ var LibraryManager = {
408
424
  load: function() {
409
425
  if (this.library) return;
410
426
 
411
- var libraries = ['library.js', 'library_browser.js', 'library_sdl.js', 'library_gl.js', 'library_glut.js', 'library_xlib.js', 'library_egl.js', 'library_gc.js', 'library_jansson.js', 'library_openal.js', 'library_glfw.js'].concat(additionalLibraries);
427
+ var libraries = ['library.js', 'library_path.js', 'library_browser.js', 'library_sdl.js', 'library_gl.js', 'library_glut.js', 'library_xlib.js', 'library_egl.js', 'library_gc.js', 'library_jansson.js', 'library_openal.js', 'library_glfw.js'].concat(additionalLibraries);
412
428
  for (var i = 0; i < libraries.length; i++) {
413
429
  eval(processMacros(preprocess(read(libraries[i]))));
414
430
  }
@@ -449,7 +465,8 @@ var PassManager = {
449
465
  Types: Types,
450
466
  Variables: Variables,
451
467
  Functions: Functions,
452
- EXPORTED_FUNCTIONS: EXPORTED_FUNCTIONS // needed for asm.js global constructors (ctors)
468
+ EXPORTED_FUNCTIONS: EXPORTED_FUNCTIONS, // needed for asm.js global constructors (ctors)
469
+ Runtime: { GLOBAL_BASE: Runtime.GLOBAL_BASE }
453
470
  }));
454
471
  } else if (phase == 'funcs') {
455
472
  print('\n//FORWARDED_DATA:' + JSON.stringify({
@@ -396,12 +396,18 @@ function parseParamTokens(params) {
396
396
  // handle 'byval' and 'byval align X'. We store the alignment in 'byVal'
397
397
  byVal = QUANTUM_SIZE;
398
398
  segment.splice(1, 1);
399
+ if (segment[1] && segment[1].text === 'nocapture') {
400
+ segment.splice(1, 1);
401
+ }
399
402
  if (segment[1] && segment[1].text === 'align') {
400
403
  assert(isNumber(segment[2].text));
401
404
  byVal = parseInt(segment[2].text);
402
405
  segment.splice(1, 2);
403
406
  }
404
407
  }
408
+ if (segment[1] && segment[1].text === 'nocapture') {
409
+ segment.splice(1, 1);
410
+ }
405
411
  if (segment.length == 1) {
406
412
  if (segment[0].text == '...') {
407
413
  ret.push({
@@ -969,6 +975,11 @@ function generateStructTypes(type) {
969
975
  }
970
976
  ret[index++] = type;
971
977
  } else {
978
+ if (Runtime.isStructType(type) && type[1] === '0') {
979
+ // this is [0 x something], which does nothing
980
+ // XXX this happens in java_nbody... assert(i === typeData.fields.length-1);
981
+ continue;
982
+ }
972
983
  add(Types.types[type]);
973
984
  }
974
985
  var more = (i+1 < typeData.fields.length ? typeData.flatIndexes[i+1] : typeData.flatSize) - (index - start);
@@ -1231,7 +1242,7 @@ function indexizeFunctions(value, type) {
1231
1242
  // add signature to library functions that we now know need indexing
1232
1243
  var sig = Functions.implementedFunctions[value] || Functions.unimplementedFunctions[value];
1233
1244
  if (!sig) {
1234
- sig = Functions.unimplementedFunctions[value] = Functions.getSignature(out.returnType, out.segments ? out.segments.map(function(segment) { return segment[0].text }) : []);
1245
+ sig = Functions.unimplementedFunctions[value] = Functions.getSignature(out.returnType, out.segments ? out.segments.map(function(segment) { return segment[0].text }) : [], isVarArgsFunctionType(type));
1235
1246
  }
1236
1247
  return Functions.getIndex(value, undefined, sig);
1237
1248
  }
@@ -1694,7 +1705,7 @@ function makeGetSlabs(ptr, type, allowMultiple, unsigned) {
1694
1705
  }
1695
1706
  case 'float': return ['HEAPF32'];
1696
1707
  default: {
1697
- throw 'what, exactly, can we do for unknown types in TA2?! ' + new Error().stack;
1708
+ throw 'what, exactly, can we do for unknown types in TA2?! ' + [new Error().stack, ptr, type, allowMultiple, unsigned];
1698
1709
  }
1699
1710
  }
1700
1711
  }