summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-31 13:45:31 +0000
committermrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-31 13:45:31 +0000
commitb54141bb1b4ae96ff6300177e5eb309b5fee738f (patch)
treec07719510f9e94164e32e3901f3b12e0a12d846f
parent899d2c14b055e180308396b5ef36397c0737f6f7 (diff)
* ext/bigdecimal/bigdecimal.c (BigDecimal_new): support instantiation a
BigDecimal object from an Integer. * test/bigdecimal/test_bigdecimal.rb (test_new_with_integer): add for testing the above change. * ext/bigdecimal/bigdecimal.c (BigDecimal_global_new): replace its body with a BigDecimal_new call. * test/bigdecimal/test_bigdecimal.rb (test_global_new_with_integer): add for testing the above change. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31863 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog14
-rw-r--r--ext/bigdecimal/bigdecimal.c70
-rw-r--r--test/bigdecimal/test_bigdecimal.rb14
3 files changed, 65 insertions, 33 deletions
diff --git a/ChangeLog b/ChangeLog
index 6207b30a5d..9d17e7c279 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+Tue May 31 22:44:00 2011 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_new): support instantiation a
+ BigDecimal object from an Integer.
+
+ * test/bigdecimal/test_bigdecimal.rb (test_new_with_integer):
+ add for testing the above change.
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_global_new): replace its body
+ with a BigDecimal_new call.
+
+ * test/bigdecimal/test_bigdecimal.rb (test_global_new_with_integer):
+ add for testing the above change.
+
Tue May 31 22:24:39 2011 Tadayoshi Funaba <tadf@dotrb.org>
* ext/date/date_core.c: use simple/complex mode instead of light/right mode.
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 7f64288647..45dac45645 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -1738,8 +1738,23 @@ BigDecimal_power(VALUE self, VALUE p)
return ToValue(y);
}
+/* call-seq:
+ * new(initial, digits)
+ *
+ * Create a new BigDecimal object.
+ *
+ * initial:: The initial value, as a String. Spaces are ignored, unrecognized
+ * characters terminate the value.
+ *
+ * digits:: The number of significant digits, as a Fixnum. If omitted or 0,
+ * the number of significant digits is determined from the initial
+ * value.
+ *
+ * The actual number of significant digits used in computation is usually
+ * larger than the specified number.
+ */
static VALUE
-BigDecimal_global_new(int argc, VALUE *argv, VALUE self)
+BigDecimal_new(int argc, VALUE *argv, VALUE self)
{
ENTER(5);
Real *pv;
@@ -1747,45 +1762,34 @@ BigDecimal_global_new(int argc, VALUE *argv, VALUE self)
VALUE nFig;
VALUE iniValue;
- if(rb_scan_args(argc,argv,"11",&iniValue,&nFig)==1) {
- mf = 0;
- } else {
- mf = GetPositiveInt(nFig);
+ if (rb_scan_args(argc, argv, "11", &iniValue, &nFig) == 1) {
+ mf = 0;
+ }
+ else {
+ mf = GetPositiveInt(nFig);
+ }
+
+ switch (TYPE(iniValue)) {
+ case T_FIXNUM:
+ /* fall through */
+ case T_BIGNUM:
+ return ToValue(GetVpValue(iniValue, 1));
+
+ case T_STRING:
+ /* fall through */
+ default:
+ break;
}
SafeStringValue(iniValue);
- GUARD_OBJ(pv,VpCreateRbObject(mf, RSTRING_PTR(iniValue)));
+ GUARD_OBJ(pv, VpNewRbClass(mf, RSTRING_PTR(iniValue),self));
+
return ToValue(pv);
}
- /* call-seq:
- * new(initial, digits)
- *
- * Create a new BigDecimal object.
- *
- * initial:: The initial value, as a String. Spaces are ignored, unrecognized characters terminate the value.
- *
- * digits:: The number of significant digits, as a Fixnum. If omitted or 0, the number of significant digits is determined from the initial value.
- *
- * The actual number of significant digits used in computation is usually
- * larger than the specified number.
- */
static VALUE
-BigDecimal_new(int argc, VALUE *argv, VALUE self)
+BigDecimal_global_new(int argc, VALUE *argv, VALUE self)
{
- ENTER(5);
- Real *pv;
- size_t mf;
- VALUE nFig;
- VALUE iniValue;
-
- if(rb_scan_args(argc,argv,"11",&iniValue,&nFig)==1) {
- mf = 0;
- } else {
- mf = GetPositiveInt(nFig);
- }
- SafeStringValue(iniValue);
- GUARD_OBJ(pv,VpNewRbClass(mf, RSTRING_PTR(iniValue),self));
- return ToValue(pv);
+ return BigDecimal_new(argc, argv, rb_cBigDecimal);
}
/* call-seq:
diff --git a/test/bigdecimal/test_bigdecimal.rb b/test/bigdecimal/test_bigdecimal.rb
index 810630549b..d50b0e41c3 100644
--- a/test/bigdecimal/test_bigdecimal.rb
+++ b/test/bigdecimal/test_bigdecimal.rb
@@ -29,6 +29,13 @@ class TestBigDecimal < Test::Unit::TestCase
assert_raise(ArgumentError) { BigDecimal("1", -1) }
end
+ def test_global_new_with_integer
+ assert_equal(BigDecimal("1"), BigDecimal(1))
+ assert_equal(BigDecimal("-1"), BigDecimal(-1))
+ assert_equal(BigDecimal((2**100).to_s), BigDecimal(2**100))
+ assert_equal(BigDecimal((-2**100).to_s), BigDecimal(-2**100))
+ end
+
def test_new
assert_equal(1, BigDecimal.new("1"))
assert_equal(1, BigDecimal.new("1", 1))
@@ -44,6 +51,13 @@ class TestBigDecimal < Test::Unit::TestCase
assert_equal( 1, BigDecimal.new("1E1111111111111111111").infinite?)
end
+ def test_new_with_integer
+ assert_equal(BigDecimal("1"), BigDecimal.new(1))
+ assert_equal(BigDecimal("-1"), BigDecimal.new(-1))
+ assert_equal(BigDecimal((2**100).to_s), BigDecimal.new(2**100))
+ assert_equal(BigDecimal((-2**100).to_s), BigDecimal.new(-2**100))
+ end
+
def _test_mode(type)
BigDecimal.mode(type, true)
assert_raise(FloatDomainError) { yield }