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
@@ -6,7 +6,9 @@
6
6
 
7
7
  #include "mruby.h"
8
8
  #include "mruby/variable.h"
9
+ #include "mruby/class.h"
9
10
  #include "mruby/data.h"
11
+ #include "mruby/array.h"
10
12
  #include "mt19937ar.h"
11
13
 
12
14
  #include <time.h>
@@ -18,23 +20,11 @@
18
20
  #define INSTANCE_RAND_SEED_KEY_CSTR_LEN 16
19
21
 
20
22
  #define MT_STATE_KEY "$mrb_i_mt_state"
21
- #define MT_STATE_KEY_CSTR_LEN 15
22
23
 
23
24
  static const struct mrb_data_type mt_state_type = {
24
25
  MT_STATE_KEY, mrb_free,
25
26
  };
26
27
 
27
- static mt_state *mrb_mt_get_context(mrb_state *mrb, mrb_value self)
28
- {
29
- mt_state *t;
30
- mrb_value context;
31
-
32
- context = mrb_iv_get(mrb, self, mrb_intern2(mrb, MT_STATE_KEY, MT_STATE_KEY_CSTR_LEN));
33
- t = DATA_GET_PTR(mrb, context, &mt_state_type, mt_state);
34
-
35
- return t;
36
- }
37
-
38
28
  static void mt_g_srand(unsigned long seed)
39
29
  {
40
30
  init_genrand(seed);
@@ -50,7 +40,8 @@ static double mt_g_rand_real()
50
40
  return genrand_real1();
51
41
  }
52
42
 
