Skip to content

Commit 0f606a2

Browse files
committed
Undef Rational.new to avoid public use.
1 parent 0c3745e commit 0f606a2

File tree

6 files changed

+19
-14
lines changed

6 files changed

+19
-14
lines changed

lib/truffle/truffle/cext.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1310,7 +1310,7 @@ def rb_Rational(num, den)
13101310
end
13111311

13121312
def rb_rational_raw(num, den)
1313-
Rational.new(num, den)
1313+
Rational.new_already_canonical(num, den)
13141314
end
13151315

13161316
def rb_rational_new(num, den)

src/main/ruby/truffleruby/core/complex.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ def ** (other)
197197
z
198198
else
199199
if defined? Rational
200-
(Rational.new(1, 1) / self) ** -other
200+
(Rational.new_already_canonical(1, 1) / self) ** -other
201201
else
202202
self ** Float(other)
203203
end

src/main/ruby/truffleruby/core/float.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def rationalize(eps=undefined)
134134
f = Math.ldexp(f, Float::MANT_DIG).to_i
135135
n -= Float::MANT_DIG
136136

137-
Rational.new(2 * f, 1 << (1 - n)).rationalize(Rational.new(1, 1 << (1 - n)))
137+
Rational.new_already_canonical(2 * f, 1 << (1 - n)).rationalize(Rational.new_already_canonical(1, 1 << (1 - n)))
138138
else
139139
to_r.rationalize(eps)
140140
end

src/main/ruby/truffleruby/core/integer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def **(o)
5151
if (Primitive.object_kind_of?(o, Float) || Primitive.object_kind_of?(o, Rational)) && self < 0 && o != o.round
5252
return Complex.new(self, 0) ** o
5353
elsif Primitive.object_kind_of?(o, Integer) && o < 0
54-
return Rational.new(self, 1) ** o
54+
return Rational.new_already_canonical(self, 1) ** o
5555
elsif Primitive.object_kind_of?(o, Integer) && o > 0
5656
return self ** o.to_f
5757
end

src/main/ruby/truffleruby/core/rational.rb

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ class Rational < Numeric
3838
attr_reader :numerator
3939
attr_reader :denominator
4040

41+
class << self
42+
alias_method :new_already_canonical, :new
43+
undef_method :new
44+
end
45+
4146
def *(other)
4247
case other
4348
when Rational
@@ -67,19 +72,19 @@ def **(other)
6772
raise ZeroDivisionError, 'divided by 0' if self == 0
6873
Rational(@denominator ** -other, @numerator ** -other)
6974
elsif other == 0
70-
Rational.new(1, 1)
75+
Rational.new_already_canonical(1, 1)
7176
end
7277
else
7378
if self == 0
7479
if other < 0
7580
raise ZeroDivisionError, 'divided by 0'
7681
elsif other > 0
77-
Rational.new(0, 1)
82+
Rational.new_already_canonical(0, 1)
7883
end
7984
elsif self == 1
80-
Rational.new(1, 1)
85+
Rational.new_already_canonical(1, 1)
8186
elsif self == -1
82-
Rational.new(other.even? ? 1 : -1, 1)
87+
Rational.new_already_canonical(other.even? ? 1 : -1, 1)
8388
else
8489
to_f ** other
8590
end
@@ -176,7 +181,7 @@ def ==(other)
176181
def abs
177182
return self if @numerator >= 0
178183

179-
Rational.new(-@numerator, @denominator)
184+
Rational.new_already_canonical(-@numerator, @denominator)
180185
end
181186

182187
def ceil(precision = 0)
@@ -190,7 +195,7 @@ def ceil(precision = 0)
190195
def coerce(other)
191196
case other
192197
when Integer
193-
[Rational.new(other, 1), self]
198+
[Rational.new_already_canonical(other, 1), self]
194199
when Float
195200
[other, self.to_f]
196201
when Rational
@@ -263,7 +268,7 @@ def rationalize(eps = undefined)
263268
end
264269

265270
# The rational number is guaranteed to be in lowest terms.
266-
Rational.new(c * p1 + p0, c * q1 + q0)
271+
Rational.new_already_canonical(c * p1 + p0, c * q1 + q0)
267272
end
268273

269274
def round(precision = 0, half: nil)
@@ -373,7 +378,7 @@ def self.reduce(num, den)
373378
end
374379

375380
if den == 1
376-
return new(num, den)
381+
return new_already_canonical(num, den)
377382
end
378383
when Numeric
379384
den = den.to_i
@@ -385,7 +390,7 @@ def self.reduce(num, den)
385390
num = num / gcd
386391
den = den / gcd
387392

388-
new(num, den)
393+
new_already_canonical(num, den)
389394
end
390395
private_class_method :reduce
391396

src/main/ruby/truffleruby/core/rationalizer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def convert
5454
ifp, exp = nu.split(/[eE]/)
5555
ip, fp = ifp.split(/\./)
5656

57-
value = Rational.new(ip.to_i, 1)
57+
value = Rational.new_already_canonical(ip.to_i, 1)
5858

5959
if fp
6060
ctype = Truffle::CType

0 commit comments

Comments
 (0)