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
@@ -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
+ });