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

ruby-changes:12443

From: nobu <ko1@a...>
Date: Thu, 16 Jul 2009 15:54:51 +0900 (JST)
Subject: [ruby-changes:12443] Ruby:r24143 (trunk): * bignum.c (rb_big_new, rb_bigzero_p), range.c (rb_range_values):

nobu	2009-07-16 15:52:29 +0900 (Thu, 16 Jul 2009)

  New Revision: 24143

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24143

  Log:
    * bignum.c (rb_big_new, rb_bigzero_p), range.c (rb_range_values):
      added for random.c.

  Modified files:
    trunk/ChangeLog
    trunk/bignum.c
    trunk/include/ruby/intern.h
    trunk/range.c

Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h	(revision 24142)
+++ include/ruby/intern.h	(revision 24143)
@@ -75,6 +75,8 @@
 VALUE rb_ary_replace(VALUE copy, VALUE orig);
 VALUE rb_get_values_at(VALUE, long, int, VALUE*, VALUE(*)(VALUE,long));
 /* bignum.c */
+VALUE rb_big_new(long, int);
+int rb_bigzero_p(VALUE x);
 VALUE rb_big_clone(VALUE);
 void rb_big_2comp(VALUE);
 VALUE rb_big_norm(VALUE);
@@ -520,6 +522,7 @@
 /* range.c */
 VALUE rb_range_new(VALUE, VALUE, int);
 VALUE rb_range_beg_len(VALUE, long*, long*, long, int);
+int rb_range_values(VALUE range, VALUE *begp, VALUE *endp, int *exclp);
 /* random.c */
 unsigned long rb_genrand_int32(void);
 double rb_genrand_real(void);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 24142)
+++ ChangeLog	(revision 24143)
@@ -1,5 +1,8 @@
-Thu Jul 16 15:00:27 2009  Nobuyoshi Nakada  <nobu@r...>
+Thu Jul 16 15:52:25 2009  Nobuyoshi Nakada  <nobu@r...>
 
+	* bignum.c (rb_big_new, rb_bigzero_p), range.c (rb_range_values):
+	  added for random.c.
+
 	* random.c (rb_random_t): objectified.  [EXPERIMENTAL]
 	  [ruby-dev:30954]
 
Index: range.c
===================================================================
--- range.c	(revision 24142)
+++ range.c	(revision 24143)
@@ -601,12 +601,11 @@
     }
 }
 
-
-VALUE
-rb_range_beg_len(VALUE range, long *begp, long *lenp, long len, int err)
+int
+rb_range_values(VALUE range, VALUE *begp, VALUE *endp, int *exclp)
 {
     VALUE b, e;
-    long beg, end, excl;
+    int excl;
 
     if (rb_obj_is_kind_of(range, rb_cRange)) {
 	b = RANGE_BEG(range);
@@ -620,9 +619,25 @@
 	e = rb_funcall(range, id_end, 0);
 	excl = RTEST(rb_funcall(range, rb_intern("exclude_end?"), 0));
     }
+    *begp = b;
+    *endp = e;
+    *exclp = excl;
+    return Qtrue;
+}
+
+VALUE
+rb_range_beg_len(VALUE range, long *begp, long *lenp, long len, int err)
+{
+    long beg, end, origbeg, origend;
+    VALUE b, e;
+    int excl;
+
+    if (!rb_range_values(range, &b, &e, &excl))
+	return Qfalse;
     beg = NUM2LONG(b);
     end = NUM2LONG(e);
-
+    origbeg = beg;
+    origend = end;
     if (beg < 0) {
 	beg += len;
 	if (beg < 0)
@@ -649,7 +664,7 @@
   out_of_range:
     if (err) {
 	rb_raise(rb_eRangeError, "%ld..%s%ld out of range",
-		 NUM2LONG(b), excl ? "." : "", NUM2LONG(e));
+		 origbeg, excl ? "." : "", origend);
     }
     return Qnil;
 }
Index: bignum.c
===================================================================
--- bignum.c	(revision 24142)
+++ bignum.c	(revision 24143)
@@ -53,6 +53,12 @@
 }
 
 int
+rb_bigzero_p(VALUE x)
+{
+    return BIGZEROP(x);
+}
+
+int
 rb_cmpint(VALUE val, VALUE a, VALUE b)
 {
     if (NIL_P(val)) {
@@ -143,6 +149,12 @@
 #define bignew(len,sign) bignew_1(rb_cBignum,len,sign)
 
 VALUE
+rb_big_new(long len, int sign)
+{
+    return bignew(len, sign != 0);
+}
+
+VALUE
 rb_big_clone(VALUE x)
 {
     VALUE z = bignew_1(CLASS_OF(x), RBIGNUM_LEN(x), RBIGNUM_SIGN(x));

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

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