webruby 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
  };