merge revision(s) 56550:

* ext/bigdecimal/bigdecimal.c: Import changes from ruby/bigdecimal
	  repository.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@56562 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagachika 2016-11-05 02:32:13 +00:00
parent ded4039231
commit d56ccddb31
3 changed files with 96 additions and 93 deletions

View file

@ -1,3 +1,8 @@
Sat Nov 5 11:16:58 2016 Kenta Murata <mrkn@mrkn.jp>
* ext/bigdecimal/bigdecimal.c: Import changes from ruby/bigdecimal
repository.
Tue Oct 18 02:58:22 2016 Kazuki Yamaguchi <k@rhe.jp> Tue Oct 18 02:58:22 2016 Kazuki Yamaguchi <k@rhe.jp>
* eval_intern.h (TH_PUSH_TAG): Initialize struct rb_vm_tag::tag with * eval_intern.h (TH_PUSH_TAG): Initialize struct rb_vm_tag::tag with

View file

@ -2533,7 +2533,7 @@ BigDecimal_initialize(int argc, VALUE *argv, VALUE self)
/* :nodoc: /* :nodoc:
* *
* private method to dup and clone the provided BigDecimal +other+ * private method for dup and clone the provided BigDecimal +other+
*/ */
static VALUE static VALUE
BigDecimal_initialize_copy(VALUE self, VALUE other) BigDecimal_initialize_copy(VALUE self, VALUE other)
@ -2769,7 +2769,7 @@ BigMath_s_exp(VALUE klass, VALUE x, VALUE vprec)
rb_raise(rb_eArgError, "Zero or negative precision for exp"); rb_raise(rb_eArgError, "Zero or negative precision for exp");
} }
/* TODO: the following switch statement is almostly the same as one in the /* TODO: the following switch statement is almost same as one in the
* BigDecimalCmp function. */ * BigDecimalCmp function. */
switch (TYPE(x)) { switch (TYPE(x)) {
case T_DATA: case T_DATA:
@ -2907,7 +2907,7 @@ BigMath_s_log(VALUE klass, VALUE x, VALUE vprec)
rb_raise(rb_eArgError, "Zero or negative precision for exp"); rb_raise(rb_eArgError, "Zero or negative precision for exp");
} }
/* TODO: the following switch statement is almostly the same as one in the /* TODO: the following switch statement is almost same as one in the
* BigDecimalCmp function. */ * BigDecimalCmp function. */
switch (TYPE(x)) { switch (TYPE(x)) {
case T_DATA: case T_DATA:
@ -3135,9 +3135,8 @@ get_vp_value:
* *
* Copyright (C) 2002 by Shigeo Kobayashi <shigeo@tinyforest.gr.jp>. * Copyright (C) 2002 by Shigeo Kobayashi <shigeo@tinyforest.gr.jp>.
* *
* You may distribute under the terms of either the GNU General Public * BigDecimal is released under the Ruby and 2-clause BSD licenses.
* License or the Artistic License, as specified in the README file * See LICENSE.txt for details.
* of the BigDecimal distribution.
* *
* Maintained by mrkn <mrkn@mrkn.jp> and ruby-core members. * Maintained by mrkn <mrkn@mrkn.jp> and ruby-core members.
* *
@ -3915,28 +3914,28 @@ VpAlloc(size_t mx, const char *szVal)
if (mx == 0) ++mx; if (mx == 0) ++mx;
if (szVal) { if (szVal) {
while (ISSPACE(*szVal)) szVal++; while (ISSPACE(*szVal)) szVal++;
if (*szVal != '#') { if (*szVal != '#') {
if (mf) { if (mf) {
mf = (mf + BASE_FIG - 1) / BASE_FIG + 2; /* Needs 1 more for div */ mf = (mf + BASE_FIG - 1) / BASE_FIG + 2; /* Needs 1 more for div */
if (mx > mf) { if (mx > mf) {
mx = mf; mx = mf;
} }
} }
} }
else { else {
++szVal; ++szVal;
} }
} }
else { else {
/* necessary to be able to store */ /* necessary to be able to store */
/* at least mx digits. */ /* at least mx digits. */
/* szVal==NULL ==> allocate zero value. */ /* szVal==NULL ==> allocate zero value. */
vp = VpAllocReal(mx); vp = VpAllocReal(mx);
/* xmalloc() alway returns(or throw interruption) */ /* xmalloc() alway returns(or throw interruption) */
vp->MaxPrec = mx; /* set max precision */ vp->MaxPrec = mx; /* set max precision */
VpSetZero(vp, 1); /* initialize vp to zero. */ VpSetZero(vp, 1); /* initialize vp to zero. */
return vp; return vp;
} }
/* Skip all '_' after digit: 2006-6-30 */ /* Skip all '_' after digit: 2006-6-30 */
@ -3946,43 +3945,42 @@ VpAlloc(size_t mx, const char *szVal)
i = 0; i = 0;
ipn = 0; ipn = 0;
while ((psz[i] = szVal[ipn]) != 0) { while ((psz[i] = szVal[ipn]) != 0) {
if (ISDIGIT(psz[i])) ++ni; if (ISSPACE(psz[i])) {
if (psz[i] == '_') { psz[i] = 0;
if (ni > 0) { break;
ipn++; }
continue; if (ISDIGIT(psz[i])) ++ni;
} if (psz[i] == '_') {
psz[i] = 0; if (ni > 0) {
break; ipn++;
} continue;
++i; }
++ipn; psz[i] = 0;
} break;
/* Skip trailing spaces */ }
while (--i > 0) { ++i;
if (ISSPACE(psz[i])) psz[i] = 0; ++ipn;
else break;
} }
szVal = psz; szVal = psz;
/* Check on Inf & NaN */ /* Check on Inf & NaN */
if (StrCmp(szVal, SZ_PINF) == 0 || StrCmp(szVal, SZ_INF) == 0 ) { if (StrCmp(szVal, SZ_PINF) == 0 || StrCmp(szVal, SZ_INF) == 0 ) {
vp = VpAllocReal(1); vp = VpAllocReal(1);
vp->MaxPrec = 1; /* set max precision */ vp->MaxPrec = 1; /* set max precision */
VpSetPosInf(vp); VpSetPosInf(vp);
return vp; return vp;
} }
if (StrCmp(szVal, SZ_NINF) == 0) { if (StrCmp(szVal, SZ_NINF) == 0) {
vp = VpAllocReal(1); vp = VpAllocReal(1);
vp->MaxPrec = 1; /* set max precision */ vp->MaxPrec = 1; /* set max precision */
VpSetNegInf(vp); VpSetNegInf(vp);
return vp; return vp;
} }
if (StrCmp(szVal, SZ_NaN) == 0) { if (StrCmp(szVal, SZ_NaN) == 0) {
vp = VpAllocReal(1); vp = VpAllocReal(1);
vp->MaxPrec = 1; /* set max precision */ vp->MaxPrec = 1; /* set max precision */
VpSetNaN(vp); VpSetNaN(vp);
return vp; return vp;
} }
/* check on number szVal[] */ /* check on number szVal[] */
@ -3992,45 +3990,45 @@ VpAlloc(size_t mx, const char *szVal)
/* Skip digits */ /* Skip digits */
ni = 0; /* digits in mantissa */ ni = 0; /* digits in mantissa */
while ((v = szVal[i]) != 0) { while ((v = szVal[i]) != 0) {
if (!ISDIGIT(v)) break; if (!ISDIGIT(v)) break;
++i; ++i;
++ni; ++ni;
} }
nf = 0; nf = 0;
ipf = 0; ipf = 0;
ipe = 0; ipe = 0;
ne = 0; ne = 0;
if (v) { if (v) {
/* other than digit nor \0 */ /* other than digit nor \0 */
if (szVal[i] == '.') { /* xxx. */ if (szVal[i] == '.') { /* xxx. */
++i; ++i;
ipf = i; ipf = i;
while ((v = szVal[i]) != 0) { /* get fraction part. */ while ((v = szVal[i]) != 0) { /* get fraction part. */
if (!ISDIGIT(v)) break; if (!ISDIGIT(v)) break;
++i; ++i;
++nf; ++nf;
} }
} }
ipe = 0; /* Exponent */ ipe = 0; /* Exponent */
switch (szVal[i]) { switch (szVal[i]) {
case '\0': case '\0':
break; break;
case 'e': case 'E': case 'e': case 'E':
case 'd': case 'D': case 'd': case 'D':
++i; ++i;
ipe = i; ipe = i;
v = szVal[i]; v = szVal[i];
if ((v == '-') || (v == '+')) ++i; if ((v == '-') || (v == '+')) ++i;
while ((v=szVal[i]) != 0) { while ((v=szVal[i]) != 0) {
if (!ISDIGIT(v)) break; if (!ISDIGIT(v)) break;
++i; ++i;
++ne; ++ne;
} }
break; break;
default: default:
break; break;
} }
} }
nalloc = (ni + nf + BASE_FIG - 1) / BASE_FIG + 1; /* set effective allocation */ nalloc = (ni + nf + BASE_FIG - 1) / BASE_FIG + 1; /* set effective allocation */
/* units for szVal[] */ /* units for szVal[] */
@ -4099,7 +4097,7 @@ VpAsgn(Real *c, Real *a, int isw)
/* /*
* c = a + b when operation = 1 or 2 * c = a + b when operation = 1 or 2
* = a - b when operation = -1 or -2. * c = a - b when operation = -1 or -2.
* Returns number of significant digits of c * Returns number of significant digits of c
*/ */
VP_EXPORT size_t VP_EXPORT size_t
@ -4232,7 +4230,7 @@ end_if:
} }
/* /*
* Addition of two variable precisional variables * Addition of two values with variable precision
* a and b assuming abs(a)>abs(b). * a and b assuming abs(a)>abs(b).
* c = abs(a) + abs(b) ; where |a|>=|b| * c = abs(a) + abs(b) ; where |a|>=|b|
*/ */
@ -4991,7 +4989,7 @@ VpComp(Real *a, Real *b)
goto Exit; goto Exit;
} }
/* a and b have same exponent, then compare significand. */ /* a and b have same exponent, then compare their significand. */
mx = (a->Prec < b->Prec) ? a->Prec : b->Prec; mx = (a->Prec < b->Prec) ? a->Prec : b->Prec;
ind = 0; ind = 0;
while (ind < mx) { while (ind < mx) {

View file

@ -1,10 +1,10 @@
#define RUBY_VERSION "2.3.2" #define RUBY_VERSION "2.3.2"
#define RUBY_RELEASE_DATE "2016-10-18" #define RUBY_RELEASE_DATE "2016-11-05"
#define RUBY_PATCHLEVEL 200 #define RUBY_PATCHLEVEL 201
#define RUBY_RELEASE_YEAR 2016 #define RUBY_RELEASE_YEAR 2016
#define RUBY_RELEASE_MONTH 10 #define RUBY_RELEASE_MONTH 11
#define RUBY_RELEASE_DAY 18 #define RUBY_RELEASE_DAY 5
#include "ruby/version.h" #include "ruby/version.h"