opal 0.8.1 → 0.9.0.beta1

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 (331) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -2
  3. data/.gitmodules +3 -3
  4. data/.jshintrc +17 -20
  5. data/.travis.yml +22 -11
  6. data/CHANGELOG.md +51 -1
  7. data/CODE_OF_CONDUCT.md +15 -0
  8. data/CONTRIBUTING.md +125 -9
  9. data/Gemfile +1 -1
  10. data/Guardfile +2 -2
  11. data/README.md +95 -29
  12. data/Rakefile +1 -1
  13. data/benchmark/benchmarks +103 -0
  14. data/benchmark/bm_array_flatten.rb +9 -0
  15. data/benchmark/bm_array_intersection_numbers.rb +7 -0
  16. data/benchmark/bm_array_intersection_objects.rb +7 -0
  17. data/benchmark/bm_array_intersection_strings.rb +7 -0
  18. data/benchmark/bm_array_join_ary.rb +9 -0
  19. data/benchmark/bm_array_minus_numbers.rb +7 -0
  20. data/benchmark/bm_array_minus_objects.rb +7 -0
  21. data/benchmark/bm_array_minus_strings.rb +7 -0
  22. data/benchmark/bm_array_union_numbers.rb +7 -0
  23. data/benchmark/bm_array_union_objects.rb +7 -0
  24. data/benchmark/bm_array_union_strings.rb +7 -0
  25. data/benchmark/bm_array_uniq_bang_numbers.rb +5 -0
  26. data/benchmark/bm_array_uniq_bang_objects.rb +5 -0
  27. data/benchmark/bm_array_uniq_bang_strings.rb +5 -0
  28. data/benchmark/bm_array_uniq_numbers.rb +5 -0
  29. data/benchmark/bm_array_uniq_objects.rb +5 -0
  30. data/benchmark/bm_array_uniq_strings.rb +5 -0
  31. data/benchmark/bm_dispatch_bind_table.rb +57 -0
  32. data/benchmark/bm_dispatch_code_gen.rb +65 -0
  33. data/benchmark/bm_dispatch_code_gen_if.rb +64 -0
  34. data/benchmark/bm_dispatch_hardcoded.rb +44 -0
  35. data/benchmark/bm_dispatch_send.rb +38 -0
  36. data/benchmark/bm_dispatch_send_table.rb +57 -0
  37. data/benchmark/bm_hash_assoc_object.rb +11 -0
  38. data/benchmark/bm_hash_assoc_string.rb +9 -0
  39. data/benchmark/bm_hash_clone_object.rb +9 -0
  40. data/benchmark/bm_hash_clone_string.rb +9 -0
  41. data/benchmark/bm_hash_delete_object.rb +11 -0
  42. data/benchmark/bm_hash_delete_string.rb +9 -0
  43. data/benchmark/bm_hash_each_key_object.rb +9 -0
  44. data/benchmark/bm_hash_each_key_string.rb +9 -0
  45. data/benchmark/bm_hash_each_object.rb +9 -0
  46. data/benchmark/bm_hash_each_string.rb +9 -0
  47. data/benchmark/bm_hash_each_value_object.rb +9 -0
  48. data/benchmark/bm_hash_each_value_string.rb +9 -0
  49. data/benchmark/bm_hash_element_reference_object.rb +11 -0
  50. data/benchmark/bm_hash_element_reference_string.rb +9 -0
  51. data/benchmark/bm_hash_element_set_object.rb +5 -0
  52. data/benchmark/bm_hash_element_set_string.rb +5 -0
  53. data/benchmark/bm_hash_equal_value_object.rb +14 -0
  54. data/benchmark/bm_hash_equal_value_string.rb +11 -0
  55. data/benchmark/bm_hash_fetch_object.rb +11 -0
  56. data/benchmark/bm_hash_fetch_string.rb +9 -0
  57. data/benchmark/bm_hash_flatten_object.rb +9 -0
  58. data/benchmark/bm_hash_flatten_string.rb +9 -0
  59. data/benchmark/bm_hash_has_key_object.rb +11 -0
  60. data/benchmark/bm_hash_has_key_string.rb +9 -0
  61. data/benchmark/bm_hash_has_value_object.rb +9 -0
  62. data/benchmark/bm_hash_has_value_string.rb +9 -0
  63. data/benchmark/bm_hash_hash_object.rb +9 -0
  64. data/benchmark/bm_hash_hash_string.rb +9 -0
  65. data/benchmark/bm_hash_inspect_object.rb +9 -0
  66. data/benchmark/bm_hash_inspect_string.rb +9 -0
  67. data/benchmark/bm_hash_invert_object.rb +9 -0
  68. data/benchmark/bm_hash_invert_string.rb +9 -0
  69. data/benchmark/bm_hash_keep_if_object.rb +9 -0
  70. data/benchmark/bm_hash_keep_if_string.rb +9 -0
  71. data/benchmark/bm_hash_key_object.rb +9 -0
  72. data/benchmark/bm_hash_key_string.rb +9 -0
  73. data/benchmark/bm_hash_keys_object.rb +9 -0
  74. data/benchmark/bm_hash_keys_string.rb +9 -0
  75. data/benchmark/bm_hash_literal_mixed_large.rb +3 -0
  76. data/benchmark/bm_hash_literal_mixed_small.rb +3 -0
  77. data/benchmark/bm_hash_literal_object_large.rb +4 -0
  78. data/benchmark/bm_hash_literal_object_small.rb +3 -0
  79. data/benchmark/bm_hash_literal_string_large.rb +4 -0
  80. data/benchmark/bm_hash_literal_string_small.rb +3 -0
  81. data/benchmark/bm_hash_merge_object.rb +22 -0
  82. data/benchmark/bm_hash_merge_string.rb +18 -0
  83. data/benchmark/bm_hash_rassoc_object.rb +9 -0
  84. data/benchmark/bm_hash_rassoc_string.rb +9 -0
  85. data/benchmark/bm_hash_rehash_object.rb +9 -0
  86. data/benchmark/bm_hash_rehash_string.rb +9 -0
  87. data/benchmark/bm_hash_reject_bang_object.rb +9 -0
  88. data/benchmark/bm_hash_reject_bang_string.rb +9 -0
  89. data/benchmark/bm_hash_reject_object.rb +9 -0
  90. data/benchmark/bm_hash_reject_string.rb +9 -0
  91. data/benchmark/bm_hash_replace_object.rb +18 -0
  92. data/benchmark/bm_hash_replace_string.rb +14 -0
  93. data/benchmark/bm_hash_select_bang_object.rb +9 -0
  94. data/benchmark/bm_hash_select_bang_string.rb +9 -0
  95. data/benchmark/bm_hash_select_object.rb +9 -0
  96. data/benchmark/bm_hash_select_string.rb +9 -0
  97. data/benchmark/bm_hash_shift_object.rb +10 -0
  98. data/benchmark/bm_hash_shift_string.rb +10 -0
  99. data/benchmark/bm_hash_to_a_object.rb +9 -0
  100. data/benchmark/bm_hash_to_a_string.rb +9 -0
  101. data/benchmark/bm_hash_to_h_object.rb +10 -0
  102. data/benchmark/bm_hash_to_h_string.rb +10 -0
  103. data/benchmark/bm_hash_values_object.rb +9 -0
  104. data/benchmark/bm_hash_values_string.rb +9 -0
  105. data/benchmark/run.rb +48 -0
  106. data/bin/opal-mspec +1 -1
  107. data/bin/opal-repl +4 -4
  108. data/docs/compiled_ruby.md +214 -56
  109. data/docs/configuring_gems.md +2 -2
  110. data/docs/faq.md +2 -2
  111. data/docs/getting_started.md +19 -2
  112. data/docs/jquery.md +5 -5
  113. data/docs/opal_parser.md +53 -0
  114. data/docs/unsupported_features.md +2 -2
  115. data/docs/upgrading.md +22 -0
  116. data/docs/using_sprockets.md +15 -0
  117. data/examples/rack/config.ru +13 -0
  118. data/examples/sinatra/config.ru +4 -5
  119. data/lib/mspec/opal/runner.rb +54 -11
  120. data/lib/opal.rb +1 -1
  121. data/lib/opal/builder.rb +1 -1
  122. data/lib/opal/builder_processors.rb +1 -1
  123. data/lib/opal/cli.rb +17 -13
  124. data/lib/opal/cli_options.rb +1 -1
  125. data/lib/opal/compiler.rb +12 -0
  126. data/lib/opal/config.rb +4 -0
  127. data/lib/opal/nodes/arglist.rb +5 -7
  128. data/lib/opal/nodes/call.rb +6 -1
  129. data/lib/opal/nodes/call_special.rb +74 -0
  130. data/lib/opal/nodes/def.rb +35 -28
  131. data/lib/opal/nodes/definitions.rb +3 -5
  132. data/lib/opal/nodes/for.rb +13 -0
  133. data/lib/opal/nodes/helpers.rb +15 -1
  134. data/lib/opal/nodes/if.rb +5 -5
  135. data/lib/opal/nodes/iter.rb +6 -1
  136. data/lib/opal/nodes/literal.rb +1 -1
  137. data/lib/opal/nodes/logic.rb +2 -2
  138. data/lib/opal/nodes/masgn.rb +1 -2
  139. data/lib/opal/nodes/module.rb +2 -1
  140. data/lib/opal/nodes/rescue.rb +10 -1
  141. data/lib/opal/nodes/scope.rb +8 -2
  142. data/lib/opal/nodes/singleton_class.rb +1 -1
  143. data/lib/opal/nodes/top.rb +11 -0
  144. data/lib/opal/nodes/variables.rb +4 -4
  145. data/lib/opal/parser.rb +21 -3
  146. data/lib/opal/parser/grammar.rb +3115 -2961
  147. data/lib/opal/parser/grammar.y +29 -6
  148. data/lib/opal/parser/lexer.rb +18 -8
  149. data/lib/opal/sprockets.rb +85 -0
  150. data/lib/opal/sprockets/processor.rb +11 -35
  151. data/lib/opal/sprockets/server.rb +3 -15
  152. data/lib/opal/version.rb +2 -2
  153. data/opal.gemspec +4 -4
  154. data/opal/README.md +9 -0
  155. data/opal/corelib/array.rb +433 -181
  156. data/opal/corelib/basic_object.rb +48 -4
  157. data/opal/corelib/boolean.rb +15 -6
  158. data/opal/corelib/class.rb +6 -5
  159. data/opal/corelib/comparable.rb +12 -0
  160. data/opal/corelib/complex.rb +282 -0
  161. data/opal/corelib/constants.rb +9 -0
  162. data/opal/corelib/enumerable.rb +83 -34
  163. data/opal/corelib/enumerator.rb +3 -1
  164. data/opal/corelib/error.rb +49 -10
  165. data/opal/corelib/file.rb +1 -0
  166. data/opal/corelib/hash.rb +353 -577
  167. data/opal/corelib/helpers.rb +20 -0
  168. data/opal/corelib/kernel.rb +114 -59
  169. data/opal/corelib/math.rb +470 -0
  170. data/opal/corelib/method.rb +11 -2
  171. data/opal/corelib/module.rb +96 -96
  172. data/opal/corelib/{nil_class.rb → nil.rb} +20 -1
  173. data/opal/corelib/number.rb +751 -0
  174. data/opal/corelib/numeric.rb +77 -437
  175. data/opal/corelib/proc.rb +81 -1
  176. data/opal/corelib/process.rb +27 -0
  177. data/opal/corelib/rational.rb +358 -0
  178. data/opal/corelib/regexp.rb +156 -27
  179. data/opal/corelib/runtime.js +724 -335
  180. data/opal/corelib/string.rb +93 -104
  181. data/opal/corelib/string/encoding.rb +177 -0
  182. data/opal/corelib/string/inheritance.rb +2 -0
  183. data/opal/corelib/struct.rb +105 -18
  184. data/opal/corelib/time.rb +267 -146
  185. data/opal/corelib/unsupported.rb +216 -0
  186. data/opal/corelib/variables.rb +0 -6
  187. data/opal/opal.rb +8 -22
  188. data/opal/opal/base.rb +9 -0
  189. data/opal/opal/mini.rb +17 -0
  190. data/spec/README.md +1 -1
  191. data/spec/filters/bugs/array.rb +38 -136
  192. data/spec/filters/bugs/{basic_object.rb → basicobject.rb} +14 -15
  193. data/spec/filters/bugs/class.rb +6 -12
  194. data/spec/filters/bugs/complex.rb +3 -0
  195. data/spec/filters/bugs/date.rb +162 -10
  196. data/spec/filters/bugs/enumerable.rb +31 -58
  197. data/spec/filters/bugs/enumerator.rb +42 -0
  198. data/spec/filters/bugs/exception.rb +66 -10
  199. data/spec/filters/bugs/float.rb +17 -0
  200. data/spec/filters/bugs/hash.rb +11 -97
  201. data/spec/filters/bugs/inheritance.rb +5 -0
  202. data/spec/filters/bugs/integer.rb +28 -0
  203. data/spec/filters/bugs/kernel.rb +304 -12
  204. data/spec/filters/bugs/language.rb +133 -399
  205. data/spec/filters/bugs/language_opal.rb +88 -0
  206. data/spec/filters/bugs/module.rb +203 -62
  207. data/spec/filters/bugs/numeric.rb +32 -0
  208. data/spec/filters/bugs/proc.rb +39 -0
  209. data/spec/filters/bugs/range.rb +148 -0
  210. data/spec/filters/bugs/regexp.rb +168 -0
  211. data/spec/filters/bugs/set.rb +46 -3
  212. data/spec/filters/bugs/singleton.rb +1 -2
  213. data/spec/filters/bugs/string.rb +59 -90
  214. data/spec/filters/bugs/strscan.rb +80 -0
  215. data/spec/filters/bugs/struct.rb +10 -20
  216. data/spec/filters/bugs/time.rb +17 -184
  217. data/spec/filters/bugs/unboundmethod.rb +22 -0
  218. data/spec/filters/unsupported/array.rb +163 -0
  219. data/spec/filters/unsupported/basicobject.rb +14 -0
  220. data/spec/filters/unsupported/bignum.rb +46 -0
  221. data/spec/filters/unsupported/class.rb +4 -0
  222. data/spec/filters/unsupported/delegator.rb +5 -0
  223. data/spec/filters/unsupported/enumerable.rb +11 -0
  224. data/spec/filters/unsupported/enumerator.rb +8 -9
  225. data/spec/filters/unsupported/fixnum.rb +14 -0
  226. data/spec/filters/unsupported/float.rb +41 -7
  227. data/spec/filters/unsupported/freeze.rb +45 -0
  228. data/spec/filters/unsupported/hash.rb +50 -0
  229. data/spec/filters/unsupported/integer.rb +3 -0
  230. data/spec/filters/unsupported/kernel.rb +31 -0
  231. data/spec/filters/unsupported/language.rb +17 -0
  232. data/spec/filters/unsupported/matchdata.rb +30 -0
  233. data/spec/filters/unsupported/math.rb +3 -0
  234. data/spec/filters/unsupported/module.rb +5 -3
  235. data/spec/filters/unsupported/pathname.rb +3 -0
  236. data/spec/filters/unsupported/privacy.rb +136 -0
  237. data/spec/filters/unsupported/proc.rb +3 -0
  238. data/spec/filters/unsupported/regexp.rb +59 -0
  239. data/spec/filters/unsupported/set.rb +4 -0
  240. data/spec/filters/unsupported/{marshal.rb → singleton.rb} +4 -2
  241. data/spec/filters/unsupported/{mutable_strings.rb → string.rb} +456 -336
  242. data/spec/filters/unsupported/struct.rb +3 -0
  243. data/spec/filters/unsupported/symbol.rb +5 -0
  244. data/spec/filters/unsupported/taint.rb +16 -0
  245. data/spec/filters/unsupported/thread.rb +5 -0
  246. data/spec/filters/unsupported/time.rb +197 -16
  247. data/spec/lib/cli_spec.rb +14 -4
  248. data/spec/lib/compiler_spec.rb +9 -1
  249. data/spec/lib/parser/call_spec.rb +18 -0
  250. data/spec/lib/parser/not_spec.rb +2 -8
  251. data/spec/lib/sprockets_spec.rb +24 -0
  252. data/spec/opal/core/array/intersection_spec.rb +38 -0
  253. data/spec/opal/core/array/minus_spec.rb +38 -0
  254. data/spec/opal/core/array/union_spec.rb +38 -0
  255. data/spec/opal/core/array/uniq_spec.rb +49 -0
  256. data/spec/opal/core/exception_spec.rb +7 -0
  257. data/spec/opal/core/fixtures/require_tree_with_dot/file 1.rb +1 -0
  258. data/spec/opal/core/fixtures/require_tree_with_dot/file 2.rb +1 -0
  259. data/spec/opal/core/fixtures/require_tree_with_dot/file 3.rb +1 -0
  260. data/spec/opal/core/fixtures/require_tree_with_dot/index.rb +3 -0
  261. data/spec/opal/core/hash/internals_spec.rb +332 -0
  262. data/spec/opal/core/helpers_spec.rb +14 -0
  263. data/spec/opal/core/kernel/freeze_spec.rb +1 -1
  264. data/spec/opal/core/kernel/raise_spec.rb +13 -0
  265. data/spec/opal/core/kernel/require_tree_spec.rb +9 -0
  266. data/spec/opal/core/language/class_spec.rb +55 -0
  267. data/spec/opal/core/language/fixtures/send.rb +1 -0
  268. data/spec/opal/core/language/keyword_arguments_spec.rb +11 -0
  269. data/spec/opal/core/language/send_spec.rb +5 -0
  270. data/spec/opal/core/method/to_proc_spec.rb +28 -0
  271. data/spec/opal/core/module/name_spec.rb +0 -17
  272. data/spec/opal/core/runtime/bridged_classes_spec.rb +2 -2
  273. data/spec/opal/core/runtime/eval_spec.rb +1 -1
  274. data/spec/opal/core/runtime/method_missing_spec.rb +6 -0
  275. data/spec/opal/core/runtime_spec.rb +51 -0
  276. data/spec/opal/stdlib/js_spec.rb +66 -0
  277. data/spec/opal/stdlib/native/hash_spec.rb +36 -0
  278. data/spec/rubyspecs +152 -273
  279. data/spec/spec_helper.rb +10 -11
  280. data/stdlib/base64.rb +9 -9
  281. data/stdlib/benchmark.rb +551 -4
  282. data/stdlib/console.rb +94 -0
  283. data/stdlib/date.rb +1 -1
  284. data/stdlib/encoding.rb +1 -170
  285. data/stdlib/js.rb +56 -0
  286. data/stdlib/json.rb +9 -14
  287. data/stdlib/math.rb +1 -370
  288. data/stdlib/native.rb +133 -63
  289. data/stdlib/nodejs/file.rb +5 -0
  290. data/stdlib/nodejs/fileutils.rb +13 -6
  291. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +1 -1
  292. data/stdlib/opal-parser.rb +1 -2
  293. data/stdlib/ostruct.rb +65 -6
  294. data/stdlib/pp.rb +2 -4
  295. data/stdlib/rbconfig.rb +1 -3
  296. data/stdlib/strscan.rb +164 -28
  297. data/tasks/benchmarking.rake +88 -0
  298. data/tasks/testing.rake +181 -55
  299. data/{lib/mspec/opal/special_calls.rb → tasks/testing/mspec_special_calls.rb} +1 -1
  300. data/{lib/mspec/opal/sprockets.js → tasks/testing/phantomjs1-sprockets.js} +17 -6
  301. data/test/opal/test_keyword.rb +590 -0
  302. data/vendored-minitest/minitest.rb +2 -2
  303. data/vendored-minitest/test/unit.rb +5 -0
  304. metadata +229 -62
  305. data/benchmarks/operators.rb +0 -11
  306. data/benchmarks/prova.js.rb +0 -13
  307. data/docs/libraries.md +0 -36
  308. data/lib/mspec/opal/new.html.erb +0 -1
  309. data/lib/mspec/opal/rake_task.rb +0 -248
  310. data/opal/corelib/match_data.rb +0 -128
  311. data/spec/filters/bugs/math.rb +0 -95
  312. data/spec/filters/bugs/nil.rb +0 -7
  313. data/spec/filters/bugs/opal.rb +0 -9
  314. data/spec/filters/bugs/regular_expressions.rb +0 -41
  315. data/spec/filters/bugs/stringscanner.rb +0 -33
  316. data/spec/filters/unsupported/encoding.rb +0 -102
  317. data/spec/filters/unsupported/frozen.rb +0 -92
  318. data/spec/filters/unsupported/hash_compare_by_identity.rb +0 -16
  319. data/spec/filters/unsupported/integer_size.rb +0 -59
  320. data/spec/filters/unsupported/method_added.rb +0 -10
  321. data/spec/filters/unsupported/private_constants.rb +0 -30
  322. data/spec/filters/unsupported/private_methods.rb +0 -55
  323. data/spec/filters/unsupported/random.rb +0 -4
  324. data/spec/filters/unsupported/rational_numbers.rb +0 -4
  325. data/spec/filters/unsupported/regular_expressions.rb +0 -137
  326. data/spec/filters/unsupported/ruby_exe.rb +0 -5
  327. data/spec/filters/unsupported/symbols.rb +0 -17
  328. data/spec/filters/unsupported/tainted.rb +0 -180
  329. data/spec/filters/unsupported/trusted.rb +0 -88
  330. data/stdlib/process.rb +0 -10
  331. data/tasks/documenting.rake +0 -37
