summaryrefslogtreecommitdiff
path: root/ext/bigdecimal
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-09-21 19:47:39 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-09-21 19:47:39 +0000
commitd9bfa822ea7e23dcc0dd1572773495419d89e145 (patch)
tree8bd66f5787510e1ee4d108621901dbbf4d6d03db /ext/bigdecimal
parent92fd1940fee3870c89b2e0424a55cdb0f95c3a71 (diff)
* ext/bigdecimal/bigdecimal.c (GetVpValue): support conversion from
Rational. [ruby-core:25697] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25025 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/bigdecimal')
-rw-r--r--ext/bigdecimal/bigdecimal.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 97d1822..4e60bae 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);