webruby 0.2.2 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webruby/config.rb +4 -9
  3. data/lib/webruby/rake/files.rake +2 -2
  4. data/modules/emscripten/AUTHORS +9 -1
  5. data/modules/emscripten/CONTRIBUTING.markdown +5 -0
  6. data/modules/emscripten/ChangeLog +435 -0
  7. data/modules/emscripten/cmake/Modules/FindOpenAL.cmake +26 -0
  8. data/modules/emscripten/cmake/Platform/Emscripten.cmake +9 -2
  9. data/modules/emscripten/em++ +0 -2
  10. data/modules/emscripten/emcc +92 -32
  11. data/modules/emscripten/emlink.py +16 -13
  12. data/modules/emscripten/emmake +1 -1
  13. data/modules/emscripten/emrun +918 -0
  14. data/modules/emscripten/emrun.bat +2 -0
  15. data/modules/emscripten/emscripten.py +545 -20
  16. data/modules/emscripten/src/analyzer.js +6 -1
  17. data/modules/emscripten/src/compiler.js +25 -16
  18. data/modules/emscripten/src/emrun_postjs.js +20 -0
  19. data/modules/emscripten/{tests → src}/hello_world.js +0 -0
  20. data/modules/emscripten/src/intertyper.js +45 -16
  21. data/modules/emscripten/src/jsifier.js +78 -48
  22. data/modules/emscripten/src/library.js +381 -96
  23. data/modules/emscripten/src/library_browser.js +50 -53
  24. data/modules/emscripten/src/library_egl.js +66 -24
  25. data/modules/emscripten/src/library_fs.js +122 -90
  26. data/modules/emscripten/src/library_gl.js +739 -353
  27. data/modules/emscripten/src/library_glfw.js +9 -3
  28. data/modules/emscripten/src/library_glut.js +10 -5
  29. data/modules/emscripten/src/library_idbfs.js +14 -14
  30. data/modules/emscripten/src/library_memfs.js +65 -41
  31. data/modules/emscripten/src/library_nodefs.js +61 -9
  32. data/modules/emscripten/src/library_openal.js +4 -4
  33. data/modules/emscripten/src/library_path.js +9 -13
  34. data/modules/emscripten/src/library_sdl.js +301 -64
  35. data/modules/emscripten/src/library_sockfs.js +7 -5
  36. data/modules/emscripten/src/modules.js +62 -22
  37. data/modules/emscripten/src/parseTools.js +135 -102
  38. data/modules/emscripten/src/postamble.js +3 -4
  39. data/modules/emscripten/src/preamble.js +49 -29
  40. data/modules/emscripten/src/proxyClient.js +1 -1
  41. data/modules/emscripten/src/proxyWorker.js +10 -10
  42. data/modules/emscripten/src/relooper/Relooper.cpp +15 -4
  43. data/modules/emscripten/src/runtime.js +32 -8
  44. data/modules/emscripten/src/settings.js +25 -8
  45. data/modules/emscripten/src/shell.html +6 -3
  46. data/modules/emscripten/src/shell.js +13 -11
  47. data/modules/emscripten/src/simd.js +602 -432
  48. data/modules/emscripten/src/struct_info.json +22 -2
  49. data/modules/emscripten/src/utility.js +32 -17
  50. data/modules/emscripten/system/include/SDL/SDL_events.h +1 -0
  51. data/modules/emscripten/system/include/compat/ctype.h +17 -0
  52. data/modules/emscripten/system/include/compat/wchar.h +23 -0
  53. data/modules/emscripten/system/include/compat/wctype.h +23 -0
  54. data/modules/emscripten/system/include/emscripten/emmintrin.h +87 -0
  55. data/modules/emscripten/system/include/emscripten/emscripten.h +30 -4
  56. data/modules/emscripten/system/include/emscripten/vector.h +29 -1
  57. data/modules/emscripten/system/include/emscripten/xmmintrin.h +131 -0
  58. data/modules/emscripten/system/include/libcxx/CREDITS.TXT +9 -1
  59. data/modules/emscripten/system/include/libcxx/__bit_reference +8 -8
  60. data/modules/emscripten/system/include/libcxx/__config +95 -17
  61. data/modules/emscripten/system/include/libcxx/__debug +25 -4
  62. data/modules/emscripten/system/include/libcxx/__functional_03 +7 -7
  63. data/modules/emscripten/system/include/libcxx/__functional_base +169 -9
  64. data/modules/emscripten/system/include/libcxx/__functional_base_03 +1 -1
  65. data/modules/emscripten/system/include/libcxx/__hash_table +25 -25
  66. data/modules/emscripten/system/include/libcxx/__locale +21 -19
  67. data/modules/emscripten/system/include/libcxx/__mutex_base +2 -33
  68. data/modules/emscripten/system/include/libcxx/__split_buffer +9 -9
  69. data/modules/emscripten/system/include/libcxx/__std_stream +14 -0
  70. data/modules/emscripten/system/include/libcxx/__tree +35 -26
  71. data/modules/emscripten/system/include/libcxx/__tuple +15 -15
  72. data/modules/emscripten/system/include/libcxx/__tuple_03 +2 -2
  73. data/modules/emscripten/system/include/libcxx/__undef_min_max +8 -0
  74. data/modules/emscripten/system/include/libcxx/algorithm +121 -110
  75. data/modules/emscripten/system/include/libcxx/array +15 -15
  76. data/modules/emscripten/system/include/libcxx/bitset +4 -4
  77. data/modules/emscripten/system/include/libcxx/chrono +51 -17
  78. data/modules/emscripten/system/include/libcxx/cmath +25 -23
  79. data/modules/emscripten/system/include/libcxx/codecvt +21 -18
  80. data/modules/emscripten/system/include/libcxx/complex +48 -7
  81. data/modules/emscripten/system/include/libcxx/cstddef +1 -1
  82. data/modules/emscripten/system/include/libcxx/cstdio +8 -1
  83. data/modules/emscripten/system/include/libcxx/cstdlib +1 -1
  84. data/modules/emscripten/system/include/libcxx/cwchar +1 -1
  85. data/modules/emscripten/system/include/libcxx/deque +26 -12
  86. data/modules/emscripten/system/include/libcxx/dynarray +311 -0
  87. data/modules/emscripten/system/include/libcxx/exception +4 -4
  88. data/modules/emscripten/system/include/libcxx/ext/__hash +3 -3
  89. data/modules/emscripten/system/include/libcxx/ext/hash_map +19 -15
  90. data/modules/emscripten/system/include/libcxx/ext/hash_set +7 -3
  91. data/modules/emscripten/system/include/libcxx/forward_list +33 -7
  92. data/modules/emscripten/system/include/libcxx/fstream +4 -4
  93. data/modules/emscripten/system/include/libcxx/functional +200 -170
  94. data/modules/emscripten/system/include/libcxx/future +83 -39
  95. data/modules/emscripten/system/include/libcxx/initializer_list +24 -11
  96. data/modules/emscripten/system/include/libcxx/iomanip +147 -0
  97. data/modules/emscripten/system/include/libcxx/ios +24 -16
  98. data/modules/emscripten/system/include/libcxx/iosfwd +19 -19
  99. data/modules/emscripten/system/include/libcxx/istream +13 -8
  100. data/modules/emscripten/system/include/libcxx/iterator +108 -417
  101. data/modules/emscripten/system/include/libcxx/limits +8 -4
  102. data/modules/emscripten/system/include/libcxx/list +28 -8
  103. data/modules/emscripten/system/include/libcxx/locale +153 -390
  104. data/modules/emscripten/system/include/libcxx/map +280 -100
  105. data/modules/emscripten/system/include/libcxx/memory +49 -97
  106. data/modules/emscripten/system/include/libcxx/mutex +2 -2
  107. data/modules/emscripten/system/include/libcxx/new +43 -14
  108. data/modules/emscripten/system/include/libcxx/numeric +2 -2
  109. data/modules/emscripten/system/include/libcxx/optional +697 -0
  110. data/modules/emscripten/system/include/libcxx/ostream +17 -8
  111. data/modules/emscripten/system/include/libcxx/queue +5 -5
  112. data/modules/emscripten/system/include/libcxx/random +53 -51
  113. data/modules/emscripten/system/include/libcxx/ratio +11 -11
  114. data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
  115. data/modules/emscripten/system/include/libcxx/regex +23 -20
  116. data/modules/emscripten/system/include/libcxx/scoped_allocator +1 -1
  117. data/modules/emscripten/system/include/libcxx/set +166 -2
  118. data/modules/emscripten/system/include/libcxx/shared_mutex +419 -0
  119. data/modules/emscripten/system/include/libcxx/sstream +4 -4
  120. data/modules/emscripten/system/include/libcxx/stack +3 -3
  121. data/modules/emscripten/system/include/libcxx/streambuf +5 -5
  122. data/modules/emscripten/system/include/libcxx/string +372 -324
  123. data/modules/emscripten/system/include/libcxx/support/ibm/limits.h +99 -0
  124. data/modules/emscripten/system/include/libcxx/support/ibm/support.h +54 -0
  125. data/modules/emscripten/system/include/libcxx/support/ibm/xlocale.h +326 -0
  126. data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +6 -6
  127. data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -15
  128. data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +2 -0
  129. data/modules/emscripten/system/include/libcxx/support/win32/support.h +6 -1
  130. data/modules/emscripten/system/include/libcxx/system_error +14 -8
  131. data/modules/emscripten/system/include/libcxx/thread +7 -8
  132. data/modules/emscripten/system/include/libcxx/tuple +29 -88
  133. data/modules/emscripten/system/include/libcxx/type_traits +253 -209
  134. data/modules/emscripten/system/include/libcxx/typeindex +3 -3
  135. data/modules/emscripten/system/include/libcxx/unordered_map +162 -101
  136. data/modules/emscripten/system/include/libcxx/unordered_set +79 -2
  137. data/modules/emscripten/system/include/libcxx/utility +20 -20
  138. data/modules/emscripten/system/include/libcxx/valarray +23 -23
  139. data/modules/emscripten/system/include/libcxx/vector +114 -91
  140. data/modules/emscripten/system/lib/libc/musl/src/regex/regcomp.c +3352 -0
  141. data/modules/emscripten/system/lib/libc/musl/src/regex/regerror.c +35 -0
  142. data/modules/emscripten/system/lib/libc/musl/src/regex/regexec.c +1011 -0
  143. data/modules/emscripten/system/lib/libc/musl/src/regex/tre-mem.c +158 -0
  144. data/modules/emscripten/system/lib/libc/musl/src/regex/tre.h +231 -0
  145. data/modules/emscripten/system/lib/libcextra.symbols +7 -0
  146. data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +9 -1
  147. data/modules/emscripten/system/lib/libcxx/algorithm.cpp +1 -0
  148. data/modules/emscripten/system/lib/libcxx/debug.cpp +66 -42
  149. data/modules/emscripten/system/lib/libcxx/exception.cpp +88 -16
  150. data/modules/emscripten/system/lib/libcxx/future.cpp +6 -0
  151. data/modules/emscripten/system/lib/libcxx/ios.cpp +7 -2
  152. data/modules/emscripten/system/lib/libcxx/iostream.cpp +8 -8
  153. data/modules/emscripten/system/lib/libcxx/locale.cpp +38 -11
  154. data/modules/emscripten/system/lib/libcxx/mutex.cpp +3 -0
  155. data/modules/emscripten/system/lib/libcxx/new.cpp +44 -10
  156. data/modules/emscripten/system/lib/libcxx/optional.cpp +25 -0
  157. data/modules/emscripten/system/lib/libcxx/random.cpp +26 -0
  158. data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
  159. data/modules/emscripten/system/lib/libcxx/shared_mutex.cpp +101 -0
  160. data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +11 -7
  161. data/modules/emscripten/system/lib/libcxx/string.cpp +3 -1
  162. data/modules/emscripten/system/lib/libcxx/strstream.cpp +7 -7
  163. data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +12 -13
  164. data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +33 -36
  165. data/modules/emscripten/system/lib/libcxx/symbols +187 -168
  166. data/modules/emscripten/system/lib/libcxx/system_error.cpp +1 -0
  167. data/modules/emscripten/system/lib/libcxx/thread.cpp +7 -3
  168. data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +9 -6
  169. data/modules/emscripten/system/lib/libcxx/valarray.cpp +2 -0
  170. data/modules/emscripten/third_party/lzma.js/doit.bat +4 -0
  171. data/modules/emscripten/third_party/lzma.js/doit.sh +9 -2
  172. data/modules/emscripten/tools/cache.py +5 -7
  173. data/modules/emscripten/tools/cache.pyc +0 -0
  174. data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +7 -0
  175. data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +9 -1
  176. data/modules/emscripten/tools/eliminator/eliminator-test-output.js +3 -0
  177. data/modules/emscripten/tools/eliminator/eliminator-test.js +9 -1
  178. data/modules/emscripten/tools/file_packager.py +93 -50
  179. data/modules/emscripten/tools/js-optimizer.js +98 -48
  180. data/modules/emscripten/tools/js_optimizer.py +4 -4
  181. data/modules/emscripten/tools/js_optimizer.pyc +0 -0
  182. data/modules/emscripten/tools/jsrun.py +1 -1
  183. data/modules/emscripten/tools/jsrun.pyc +0 -0
  184. data/modules/emscripten/tools/response_file.py +6 -0
  185. data/modules/emscripten/tools/response_file.pyc +0 -0
  186. data/modules/emscripten/tools/settings_template_readonly.py +2 -0
  187. data/modules/emscripten/tools/shared.py +88 -34
  188. data/modules/emscripten/tools/shared.pyc +0 -0
  189. data/modules/emscripten/tools/split.py +21 -13
  190. data/modules/mruby/build_config.rb +7 -1
  191. data/modules/mruby/doc/compile/README.md +5 -9
  192. data/modules/mruby/include/mrbconf.h +5 -2
  193. data/modules/mruby/include/mruby/array.h +1 -0
  194. data/modules/mruby/include/mruby/compile.h +2 -4
  195. data/modules/mruby/include/mruby/dump.h +7 -16
  196. data/modules/mruby/include/mruby/hash.h +1 -1
  197. data/modules/mruby/include/mruby/irep.h +14 -2
  198. data/modules/mruby/include/mruby/khash.h +8 -7
  199. data/modules/mruby/include/mruby/string.h +1 -0
  200. data/modules/mruby/include/mruby/value.h +5 -2
  201. data/modules/mruby/include/mruby.h +12 -13
  202. data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +16 -6
  203. data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +18 -30
  204. data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +21 -0
  205. data/modules/mruby/mrbgems/mruby-math/src/math.c +1 -1
  206. data/modules/mruby/mrbgems/mruby-random/src/random.c +144 -47
  207. data/modules/mruby/mrbgems/mruby-random/test/random.rb +44 -0
  208. data/modules/mruby/mrbgems/mruby-struct/src/struct.c +5 -5
  209. data/modules/mruby/mrblib/numeric.rb +99 -33
  210. data/modules/mruby/src/array.c +11 -4
  211. data/modules/mruby/src/backtrace.c +2 -2
  212. data/modules/mruby/src/class.c +49 -30
  213. data/modules/mruby/src/codegen.c +131 -79
  214. data/modules/mruby/src/debug.c +1 -1
  215. data/modules/mruby/src/dump.c +213 -163
  216. data/modules/mruby/src/error.c +17 -17
  217. data/modules/mruby/src/error.h +1 -1
  218. data/modules/mruby/src/etc.c +10 -0
  219. data/modules/mruby/src/gc.c +35 -17
  220. data/modules/mruby/src/hash.c +5 -5
  221. data/modules/mruby/src/kernel.c +36 -14
  222. data/modules/mruby/src/load.c +238 -296
  223. data/modules/mruby/src/numeric.c +18 -98
  224. data/modules/mruby/src/object.c +3 -5
  225. data/modules/mruby/src/parse.y +63 -56
  226. data/modules/mruby/src/proc.c +8 -5
  227. data/modules/mruby/src/re.h +0 -1
  228. data/modules/mruby/src/state.c +65 -27
  229. data/modules/mruby/src/string.c +3 -31
  230. data/modules/mruby/src/symbol.c +3 -3
  231. data/modules/mruby/src/variable.c +12 -5
  232. data/modules/mruby/src/vm.c +90 -72
  233. data/modules/mruby/tasks/mruby_build.rake +10 -1
  234. data/modules/mruby/tasks/toolchains/gcc.rake +12 -2
  235. data/modules/mruby/tasks/toolchains/{vs2012.rake → visualcpp.rake} +1 -1
  236. data/modules/mruby/test/driver.c +3 -3
  237. data/modules/mruby/test/t/array.rb +5 -5
  238. data/modules/mruby/test/t/class.rb +14 -1
  239. data/modules/mruby/test/t/kernel.rb +4 -0
  240. data/modules/mruby/test/t/module.rb +4 -4
  241. data/modules/mruby/test/t/nameerror.rb +1 -1
  242. data/modules/mruby/tools/mrbc/mrbc.c +23 -17
  243. data/modules/mruby/travis_config.rb +10 -1
  244. metadata +28 -5
  245. data/modules/mruby/tasks/toolchains/vs2010.rake +0 -3