53
- static mrb_value mrb_random_mt_g_srand(mrb_state *mrb, mrb_value seed)
43
+ static mrb_value
44
+ mrb_random_mt_g_srand(mrb_state *mrb, mrb_value seed)
54
45
  {
55
46
  if (mrb_nil_p(seed)) {
56
47
  seed = mrb_fixnum_value(time(NULL) + mt_g_rand());
@@ -64,35 +55,41 @@ static mrb_value mrb_random_mt_g_srand(mrb_state *mrb, mrb_value seed)
64
55
  return seed;
65
56
  }
66
57
 
67
- static mrb_value mrb_random_mt_g_rand(mrb_state *mrb, mrb_value max)
58
+ static mrb_value
59
+ mrb_random_mt_g_rand(mrb_state *mrb, mrb_value max)
68
60
  {
69
61
  mrb_value value;
70
62
 
71
63
  if (mrb_fixnum(max) == 0) {
72
64
  value = mrb_float_value(mrb, mt_g_rand_real());
73
- } else {
65
+ }
66
+ else {
74
67
  value = mrb_fixnum_value(mt_g_rand() % mrb_fixnum(max));
75
68
  }
76
69
 
77
70
  return value;
78
71
  }
79
72
 
80
- static void mt_srand(mt_state *t, unsigned long seed)
73
+ static void
74
+ mt_srand(mt_state *t, unsigned long seed)
81
75
  {
82
76
  mrb_random_init_genrand(t, seed);
83
77
  }
84
78
 
85
- static unsigned long mt_rand(mt_state *t)
79
+ static unsigned long
80
+ mt_rand(mt_state *t)
86
81
  {
87
82
  return mrb_random_genrand_int32(t);
88
83
  }
89
84
 
90
- static double mt_rand_real(mt_state *t)
85
+ static double
86
+ mt_rand_real(mt_state *t)
91
87
  {
92
88
  return mrb_random_genrand_real1(t);
93
89
  }
94
90
 
95
- static mrb_value mrb_random_mt_srand(mrb_state *mrb, mt_state *t, mrb_value seed)
91
+ static mrb_value
92
+ mrb_random_mt_srand(mrb_state *mrb, mt_state *t, mrb_value seed)
96
93
  {
97
94
  if (mrb_nil_p(seed)) {
98
95
  seed = mrb_fixnum_value(time(NULL) + mt_rand(t));
@@ -106,20 +103,23 @@ static mrb_value mrb_random_mt_srand(mrb_state *mrb, mt_state *t, mrb_value seed
106
103
  return seed;
107
104
  }
108
105
 
109
- static mrb_value mrb_random_mt_rand(mrb_state *mrb, mt_state *t, mrb_value max)
106
+ static mrb_value
107
+ mrb_random_mt_rand(mrb_state *mrb, mt_state *t, mrb_value max)
110
108
  {
111
109
  mrb_value value;
112
110
 
113
111
  if (mrb_fixnum(max) == 0) {
114
112
  value = mrb_float_value(mrb, mt_rand_real(t));
115
- } else {
113
+ }
114
+ else {
116
115
  value = mrb_fixnum_value(mt_rand(t) % mrb_fixnum(max));
117
116
  }
118
117
 
119
118
  return value;
120
119
  }
121
120
 
122
- static mrb_value get_opt(mrb_state* mrb)
121
+ static mrb_value
122
+ get_opt(mrb_state* mrb)
123
123
  {
124
124
  mrb_value arg;
125
125
 
@@ -138,89 +138,186 @@ static mrb_value get_opt(mrb_state* mrb)
138
138
  return arg;
139
139
  }
140
140
 
141
- static mrb_value mrb_random_g_rand(mrb_state *mrb, mrb_value self)
141
+ static void
142
+ mrb_random_g_rand_seed(mrb_state *mrb)
142
143
  {
143
- mrb_value max;
144
144
  mrb_value seed;
145
-
146
- max = get_opt(mrb);
147
- seed = mrb_gv_get(mrb, mrb_intern2(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN));
145
+
146
+ seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN));
148
147
  if (mrb_nil_p(seed)) {
149
148
  mrb_random_mt_g_srand(mrb, mrb_nil_value());
150
149
  }
150
+ }
151
+
152
+ static mrb_value
153
+ mrb_random_g_rand(mrb_state *mrb, mrb_value self)
154
+ {
155
+ mrb_value max;
156
+
157
+ max = get_opt(mrb);
158
+ mrb_random_g_rand_seed(mrb);
151
159
  return mrb_random_mt_g_rand(mrb, max);
152
160
  }
153
161
 
154
- static mrb_value mrb_random_g_srand(mrb_state *mrb, mrb_value self)
162
+ static mrb_value
163
+ mrb_random_g_srand(mrb_state *mrb, mrb_value self)
155
164
  {
156
165
  mrb_value seed;
157
166
  mrb_value old_seed;
158
167
 
159
168
  seed = get_opt(mrb);
160
169
  seed = mrb_random_mt_g_srand(mrb, seed);
161
- old_seed = mrb_gv_get(mrb, mrb_intern2(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN));
162
- mrb_gv_set(mrb, mrb_intern2(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN), seed);
170
+ old_seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN));
171
+ mrb_gv_set(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN), seed);
163
172
  return old_seed;
164
173
  }
165
174
 
166
- static mrb_value mrb_random_init(mrb_state *mrb, mrb_value self)
175
+ static mrb_value
176
+ mrb_random_init(mrb_state *mrb, mrb_value self)
167
177
  {
168
178
  mrb_value seed;
169
-
170
-
171
- mt_state *t = (mt_state *)mrb_malloc(mrb, sizeof(mt_state));
179
+ mt_state *t;
180
+
181
+ DATA_TYPE(self) = &mt_state_type;
182
+ DATA_PTR(self) = NULL;
183
+
184
+ /* avoid memory leaks */
185
+ t = (mt_state*)DATA_PTR(self);
186
+ if (t) {
187
+ mrb_free(mrb, t);
188
+ }
189
+
190
+ t = (mt_state *)mrb_malloc(mrb, sizeof(mt_state));
172
191
  t->mti = N + 1;
173
192
 
174
193
  seed = get_opt(mrb);
175
194
  seed = mrb_random_mt_srand(mrb, t, seed);
176
- mrb_iv_set(mrb, self, mrb_intern2(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN), seed);
177
- mrb_iv_set(mrb, self, mrb_intern2(mrb, MT_STATE_KEY, MT_STATE_KEY_CSTR_LEN),
178
- mrb_obj_value(Data_Wrap_Struct(mrb, mrb->object_class, &mt_state_type, (void*) t)));
195
+ mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN), seed);
196
+
197
+ DATA_PTR(self) = t;
198
+
179
199
  return self;
