opal 1.3.2 → 1.4.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (222) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +1 -0
  3. data/.github/workflows/build.yml +0 -3
  4. data/.rubocop.yml +5 -1
  5. data/UNRELEASED.md +66 -2
  6. data/benchmark-ips/bm_truthy.rb +30 -0
  7. data/bin/opal-mspec +1 -3
  8. data/bin/opal-repl +1 -2
  9. data/bin/remove-filters +1 -4
  10. data/docs/compiled_ruby.md +10 -6
  11. data/exe/opal-repl +1 -3
  12. data/lib/opal/ast/builder.rb +1 -1
  13. data/lib/opal/cli.rb +2 -2
  14. data/lib/opal/cli_runners/nodejs.rb +9 -2
  15. data/lib/opal/cli_runners/source-map-support-browser.js +80 -216
  16. data/lib/opal/cli_runners/source-map-support-node.js +80 -216
  17. data/lib/opal/cli_runners/source-map-support.js +5 -1
  18. data/lib/opal/cli_runners/system_runner.rb +10 -4
  19. data/lib/opal/compiler.rb +3 -5
  20. data/lib/opal/fragment.rb +5 -1
  21. data/lib/opal/nodes/args/extract_block_arg.rb +1 -8
  22. data/lib/opal/nodes/args/extract_kwoptarg.rb +1 -3
  23. data/lib/opal/nodes/args/extract_optarg.rb +1 -3
  24. data/lib/opal/nodes/args/extract_post_arg.rb +2 -5
  25. data/lib/opal/nodes/args/extract_post_optarg.rb +2 -7
  26. data/lib/opal/nodes/args/initialize_iterarg.rb +1 -3
  27. data/lib/opal/nodes/args/prepare_post_args.rb +5 -1
  28. data/lib/opal/nodes/base.rb +3 -2
  29. data/lib/opal/nodes/call.rb +20 -9
  30. data/lib/opal/nodes/call_special.rb +50 -0
  31. data/lib/opal/nodes/class.rb +24 -15
  32. data/lib/opal/nodes/constants.rb +23 -5
  33. data/lib/opal/nodes/def.rb +20 -23
  34. data/lib/opal/nodes/defined.rb +5 -5
  35. data/lib/opal/nodes/definitions.rb +2 -2
  36. data/lib/opal/nodes/defs.rb +2 -5
  37. data/lib/opal/nodes/helpers.rb +48 -18
  38. data/lib/opal/nodes/if.rb +109 -8
  39. data/lib/opal/nodes/iter.rb +23 -16
  40. data/lib/opal/nodes/literal.rb +18 -4
  41. data/lib/opal/nodes/logic.rb +2 -1
  42. data/lib/opal/nodes/masgn.rb +4 -9
  43. data/lib/opal/nodes/module.rb +29 -19
  44. data/lib/opal/nodes/node_with_args.rb +1 -7
  45. data/lib/opal/nodes/scope.rb +54 -15
  46. data/lib/opal/nodes/singleton_class.rb +5 -3
  47. data/lib/opal/nodes/super.rb +3 -3
  48. data/lib/opal/nodes/top.rb +34 -31
  49. data/lib/opal/nodes/variables.rb +2 -2
  50. data/lib/opal/nodes/x_string.rb +3 -0
  51. data/lib/opal/nodes.rb +0 -1
  52. data/lib/opal/parser/patch.rb +75 -0
  53. data/lib/opal/parser/with_ruby_lexer.rb +1 -1
  54. data/lib/opal/regexp_anchors.rb +7 -7
  55. data/lib/opal/requires.rb +19 -0
  56. data/lib/opal/rewriters/pattern_matching.rb +1 -1
  57. data/lib/opal/rewriters/returnable_logic.rb +102 -4
  58. data/lib/opal/util.rb +2 -2
  59. data/lib/opal/version.rb +1 -1
  60. data/lib/opal.rb +1 -17
  61. data/opal/corelib/array/pack.rb +11 -11
  62. data/opal/corelib/array.rb +193 -152
  63. data/opal/corelib/basic_object.rb +14 -14
  64. data/opal/corelib/binding.rb +7 -7
  65. data/opal/corelib/boolean.rb +12 -15
  66. data/opal/corelib/class.rb +23 -1
  67. data/opal/corelib/comparable.rb +8 -8
  68. data/opal/corelib/complex/base.rb +2 -2
  69. data/opal/corelib/complex.rb +79 -88
  70. data/opal/corelib/constants.rb +9 -9
  71. data/opal/corelib/dir.rb +4 -3
  72. data/opal/corelib/enumerable.rb +140 -127
  73. data/opal/corelib/enumerator/arithmetic_sequence.rb +177 -0
  74. data/opal/corelib/enumerator/chain.rb +42 -0
  75. data/opal/corelib/enumerator/generator.rb +35 -0
  76. data/opal/corelib/enumerator/lazy.rb +243 -0
  77. data/opal/corelib/enumerator/yielder.rb +36 -0
  78. data/opal/corelib/enumerator.rb +45 -300
  79. data/opal/corelib/error/errno.rb +47 -0
  80. data/opal/corelib/error.rb +62 -60
  81. data/opal/corelib/file.rb +26 -12
  82. data/opal/corelib/hash.rb +98 -107
  83. data/opal/corelib/helpers.rb +62 -13
  84. data/opal/corelib/io.rb +47 -34
  85. data/opal/corelib/kernel/format.rb +29 -29
  86. data/opal/corelib/kernel.rb +86 -83
  87. data/opal/corelib/main.rb +14 -12
  88. data/opal/corelib/marshal/read_buffer.rb +15 -15
  89. data/opal/corelib/marshal/write_buffer.rb +45 -44
  90. data/opal/corelib/marshal.rb +3 -3
  91. data/opal/corelib/math.rb +50 -50
  92. data/opal/corelib/method.rb +12 -8
  93. data/opal/corelib/module.rb +96 -79
  94. data/opal/corelib/nil.rb +9 -11
  95. data/opal/corelib/number.rb +113 -118
  96. data/opal/corelib/numeric.rb +37 -33
  97. data/opal/corelib/object_space.rb +11 -10
  98. data/opal/corelib/pack_unpack/format_string_parser.rb +3 -3
  99. data/opal/corelib/pattern_matching/base.rb +7 -7
  100. data/opal/corelib/pattern_matching.rb +1 -1
  101. data/opal/corelib/proc.rb +15 -16
  102. data/opal/corelib/process/base.rb +2 -2
  103. data/opal/corelib/process/status.rb +21 -0
  104. data/opal/corelib/process.rb +5 -5
  105. data/opal/corelib/random/formatter.rb +11 -11
  106. data/opal/corelib/random/math_random.js.rb +1 -1
  107. data/opal/corelib/random/mersenne_twister.rb +3 -3
  108. data/opal/corelib/random/seedrandom.js.rb +3 -3
  109. data/opal/corelib/random.rb +17 -17
  110. data/opal/corelib/range.rb +51 -35
  111. data/opal/corelib/rational/base.rb +4 -4
  112. data/opal/corelib/rational.rb +61 -62
  113. data/opal/corelib/regexp.rb +47 -38
  114. data/opal/corelib/runtime.js +245 -139
  115. data/opal/corelib/string/encoding.rb +21 -21
  116. data/opal/corelib/string/unpack.rb +19 -14
  117. data/opal/corelib/string.rb +135 -128
  118. data/opal/corelib/struct.rb +59 -46
  119. data/opal/corelib/time.rb +47 -57
  120. data/opal/corelib/trace_point.rb +2 -2
  121. data/opal/corelib/unsupported.rb +31 -120
  122. data/opal/corelib/variables.rb +3 -3
  123. data/opal/opal/base.rb +9 -8
  124. data/opal/opal/full.rb +8 -8
  125. data/opal/opal/mini.rb +17 -17
  126. data/opal/opal.rb +17 -18
  127. data/opal.gemspec +1 -1
  128. data/spec/filters/bugs/array.rb +4 -24
  129. data/spec/filters/bugs/bigdecimal.rb +0 -23
  130. data/spec/filters/bugs/binding.rb +0 -1
  131. data/spec/filters/bugs/boolean.rb +3 -0
  132. data/spec/filters/bugs/class.rb +2 -0
  133. data/spec/filters/bugs/date.rb +0 -5
  134. data/spec/filters/bugs/encoding.rb +8 -50
  135. data/spec/filters/bugs/enumerable.rb +4 -1
  136. data/spec/filters/bugs/enumerator.rb +3 -36
  137. data/spec/filters/bugs/exception.rb +0 -2
  138. data/spec/filters/bugs/file.rb +0 -2
  139. data/spec/filters/bugs/float.rb +0 -3
  140. data/spec/filters/bugs/hash.rb +5 -3
  141. data/spec/filters/bugs/integer.rb +2 -3
  142. data/spec/filters/bugs/kernel.rb +2 -31
  143. data/spec/filters/bugs/language.rb +29 -49
  144. data/spec/filters/bugs/main.rb +0 -2
  145. data/spec/filters/bugs/marshal.rb +2 -3
  146. data/spec/filters/bugs/matrix.rb +0 -36
  147. data/spec/filters/bugs/module.rb +7 -61
  148. data/spec/filters/bugs/numeric.rb +0 -7
  149. data/spec/filters/bugs/objectspace.rb +1 -1
  150. data/spec/filters/bugs/pack_unpack.rb +0 -4
  151. data/spec/filters/bugs/proc.rb +0 -9
  152. data/spec/filters/bugs/random.rb +0 -5
  153. data/spec/filters/bugs/range.rb +1 -6
  154. data/spec/filters/bugs/regexp.rb +0 -3
  155. data/spec/filters/bugs/set.rb +8 -1
  156. data/spec/filters/bugs/string.rb +9 -34
  157. data/spec/filters/bugs/stringscanner.rb +8 -7
  158. data/spec/filters/bugs/struct.rb +2 -3
  159. data/spec/filters/bugs/symbol.rb +0 -1
  160. data/spec/filters/bugs/time.rb +0 -8
  161. data/spec/filters/bugs/unboundmethod.rb +0 -8
  162. data/spec/filters/bugs/warnings.rb +1 -7
  163. data/spec/filters/unsupported/freeze.rb +24 -0
  164. data/spec/filters/unsupported/integer.rb +1 -0
  165. data/spec/filters/unsupported/kernel.rb +12 -0
  166. data/spec/filters/unsupported/privacy.rb +3 -0
  167. data/spec/filters/unsupported/string.rb +2 -0
  168. data/spec/lib/builder_spec.rb +2 -2
  169. data/spec/lib/cli_spec.rb +1 -1
  170. data/spec/lib/compiler_spec.rb +37 -37
  171. data/spec/lib/simple_server_spec.rb +2 -2
  172. data/spec/lib/source_map/file_spec.rb +1 -1
  173. data/spec/opal/compiler/irb_spec.rb +2 -2
  174. data/spec/opal/core/kernel/puts_spec.rb +90 -0
  175. data/spec/opal/core/language/super_spec.rb +24 -0
  176. data/spec/ruby_specs +4 -2
  177. data/spec/support/rewriters_helper.rb +1 -1
  178. data/stdlib/bigdecimal.rb +7 -11
  179. data/stdlib/buffer/view.rb +2 -2
  180. data/stdlib/buffer.rb +2 -2
  181. data/stdlib/date.rb +5 -6
  182. data/stdlib/erb.rb +1 -0
  183. data/stdlib/js.rb +2 -1
  184. data/stdlib/native.rb +7 -8
  185. data/stdlib/nodejs/argf.rb +4 -4
  186. data/stdlib/nodejs/base.rb +29 -0
  187. data/stdlib/nodejs/dir.rb +1 -1
  188. data/stdlib/nodejs/env.rb +6 -9
  189. data/stdlib/nodejs/file.rb +23 -17
  190. data/stdlib/nodejs/fileutils.rb +3 -3
  191. data/stdlib/nodejs/io.rb +2 -20
  192. data/stdlib/nodejs/irb.rb +0 -0
  193. data/stdlib/nodejs/kernel.rb +2 -37
  194. data/stdlib/nodejs.rb +1 -3
  195. data/stdlib/opal/miniracer.rb +2 -0
  196. data/stdlib/opal/platform.rb +6 -13
  197. data/stdlib/opal/replutils.rb +16 -5
  198. data/stdlib/opal-parser.rb +2 -2
  199. data/stdlib/optparse/ac.rb +54 -0
  200. data/stdlib/optparse/date.rb +14 -0
  201. data/stdlib/optparse/kwargs.rb +22 -0
  202. data/stdlib/optparse/shellwords.rb +7 -0
  203. data/stdlib/optparse/time.rb +15 -0
  204. data/stdlib/optparse/uri.rb +7 -0
  205. data/stdlib/optparse/version.rb +69 -0
  206. data/stdlib/optparse.rb +2279 -0
  207. data/stdlib/pathname.rb +5 -6
  208. data/stdlib/pp.rb +18 -2
  209. data/stdlib/promise/v2.rb +18 -22
  210. data/stdlib/promise.rb +15 -21
  211. data/stdlib/set.rb +32 -32
  212. data/stdlib/shellwords.rb +240 -0
  213. data/stdlib/stringio.rb +3 -6
  214. data/stdlib/strscan.rb +5 -8
  215. data/stdlib/template.rb +2 -2
  216. data/stdlib/thread.rb +7 -9
  217. data/tasks/performance.rake +5 -2
  218. data/tasks/testing/mspec_special_calls.rb +0 -12
  219. data/tasks/testing.rake +55 -37
  220. data/test/nodejs/test_file.rb +11 -0
  221. metadata +55 -10
  222. data/lib/opal/nodes/case.rb +0 -114
