[前][次][番号順一覧][スレッド一覧]

ruby-changes:42228

From: nobu <ko1@a...>
Date: Sun, 27 Mar 2016 12:13:47 +0900 (JST)
Subject: [ruby-changes:42228] nobu:r54302 (trunk): sprintf.c: Rational f by generic Integer functions

nobu	2016-03-27 12:13:39 +0900 (Sun, 27 Mar 2016)

  New Revision: 54302

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=54302

  Log:
    sprintf.c: Rational f by generic Integer functions
    
    * sprintf.c (rb_str_format): convert Rational to floating point
      format by using gereric Integer functions, not by methods which
      can be overwritten.

  Modified files:
    trunk/ChangeLog
    trunk/sprintf.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 54301)
+++ ChangeLog	(revision 54302)
@@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Sun Mar 27 12:13:37 2016  Nobuyoshi Nakada  <nobu@r...>
+
+	* sprintf.c (rb_str_format): convert Rational to floating point
+	  format by using gereric Integer functions, not by methods which
+	  can be overwritten.
+
 Sat Mar 26 10:55:12 2016  Nobuyoshi Nakada  <nobu@r...>
 
 	* numeric.c (rb_int2str): conversion function to String for
Index: sprintf.c
===================================================================
--- sprintf.c	(revision 54301)
+++ sprintf.c	(revision 54302)
@@ -1056,22 +1056,19 @@ rb_str_format(int argc, const VALUE *arg https://github.com/ruby/ruby/blob/trunk/sprintf.c#L1056
 			sign = -1;
 		    }
 		}
-		else if (rb_num_negative_p(num)) {
+		else if (BIGNUM_NEGATIVE_P(num)) {
 		    sign = -1;
-		    num = rb_funcallv(num, idUMinus, 0, 0);
+		    num = rb_big_uminus(num);
 		}
-		if (den != INT2FIX(1) || prec > 1) {
-		    const ID idDiv = rb_intern("div");
-		    VALUE p10 = rb_int_positive_pow(10, prec);
-		    VALUE den_2 = rb_funcall(den, idDiv, 1, INT2FIX(2));
-		    num = rb_funcallv(num, '*', 1, &p10);
-		    num = rb_funcallv(num, '+', 1, &den_2);
-		    num = rb_funcallv(num, idDiv, 1, &den);
+		if (den != INT2FIX(1)) {
+		    num = rb_int_mul(num, rb_int_positive_pow(10, prec));
+		    num = rb_int_plus(num, rb_int_idiv(den, INT2FIX(2)));
+		    num = rb_int_idiv(num, den);
 		}
 		else if (prec >= 0) {
 		    zero = prec;
 		}
-		val = rb_obj_as_string(num);
+		val = rb_int2str(num, 10);
 		len = RSTRING_LEN(val) + zero;
 		if (prec >= len) ++len; /* integer part 0 */
 		if (sign || (flags&FSPACE)) ++len;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]