180
200
  }
181
201
 
182
- static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self)
202
+ static void
203
+ mrb_random_rand_seed(mrb_state *mrb, mrb_value self)
183
204
  {
184
- mrb_value max;
185
205
  mrb_value seed;
186
- mt_state *t = mrb_mt_get_context(mrb, self);
187
-
188
- max = get_opt(mrb);
189
- seed = mrb_iv_get(mrb, self, mrb_intern2(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN));
206
+ mt_state *t = DATA_PTR(self);
207
+
208
+ seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN));
190
209
  if (mrb_nil_p(seed)) {
191
210
  mrb_random_mt_srand(mrb, t, mrb_nil_value());
192
211
  }
212
+ }
213
+
214
+ static mrb_value
215
+ mrb_random_rand(mrb_state *mrb, mrb_value self)
216
+ {
217
+ mrb_value max;
218
+ mt_state *t = DATA_PTR(self);
219
+
220
+ max = get_opt(mrb);
221
+ mrb_random_rand_seed(mrb, self);
193
222
  return mrb_random_mt_rand(mrb, t, max);
194
223
  }
195
224
 
196
- static mrb_value mrb_random_srand(mrb_state *mrb, mrb_value self)
225
+ static mrb_value
226
+ mrb_random_srand(mrb_state *mrb, mrb_value self)
197
227
  {
198
228
  mrb_value seed;
199
229
  mrb_value old_seed;
200
- mt_state *t = mrb_mt_get_context(mrb, self);
230
+ mt_state *t = DATA_PTR(self);
201
231
 
202
232
  seed = get_opt(mrb);
203
233
  seed = mrb_random_mt_srand(mrb, t, seed);
204
- old_seed = mrb_iv_get(mrb, self, mrb_intern2(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN));
205
- mrb_iv_set(mrb, self, mrb_intern2(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN), seed);
234
+ old_seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN));
235
+ mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN), seed);
206
236
 
207
237
  return old_seed;
208
238
  }
209
239
 
240
+ /*
241
+ * call-seq:
242
+ * ary.shuffle! -> ary
243
+ *
244
+ * Shuffles elements in self in place.
245
+ */
246
+
247
+ static mrb_value
248
+ mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
249
+ {
250
+ mrb_int i;
251
+ mrb_value random = mrb_nil_value();
252
+
253
+ if (RARRAY_LEN(ary) > 1) {
254
+ mrb_get_args(mrb, "|o", &random);
255
+
256
+ if (mrb_nil_p(random)) {
257
+ mrb_random_g_rand_seed(mrb);
258
+ }
259
+ else {
260
+ mrb_data_check_type(mrb, random, &mt_state_type);
261
+ mrb_random_rand_seed(mrb, random);
262
+ }
263
+
264
+ mrb_ary_modify(mrb, mrb_ary_ptr(ary));
265
+
266
+ for (i = RARRAY_LEN(ary) - 1; i > 0; i--) {
267
+ mrb_int j;
268
+ mrb_value tmp;
269
+
270
+ if (mrb_nil_p(random)) {
271
+ j = mrb_fixnum(mrb_random_mt_g_rand(mrb, mrb_fixnum_value(RARRAY_LEN(ary))));
272
+ }
273
+ else {
274
+ j = mrb_fixnum(mrb_random_mt_rand(mrb, DATA_PTR(random), mrb_fixnum_value(RARRAY_LEN(ary))));
275
+ }
276
+
277
+ tmp = RARRAY_PTR(ary)[i];
278
+ RARRAY_PTR(ary)[i] = RARRAY_PTR(ary)[j];
279
+ RARRAY_PTR(ary)[j] = tmp;
280
+ }
281
+ }
282
+
283
+ return ary;
284
+ }
285
+
286
+ /*
287
+ * call-seq:
288
+ * ary.shuffle -> new_ary
289
+ *
290
+ * Returns a new array with elements of self shuffled.
291
+ */
292
+
293
+ static mrb_value
294
+ mrb_ary_shuffle(mrb_state *mrb, mrb_value ary)
295
+ {
296
+ mrb_value new_ary = mrb_ary_new_from_values(mrb, RARRAY_LEN(ary), RARRAY_PTR(ary));
297
+ mrb_ary_shuffle_bang(mrb, new_ary);
298
+
299
+ return new_ary;
300
+ }
301
+
210
302
  void mrb_mruby_random_gem_init(mrb_state *mrb)