data/opal/corelib/proc.rb CHANGED
@@ -1,4 +1,4 @@
1
- class Proc
1
+ class Proc < `Function`
2
2
  `def.$$is_proc = true`
3
3
  `def.$$is_lambda = false`
4
4
 
@@ -34,6 +34,8 @@ class Proc
34
34
  end
35
35
 
36
36
  alias [] call
37
+ alias === call
38
+ alias yield call
37
39
 
38
40
  def to_proc
39
41
  self
@@ -47,6 +49,84 @@ class Proc
47
49
 
48
50
  # FIXME: this should support the various splats and optional arguments
49
51
  def arity
52
+ `if (self.$$is_curried) { return -1; }`
53
+ `if (self.$$arity) { return self.$$arity }`
50
54
  `self.length`
51
55
  end
56
+
57
+ def source_location
58
+ `if (self.$$is_curried) { return nil; }`
59
+ nil
60
+ end
61
+
62
+ def binding
63
+ `if (self.$$is_curried) { #{raise ArgumentError, "Can't create Binding"} }`
64
+ nil
65
+ end
66
+
67
+ def parameters
68
+ `if (self.$$is_curried) { return #{[[:rest]]}; }`
69
+ nil
70
+ end
71
+
72
+ def curry(arity = undefined)
73
+ %x{
74
+ if (arity === undefined) {
75
+ arity = self.length;
76
+ }
77
+ else {
78
+ arity = #{Opal.coerce_to!(arity, Integer, :to_int)};
79
+ if (self.$$is_lambda && arity !== self.length) {
80
+ #{raise ArgumentError, "wrong number of arguments (#{`arity`} for #{`self.length`})"}
81
+ }
82
+ }
83
+
84
+ function curried () {
85
+ var args = $slice.call(arguments),
86
+ length = args.length,
87
+ result;
88
+
89
+ if (length > arity && self.$$is_lambda && !self.$$is_curried) {
90
+ #{raise ArgumentError, "wrong number of arguments (#{`length`} for #{`arity`})"}
91
+ }
92
+
93
+ if (length >= arity) {
94
+ return self.$call.apply(self, args);
95
+ }
96
+
97
+ result = function () {
98
+ return curried.apply(null,
99
+ args.concat($slice.call(arguments)));
100
+ }
101
+ result.$$is_lambda = self.$$is_lambda;
102
+ result.$$is_curried = true;
103
+
104
+ return result;
105
+ };
106
+
107
+ curried.$$is_lambda = self.$$is_lambda;
108
+ curried.$$is_curried = true;
109
+ return curried;
110
+ }
111
+ end
112
+
113
+ def dup
114
+ %x{
115
+ var original_proc = self.$$original_proc || self,
116
+ proc = function () {
117
+ return original_proc.apply(this, arguments);
118
+ };
119
+
120
+ for (var prop in self) {
121
+ if (self.hasOwnProperty(prop)) {
122
+ proc[prop] = self[prop];
123
+ }
124
+ }
125
+
126
+ return proc;
127
+ }
128
+ end
129
+
130
+ alias clone dup
131
+
52
132
  end