@@ -1,15 +1,15 @@
1
1
  require 'corelib/enumerable'
2
2
 
3
- class Range
4
- include Enumerable
3
+ class ::Range
4
+ include ::Enumerable
5
5
 
6
6
  `self.$$prototype.$$is_range = true`
7
7
 
8
8
  attr_reader :begin, :end
9
9
 
10
10
  def initialize(first, last, exclude = false)
11
- raise NameError, "'initialize' called twice" if @begin
12
- raise ArgumentError, 'bad value for range' unless first <=> last || first.nil? || last.nil?
11
+ ::Kernel.raise ::NameError, "'initialize' called twice" if @begin
12
+ ::Kernel.raise ::ArgumentError, 'bad value for range' unless first <=> last || first.nil? || last.nil?
13
13
 
14
14
  @begin = first
15
15
  @end = last
@@ -31,13 +31,13 @@ class Range
31
31
 
32
32
  def count(&block)
33
33
  if !block_given? && `is_infinite(self)`
34
- return Float::INFINITY
34
+ return ::Float::INFINITY
35
35
  end
36
36
  super
37
37
  end
38
38
 
39
39
  def to_a
40
- raise TypeError, 'cannot convert endless range to an array' if `is_infinite(self)`
40
+ ::Kernel.raise ::TypeError, 'cannot convert endless range to an array' if `is_infinite(self)`
41
41
  super