211
303
  {
212
304
  struct RClass *random;
305
+ struct RClass *array = mrb->array_class;
213
306
 
214
307
  mrb_define_method(mrb, mrb->kernel_module, "rand", mrb_random_g_rand, MRB_ARGS_OPT(1));
215
308
  mrb_define_method(mrb, mrb->kernel_module, "srand", mrb_random_g_srand, MRB_ARGS_OPT(1));
216
309
 
217
310
  random = mrb_define_class(mrb, "Random", mrb->object_class);
311
+ MRB_SET_INSTANCE_TT(random, MRB_TT_DATA);
218
312
  mrb_define_class_method(mrb, random, "rand", mrb_random_g_rand, MRB_ARGS_OPT(1));
219
313
  mrb_define_class_method(mrb, random, "srand", mrb_random_g_srand, MRB_ARGS_OPT(1));
220
314
 
221
315
  mrb_define_method(mrb, random, "initialize", mrb_random_init, MRB_ARGS_OPT(1));
222
316
  mrb_define_method(mrb, random, "rand", mrb_random_rand, MRB_ARGS_OPT(1));
223
317
  mrb_define_method(mrb, random, "srand", mrb_random_srand, MRB_ARGS_OPT(1));
318
+
319
+ mrb_define_method(mrb, array, "shuffle", mrb_ary_shuffle, MRB_ARGS_OPT(1));
320
+ mrb_define_method(mrb, array, "shuffle!", mrb_ary_shuffle_bang, MRB_ARGS_OPT(1));
224
321
  }
225
322
 
226
323
  void mrb_mruby_random_gem_final(mrb_state *mrb)
@@ -30,3 +30,47 @@ end
30
30
  assert("float") do
31
31
  rand.class == Float
32
32
  end
