summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--numeric.c14
-rw-r--r--sample/test.rb42
-rw-r--r--test/ruby/test_float.rb44
4 files changed, 62 insertions, 43 deletions
diff --git a/ChangeLog b/ChangeLog
index c0957fea82..9fd573f729 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Dec 1 21:33:08 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * numeric.c (num_sadded): prohibit singleton method definition for
+ Numerics. fill yet another gap between Fixnum and Bignum.
+
Mon Dec 1 17:33:47 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
* pack.c (htov16): converts endian using swap16. htov32(), hton16,
diff --git a/numeric.c b/numeric.c
index b030d8795a..e533dfd0a2 100644
--- a/numeric.c
+++ b/numeric.c
@@ -159,6 +159,19 @@ rb_num_coerce_relop(x, y)
}
static VALUE
+num_sadded(x, name)
+ VALUE x, name;
+{
+ ruby_frame = ruby_frame->prev; /* pop frame for "singleton_method_added" */
+ /* Numerics should be values; singleton_methods should not be added to them */
+ rb_raise(rb_eTypeError,
+ "can't define singleton method \"%s\" for %s",
+ rb_id2name(rb_to_id(name)),
+ rb_obj_classname(x));
+ return Qnil; /* not reached */
+}
+
+static VALUE
num_init_copy(x, y)
VALUE x, y;
{
@@ -1820,6 +1833,7 @@ Init_Numeric()
rb_eFloatDomainError = rb_define_class("FloatDomainError", rb_eRangeError);
rb_cNumeric = rb_define_class("Numeric", rb_cObject);
+ rb_define_method(rb_cNumeric, "singleton_method_added", num_sadded, 1);
rb_include_module(rb_cNumeric, rb_mComparable);
rb_define_method(rb_cNumeric, "initialize_copy", num_init_copy, 1);
rb_define_method(rb_cNumeric, "coerce", num_coerce, 1);
diff --git a/sample/test.rb b/sample/test.rb
index 6488558fd1..65cfcad475 100644
--- a/sample/test.rb
+++ b/sample/test.rb
@@ -1179,27 +1179,27 @@ test_ok(2.6.round == 3)
test_ok((-2.4).truncate == -2)
test_ok((13.4 % 1 - 0.4).abs < 0.0001)
nan = 0.0/0
-def nan.test(v)
- test_ok(self != v)
- test_ok((self < v) == false)
- test_ok((self > v) == false)
- test_ok((self <= v) == false)
- test_ok((self >= v) == false)
-end
-nan.test(nan)
-nan.test(0)
-nan.test(1)
-nan.test(-1)
-nan.test(1000)
-nan.test(-1000)
-nan.test(1_000_000_000_000)
-nan.test(-1_000_000_000_000)
-nan.test(100.0);
-nan.test(-100.0);
-nan.test(0.001);
-nan.test(-0.001);
-nan.test(1.0/0);
-nan.test(-1.0/0);
+def nan_test(x,y)
+ test_ok(x != y)
+ test_ok((x < y) == false)
+ test_ok((x > y) == false)
+ test_ok((x <= y) == false)
+ test_ok((x >= y) == false)
+end
+nan_test(nan, nan)
+nan_test(nan, 0)
+nan_test(nan, 1)
+nan_test(nan, -1)
+nan_test(nan, 1000)
+nan_test(nan, -1000)
+nan_test(nan, 1_000_000_000_000)
+nan_test(nan, -1_000_000_000_000)
+nan_test(nan, 100.0);
+nan_test(nan, -100.0);
+nan_test(nan, 0.001);
+nan_test(nan, -0.001);
+nan_test(nan, 1.0/0);
+nan_test(nan, -1.0/0);
#s = "3.7517675036461267e+17"
#test_ok(s == sprintf("%.16e", s.to_f))
diff --git a/test/ruby/test_float.rb b/test/ruby/test_float.rb
index b023a9fb23..efb69954a1 100644
--- a/test/ruby/test_float.rb
+++ b/test/ruby/test_float.rb
@@ -15,30 +15,30 @@ class TestFloat < Test::Unit::TestCase
assert((13.4 % 1 - 0.4).abs < 0.0001)
end
+ def nan_test(x,y)
+ extend Test::Unit::Assertions
+ assert(x != y)
+ assert_equal(false, (x < y))
+ assert_equal(false, (x > y))
+ assert_equal(false, (x <= y))
+ assert_equal(false, (x >= y))
+ end
def test_nan
nan = 0.0/0
- def nan.test(v)
- extend Test::Unit::Assertions
- assert(self != v)
- assert_equal(false, (self < v))
- assert_equal(false, (self > v))
- assert_equal(false, (self <= v))
- assert_equal(false, (self >= v))
- end
- nan.test(nan)
- nan.test(0)
- nan.test(1)
- nan.test(-1)
- nan.test(1000)
- nan.test(-1000)
- nan.test(1_000_000_000_000)
- nan.test(-1_000_000_000_000)
- nan.test(100.0);
- nan.test(-100.0);
- nan.test(0.001);
- nan.test(-0.001);
- nan.test(1.0/0);
- nan.test(-1.0/0);
+ nan_test(nan, nan)
+ nan_test(nan, 0)
+ nan_test(nan, 1)
+ nan_test(nan, -1)
+ nan_test(nan, 1000)
+ nan_test(nan, -1000)
+ nan_test(nan, 1_000_000_000_000)
+ nan_test(nan, -1_000_000_000_000)
+ nan_test(nan, 100.0);
+ nan_test(nan, -100.0);
+ nan_test(nan, 0.001);
+ nan_test(nan, -0.001);
+ nan_test(nan, 1.0/0);
+ nan_test(nan, -1.0/0);
end
def test_precision