42
42
  end
43
43
 
@@ -59,7 +59,7 @@ class Range
59
59
 
60
60
  if (#{@begin}.$$is_number && #{@end}.$$is_number) {
61
61
  if (#{@begin} % 1 !== 0 || #{@end} % 1 !== 0) {
62
- #{raise TypeError, "can't iterate from Float"}
62
+ #{::Kernel.raise ::TypeError, "can't iterate from Float"}
63
63
  }
64
64
 
65
65
  for (i = #{@begin}, limit = #{@end} + #{@excl ? 0 : 1}; i < limit; i++) {
@@ -79,7 +79,7 @@ class Range
79
79
  last = @end
80
80
 
81
81
  unless current.respond_to?(:succ)
82
- raise TypeError, "can't iterate from #{current.class}"
82
+ ::Kernel.raise ::TypeError, "can't iterate from #{current.class}"
83
83
  end
84
84
 
85
85
  while @end.nil? || (current <=> last) < 0
@@ -94,29 +94,25 @@ class Range
94
94
  end
95
95
 
96
96
  def eql?(other)
97
- return false unless Range === other
97
+ return false unless ::Range === other
98
98
 
99
99
  @excl === other.exclude_end? &&
100
100
  @begin.eql?(other.begin) &&
101
101
  @end.eql?(other.end)
102
102
  end
103
103
 
104
- alias == eql?
105
-
106
104
  def exclude_end?
107
105
  @excl
108
106
  end
109
107
 
110
108
  def first(n = undefined)
111
- raise RangeError, 'cannot get the minimum of beginless range' if @begin.nil?
109
+ ::Kernel.raise ::RangeError, 'cannot get the minimum of beginless range' if @begin.nil?
112
110
  return @begin if `n == null`
113
111
  super
114
112
  end
115
113
 
116
- alias include? cover?
117
-
118
114
  def last(n = undefined)
119
- raise RangeError, 'cannot get the maximum of endless range' if @end.nil?
115
+ ::Kernel.raise ::RangeError, 'cannot get the maximum of endless range' if @end.nil?
120
116
  return @end if `n == null`
121
117
  to_a.last(n)
122
118
  end
@@ -124,7 +120,7 @@ class Range
124
120
  # FIXME: currently hardcoded to assume range holds numerics
125
121
  def max
126
122
  if @end.nil?
127
- raise RangeError, 'cannot get the maximum of endless range'
123
+ ::Kernel.raise ::RangeError, 'cannot get the maximum of endless range'
128
124
  elsif block_given?
129
125
  super
130
126
  elsif !@begin.nil? && (@begin > @end ||
@@ -135,11 +131,9 @@ class Range
135
131
  end
136
132
  end
137
133
 
138
- alias member? cover?
139
-
140
134
  def min
141
135
  if @begin.nil?
142
- raise RangeError, 'cannot get the minimum of beginless range'
136
+ ::Kernel.raise ::RangeError, 'cannot get the minimum of beginless range'
143
137
  elsif block_given?
144
138
  super
145
139
  elsif !@end.nil? && (@begin > @end ||
@@ -151,11 +145,11 @@ class Range
151
145
  end
152
146
 
153
147
  def size
154
- infinity = Float::INFINITY
148
+ infinity = ::Float::INFINITY
155
149
 
156
150
  return 0 if (@begin == infinity && !@end.nil?) || (@end == -infinity && !@begin.nil?)
157
151
  return infinity if `is_infinite(self)`
158
- return nil unless Numeric === @begin && Numeric === @end
152
+ return nil unless ::Numeric === @begin && ::Numeric === @end
159
153
 
160
154
  range_begin = @begin
161
155
  range_end = @end
@@ -166,17 +160,20 @@ class Range
166
160
  `Math.abs(range_end - range_begin) + 1`.to_i
167
161
  end
168
162
 
169
- def step(n = 1)
163
+ def step(n = undefined)
170
164
  %x{
171
165
  function coerceStepSize() {
172
- if (!n.$$is_number) {
173
- n = #{Opal.coerce_to!(n, Integer, :to_int)}
166
+ if (n == null) {
167
+ n = 1;
168
+ }
169
+ else if (!n.$$is_number) {
170
+ n = #{::Opal.coerce_to!(n, ::Integer, :to_int)}
174
171
  }
175
172
 
176
173
  if (n < 0) {
177
- #{raise ArgumentError, "step can't be negative"}
174
+ #{::Kernel.raise ::ArgumentError, "step can't be negative"}
178
175
  } else if (n === 0) {
179
- #{raise ArgumentError, "step can't be 0"}
176
+ #{::Kernel.raise ::ArgumentError, "step can't be 0"}
180
177
  }
181
178
  }
182
179
 
@@ -195,7 +192,7 @@ class Range
195
192
  // n is a float
196
193
  var begin = self.begin, end = self.end,
197
194
  abs = Math.abs, floor = Math.floor,
198
- err = (abs(begin) + abs(end) + abs(end - begin)) / abs(n) * #{Float::EPSILON},
195
+ err = (abs(begin) + abs(end) + abs(end - begin)) / abs(n) * #{::Float::EPSILON},
199
196
  size;
200
197
 
201
198
  if (err > 0.5) {
@@ -217,11 +214,18 @@ class Range
217
214
  }
218
215
 
219
216
  unless block_given?
220
- return enum_for(:step, n) do
221
- %x{
222
- coerceStepSize();
223
- return enumeratorSize();
224
- }
217
+ if (@begin.is_a?(Numeric) || @begin.nil?) &&
218
+ (@end.is_a?(Numeric) || @end.nil?) &&
219
+ !(@begin.nil? && @end.nil?)
220
+
221
+ return ::Enumerator::ArithmeticSequence.new(self, n, :step)
222
+ else
223
+ return enum_for(:step, n) do
224
+ %x{
225
+ coerceStepSize();
226
+ return enumeratorSize();
227
+ }
228
+ end
225
229
  end
226
230
  end
227
231
 
@@ -242,7 +246,7 @@ class Range
242
246
  else
243
247
  %x{
244
248
  if (#{@begin}.$$is_string && #{@end}.$$is_string && n % 1 !== 0) {
245
- #{raise TypeError, 'no implicit conversion to float from string'}
249
+ #{::Kernel.raise ::TypeError, 'no implicit conversion to float from string'}
246
250
  }
247
251
  }
248
252
  each_with_index do |value, idx|
@@ -252,15 +256,23 @@ class Range
252
256
  self
253
257
  end
254
258
 
259
+ def %(n)
260
+ if @begin.is_a?(Numeric) && @end.is_a?(Numeric)
261
+ ::Enumerator::ArithmeticSequence.new(self, n, :%)
262
+ else
263
+ step(n)
264
+ end
265
+ end
266
+
255
267
  def bsearch(&block)
256
268
  return enum_for(:bsearch) unless block_given?
257
269
 
258
270
  if `is_infinite(self) && (self.begin.$$is_number || self.end.$$is_number)`
259
- raise NotImplementedError, "Can't #bsearch an infinite range"
271
+ ::Kernel.raise ::NotImplementedError, "Can't #bsearch an infinite range"
260
272
  end
261
273
 
262
274
  unless `self.begin.$$is_number && self.end.$$is_number`
263
- raise TypeError, "can't do binary search for #{@begin.class}"
275
+ ::Kernel.raise ::TypeError, "can't do binary search for #{@begin.class}"
264
276
  end
265
277
 
266
278
  to_a.bsearch(&block)
@@ -283,4 +295,8 @@ class Range
283
295
  def hash
284
296
  [@begin, @end, @excl].hash
285
297
  end
298
+
299
+ alias == eql?
300
+ alias include? cover?
301
+ alias member? cover?
286
302
  end
@@ -1,11 +1,11 @@
1
- module Kernel
1
+ module ::Kernel
2
2
  def Rational(numerator, denominator = 1)
3
- Rational.convert(numerator, denominator)
3
+ ::Rational.convert(numerator, denominator)
4
4
  end
5
5
  end
6
6
 
7
- class String
7
+ class ::String
8
8
  def to_r
9
- Rational.from_string(self)
9
+ ::Rational.from_string(self)
10
10
  end
11
11
  end
@@ -1,13 +1,13 @@
1
1
  require 'corelib/numeric'
2
2
  require 'corelib/rational/base'
3
3
 
4
- class Rational < Numeric
4
+ class ::Rational < ::Numeric
5
5
  def self.reduce(num, den)
6
6
  num = num.to_i
7
7
  den = den.to_i
8
8
 
9
9
  if den == 0
10
- raise ZeroDivisionError, 'divided by 0'
10
+ ::Kernel.raise ::ZeroDivisionError, 'divided by 0'
11
11
  elsif den < 0
12
12
  num = -num
13
13
  den = -den
@@ -22,24 +22,24 @@ class Rational < Numeric
22
22
 
23
23
  def self.convert(num, den)
24
24
  if num.nil? || den.nil?
25
- raise TypeError, 'cannot convert nil into Rational'
25
+ ::Kernel.raise ::TypeError, 'cannot convert nil into Rational'
26
26
  end
27
27
 
28
- if Integer === num && Integer === den
28
+ if ::Integer === num && ::Integer === den
29
29
  return reduce(num, den)
30
30
  end
31
31
 
32
- if Float === num || String === num || Complex === num
32
+ if ::Float === num || ::String === num || ::Complex === num
33
33
  num = num.to_r
34
34
  end
35
35
 
36
- if Float === den || String === den || Complex === den
36
+ if ::Float === den || ::String === den || ::Complex === den
37
37
  den = den.to_r
38
38
  end
39
39
 
40
- if den.equal?(1) && !(Integer === num)
41
- Opal.coerce_to!(num, Rational, :to_r)
42
- elsif Numeric === num && Numeric === den
40
+ if den.equal?(1) && !(::Integer === num)
41
+ ::Opal.coerce_to!(num, ::Rational, :to_r)
42
+ elsif ::Numeric === num && ::Numeric === den
43
43
  num / den
44
44
  else
45
45
  reduce(num, den)
@@ -61,26 +61,26 @@ class Rational < Numeric
61
61
 
62
62
  def coerce(other)
63
63
  case other
64
- when Rational
64
+ when ::Rational
65
65
  [other, self]
66
66
 
67
- when Integer
67
+ when ::Integer
68
68
  [other.to_r, self]
69
69
 
70
- when Float
70
+ when ::Float
71
71
  [other, to_f]
72
72
  end
73
73
  end
74
74
 
75
75
  def ==(other)
76
76
  case other
77
- when Rational
77
+ when ::Rational
78
78
  @num == other.numerator && @den == other.denominator
79
79
 
80
- when Integer
80
+ when ::Integer
81
81
  @num == other && @den == 1
82
82
 
83
- when Float
83
+ when ::Float
84
84
  to_f == other
85
85
 
86
86
  else
@@ -90,13 +90,13 @@ class Rational < Numeric
90
90
 
91
91
  def <=>(other)
92
92
  case other
93
- when Rational
93
+ when ::Rational
94
94
  @num * other.denominator - @den * other.numerator <=> 0
95
95
 
96
- when Integer
96
+ when ::Integer
97
97
  @num - @den * other <=> 0
98
98
 
99
- when Float
99
+ when ::Float
100
100
  to_f <=> other
101
101
 
102
102
  else
@@ -106,16 +106,16 @@ class Rational < Numeric
106
106
 
107
107
  def +(other)
108
108
  case other
109
- when Rational
109
+ when ::Rational
110
110
  num = @num * other.denominator + @den * other.numerator
111
111
  den = @den * other.denominator
112
112
 
113
- Rational(num, den)
113
+ ::Kernel.Rational(num, den)
114
114
 
115
- when Integer
116
- Rational(@num + other * @den, @den)
115
+ when ::Integer
116
+ ::Kernel.Rational(@num + other * @den, @den)
117
117
 
118
- when Float
118
+ when ::Float
119
119
  to_f + other
120
120
 
121
121
  else
@@ -125,16 +125,16 @@ class Rational < Numeric
125
125
 
126
126
  def -(other)
127
127
  case other
128
- when Rational
128
+ when ::Rational
129
129
  num = @num * other.denominator - @den * other.numerator
130
130
  den = @den * other.denominator
131
131
 
132
- Rational(num, den)
132
+ ::Kernel.Rational(num, den)
133
133
 
134
- when Integer
135
- Rational(@num - other * @den, @den)
134
+ when ::Integer
135
+ ::Kernel.Rational(@num - other * @den, @den)
136
136
 
137
- when Float
137
+ when ::Float
138
138
  to_f - other
139
139
 
140
140
  else
@@ -144,16 +144,16 @@ class Rational < Numeric
144
144
 
145
145
  def *(other)
146
146
  case other
147
- when Rational
147
+ when ::Rational
148
148
  num = @num * other.numerator
149
149
  den = @den * other.denominator
150
150
 
151
- Rational(num, den)
151
+ ::Kernel.Rational(num, den)
152
152
 
153
- when Integer
154
- Rational(@num * other, @den)
153
+ when ::Integer
154
+ ::Kernel.Rational(@num * other, @den)
155
155
 
156
- when Float
156
+ when ::Float
157
157
  to_f * other
158
158
 
159
159
  else
@@ -163,20 +163,20 @@ class Rational < Numeric
163
163
 
164
164
  def /(other)
165
165
  case other
166
- when Rational
166
+ when ::Rational
167
167
  num = @num * other.denominator
168
168
  den = @den * other.numerator
169
169
 
170
- Rational(num, den)
170
+ ::Kernel.Rational(num, den)
171
171
 
172
- when Integer
172
+ when ::Integer
173
173
  if other == 0
174
174
  to_f / 0.0
175
175
  else
176
- Rational(@num, @den * other)
176
+ ::Kernel.Rational(@num, @den * other)
177
177
  end
178
178
 
179
- when Float
179
+ when ::Float
180
180
  to_f / other
181
181
 
182
182
  else
@@ -186,31 +186,31 @@ class Rational < Numeric
186
186
 
187
187
  def **(other)
188
188
  case other
189
- when Integer
189
+ when ::Integer
190
190
  if self == 0 && other < 0
191
- Float::INFINITY
191
+ ::Float::INFINITY
192
192
  elsif other > 0
193
- Rational(@num**other, @den**other)
193
+ ::Kernel.Rational(@num**other, @den**other)
194
194
  elsif other < 0
195
- Rational(@den**-other, @num**-other)
195
+ ::Kernel.Rational(@den**-other, @num**-other)
196
196
  else
197
- Rational(1, 1)
197
+ ::Kernel.Rational(1, 1)
198
198
  end
199
199
 
200
- when Float
200
+ when ::Float
201
201
  to_f**other
202
202
 
203
- when Rational
203
+ when ::Rational
204
204
  if other == 0
205
- Rational(1, 1)
205
+ ::Kernel.Rational(1, 1)
206
206
  elsif other.denominator == 1
207
207
  if other < 0
208
- Rational(@den**other.numerator.abs, @num**other.numerator.abs)
208
+ ::Kernel.Rational(@den**other.numerator.abs, @num**other.numerator.abs)
209
209
  else
210
- Rational(@num**other.numerator, @den**other.numerator)
210
+ ::Kernel.Rational(@num**other.numerator, @den**other.numerator)
211
211
  end
212
212
  elsif self == 0 && other < 0
213
- raise ZeroDivisionError, 'divided by 0'
213
+ ::Kernel.raise ::ZeroDivisionError, 'divided by 0'
214
214
  else
215
215
  to_f**other
216
216
  end
@@ -221,7 +221,7 @@ class Rational < Numeric
221
221
  end
222
222
 
223
223
  def abs
224
- Rational(@num.abs, @den.abs)
224
+ ::Kernel.Rational(@num.abs, @den.abs)
225
225
  end
226
226
 
227
227
  def ceil(precision = 0)
@@ -232,8 +232,6 @@ class Rational < Numeric
232
232
  end
233
233
  end
234
234
 
235
- alias divide /
236
-
237
235
  def floor(precision = 0)
238
236
  if precision == 0
239
237
  (-(-@num / @den)).floor
@@ -250,12 +248,10 @@ class Rational < Numeric
250
248
  "(#{self})"
251
249
  end
252
250
 
253
- alias quo /
254
-
255
251
  def rationalize(eps = undefined)
256
252
  %x{
257
253
  if (arguments.length > 1) {
258
- #{raise ArgumentError, "wrong number of arguments (#{`arguments.length`} for 0..1)"};
254
+ #{::Kernel.raise ::ArgumentError, "wrong number of arguments (#{`arguments.length`} for 0..1)"};
259
255
  }
260
256
 
261
257
  if (eps == null) {
@@ -294,7 +290,7 @@ class Rational < Numeric
294
290
  q1 = q2;
295
291
  }
296
292
 
297
- return #{Rational(`c * p1 + p0`, `c * q1 + q0`)};
293
+ return #{::Kernel.Rational(`c * p1 + p0`, `c * q1 + q0`)};
298
294
  }
299
295
  end
300
296
 
@@ -340,7 +336,7 @@ class Rational < Numeric
340
336
  end
341
337
 
342
338
  def with_precision(method, precision)
343
- raise TypeError, 'not an Integer' unless Integer === precision
339
+ ::Kernel.raise ::TypeError, 'not an Integer' unless ::Integer === precision
344
340
 
345
341
  p = 10**precision
346
342
  s = self * p
@@ -348,7 +344,7 @@ class Rational < Numeric
348
344
  if precision < 1
349
345
  (s.send(method) / p).to_i
350
346
  else
351
- Rational(s.send(method), p)
347
+ ::Kernel.Rational(s.send(method), p)
352
348
  end
353
349
  end
354
350
 
@@ -379,16 +375,19 @@ class Rational < Numeric
379
375
 
380
376
  if (isFloat()) {
381
377
  denominator = parseFloat(cutFloat());
382
- return #{Rational(`numerator`, `denominator`)};
378
+ return #{::Kernel.Rational(`numerator`, `denominator`)};
383
379
  } else {
384
- return #{Rational(`numerator`, 1)};
380
+ return #{::Kernel.Rational(`numerator`, 1)};
385
381
  }
386
382
  } else {
387
- return #{Rational(`numerator`, 1)};
383
+ return #{::Kernel.Rational(`numerator`, 1)};
388
384
  }
389
385
  } else {
390
- return #{Rational(0, 1)};
386
+ return #{::Kernel.Rational(0, 1)};
391
387
  }
392
388
  }
393
389
  end
390
+
391
+ alias divide /
392
+ alias quo /
394
393
  end