33
+
34
+ assert("Array#shuffle") do
35
+ ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
36
+ shuffled = ary.shuffle
37
+
38
+ ary == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and shuffled != ary and 10.times { |x| ary.include? x }
39
+ end
40
+
41
+ assert('Array#shuffle!') do
42
+ ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
43
+ ary.shuffle!
44
+
45
+ ary != [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and 10.times { |x| ary.include? x }
46
+ end
47
+
48
+ assert("Array#shuffle(random)") do
49
+ assert_raise(TypeError) do
50
+ # this will cause an exception due to the wrong argument
51
+ [1, 2].shuffle "Not a Random instance"
52
+ end
53
+
54
+ # verify that the same seed causes the same results
55
+ ary1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
56
+ shuffle1 = ary1.shuffle Random.new 345
57
+ ary2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
58
+ shuffle2 = ary2.shuffle Random.new 345
59
+
60
+ ary1 != shuffle1 and 10.times { |x| shuffle1.include? x } and shuffle1 == shuffle2
61
+ end
62
+
63
+ assert('Array#shuffle!(random)') do
64
+ assert_raise(TypeError) do
65
+ # this will cause an exception due to the wrong argument
66
+ [1, 2].shuffle! "Not a Random instance"
67
+ end
68
+
69
+ # verify that the same seed causes the same results
70
+ ary1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
71
+ ary1.shuffle! Random.new 345
72
+ ary2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
73
+ ary2.shuffle! Random.new 345
74
+
75
+ ary1 != [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and 10.times { |x| ary1.include? x } and ary1 == ary2
76
+ end
@@ -49,7 +49,7 @@ mrb_struct_iv_get(mrb_state *mrb, mrb_value c, const char *name)
49
49
  mrb_value
50
50
  mrb_struct_s_members(mrb_state *mrb, mrb_value klass)
51
51
  {
52
- mrb_value members = struct_ivar_get(mrb, klass, mrb_intern2(mrb, "__members__", 11));
52
+ mrb_value members = struct_ivar_get(mrb, klass, mrb_intern_lit(mrb, "__members__"));
53
53
 
54
54
  if (mrb_nil_p(members)) {
55
55
  mrb_raise(mrb, E_TYPE_ERROR, "uninitialized struct");
@@ -176,7 +176,7 @@ mrb_id_attrset(mrb_state *mrb, mrb_sym id)
176
176
  buf[len] = '=';
177
177
  buf[len+1] = '\0';
178
178
 
179
- mid = mrb_intern2(mrb, buf, len+1);
179
+ mid = mrb_intern(mrb, buf, len+1);
180
180
  mrb_free(mrb, buf);
181
181
  return mid;
182
182
  }
@@ -191,7 +191,7 @@ mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val)
191
191
 
192
192
  /* get base id */
193
193
  name = mrb_sym2name_len(mrb, mrb->c->ci->mid, &len);
194
- mid = mrb_intern2(mrb, name, len-1); /* omit last "=" */
194
+ mid = mrb_intern(mrb, name, len-1); /* omit last "=" */
195
195
 
196
196
  members = mrb_struct_members(mrb, obj);
197
197
  ptr_members = RARRAY_PTR(members);
@@ -258,7 +258,7 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * k
258
258
  }
259
259
  MRB_SET_INSTANCE_TT(c, MRB_TT_ARRAY);
260
260
  nstr = mrb_obj_value(c);
261
- mrb_iv_set(mrb, nstr, mrb_intern2(mrb, "__members__", 11), members);
261
+ mrb_iv_set(mrb, nstr, mrb_intern_lit(mrb, "__members__"), members);
262
262
 
263
263
  mrb_define_class_method(mrb, c, "new", mrb_instance_new, MRB_ARGS_ANY());
264
264
  mrb_define_class_method(mrb, c, "[]", mrb_instance_new, MRB_ARGS_ANY());
@@ -393,7 +393,7 @@ num_members(mrb_state *mrb, struct RClass *klass)
393
393
  {
394
394
  mrb_value members;
395
395
 
396
- members = struct_ivar_get(mrb, mrb_obj_value(klass), mrb_intern2(mrb, "__members__", 11));
396
+ members = struct_ivar_get(mrb, mrb_obj_value(klass), mrb_intern_lit(mrb, "__members__"));
397
397
  if (!mrb_array_p(members)) {
398
398
  mrb_raise(mrb, E_TYPE_ERROR, "broken members");
399
399
  }
@@ -1,24 +1,51 @@
1
1
  ##
2
- # Integer
2
+ # Numeric
3
3
  #
4
- # ISO 15.2.8
5
- class Integer
6
-
4
+ # ISO 15.2.7
5
+ class Numeric
6
+ include Comparable
7
7
  ##
8
8
  # Returns the receiver simply.
9
9
  #
10
- # ISO 15.2.8.3.14
11
- def ceil
10
+ # ISO 15.2.7.4.1
11
+ def +@
12
12
  self
13
13
  end
14
14
 
15
+ ##
16
+ # Returns the receiver's value, negated.
17
+ #
18
+ # ISO 15.2.7.4.2
19
+ def -@
20
+ 0 - self
21
+ end
22
+
23
+ ##
24
+ # Returns the absolute value of the receiver.
25
+ #
26
+ # ISO 15.2.7.4.3
27
+ def abs
28
+ if self < 0
29
+ -self
30
+ else
31
+ self
32
+ end
33
+ end
34
+ end
35
+
36
+ ##
37
+ # Integral
38
+ #
39
+ # mruby special - module to share methods between Floats and Integers
40
+ # to make them compatible
41
+ module Integral
15
42
  ##
16
43
  # Calls the given block once for each Integer
17
44
  # from +self+ downto +num+.
18
45
  #
19
46
  # ISO 15.2.8.3.15
20
47
  def downto(num, &block)
21
- i = self
48
+ i = self.to_i
22
49
  while(i >= num)
23
50
  block.call(i)
24
51
  i -= 1
@@ -27,12 +54,14 @@ class Integer
27
54
  end
28
55
 
29
56
  ##
30
- # Returns the receiver simply.
57
+ # Returns self + 1
31
58
  #
32
- # ISO 15.2.8.3.17
33
- def floor
34
- self
59
+ # ISO 15.2.8.3.19
60
+ def next
61
+ self + 1
35
62
  end
63
+ # ISO 15.2.8.3.21
64
+ alias succ next
36
65
 
37
66
  ##
38
67
  # Calls the given block +self+ times.
@@ -47,29 +76,13 @@ class Integer
47
76
  self
48
77
  end
49
78
 
50
- ##
51
- # Returns the receiver simply.
52
- #
53
- # ISO 15.2.8.3.24
54
- def round
55
- self
56
- end
57
-
58
- ##
59
- # Returns the receiver simply.
60
- #
61
- # ISO 15.2.8.3.26
62
- def truncate
63
- self
64
- end
65
-
66
79
  ##
67
80
  # Calls the given block once for each Integer
68
81
  # from +self+ upto +num+.
69
82
  #
70
83
  # ISO 15.2.8.3.27
71
84
  def upto(num, &block)
72
- i = self
85
+ i = self.to_i
73
86
  while(i <= num)
74
87
  block.call(i)
75
88
  i += 1
@@ -92,10 +105,63 @@ class Integer
92
105
  end
93
106
 
94
107
  ##
95
- # Numeric is comparable
108
+ # Integer
96
109
  #
97
- # ISO 15.2.7.3
98
- module Comparable; end
99
- class Numeric
100
- include Comparable
110
+ # ISO 15.2.8
111
+ class Integer
112
+ include Integral
113
+ ##
114
+ # Returns the receiver simply.
115
+ #
116
+ # ISO 15.2.8.3.14
117
+ def ceil
118
+ self
119
+ end
120
+
121
+ ##
122
+ # Returns the receiver simply.
123
+ #
124
+ # ISO 15.2.8.3.17
125
+ def floor
126
+ self
127
+ end
128
+
129
+ ##
130
+ # Returns the receiver simply.
131
+ #
132
+ # ISO 15.2.8.3.24
133
+ alias round floor
134
+
135
+ ##
136
+ # Returns the receiver simply.
137
+ #
138
+ # ISO 15.2.8.3.26
139
+ alias truncate floor
140
+ end
141
+
142
+ ##
143
+ # Float
144
+ #
145
+ # ISO 15.2.9
146
+ class Float
147
+ include Integral
148
+ # mruby special - since mruby integers may be upgraded to floats,
149
+ # floats should be compatible to integers.
150
+ def >> other
151
+ n = self.to_i
152
+ other.to_i.times {
153
+ n /= 2
154
+ }
155
+ n
156
+ end
157
+ def << other
158
+ n = self.to_i
159
+ other.to_i.times {
160
+ n *= 2
161
+ }
162
+ n.to_i
163
+ end
164
+
165
+ def divmod(other)
166
+ end
101
167
  end
@@ -138,6 +138,13 @@ ary_modify(mrb_state *mrb, struct RArray *a)
138
138
  }
139
139
  }
