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