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.
- checksums.yaml +4 -4
- data/.eslintrc.js +1 -0
- data/.github/workflows/build.yml +0 -3
- data/.rubocop.yml +5 -1
- data/UNRELEASED.md +66 -2
- data/benchmark-ips/bm_truthy.rb +30 -0
- data/bin/opal-mspec +1 -3
- data/bin/opal-repl +1 -2
- data/bin/remove-filters +1 -4
- data/docs/compiled_ruby.md +10 -6
- data/exe/opal-repl +1 -3
- data/lib/opal/ast/builder.rb +1 -1
- data/lib/opal/cli.rb +2 -2
- data/lib/opal/cli_runners/nodejs.rb +9 -2
- data/lib/opal/cli_runners/source-map-support-browser.js +80 -216
- data/lib/opal/cli_runners/source-map-support-node.js +80 -216
- data/lib/opal/cli_runners/source-map-support.js +5 -1
- data/lib/opal/cli_runners/system_runner.rb +10 -4
- data/lib/opal/compiler.rb +3 -5
- data/lib/opal/fragment.rb +5 -1
- data/lib/opal/nodes/args/extract_block_arg.rb +1 -8
- data/lib/opal/nodes/args/extract_kwoptarg.rb +1 -3
- data/lib/opal/nodes/args/extract_optarg.rb +1 -3
- data/lib/opal/nodes/args/extract_post_arg.rb +2 -5
- data/lib/opal/nodes/args/extract_post_optarg.rb +2 -7
- data/lib/opal/nodes/args/initialize_iterarg.rb +1 -3
- data/lib/opal/nodes/args/prepare_post_args.rb +5 -1
- data/lib/opal/nodes/base.rb +3 -2
- data/lib/opal/nodes/call.rb +20 -9
- data/lib/opal/nodes/call_special.rb +50 -0
- data/lib/opal/nodes/class.rb +24 -15
- data/lib/opal/nodes/constants.rb +23 -5
- data/lib/opal/nodes/def.rb +20 -23
- data/lib/opal/nodes/defined.rb +5 -5
- data/lib/opal/nodes/definitions.rb +2 -2
- data/lib/opal/nodes/defs.rb +2 -5
- data/lib/opal/nodes/helpers.rb +48 -18
- data/lib/opal/nodes/if.rb +109 -8
- data/lib/opal/nodes/iter.rb +23 -16
- data/lib/opal/nodes/literal.rb +18 -4
- data/lib/opal/nodes/logic.rb +2 -1
- data/lib/opal/nodes/masgn.rb +4 -9
- data/lib/opal/nodes/module.rb +29 -19
- data/lib/opal/nodes/node_with_args.rb +1 -7
- data/lib/opal/nodes/scope.rb +54 -15
- data/lib/opal/nodes/singleton_class.rb +5 -3
- data/lib/opal/nodes/super.rb +3 -3
- data/lib/opal/nodes/top.rb +34 -31
- data/lib/opal/nodes/variables.rb +2 -2
- data/lib/opal/nodes/x_string.rb +3 -0
- data/lib/opal/nodes.rb +0 -1
- data/lib/opal/parser/patch.rb +75 -0
- data/lib/opal/parser/with_ruby_lexer.rb +1 -1
- data/lib/opal/regexp_anchors.rb +7 -7
- data/lib/opal/requires.rb +19 -0
- data/lib/opal/rewriters/pattern_matching.rb +1 -1
- data/lib/opal/rewriters/returnable_logic.rb +102 -4
- data/lib/opal/util.rb +2 -2
- data/lib/opal/version.rb +1 -1
- data/lib/opal.rb +1 -17
- data/opal/corelib/array/pack.rb +11 -11
- data/opal/corelib/array.rb +193 -152
- data/opal/corelib/basic_object.rb +14 -14
- data/opal/corelib/binding.rb +7 -7
- data/opal/corelib/boolean.rb +12 -15
- data/opal/corelib/class.rb +23 -1
- data/opal/corelib/comparable.rb +8 -8
- data/opal/corelib/complex/base.rb +2 -2
- data/opal/corelib/complex.rb +79 -88
- data/opal/corelib/constants.rb +9 -9
- data/opal/corelib/dir.rb +4 -3
- data/opal/corelib/enumerable.rb +140 -127
- data/opal/corelib/enumerator/arithmetic_sequence.rb +177 -0
- data/opal/corelib/enumerator/chain.rb +42 -0
- data/opal/corelib/enumerator/generator.rb +35 -0
- data/opal/corelib/enumerator/lazy.rb +243 -0
- data/opal/corelib/enumerator/yielder.rb +36 -0
- data/opal/corelib/enumerator.rb +45 -300
- data/opal/corelib/error/errno.rb +47 -0
- data/opal/corelib/error.rb +62 -60
- data/opal/corelib/file.rb +26 -12
- data/opal/corelib/hash.rb +98 -107
- data/opal/corelib/helpers.rb +62 -13
- data/opal/corelib/io.rb +47 -34
- data/opal/corelib/kernel/format.rb +29 -29
- data/opal/corelib/kernel.rb +86 -83
- data/opal/corelib/main.rb +14 -12
- data/opal/corelib/marshal/read_buffer.rb +15 -15
- data/opal/corelib/marshal/write_buffer.rb +45 -44
- data/opal/corelib/marshal.rb +3 -3
- data/opal/corelib/math.rb +50 -50
- data/opal/corelib/method.rb +12 -8
- data/opal/corelib/module.rb +96 -79
- data/opal/corelib/nil.rb +9 -11
- data/opal/corelib/number.rb +113 -118
- data/opal/corelib/numeric.rb +37 -33
- data/opal/corelib/object_space.rb +11 -10
- data/opal/corelib/pack_unpack/format_string_parser.rb +3 -3
- data/opal/corelib/pattern_matching/base.rb +7 -7
- data/opal/corelib/pattern_matching.rb +1 -1
- data/opal/corelib/proc.rb +15 -16
- data/opal/corelib/process/base.rb +2 -2
- data/opal/corelib/process/status.rb +21 -0
- data/opal/corelib/process.rb +5 -5
- data/opal/corelib/random/formatter.rb +11 -11
- data/opal/corelib/random/math_random.js.rb +1 -1
- data/opal/corelib/random/mersenne_twister.rb +3 -3
- data/opal/corelib/random/seedrandom.js.rb +3 -3
- data/opal/corelib/random.rb +17 -17
- data/opal/corelib/range.rb +51 -35
- data/opal/corelib/rational/base.rb +4 -4
- data/opal/corelib/rational.rb +61 -62
- data/opal/corelib/regexp.rb +47 -38
- data/opal/corelib/runtime.js +245 -139
- data/opal/corelib/string/encoding.rb +21 -21
- data/opal/corelib/string/unpack.rb +19 -14
- data/opal/corelib/string.rb +135 -128
- data/opal/corelib/struct.rb +59 -46
- data/opal/corelib/time.rb +47 -57
- data/opal/corelib/trace_point.rb +2 -2
- data/opal/corelib/unsupported.rb +31 -120
- data/opal/corelib/variables.rb +3 -3
- data/opal/opal/base.rb +9 -8
- data/opal/opal/full.rb +8 -8
- data/opal/opal/mini.rb +17 -17
- data/opal/opal.rb +17 -18
- data/opal.gemspec +1 -1
- data/spec/filters/bugs/array.rb +4 -24
- data/spec/filters/bugs/bigdecimal.rb +0 -23
- data/spec/filters/bugs/binding.rb +0 -1
- data/spec/filters/bugs/boolean.rb +3 -0
- data/spec/filters/bugs/class.rb +2 -0
- data/spec/filters/bugs/date.rb +0 -5
- data/spec/filters/bugs/encoding.rb +8 -50
- data/spec/filters/bugs/enumerable.rb +4 -1
- data/spec/filters/bugs/enumerator.rb +3 -36
- data/spec/filters/bugs/exception.rb +0 -2
- data/spec/filters/bugs/file.rb +0 -2
- data/spec/filters/bugs/float.rb +0 -3
- data/spec/filters/bugs/hash.rb +5 -3
- data/spec/filters/bugs/integer.rb +2 -3
- data/spec/filters/bugs/kernel.rb +2 -31
- data/spec/filters/bugs/language.rb +29 -49
- data/spec/filters/bugs/main.rb +0 -2
- data/spec/filters/bugs/marshal.rb +2 -3
- data/spec/filters/bugs/matrix.rb +0 -36
- data/spec/filters/bugs/module.rb +7 -61
- data/spec/filters/bugs/numeric.rb +0 -7
- data/spec/filters/bugs/objectspace.rb +1 -1
- data/spec/filters/bugs/pack_unpack.rb +0 -4
- data/spec/filters/bugs/proc.rb +0 -9
- data/spec/filters/bugs/random.rb +0 -5
- data/spec/filters/bugs/range.rb +1 -6
- data/spec/filters/bugs/regexp.rb +0 -3
- data/spec/filters/bugs/set.rb +8 -1
- data/spec/filters/bugs/string.rb +9 -34
- data/spec/filters/bugs/stringscanner.rb +8 -7
- data/spec/filters/bugs/struct.rb +2 -3
- data/spec/filters/bugs/symbol.rb +0 -1
- data/spec/filters/bugs/time.rb +0 -8
- data/spec/filters/bugs/unboundmethod.rb +0 -8
- data/spec/filters/bugs/warnings.rb +1 -7
- data/spec/filters/unsupported/freeze.rb +24 -0
- data/spec/filters/unsupported/integer.rb +1 -0
- data/spec/filters/unsupported/kernel.rb +12 -0
- data/spec/filters/unsupported/privacy.rb +3 -0
- data/spec/filters/unsupported/string.rb +2 -0
- data/spec/lib/builder_spec.rb +2 -2
- data/spec/lib/cli_spec.rb +1 -1
- data/spec/lib/compiler_spec.rb +37 -37
- data/spec/lib/simple_server_spec.rb +2 -2
- data/spec/lib/source_map/file_spec.rb +1 -1
- data/spec/opal/compiler/irb_spec.rb +2 -2
- data/spec/opal/core/kernel/puts_spec.rb +90 -0
- data/spec/opal/core/language/super_spec.rb +24 -0
- data/spec/ruby_specs +4 -2
- data/spec/support/rewriters_helper.rb +1 -1
- data/stdlib/bigdecimal.rb +7 -11
- data/stdlib/buffer/view.rb +2 -2
- data/stdlib/buffer.rb +2 -2
- data/stdlib/date.rb +5 -6
- data/stdlib/erb.rb +1 -0
- data/stdlib/js.rb +2 -1
- data/stdlib/native.rb +7 -8
- data/stdlib/nodejs/argf.rb +4 -4
- data/stdlib/nodejs/base.rb +29 -0
- data/stdlib/nodejs/dir.rb +1 -1
- data/stdlib/nodejs/env.rb +6 -9
- data/stdlib/nodejs/file.rb +23 -17
- data/stdlib/nodejs/fileutils.rb +3 -3
- data/stdlib/nodejs/io.rb +2 -20
- data/stdlib/nodejs/irb.rb +0 -0
- data/stdlib/nodejs/kernel.rb +2 -37
- data/stdlib/nodejs.rb +1 -3
- data/stdlib/opal/miniracer.rb +2 -0
- data/stdlib/opal/platform.rb +6 -13
- data/stdlib/opal/replutils.rb +16 -5
- data/stdlib/opal-parser.rb +2 -2
- data/stdlib/optparse/ac.rb +54 -0
- data/stdlib/optparse/date.rb +14 -0
- data/stdlib/optparse/kwargs.rb +22 -0
- data/stdlib/optparse/shellwords.rb +7 -0
- data/stdlib/optparse/time.rb +15 -0
- data/stdlib/optparse/uri.rb +7 -0
- data/stdlib/optparse/version.rb +69 -0
- data/stdlib/optparse.rb +2279 -0
- data/stdlib/pathname.rb +5 -6
- data/stdlib/pp.rb +18 -2
- data/stdlib/promise/v2.rb +18 -22
- data/stdlib/promise.rb +15 -21
- data/stdlib/set.rb +32 -32
- data/stdlib/shellwords.rb +240 -0
- data/stdlib/stringio.rb +3 -6
- data/stdlib/strscan.rb +5 -8
- data/stdlib/template.rb +2 -2
- data/stdlib/thread.rb +7 -9
- data/tasks/performance.rake +5 -2
- data/tasks/testing/mspec_special_calls.rb +0 -12
- data/tasks/testing.rake +55 -37
- data/test/nodejs/test_file.rb +11 -0
- metadata +55 -10
- data/lib/opal/nodes/case.rb +0 -114
data/opal/corelib/range.rb
CHANGED
@@ -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 =
|
163
|
+
def step(n = undefined)
|
170
164
|
%x{
|
171
165
|
function coerceStepSize() {
|
172
|
-
if (
|
173
|
-
n =
|
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
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
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
|
data/opal/corelib/rational.rb
CHANGED
@@ -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
|