140
140
 
141
+ void
142
+ mrb_ary_modify(mrb_state *mrb, struct RArray* a)
143
+ {
144
+ mrb_write_barrier(mrb, (struct RBasic*)a);
145
+ ary_modify(mrb, a);
146
+ }
147
+
141
148
  static void
142
149
  ary_make_shared(mrb_state *mrb, struct RArray *a)
143
150
  {
@@ -302,7 +309,7 @@ mrb_ary_cmp(mrb_state *mrb, mrb_value ary1)
302
309
  a1 = RARRAY(ary1); a2 = RARRAY(ary2);
303
310
  if (a1->len == a2->len && a1->ptr == a2->ptr) return mrb_fixnum_value(0);
304
311
  else {
305
- mrb_sym cmp = mrb_intern2(mrb, "<=>", 3);
312
+ mrb_sym cmp = mrb_intern_lit(mrb, "<=>");
306
313
 
307
314
  len = RARRAY_LEN(ary1);
308
315
  if (len > RARRAY_LEN(ary2)) {
@@ -1063,7 +1070,7 @@ mrb_ary_equal(mrb_state *mrb, mrb_value ary1)
1063
1070
  if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value();
1064
1071
  if (mrb_special_const_p(ary2)) return mrb_false_value();
1065
1072
  if (!mrb_array_p(ary2)) {
1066
- if (!mrb_respond_to(mrb, ary2, mrb_intern2(mrb, "to_ary", 6))) {
1073
+ if (!mrb_respond_to(mrb, ary2, mrb_intern_lit(mrb, "to_ary"))) {
1067
1074
  return mrb_false_value();
1068
1075
  }
1069
1076
  else {
@@ -1117,8 +1124,8 @@ mrb_init_array(mrb_state *mrb)
1117
1124
 
1118
1125
  mrb_define_class_method(mrb, a, "[]", mrb_ary_s_create, MRB_ARGS_ANY()); /* 15.2.12.4.1 */
1119
1126
 
1120
- mrb_define_method(mrb, a, "*", mrb_ary_times, MRB_ARGS_REQ(1)); /* 15.2.12.5.1 */
1121
- mrb_define_method(mrb, a, "+", mrb_ary_plus, MRB_ARGS_REQ(1)); /* 15.2.12.5.2 */
1127
+ mrb_define_method(mrb, a, "+", mrb_ary_plus, MRB_ARGS_REQ(1)); /* 15.2.12.5.1 */
1128
+ mrb_define_method(mrb, a, "*", mrb_ary_times, MRB_ARGS_REQ(1)); /* 15.2.12.5.2 */
1122
1129
  mrb_define_method(mrb, a, "<<", mrb_ary_push_m, MRB_ARGS_REQ(1)); /* 15.2.12.5.3 */
1123
1130
  mrb_define_method(mrb, a, "[]", mrb_ary_aget, MRB_ARGS_ANY()); /* 15.2.12.5.4 */
1124
1131
  mrb_define_method(mrb, a, "[]=", mrb_ary_aset, MRB_ARGS_ANY()); /* 15.2.12.5.5 */
@@ -65,7 +65,7 @@ mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func fun
65
65
  int i, line;
66
66
 
67
67
  func(mrb, stream, 1, "trace:\n");
68
- ciidx = mrb_fixnum(mrb_obj_iv_get(mrb, exc, mrb_intern2(mrb, "ciidx", 5)));
68
+ ciidx = mrb_fixnum(mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "ciidx")));
69
69
  if (ciidx >= mrb->c->ciend - mrb->c->cibase)
70
70
  ciidx = 10; /* ciidx is broken... */
71
71
 
@@ -88,7 +88,7 @@ mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func fun
88
88
  pc = mrb->c->cibase[i+1].pc - 1;
89
89
  }
90
90
  else {
91
- pc = (mrb_code*)mrb_cptr(mrb_obj_iv_get(mrb, exc, mrb_intern2(mrb, "lastpc", 6)));
91
+ pc = (mrb_code*)mrb_cptr(mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "lastpc")));
92
92
  }
93
93
  filename = mrb_debug_get_filename(irep, pc - irep->iseq);
94
94
  line = mrb_debug_get_line(irep, pc - irep->iseq);