@@ -28,6 +28,7 @@ mergeInto(LibraryManager.library, {
28
28
  ignorePermissions: true,
29
29
 
30
30
  ErrnoError: null, // set during init
31
+ genericErrors: {},
31
32
 
32
33
  handleFSError: function(e) {
33
34
  if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();
@@ -62,7 +63,7 @@ mergeInto(LibraryManager.library, {
62
63
  }
63
64
 
64
65
  current = FS.lookupNode(current, parts[i]);
65
- current_path = PATH.join(current_path, parts[i]);
66
+ current_path = PATH.join2(current_path, parts[i]);
66
67
 
67
68
  // jump to the mount's root node if this is a mountpoint
68
69
  if (FS.isMountpoint(current)) {
@@ -94,9 +95,11 @@ mergeInto(LibraryManager.library, {
94
95
  var path;
95
96
  while (true) {
96
97
  if (FS.isRoot(node)) {
97
- return path ? PATH.join(node.mount.mountpoint, path) : node.mount.mountpoint;
98
+ var mount = node.mount.mountpoint;
99
+ if (!path) return mount;
100
+ return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;
98
101
  }
99
- path = path ? PATH.join(node.name, path) : node.name;
102
+ path = path ? node.name + '/' + path : node.name;
100
103
  node = node.parent;
101
104
  }
102
105
  },
@@ -158,44 +161,50 @@ mergeInto(LibraryManager.library, {
158
161
  return FS.lookup(parent, name);
159
162
  },
160
163
  createNode: function(parent, name, mode, rdev) {
161
- var node = {
162
- id: FS.nextInode++,
163
- name: name,
164
- mode: mode,
165
- node_ops: {},
166
- stream_ops: {},
167
- rdev: rdev,
168
- parent: null,
169
- mount: null
170
- };
171
- if (!parent) {
172
- parent = node; // root node sets parent to itself
173
- }
174
- node.parent = parent;
175
- node.mount = parent.mount;
176
- // compatibility
177
- var readMode = {{{ cDefine('S_IRUGO') }}} | {{{ cDefine('S_IXUGO') }}};
178
- var writeMode = {{{ cDefine('S_IWUGO') }}};
179
- // NOTE we must use Object.defineProperties instead of individual calls to
180
- // Object.defineProperty in order to make closure compiler happy
181
- Object.defineProperties(node, {
182
- read: {
183
- get: function() { return (node.mode & readMode) === readMode; },
184
- set: function(val) { val ? node.mode |= readMode : node.mode &= ~readMode; }
185
- },
186
- write: {
187
- get: function() { return (node.mode & writeMode) === writeMode; },
188
- set: function(val) { val ? node.mode |= writeMode : node.mode &= ~writeMode; }
189
- },
190
- isFolder: {
191
- get: function() { return FS.isDir(node.mode); },
192
- },
193
- isDevice: {
194
- get: function() { return FS.isChrdev(node.mode); },
195
- },
196
- });
197
- FS.hashAddNode(node);
198
- return node;
164
+ if (!FS.FSNode) {
165
+ FS.FSNode = function(parent, name, mode, rdev) {
166
+ this.id = FS.nextInode++;
167
+ this.name = name;
168
+ this.mode = mode;
169
+ this.node_ops = {};
170
+ this.stream_ops = {};
171
+ this.rdev = rdev;
172
+ this.parent = null;
173
+ this.mount = null;
174
+ if (!parent) {
175
+ parent = this; // root node sets parent to itself
176
+ }
177
+ this.parent = parent;
178
+ this.mount = parent.mount;
179
+ FS.hashAddNode(this);
180
+ };
181
+
182
+ // compatibility
183
+ var readMode = {{{ cDefine('S_IRUGO') }}} | {{{ cDefine('S_IXUGO') }}};
184
+ var writeMode = {{{ cDefine('S_IWUGO') }}};
185
+
186
+ FS.FSNode.prototype = {};
187
+
188
+ // NOTE we must use Object.defineProperties instead of individual calls to
189
+ // Object.defineProperty in order to make closure compiler happy
190
+ Object.defineProperties(FS.FSNode.prototype, {
191
+ read: {
192
+ get: function() { return (this.mode & readMode) === readMode; },
193
+ set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }
194
+ },
195
+ write: {
196
+ get: function() { return (this.mode & writeMode) === writeMode; },
197
+ set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }
198
+ },
199
+ isFolder: {
200
+ get: function() { return FS.isDir(this.mode); },
201
+ },
202
+ isDevice: {
203
+ get: function() { return FS.isChrdev(this.mode); },
204
+ },
205
+ });
206
+ }
207
+ return new FS.FSNode(parent, name, mode, rdev);
199
208
  },
200
209
  destroyNode: function(node) {
201
210
  FS.hashRemoveNode(node);
@@ -351,24 +360,38 @@ mergeInto(LibraryManager.library, {
351
360
  // object isn't directly passed in. not possible until
352
361
  // SOCKFS is completed.
353
362
  createStream: function(stream, fd_start, fd_end) {
363
+ if (!FS.FSStream) {
364
+ FS.FSStream = function(){};
365
+ FS.FSStream.prototype = {};
366
+ // compatibility
367
+ Object.defineProperties(FS.FSStream.prototype, {
368
+ object: {
369
+ get: function() { return this.node; },
370
+ set: function(val) { this.node = val; }
371
+ },
372
+ isRead: {
373
+ get: function() { return (this.flags & {{{ cDefine('O_ACCMODE') }}}) !== {{{ cDefine('O_WRONLY') }}}; }
374
+ },
375
+ isWrite: {
376
+ get: function() { return (this.flags & {{{ cDefine('O_ACCMODE') }}}) !== {{{ cDefine('O_RDONLY') }}}; }
377
+ },
378
+ isAppend: {
379
+ get: function() { return (this.flags & {{{ cDefine('O_APPEND') }}}); }
380
+ }
381
+ });
382
+ }
383
+ if (stream.__proto__) {
384
+ // reuse the object
385
+ stream.__proto__ = FS.FSStream.prototype;
386
+ } else {
387
+ var newStream = new FS.FSStream();
388
+ for (var p in stream) {
389
+ newStream[p] = stream[p];
390
+ }
391
+ stream = newStream;
392
+ }
354
393
  var fd = FS.nextfd(fd_start, fd_end);
355
394
  stream.fd = fd;
356
- // compatibility
357
- Object.defineProperties(stream, {
358
- object: {
359
- get: function() { return stream.node; },
360
- set: function(val) { stream.node = val; }
361
- },
362
- isRead: {
363
- get: function() { return (stream.flags & {{{ cDefine('O_ACCMODE') }}}) !== {{{ cDefine('O_WRONLY') }}}; }
364
- },
365
- isWrite: {
366
- get: function() { return (stream.flags & {{{ cDefine('O_ACCMODE') }}}) !== {{{ cDefine('O_RDONLY') }}}; }
367
- },
368
- isAppend: {
369
- get: function() { return (stream.flags & {{{ cDefine('O_APPEND') }}}); }
370
- }
371
- });
372
395
  FS.streams[fd] = stream;
373
396
  return stream;
374
397
  },
@@ -426,7 +449,7 @@ mergeInto(LibraryManager.library, {
426
449
 
427
450
  var completed = 0;
428
451
  var total = FS.mounts.length;
429
- var done = function(err) {
452
+ function done(err) {
430
453
  if (err) {
431
454
  return callback(err);
432
455
  }
@@ -771,7 +794,6 @@ mergeInto(LibraryManager.library, {
771
794
  });
772
795
  },
773
796
  open: function(path, flags, mode, fd_start, fd_end) {
774
- path = PATH.normalize(path);
775
797
  flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;
776
798
  mode = typeof mode === 'undefined' ? 0666 : mode;
777
799
  if ((flags & {{{ cDefine('O_CREAT') }}})) {
@@ -780,13 +802,18 @@ mergeInto(LibraryManager.library, {
780
802
  mode = 0;
781
803
  }
782
804
  var node;
783
- try {
784
- var lookup = FS.lookupPath(path, {
785
- follow: !(flags & {{{ cDefine('O_NOFOLLOW') }}})
786
- });
787
- node = lookup.node;
788
- } catch (e) {
789
- // ignore
805
+ if (typeof path === 'object') {
806
+ node = path;
807
+ } else {
808
+ path = PATH.normalize(path);
809
+ try {
810
+ var lookup = FS.lookupPath(path, {
811
+ follow: !(flags & {{{ cDefine('O_NOFOLLOW') }}})
812
+ });
813
+ node = lookup.node;
814
+ } catch (e) {
815
+ // ignore
816
+ }
790
817
  }
791
818
  // perhaps we need to create the node
792
819
  if ((flags & {{{ cDefine('O_CREAT') }}})) {
@@ -934,7 +961,7 @@ mergeInto(LibraryManager.library, {
934
961
  throw new FS.ErrnoError(ERRNO_CODES.EACCES);
935
962
  }
936
963
  if (!stream.stream_ops.mmap) {
937
- throw new FS.errnoError(ERRNO_CODES.ENODEV);
964
+ throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
938
965
  }
939
966
  return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);
940
967
  },
@@ -1079,6 +1106,11 @@ mergeInto(LibraryManager.library, {
1079
1106
  };
1080
1107
  FS.ErrnoError.prototype = new Error();
1081
1108
  FS.ErrnoError.prototype.constructor = FS.ErrnoError;
1109
+ // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)
1110
+ [ERRNO_CODES.ENOENT].forEach(function(code) {
1111
+ FS.genericErrors[code] = new FS.ErrnoError(code);
1112
+ FS.genericErrors[code].stack = '<generic error, no stack>';
1113
+ });
1082
1114
  },
1083
1115
  staticInit: function() {
1084
1116
  FS.ensureErrnoError();
@@ -1173,7 +1205,7 @@ mergeInto(LibraryManager.library, {
1173
1205
  return ret;
1174
1206
  },
1175
1207
  createFolder: function(parent, name, canRead, canWrite) {
1176
- var path = PATH.join(typeof parent === 'string' ? parent : FS.getPath(parent), name);
1208
+ var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
1177
1209
  var mode = FS.getMode(canRead, canWrite);
1178
1210
  return FS.mkdir(path, mode);
1179
1211
  },
@@ -1183,7 +1215,7 @@ mergeInto(LibraryManager.library, {
1183
1215
  while (parts.length) {
1184
1216
  var part = parts.pop();
1185
1217
  if (!part) continue;
1186
- var current = PATH.join(parent, part);
1218
+ var current = PATH.join2(parent, part);
1187
1219
  try {
1188
1220
  FS.mkdir(current);
1189
1221
  } catch (e) {
@@ -1194,12 +1226,12 @@ mergeInto(LibraryManager.library, {
1194
1226
  return current;
1195
1227
  },
1196
1228
  createFile: function(parent, name, properties, canRead, canWrite) {
1197
- var path = PATH.join(typeof parent === 'string' ? parent : FS.getPath(parent), name);
1229
+ var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
1198
1230
  var mode = FS.getMode(canRead, canWrite);
1199
1231
  return FS.create(path, mode);
1200
1232
  },
1201
1233
  createDataFile: function(parent, name, data, canRead, canWrite, canOwn) {
1202
- var path = name ? PATH.join(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;
1234
+ var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;
1203
1235
  var mode = FS.getMode(canRead, canWrite);
1204
1236
  var node = FS.create(path, mode);
1205
1237
  if (data) {
@@ -1209,16 +1241,16 @@ mergeInto(LibraryManager.library, {
1209
1241
  data = arr;
1210
1242
  }
1211
1243
  // make sure we can write to the file
1212
- FS.chmod(path, mode | {{{ cDefine('S_IWUGO') }}});
1213
- var stream = FS.open(path, 'w');
1244
+ FS.chmod(node, mode | {{{ cDefine('S_IWUGO') }}});
1245
+ var stream = FS.open(node, 'w');
1214
1246
  FS.write(stream, data, 0, data.length, 0, canOwn);
1215
1247
  FS.close(stream);
1216
- FS.chmod(path, mode);
1248
+ FS.chmod(node, mode);
1217
1249
  }
1218
1250
  return node;
1219
1251
  },
1220
1252
  createDevice: function(parent, name, input, output) {
1221
- var path = PATH.join(typeof parent === 'string' ? parent : FS.getPath(parent), name);
1253
+ var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
1222
1254
  var mode = FS.getMode(!!input, !!output);
1223
1255
  if (!FS.createDevice.major) FS.createDevice.major = 64;
1224
1256
  var dev = FS.makedev(FS.createDevice.major++, 0);
@@ -1272,7 +1304,7 @@ mergeInto(LibraryManager.library, {
1272
1304
  return FS.mkdev(path, mode, dev);
1273
1305
  },
1274
1306
  createLink: function(parent, name, target, canRead, canWrite) {
1275
- var path = PATH.join(typeof parent === 'string' ? parent : FS.getPath(parent), name);
1307
+ var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);
1276
1308
  return FS.symlink(target, path);
1277
1309
  },
1278
1310
  // Makes sure a file's contents are loaded. Returns whether the file has
@@ -1304,11 +1336,11 @@ mergeInto(LibraryManager.library, {
1304
1336
  if (typeof XMLHttpRequest !== 'undefined') {
1305
1337
  if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';
1306
1338
  // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.
1307
- var LazyUint8Array = function() {
1339
+ function LazyUint8Array() {
1308
1340
  this.lengthKnown = false;
1309
1341
  this.chunks = []; // Loaded chunks. Index is the chunk number
1310
1342
  }
1311
- LazyUint8Array.prototype.get = function(idx) {
1343
+ LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
1312
1344
  if (idx > this.length-1 || idx < 0) {
1313
1345
  return undefined;
1314
1346
  }
@@ -1316,10 +1348,10 @@ mergeInto(LibraryManager.library, {
1316
1348
  var chunkNum = Math.floor(idx / this.chunkSize);
1317
1349
  return this.getter(chunkNum)[chunkOffset];
1318
1350
  }
1319
- LazyUint8Array.prototype.setDataGetter = function(getter) {
1351
+ LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
1320
1352
  this.getter = getter;
1321
1353
  }
1322
- LazyUint8Array.prototype.cacheLength = function() {
1354
+ LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
1323
1355
  // Find length
1324
1356
  var xhr = new XMLHttpRequest();
1325
1357
  xhr.open('HEAD', url, false);
@@ -1415,7 +1447,7 @@ mergeInto(LibraryManager.library, {
1415
1447
  var keys = Object.keys(node.stream_ops);
1416
1448
  keys.forEach(function(key) {
1417
1449
  var fn = node.stream_ops[key];
1418
- stream_ops[key] = function() {
1450
+ stream_ops[key] = function forceLoadLazyFile() {
1419
1451
  if (!FS.forceLoadFile(node)) {
1420
1452
  throw new FS.ErrnoError(ERRNO_CODES.EIO);
1421
1453
  }
@@ -1423,7 +1455,7 @@ mergeInto(LibraryManager.library, {
1423
1455
  };
1424
1456
  });
1425
1457
  // use a custom read function
1426
- stream_ops.read = function(stream, buffer, offset, length, position) {
1458
+ stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
1427
1459
  if (!FS.forceLoadFile(node)) {
1428
1460
  throw new FS.ErrnoError(ERRNO_CODES.EIO);
1429
1461
  }
@@ -1462,7 +1494,7 @@ mergeInto(LibraryManager.library, {
1462
1494
  Browser.init();
1463
1495
  // TODO we should allow people to just pass in a complete filename instead
1464
1496
  // of parent and name being that we just join them anyways
1465
- var fullname = name ? PATH.resolve(PATH.join(parent, name)) : parent;
1497
+ var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
1466
1498
  function processData(byteArray) {
1467
1499
  function finish(byteArray) {
1468
1500
  if (!dontCreateFile) {
@@ -1517,12 +1549,12 @@ mergeInto(LibraryManager.library, {
1517
1549
  } catch (e) {
1518
1550
  return onerror(e);
1519
1551
  }
1520
- openRequest.onupgradeneeded = function() {
1552
+ openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
1521
1553
  console.log('creating db');
1522
1554
  var db = openRequest.result;
1523
1555
  db.createObjectStore(FS.DB_STORE_NAME);
1524
1556
  };
1525
- openRequest.onsuccess = function() {
1557
+ openRequest.onsuccess = function openRequest_onsuccess() {
1526
1558
  var db = openRequest.result;
1527
1559
  var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');
1528
1560
  var files = transaction.objectStore(FS.DB_STORE_NAME);
@@ -1532,8 +1564,8 @@ mergeInto(LibraryManager.library, {
1532
1564
  }
1533
1565
  paths.forEach(function(path) {
1534
1566
  var putRequest = files.put(FS.analyzePath(path).object.contents, path);
1535
- putRequest.onsuccess = function() { ok++; if (ok + fail == total) finish() };
1536
- putRequest.onerror = function() { fail++; if (ok + fail == total) finish() };
1567
+ putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };
1568
+ putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };
1537
1569
  });
1538
1570
  transaction.onerror = onerror;
1539
1571
  };
@@ -1551,7 +1583,7 @@ mergeInto(LibraryManager.library, {
1551
1583
  return onerror(e);
1552
1584
  }
1553
1585
  openRequest.onupgradeneeded = onerror; // no database to load from
1554
- openRequest.onsuccess = function() {
1586
+ openRequest.onsuccess = function openRequest_onsuccess() {
1555
1587
  var db = openRequest.result;
1556
1588
  try {
1557
1589
  var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');
@@ -1566,7 +1598,7 @@ mergeInto(LibraryManager.library, {
1566
1598
  }
1567
1599
  paths.forEach(function(path) {
1568
1600
  var getRequest = files.get(path);
1569
- getRequest.onsuccess = function() {
1601
+ getRequest.onsuccess = function getRequest_onsuccess() {
1570
1602
  if (FS.analyzePath(path).exists) {
1571
1603
  FS.unlink(path);
1572
1604
  }
@@ -1574,7 +1606,7 @@ mergeInto(LibraryManager.library, {
1574
1606
  ok++;
1575
1607
  if (ok + fail == total) finish();
1576
1608
  };
1577
- getRequest.onerror = function() { fail++; if (ok + fail == total) finish() };
1609
+ getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };
1578
1610
  });
1579
1611
  transaction.onerror = onerror;
1580
1612
  };