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
@@ -120,7 +120,6 @@ var LibraryGLFW = {
120
120
  if (event.charCode) {
121
121
  var char = GLFW.getUnicodeChar(event.charCode);
122
122
  if (char !== null && GLFW.charFunc) {
123
- event.preventDefault();
124
123
  Runtime.dynCall('vii', GLFW.charFunc, [event.charCode, 1]);
125
124
  }
126
125
  }
@@ -130,13 +129,18 @@ var LibraryGLFW = {
130
129
  var key = GLFW.DOMToGLFWKeyCode(event.keyCode);
131
130
  if (key && GLFW.keyFunc) {
132
131
  GLFW.keys[key] = status;
133
- event.preventDefault();
134
132
  Runtime.dynCall('vii', GLFW.keyFunc, [key, status]);
135
133
  }
136
134
  },
137
135
 
138
136
  onKeydown: function(event) {
139
137
  GLFW.onKeyChanged(event, 1);//GLFW_PRESS
138
+ // This logic comes directly from the sdl implementation. We cannot
139
+ // call preventDefault on all keydown events otherwise onKeyPress will
140
+ // not get called
141
+ if (event.keyCode === 8 /* backspace */ || event.keyCode === 9 /* tab */) {
142
+ event.preventDefault();
143
+ }
140
144
  },
141
145
 
142
146
  onKeyup: function(event) {
@@ -355,7 +359,9 @@ var LibraryGLFW = {
355
359
  }
356
360
 
357
361
  var contextAttributes = {
358
- antialias: (GLFW.params[0x00020013] > 1) //GLFW_FSAA_SAMPLES
362
+ antialias: (GLFW.params[0x00020013] > 1), //GLFW_FSAA_SAMPLES
363
+ depth: (GLFW.params[0x00020009] > 0), //GLFW_DEPTH_BITS
364
+ stencil: (GLFW.params[0x0002000A] > 0) //GLFW_STENCIL_BITS
359
365
  }
360
366
  Module.ctx = Browser.createContext(Module['canvas'], true, true, contextAttributes);
361
367
  return 1; //GL_TRUE
@@ -59,6 +59,9 @@ var LibraryGLUT = {
59
59
  getSpecialKey: function(keycode) {
60
60
  var key = null;
61
61
  switch (keycode) {
62
+ case 8: key = 120 /* backspace */; break;
63
+ case 46: key = 111 /* delete */; break;
64
+
62
65
  case 0x70 /*DOM_VK_F1*/: key = 1 /* GLUT_KEY_F1 */; break;
63
66
  case 0x71 /*DOM_VK_F2*/: key = 2 /* GLUT_KEY_F2 */; break;
64
67
  case 0x72 /*DOM_VK_F3*/: key = 3 /* GLUT_KEY_F3 */; break;
@@ -228,14 +231,14 @@ var LibraryGLUT = {
228
231
  if (delta < 0) {
229
232
  button = 4; // wheel down
230
233
  }
231
-
234
+
232
235
  if (GLUT.mouseFunc) {
233
236
  event.preventDefault();
234
237
  GLUT.saveModifiers(event);
235
238
  Runtime.dynCall('viiii', GLUT.mouseFunc, [button, 0/*GLUT_DOWN*/, Browser.mouseX, Browser.mouseY]);
236
239
  }
237
240
  },
238
-
241
+
239
242
  // TODO add fullscreen API ala:
240
243
  // http://johndyer.name/native-fullscreen-javascript-api-plus-jquery-plugin/
241
244
  onFullScreenEventChange: function(event) {
@@ -304,7 +307,7 @@ var LibraryGLUT = {
304
307
  // Firefox
305
308
  window.addEventListener("DOMMouseScroll", GLUT.onMouseWheel, true);
306
309
  }
307
-
310
+
308
311
  Browser.resizeListeners.push(function(width, height) {
309
312
  if (GLUT.reshapeFunc) {
310
313
  Runtime.dynCall('vii', GLUT.reshapeFunc, [width, height]);
@@ -372,7 +375,7 @@ var LibraryGLUT = {
372
375
  },
373
376
 
374
377
  glutIdleFunc: function(func) {
375
- var callback = function() {
378
+ function callback() {
376
379
  if (GLUT.idleFunc) {
377
380
  Runtime.dynCall('v', GLUT.idleFunc);
378
381
  Browser.safeSetTimeout(callback, 0);
@@ -427,7 +430,9 @@ var LibraryGLUT = {
427
430
  glutCreateWindow__deps: ['$Browser'],
428
431
  glutCreateWindow: function(name) {
429
432
  var contextAttributes = {
430
- antialias: ((GLUT.initDisplayMode & 0x0080 /*GLUT_MULTISAMPLE*/) != 0)
433
+ antialias: ((GLUT.initDisplayMode & 0x0080 /*GLUT_MULTISAMPLE*/) != 0),
434
+ depth: ((GLUT.initDisplayMode & 0x0010 /*GLUT_DEPTH*/) != 0),
435
+ stencil: ((GLUT.initDisplayMode & 0x0020 /*GLUT_STENCIL*/) != 0)
431
436
  };
432
437
  Module.ctx = Browser.createContext(Module['canvas'], true, true, contextAttributes);
433
438
  return Module.ctx ? 1 /* a new GLUT window ID for the created context */ : 0 /* failure */;
@@ -58,7 +58,7 @@ mergeInto(LibraryManager.library, {
58
58
  }
59
59
 
60
60
  var completed = 0;
61
- var done = function(err) {
61
+ function done(err) {
62
62
  if (err) return callback(err);
63
63
  if (++completed >= total) {
64
64
  return callback(null);
@@ -68,7 +68,7 @@ mergeInto(LibraryManager.library, {
68
68
  // create a single transaction to handle and IDB reads / writes we'll need to do
69
69
  var db = src.type === 'remote' ? src.db : dst.db;
70
70
  var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');
71
- transaction.onerror = function() { callback(this.error); };
71
+ transaction.onerror = function transaction_onerror() { callback(this.error); };
72
72
  var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
73
73
 
74
74
  for (var path in create) {
@@ -92,8 +92,8 @@ mergeInto(LibraryManager.library, {
92
92
  } else {
93
93
  // save file to IDB
94
94
  var req = store.put(entry, path);
95
- req.onsuccess = function() { done(null); };
96
- req.onerror = function() { done(this.error); };
95
+ req.onsuccess = function req_onsuccess() { done(null); };
96
+ req.onerror = function req_onerror() { done(this.error); };
97
97
  }
98
98
  }
99
99
 
@@ -117,20 +117,20 @@ mergeInto(LibraryManager.library, {
117
117
  } else {
118
118
  // delete file from IDB
119
119
  var req = store.delete(path);
120
- req.onsuccess = function() { done(null); };
121
- req.onerror = function() { done(this.error); };
120
+ req.onsuccess = function req_onsuccess() { done(null); };
121
+ req.onerror = function req_onerror() { done(this.error); };
122
122
  }
123
123
  }
124
124
  },
125
125
  getLocalSet: function(mount, callback) {
126
126
  var files = {};
127
127
 
128
- var isRealDir = function(p) {
128
+ function isRealDir(p) {
129
129
  return p !== '.' && p !== '..';
130
130
  };
131
- var toAbsolute = function(root) {
131
+ function toAbsolute(root) {
132
132
  return function(p) {
133
- return PATH.join(root, p);
133
+ return PATH.join2(root, p);
134
134
  }
135
135
  };
136
136
 
@@ -177,17 +177,17 @@ mergeInto(LibraryManager.library, {
177
177
  } catch (e) {
178
178
  return onerror(e);
179
179
  }
180
- req.onupgradeneeded = function() {
180
+ req.onupgradeneeded = function req_onupgradeneeded() {
181
181
  db = req.result;
182
182
  db.createObjectStore(IDBFS.DB_STORE_NAME);
183
183
  };
184
- req.onsuccess = function() {
184
+ req.onsuccess = function req_onsuccess() {
185
185
  db = req.result;
186
186
  // add to the cache
187
187
  IDBFS.dbs[name] = db;
188
188
  callback(null, db);
189
189
  };
190
- req.onerror = function() {
190
+ req.onerror = function req_onerror() {
191
191
  callback(this.error);
192
192
  };
193
193
  },
@@ -198,10 +198,10 @@ mergeInto(LibraryManager.library, {
198
198
  if (err) return callback(err);
199
199
 
200
200
  var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');
201
- transaction.onerror = function() { callback(this.error); };
201
+ transaction.onerror = function transaction_onerror() { callback(this.error); };
202
202
 
203
203
  var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
204
- store.openCursor().onsuccess = function(event) {
204
+ store.openCursor().onsuccess = function store_openCursor_onsuccess(event) {
205
205
  var cursor = event.target.result;
206
206
  if (!cursor) {
207
207
  return callback(null, { type: 'remote', db: db, files: files });
@@ -1,6 +1,8 @@
1
1
  mergeInto(LibraryManager.library, {
2
2
  $MEMFS__deps: ['$FS'],
3
3
  $MEMFS: {
4
+ ops_table: null,
5
+
4
6
  // content modes
5
7
  CONTENT_OWNING: 1, // contains a subarray into the heap, and we own it, without copying (note: someone else needs to free() it, if that is necessary)
6
8
  CONTENT_FLEXIBLE: 2, // has been modified or never set to anything, and is a flexible js array that can grow/shrink
@@ -13,51 +15,71 @@ mergeInto(LibraryManager.library, {
13
15
  // no supported
14
16
  throw new FS.ErrnoError(ERRNO_CODES.EPERM);
15
17
  }
18
+ if (!MEMFS.ops_table) {
19
+ MEMFS.ops_table = {
20
+ dir: {
21
+ node: {
22
+ getattr: MEMFS.node_ops.getattr,
23
+ setattr: MEMFS.node_ops.setattr,
24
+ lookup: MEMFS.node_ops.lookup,
25
+ mknod: MEMFS.node_ops.mknod,
26
+ mknod: MEMFS.node_ops.mknod,
27
+ rename: MEMFS.node_ops.rename,
28
+ unlink: MEMFS.node_ops.unlink,
29
+ rmdir: MEMFS.node_ops.rmdir,
30
+ readdir: MEMFS.node_ops.readdir,
31
+ symlink: MEMFS.node_ops.symlink
32
+ },
33
+ stream: {
34
+ llseek: MEMFS.stream_ops.llseek
35
+ }
36
+ },
37
+ file: {
38
+ node: {
39
+ getattr: MEMFS.node_ops.getattr,
40
+ setattr: MEMFS.node_ops.setattr
41
+ },
42
+ stream: {
43
+ llseek: MEMFS.stream_ops.llseek,
44
+ read: MEMFS.stream_ops.read,
45
+ write: MEMFS.stream_ops.write,
46
+ allocate: MEMFS.stream_ops.allocate,
47
+ mmap: MEMFS.stream_ops.mmap
48
+ }
49
+ },
50
+ link: {
51
+ node: {
52
+ getattr: MEMFS.node_ops.getattr,
53
+ setattr: MEMFS.node_ops.setattr,
54
+ readlink: MEMFS.node_ops.readlink
55
+ },
56
+ stream: {}
57
+ },
58
+ chrdev: {
59
+ node: {
60
+ getattr: MEMFS.node_ops.getattr,
61
+ setattr: MEMFS.node_ops.setattr
62
+ },
63
+ stream: FS.chrdev_stream_ops
64
+ },
65
+ };
66
+ }
16
67
  var node = FS.createNode(parent, name, mode, dev);
17
68
  if (FS.isDir(node.mode)) {
18
- node.node_ops = {
19
- getattr: MEMFS.node_ops.getattr,
20
- setattr: MEMFS.node_ops.setattr,
21
- lookup: MEMFS.node_ops.lookup,
22
- mknod: MEMFS.node_ops.mknod,
23
- mknod: MEMFS.node_ops.mknod,
24
- rename: MEMFS.node_ops.rename,
25
- unlink: MEMFS.node_ops.unlink,
26
- rmdir: MEMFS.node_ops.rmdir,
27
- readdir: MEMFS.node_ops.readdir,
28
- symlink: MEMFS.node_ops.symlink
29
- };
30
- node.stream_ops = {
31
- llseek: MEMFS.stream_ops.llseek
32
- };
69
+ node.node_ops = MEMFS.ops_table.dir.node;
70
+ node.stream_ops = MEMFS.ops_table.dir.stream;
33
71
  node.contents = {};
34
72
  } else if (FS.isFile(node.mode)) {
35
- node.node_ops = {
36
- getattr: MEMFS.node_ops.getattr,
37
- setattr: MEMFS.node_ops.setattr
38
- };
39
- node.stream_ops = {
40
- llseek: MEMFS.stream_ops.llseek,
41
- read: MEMFS.stream_ops.read,
42
- write: MEMFS.stream_ops.write,
43
- allocate: MEMFS.stream_ops.allocate,
44
- mmap: MEMFS.stream_ops.mmap
45
- };
73
+ node.node_ops = MEMFS.ops_table.file.node;
74
+ node.stream_ops = MEMFS.ops_table.file.stream;
46
75
  node.contents = [];
47
76
  node.contentMode = MEMFS.CONTENT_FLEXIBLE;
48
77
  } else if (FS.isLink(node.mode)) {
49
- node.node_ops = {
50
- getattr: MEMFS.node_ops.getattr,
51
- setattr: MEMFS.node_ops.setattr,
52
- readlink: MEMFS.node_ops.readlink
53
- };
54
- node.stream_ops = {};
78
+ node.node_ops = MEMFS.ops_table.link.node;
79
+ node.stream_ops = MEMFS.ops_table.link.stream;
55
80
  } else if (FS.isChrdev(node.mode)) {
56
- node.node_ops = {
57
- getattr: MEMFS.node_ops.getattr,
58
- setattr: MEMFS.node_ops.setattr
59
- };
60
- node.stream_ops = FS.chrdev_stream_ops;
81
+ node.node_ops = MEMFS.ops_table.chrdev.node;
82
+ node.stream_ops = MEMFS.ops_table.chrdev.stream;
61
83
  }
62
84
  node.timestamp = Date.now();
63
85
  // add the new node to the parent
@@ -117,7 +139,7 @@ mergeInto(LibraryManager.library, {
117
139
  }
118
140
  },
119
141
  lookup: function(parent, name) {
120
- throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
142
+ throw FS.genericErrors[ERRNO_CODES.ENOENT];
121
143
  },
122
144
  mknod: function(parent, name, mode, dev) {
123
145
  return MEMFS.createNode(parent, name, mode, dev);
@@ -200,10 +222,12 @@ mergeInto(LibraryManager.library, {
200
222
  #if USE_TYPED_ARRAYS == 2
201
223
  if (length && contents.length === 0 && position === 0 && buffer.subarray) {
202
224
  // just replace it with the new data
225
+ #if ASSERTIONS
203
226
  assert(buffer.length);
204
- if (canOwn && buffer.buffer === HEAP8.buffer && offset === 0) {
205
- node.contents = buffer; // this is a subarray of the heap, and we can own it
206
- node.contentMode = MEMFS.CONTENT_OWNING;
227
+ #endif
228
+ if (canOwn && offset === 0) {
229
+ node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.
230
+ node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;
207
231
  } else {
208
232
  node.contents = new Uint8Array(buffer.subarray(offset, offset+length));
209
233
  node.contentMode = MEMFS.CONTENT_FIXED;
@@ -1,7 +1,11 @@
1
1
  mergeInto(LibraryManager.library, {
2
2
  $NODEFS__deps: ['$FS', '$PATH'],
3
- $NODEFS__postset: 'if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); }',
3
+ $NODEFS__postset: 'if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); NODEFS.staticInit(); }',
4
4
  $NODEFS: {
5
+ isWindows: false,
6
+ staticInit: function() {
7
+ NODEFS.isWindows = !!process.platform.match(/^win/);
8
+ },
5
9
  mount: function (mount) {
6
10
  assert(ENVIRONMENT_IS_NODE);
7
11
  return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);
@@ -19,6 +23,11 @@ mergeInto(LibraryManager.library, {
19
23
  var stat;
20
24
  try {
21
25
  stat = fs.lstatSync(path);
26
+ if (NODEFS.isWindows) {
27
+ // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so
28
+ // propagate write bits to execute bits.
29
+ stat.mode = stat.mode | ((stat.mode & 146) >> 1);
30
+ }
22
31
  } catch (e) {
23
32
  if (!e.code) throw e;
24
33
  throw new FS.ErrnoError(ERRNO_CODES[e.code]);
@@ -35,6 +44,41 @@ mergeInto(LibraryManager.library, {
35
44
  parts.reverse();
36
45
  return PATH.join.apply(null, parts);
37
46
  },
47
+ // This maps the integer permission modes from http://linux.die.net/man/3/open
48
+ // to node.js-specific file open permission strings at http://nodejs.org/api/fs.html#fs_fs_open_path_flags_mode_callback
49
+ flagsToPermissionStringMap: {
50
+ 0/*O_RDONLY*/: 'r',
51
+ 1/*O_WRONLY*/: 'r+',
52
+ 2/*O_RDWR*/: 'r+',
53
+ 64/*O_CREAT*/: 'r',
54
+ 65/*O_WRONLY|O_CREAT*/: 'r+',
55
+ 66/*O_RDWR|O_CREAT*/: 'r+',
56
+ 129/*O_WRONLY|O_EXCL*/: 'rx+',
57
+ 193/*O_WRONLY|O_CREAT|O_EXCL*/: 'rx+',
58
+ 514/*O_RDWR|O_TRUNC*/: 'w+',
59
+ 577/*O_WRONLY|O_CREAT|O_TRUNC*/: 'w',
60
+ 578/*O_CREAT|O_RDWR|O_TRUNC*/: 'w+',
61
+ 705/*O_WRONLY|O_CREAT|O_EXCL|O_TRUNC*/: 'wx',
62
+ 706/*O_RDWR|O_CREAT|O_EXCL|O_TRUNC*/: 'wx+',
63
+ 1024/*O_APPEND*/: 'a',
64
+ 1025/*O_WRONLY|O_APPEND*/: 'a',
65
+ 1026/*O_RDWR|O_APPEND*/: 'a+',
66
+ 1089/*O_WRONLY|O_CREAT|O_APPEND*/: 'a',
67
+ 1090/*O_RDWR|O_CREAT|O_APPEND*/: 'a+',
68
+ 1153/*O_WRONLY|O_EXCL|O_APPEND*/: 'ax',
69
+ 1154/*O_RDWR|O_EXCL|O_APPEND*/: 'ax+',
70
+ 1217/*O_WRONLY|O_CREAT|O_EXCL|O_APPEND*/: 'ax',
71
+ 1218/*O_RDWR|O_CREAT|O_EXCL|O_APPEND*/: 'ax+',
72
+ 4096/*O_RDONLY|O_DSYNC*/: 'rs',
73
+ 4098/*O_RDWR|O_DSYNC*/: 'rs+'
74
+ },
75
+ flagsToPermissionString: function(flags) {
76
+ if (flags in NODEFS.flagsToPermissionStringMap) {
77
+ return NODEFS.flagsToPermissionStringMap[flags];
78
+ } else {
79
+ return flags;
80
+ }
81
+ },
38
82
  node_ops: {
39
83
  getattr: function(node) {
40
84
  var path = NODEFS.realPath(node);
@@ -45,6 +89,14 @@ mergeInto(LibraryManager.library, {
45
89
  if (!e.code) throw e;
46
90
  throw new FS.ErrnoError(ERRNO_CODES[e.code]);
47
91
  }
92
+ // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.
93
+ // See http://support.microsoft.com/kb/140365
94
+ if (NODEFS.isWindows && !stat.blksize) {
95
+ stat.blksize = 4096;
96
+ }
97
+ if (NODEFS.isWindows && !stat.blocks) {
98
+ stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;
99
+ }
48
100
  return {
49
101
  dev: stat.dev,
50
102
  ino: stat.ino,
@@ -82,7 +134,7 @@ mergeInto(LibraryManager.library, {
82
134
  }
83
135
  },
84
136
  lookup: function (parent, name) {
85
- var path = PATH.join(NODEFS.realPath(parent), name);
137
+ var path = PATH.join2(NODEFS.realPath(parent), name);
86
138
  var mode = NODEFS.getMode(path);
87
139
  return NODEFS.createNode(parent, name, mode);
88
140
  },
@@ -104,7 +156,7 @@ mergeInto(LibraryManager.library, {
104
156
  },
105
157
  rename: function (oldNode, newDir, newName) {
106
158
  var oldPath = NODEFS.realPath(oldNode);
107
- var newPath = PATH.join(NODEFS.realPath(newDir), newName);
159
+ var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
108
160
  try {
109
161
  fs.renameSync(oldPath, newPath);
110
162
  } catch (e) {
@@ -113,7 +165,7 @@ mergeInto(LibraryManager.library, {
113
165
  }
114
166
  },
115
167
  unlink: function(parent, name) {
116
- var path = PATH.join(NODEFS.realPath(parent), name);
168
+ var path = PATH.join2(NODEFS.realPath(parent), name);
117
169
  try {
118
170
  fs.unlinkSync(path);
119
171
  } catch (e) {
@@ -122,7 +174,7 @@ mergeInto(LibraryManager.library, {
122
174
  }
123
175
  },
124
176
  rmdir: function(parent, name) {
125
- var path = PATH.join(NODEFS.realPath(parent), name);
177
+ var path = PATH.join2(NODEFS.realPath(parent), name);
126
178
  try {
127
179
  fs.rmdirSync(path);
128
180
  } catch (e) {
@@ -140,7 +192,7 @@ mergeInto(LibraryManager.library, {
140
192
  }
141
193
  },
142
194
  symlink: function(parent, newName, oldPath) {
143
- var newPath = PATH.join(NODEFS.realPath(parent), newName);
195
+ var newPath = PATH.join2(NODEFS.realPath(parent), newName);
144
196
  try {
145
197
  fs.symlinkSync(oldPath, newPath);
146
198
  } catch (e) {
@@ -163,7 +215,7 @@ mergeInto(LibraryManager.library, {
163
215
  var path = NODEFS.realPath(stream.node);
164
216
  try {
165
217
  if (FS.isFile(stream.node.mode)) {
166
- stream.nfd = fs.openSync(path, stream.flags);
218
+ stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));
167
219
  }
168
220
  } catch (e) {
169
221
  if (!e.code) throw e;
@@ -172,7 +224,7 @@ mergeInto(LibraryManager.library, {
172
224
  },
173
225
  close: function (stream) {
174
226
  try {
175
- if (FS.isFile(stream.node.mode)) {
227
+ if (FS.isFile(stream.node.mode) && stream.nfd) {
176
228
  fs.closeSync(stream.nfd);
177
229
  }
178
230
  } catch (e) {
@@ -231,4 +283,4 @@ mergeInto(LibraryManager.library, {
231
283
  }
232
284
  }
233
285
  }
234
- });
286
+ });
@@ -8,13 +8,13 @@ var LibraryOpenAL = {
8
8
  QUEUE_INTERVAL: 25,
9
9
  QUEUE_LOOKAHEAD: 100,
10
10
 
11
- updateSources: function(context) {
11
+ updateSources: function updateSources(context) {
12
12
  for (var i = 0; i < context.src.length; i++) {
13
13
  AL.updateSource(context.src[i]);
14
14
  }
15
15
  },
16
16
 
17
- updateSource: function(src) {
17
+ updateSource: function updateSource(src) {
18
18
  #if OPENAL_DEBUG
19
19
  var idx = AL.currentContext.src.indexOf(src);
20
20
  #endif
@@ -65,7 +65,7 @@ var LibraryOpenAL = {
65
65
  }
66
66
  },
67
67
 
68
- setSourceState: function(src, state) {
68
+ setSourceState: function setSourceState(src, state) {
69
69
  #if OPENAL_DEBUG
70
70
  var idx = AL.currentContext.src.indexOf(src);
71
71
  #endif
@@ -119,7 +119,7 @@ var LibraryOpenAL = {
119
119
  }
120
120
  },
121
121
 
122
- stopSourceQueue: function(src) {
122
+ stopSourceQueue: function stopSourceQueue(src) {
123
123
  for (var i = 0; i < src.queue.length; i++) {
124
124
  var entry = src.queue[i];
125
125
  if (entry.src) {
@@ -59,26 +59,22 @@ mergeInto(LibraryManager.library, {
59
59
  }
60
60
  return root + dir;
61
61
  },
62
- basename: function(path, ext) {
62
+ basename: function(path) {
63
63
  // EMSCRIPTEN return '/'' for '/', not an empty string
64
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;
65
+ var lastSlash = path.lastIndexOf('/');
66
+ if (lastSlash === -1) return path;
67
+ return path.substr(lastSlash+1);
70
68
  },
71
69
  extname: function(path) {
72
70
  return PATH.splitPath(path)[3];
73
71
  },
74
72
  join: function() {
75
73
  var paths = Array.prototype.slice.call(arguments, 0);
76
- return PATH.normalize(paths.filter(function(p, index) {
77
- if (typeof p !== 'string') {
78
- throw new TypeError('Arguments to path.join must be strings');
79
- }
80
- return p;
81
- }).join('/'));
74
+ return PATH.normalize(paths.join('/'));
75
+ },
76
+ join2: function(l, r) {
77
+ return PATH.normalize(l + '/' + r);
82
78
  },
83
79
  resolve: function() {
84
80
  var resolvedPath = '',
@@ -134,4 +130,4 @@ mergeInto(LibraryManager.library, {
134
130
  return outputParts.join('/');
135
131
  }
136
132
  }
137
- });
133
+ });