summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--complex.c29
-rw-r--r--test/ruby/test_complex.rb6
3 files changed, 36 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index fb6df4f699..44d6904268 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Jul 3 19:48:40 2009 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * complex.c: undef-ed shome methods. [ruby-core:24110]
+
+ * complex.c (Numeric#arg): NaN for NaN. [ruby-core:24116]
+
Fri Jul 3 18:35:06 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* vm_core.h (struct rb_iseq_struct): fixed types.
diff --git a/complex.c b/complex.c
index b176dd36df..2441339942 100644
--- a/complex.c
+++ b/complex.c
@@ -1690,9 +1690,9 @@ numeric_abs2(VALUE self)
/*
* call-seq:
- * num.arg -> float
- * num.angle -> float
- * num.phase -> float
+ * num.arg -> 0 or float
+ * num.angle -> 0 or float
+ * num.phase -> 0 or float
*
* Returns 0 if the value is positive, pi otherwise.
*/
@@ -1742,6 +1742,22 @@ numeric_conj(VALUE self)
}
/*
+ * call-seq:
+ * flo.arg -> 0 or float
+ * flo.angle -> 0 or float
+ * flo.phase -> 0 or float
+ *
+ * Returns 0 if the value is positive, pi otherwise.
+ */
+static VALUE
+float_arg(VALUE self)
+{
+ if (isnan(RFLOAT_VALUE(self)))
+ return self;
+ return rb_call_super(0, 0);
+}
+
+/*
* A complex number can be represented as a paired real number with
* imaginary unit; a+bi. Where a is real part, b is imaginary part
* and i is imaginary unit. Real a equals complex a+0i
@@ -1824,16 +1840,19 @@ Init_Complex(void)
rb_define_global_function("Complex", nucomp_f_complex, -1);
+ rb_undef_method(rb_cComplex, "%");
rb_undef_method(rb_cComplex, "<");
rb_undef_method(rb_cComplex, "<=");
rb_undef_method(rb_cComplex, "<=>");
rb_undef_method(rb_cComplex, ">");
rb_undef_method(rb_cComplex, ">=");
rb_undef_method(rb_cComplex, "between?");
+ rb_undef_method(rb_cComplex, "div");
rb_undef_method(rb_cComplex, "divmod");
rb_undef_method(rb_cComplex, "floor");
rb_undef_method(rb_cComplex, "ceil");
rb_undef_method(rb_cComplex, "modulo");
+ rb_undef_method(rb_cComplex, "remainder");
rb_undef_method(rb_cComplex, "round");
rb_undef_method(rb_cComplex, "step");
rb_undef_method(rb_cComplex, "truncate");
@@ -1921,6 +1940,10 @@ Init_Complex(void)
rb_define_method(rb_cNumeric, "conjugate", numeric_conj, 0);
rb_define_method(rb_cNumeric, "conj", numeric_conj, 0);
+ rb_define_method(rb_cFloat, "arg", float_arg, 0);
+ rb_define_method(rb_cFloat, "angle", float_arg, 0);
+ rb_define_method(rb_cFloat, "phase", float_arg, 0);
+
rb_define_const(rb_cComplex, "I",
f_complex_new_bang2(rb_cComplex, ZERO, ONE));
}
diff --git a/test/ruby/test_complex.rb b/test/ruby/test_complex.rb
index 846fcf9a3e..b0ab318df8 100644
--- a/test/ruby/test_complex.rb
+++ b/test/ruby/test_complex.rb
@@ -519,7 +519,7 @@ class Complex_Test < Test::Unit::TestCase
assert_instance_of(Fixnum, Complex(1,2) - Complex(1,2))
assert_instance_of(Fixnum, Complex(1,2) * 0)
assert_instance_of(Fixnum, Complex(1,2) / Complex(1,2))
- assert_instance_of(Fixnum, Complex(1,2).div(Complex(1,2)))
+# assert_instance_of(Fixnum, Complex(1,2).div(Complex(1,2)))
assert_instance_of(Fixnum, Complex(1,2).quo(Complex(1,2)))
# assert_instance_of(Fixnum, Complex(1,2) ** 0) # mathn's bug
end
@@ -779,17 +779,19 @@ class Complex_Test < Test::Unit::TestCase
def test_respond
c = Complex(1,1)
+ assert_equal(false, c.respond_to?(:%))
assert_equal(false, c.respond_to?(:<))
assert_equal(false, c.respond_to?(:<=))
assert_equal(false, c.respond_to?(:<=>))
assert_equal(false, c.respond_to?(:>))
assert_equal(false, c.respond_to?(:>=))
assert_equal(false, c.respond_to?(:between?))
-# assert_equal(false, c.respond_to?(:div)) # ?
+ assert_equal(false, c.respond_to?(:div))
assert_equal(false, c.respond_to?(:divmod))
assert_equal(false, c.respond_to?(:floor))
assert_equal(false, c.respond_to?(:ceil))
assert_equal(false, c.respond_to?(:modulo))
+ assert_equal(false, c.respond_to?(:remainder))
assert_equal(false, c.respond_to?(:round))
assert_equal(false, c.respond_to?(:step))
assert_equal(false, c.respond_to?(:tunrcate))