summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--ext/bigdecimal/bigdecimal.c15
-rw-r--r--test/bigdecimal/test_bigdecimal.rb4
3 files changed, 24 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 6437ac91db..126cac520a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Sep 22 04:47:37 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/bigdecimal/bigdecimal.c (GetVpValue): support conversion from
+ Rational. [ruby-core:25697]
+
Tue Sep 22 04:43:42 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* Makefile.in, win32/Makefile.sub (INSNS): depend on tools.
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 97d1822e0d..4e60bae173 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -239,9 +239,24 @@ GetVpValue(VALUE v, int must)
Real *pv;
VALUE bg;
char szD[128];
+ VALUE orig = Qundef;
+ int util_loaded = 0;
+again:
switch(TYPE(v))
{
+ case T_RATIONAL:
+ if(orig == Qundef ? (orig = v, 1) : orig != v) {
+ if(!util_loaded) {
+ rb_require("bigdecimal/util");
+ util_loaded = 1;
+ }
+ v = rb_funcall2(v, rb_intern("to_d"), 0, 0);
+ goto again;
+ }
+ v = orig;
+ goto SomeOneMayDoIt;
+
case T_DATA:
if(rb_typeddata_is_kind_of(v, &BigDecimal_data_type)) {
pv = DATA_PTR(v);
diff --git a/test/bigdecimal/test_bigdecimal.rb b/test/bigdecimal/test_bigdecimal.rb
index 7eecc1ade1..2490c8469c 100644
--- a/test/bigdecimal/test_bigdecimal.rb
+++ b/test/bigdecimal/test_bigdecimal.rb
@@ -691,4 +691,8 @@ class TestBigDecimal < Test::Unit::TestCase
assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, BigDecimal.new("1E-1" + "0" * 10000).sign)
assert_equal(BigDecimal::SIGN_NEGATIVE_ZERO, BigDecimal.new("-1E-1" + "0" * 10000).sign)
end
+
+ def test_coerce
+ assert_equal(2, 1 + BigDecimal.new("1"), '[ruby-core:25697]')
+ end
end