@@ -0,0 +1,27 @@
1
+ class Process
2
+ CLOCK_REALTIME = 0
3
+ CLOCK_MONOTONIC = 1
4
+
5
+ def self.pid
6
+ 0
7
+ end
8
+
9
+ def self.times
10
+ t = Time.now.to_f
11
+ Benchmark::Tms.new(t, t, t, t, t)
12
+ end
13
+
14
+ def self.clock_gettime(clock_id, unit = nil)
15
+ Time.now.to_f
16
+ end
17
+ end
18
+
19
+ class Signal
20
+ def self.trap(*)
21
+ end
22
+ end
23
+
24
+ class GC
25
+ def self.start
26
+ end
27
+ end
@@ -1,3 +1,361 @@
1
+ require 'corelib/numeric'
2
+
1
3
  class Rational < Numeric
4
+ def self.reduce(num, den)
5
+ num = num.to_i
6
+ den = den.to_i
7
+
8
+ if den == 0
9
+ raise ZeroDivisionError, "divided by 0"
10
+ elsif den < 0
11
+ num = -num
12
+ den = -den
13
+ elsif den == 1
14
+ return new(num, den)
15
+ end
16
+
17
+ gcd = num.gcd(den)
18
+
19
+ new(num / gcd, den / gcd)
20
+ end
21
+
22
+ def self.convert(num, den)
23
+ if num.nil? || den.nil?
24
+ raise TypeError, "cannot convert nil into Rational"
25
+ end
26
+
27
+ if Integer === num && Integer === den
28
+ return reduce(num, den)
29
+ end
30
+
31
+ if Float === num || String === num || Complex === num
32
+ num = num.to_r
33
+ end
34
+
35
+ if Float === den || String === den || Complex === den
36
+ den = den.to_r
37
+ end
38
+
39
+ if den.equal?(1) && !(Integer === num)
40
+ Opal.coerce_to!(num, Rational, :to_r)
41
+ elsif Numeric === num && Numeric === den
42
+ num / den
43
+ else
44
+ reduce(num, den)
45
+ end
46
+ end
47
+
48
+ attr_reader :numerator, :denominator
49
+
50
+ def initialize(num, den)
51
+ @num = num
52
+ @den = den
53
+ end
54
+
55
+ def numerator
56
+ @num
57
+ end
58
+
59
+ def denominator
60
+ @den
61
+ end
62
+
63
+ def coerce(other)
64
+ case other
65
+ when Rational
66
+ [other, self]
67
+
68
+ when Integer
69
+ [other.to_r, self]
70
+
71
+ when Float
72
+ [other, to_f]
73
+ end
74
+ end
75
+
76
+ def ==(other)
77
+ case other
78
+ when Rational
79
+ @num == other.numerator && @den == other.denominator
80
+
81
+ when Integer
82
+ @num == other && @den == 1
83
+
84
+ when Float
85
+ to_f == other
86
+
87
+ else
88
+ other == self
89
+ end
90
+ end
91
+
92
+ def <=>(other)
93
+ case other
94
+ when Rational
95
+ @num * other.denominator - @den * other.numerator <=> 0
96
+
97
+ when Integer
98
+ @num - @den * other <=> 0
99
+
100
+ when Float
101
+ to_f <=> other
102
+
103
+ else
104
+ __coerced__ :<=>, other
105
+ end
106
+ end
107
+
108
+ def +(other)
109
+ case other
110
+ when Rational
111
+ num = @num * other.denominator + @den * other.numerator
112
+ den = @den * other.denominator
113
+
114
+ Rational(num, den)
115
+
116
+ when Integer
117
+ Rational(@num + other * @den, @den)
118
+
119
+ when Float
120
+ to_f + other
121
+
122
+ else
123
+ __coerced__ :+, other
124
+ end
125
+ end
126
+
127
+ def -(other)
128
+ case other
129
+ when Rational
130
+ num = @num * other.denominator - @den * other.numerator
131
+ den = @den * other.denominator
132
+
133
+ Rational(num, den)
134
+
135
+ when Integer
136
+ Rational(@num - other * @den, @den)
137
+
138
+ when Float
139
+ to_f - other
140
+
141
+ else
142
+ __coerced__ :-, other
143
+ end
144
+ end
145
+
146
+ def *(other)
147
+ case other
148
+ when Rational
149
+ num = @num * other.numerator
150
+ den = @den * other.denominator
151
+
152
+ Rational(num, den)
153
+
154
+ when Integer
155
+ Rational(@num * other, @den)
156
+
157
+ when Float
158
+ to_f * other
159
+
160
+ else
161
+ __coerced__ :*, other
162
+ end
163
+ end
164
+
165
+ def /(other)
166
+ case other
167
+ when Rational
168
+ num = @num * other.denominator
169
+ den = @den * other.numerator
170
+
171
+ Rational(num, den)
172
+
173
+ when Integer
174
+ if other == 0
175
+ to_f / 0.0
176
+ else
177
+ Rational(@num, @den * other)
178
+ end
179
+
180
+ when Float
181
+ to_f / other
182
+
183
+ else
184
+ __coerced__ :/, other
185
+ end
186
+ end
187
+
188
+ def **(other)
189
+ case other
190
+ when Integer
191
+ if self == 0 && other < 0
192
+ return Float::INFINITY
193
+ elsif other > 0
194
+ Rational(@num ** other, @den ** other)
195
+ elsif other < 0
196
+ Rational(@den ** -other, @num ** -other)
197
+ else
198
+ Rational(1, 1)
199
+ end
200
+
201
+ when Float
202
+ to_f ** other
203
+
204
+ when Rational
205
+ if other == 0
206
+ Rational(1, 1)
207
+ elsif other.denominator == 1
208
+ if other < 0
209
+ Rational(@den ** other.numerator.abs, @num ** other.numerator.abs)
210
+ else
211
+ Rational(@num ** other.numerator, @den ** other.numerator)
212
+ end
213
+ elsif self == 0 && other < 0
214
+ raise ZeroDivisionError, "divided by 0"
215
+ else
216
+ to_f ** other
217
+ end
218
+
219
+ else
220
+ __coerced__ :**, other
221
+ end
222
+ end
223
+
224
+ def abs
225
+ Rational(@num.abs, @den.abs)
226
+ end
227
+
228
+ def ceil(precision = 0)
229
+ if precision == 0
230
+ (-(-@num / @den)).ceil
231
+ else
232
+ with_precision(:ceil, precision)
233
+ end
234
+ end
235
+
236
+ alias divide /
237
+
238
+ def floor(precision = 0)
239
+ if precision == 0
240
+ (-(-@num / @den)).floor
241
+ else
242
+ with_precision(:floor, precision)
243
+ end
244
+ end
245
+
246
+ def hash
247
+ "Rational:#@num:#@den"
248
+ end
249
+
250
+ def inspect
251
+ "(#{to_s})"
252
+ end
253
+
254
+ alias quo /
255
+
256
+ def rationalize(eps = undefined)
257
+ %x{
258
+ if (arguments.length > 1) {
259
+ #{raise ArgumentError, "wrong number of arguments (#{`arguments.length`} for 0..1)"};
260
+ }
261
+
262
+ if (eps == null) {
263
+ return self;
264
+ }
265
+
266
+ var e = #{eps.abs},
267
+ a = #{self - `e`},
268
+ b = #{self + `e`};
269
+
270
+ var p0 = 0,
271
+ p1 = 1,
272
+ q0 = 1,
273
+ q1 = 0,
274
+ p2, q2;
275
+
276
+ var c, k, t;
277
+
278
+ while (true) {
279
+ c = #{`a`.ceil};
280
+
281
+ if (#{`c` <= `b`}) {
282
+ break;
283
+ }
284
+
285
+ k = c - 1;
286
+ p2 = k * p1 + p0;
287
+ q2 = k * q1 + q0;
288
+ t = #{1 / (`b` - `k`)};
289
+ b = #{1 / (`a` - `k`)};
290
+ a = t;
291
+
292
+ p0 = p1;
293
+ q0 = q1;
294
+ p1 = p2;
295
+ q1 = q2;
296
+ }
297
+
298
+ return #{Rational(`c * p1 + p0`, `c * q1 + q0`)};
299
+ }
300
+ end
301
+
302
+ def round(precision = 0)
303
+ return with_precision(:round, precision) unless precision == 0
304
+ return 0 if @num == 0
305
+ return @num if @den == 1
306
+
307
+ num = @num.abs * 2 + @den
308
+ den = @den * 2
309
+
310
+ approx = (num / den).truncate
311
+
312
+ if @num < 0
313
+ -approx
314
+ else
315
+ approx
316
+ end
317
+ end
318
+
319
+ def to_f
320
+ @num / @den
321
+ end
322
+
323
+ def to_i
324
+ truncate
325
+ end
326
+
327
+ def to_r
328
+ self
329
+ end
330
+
331
+ def to_s
332
+ "#@num/#@den"
333
+ end
334
+
335
+ def truncate(precision = 0)
336
+ if precision == 0
337
+ @num < 0 ? ceil : floor
338
+ else
339
+ with_precision(:truncate, precision)
340
+ end
341
+ end
342
+
343
+ def with_precision(method, precision)
344
+ raise TypeError, "not an Integer" unless Integer === precision
345
+
346
+ p = 10 ** precision
347
+ s = self * p
348
+
349
+ if precision < 1
350
+ (s.send(method) / p).to_i
351
+ else
352
+ Rational(s.send(method), p)
353
+ end
354
+ end
355
+ end
2
356
 
357
+ module Kernel
358
+ def Rational(numerator, denominator = 1)
359
+ Rational.convert(numerator, denominator)
360
+ end
3
361
  end