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

ruby-changes:4841

From: ko1@a...
Date: Thu, 8 May 2008 18:19:02 +0900 (JST)
Subject: [ruby-changes:4841] matz - Ruby:r16335 (trunk): * bignum.c (rb_big_and): bit-wise operation should not take float

matz	2008-05-08 18:18:47 +0900 (Thu, 08 May 2008)

  New Revision: 16335

  Modified files:
    trunk/ChangeLog
    trunk/bignum.c

  Log:
    * bignum.c (rb_big_and): bit-wise operation should not take float
      values.  [ruby-dev:34612]
    
    * bignum.c (rb_big_or): ditto.
    
    * bignum.c (rb_big_xor): ditto.

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16335&r2=16334&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bignum.c?r1=16335&r2=16334&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16334)
+++ ChangeLog	(revision 16335)
@@ -1,3 +1,12 @@
+Thu May  8 18:14:00 2008  Yukihiro Matsumoto  <matz@r...>
+
+	* bignum.c (rb_big_and): bit-wise operation should not take float
+	  values.  [ruby-dev:34612]
+
+	* bignum.c (rb_big_or): ditto.
+
+	* bignum.c (rb_big_xor): ditto.
+
 Thu May  8 17:44:13 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* common.mk, ext/extmk.rb, lib/mkmf.rb: use absolute path for RUBYOPT.
Index: bignum.c
===================================================================
--- bignum.c	(revision 16334)
+++ bignum.c	(revision 16335)
@@ -2152,6 +2152,18 @@
     return DOUBLE2NUM(pow(rb_big2dbl(x), d));
 }
 
+static VALUE
+bit_coerce(VALUE x)
+{
+    while (!FIXNUM_P(x) && TYPE(x) != T_BIGNUM) {
+	if (TYPE(x) == T_FLOAT) {
+	    rb_raise(rb_eTypeError, "can't convert Float into Integer");
+	}
+	x = rb_to_int(x);
+    }
+    return x;
+}
+
 /*
  * call-seq:
  *     big & numeric   =>  integer
@@ -2168,7 +2180,7 @@
     char sign;
 
     x = xx;
-    y = rb_to_int(yy);
+    y = bit_coerce(yy);
     if (FIXNUM_P(y)) {
 	y = rb_int2big(FIX2LONG(y));
     }
@@ -2223,7 +2235,7 @@
     char sign;
 
     x = xx;
-    y = rb_to_int(yy);
+    y = bit_coerce(yy);
     if (FIXNUM_P(y)) {
 	y = rb_int2big(FIX2LONG(y));
     }
@@ -2281,7 +2293,7 @@
     char sign;
 
     x = xx;
-    y = rb_to_int(yy);
+    y = bit_coerce(yy);
     if (FIXNUM_P(y)) {
 	y = rb_int2big(FIX2LONG(y));
     }

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

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