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

ruby-changes:4827

From: ko1@a...
Date: Thu, 8 May 2008 09:52:33 +0900 (JST)
Subject: [ruby-changes:4827] nobu - Ruby:r16321 (trunk): * array.c (sort_1, sort_2): check for reentered and if elements are

nobu	2008-05-08 09:51:55 +0900 (Thu, 08 May 2008)

  New Revision: 16321

  Modified files:
    trunk/ChangeLog
    trunk/array.c

  Log:
    * array.c (sort_1, sort_2): check for reentered and if elements are
      accessible.  [ruby-core:16679]


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/array.c?r1=16321&r2=16320&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16321&r2=16320&diff_format=u

Index: array.c
===================================================================
--- array.c	(revision 16320)
+++ array.c	(revision 16321)
@@ -1442,21 +1442,23 @@
     return rb_ary_reverse(rb_ary_dup(ary));
 }
 
-static void
+static VALUE
 check_reentered(VALUE *klass)
 {
     if (*klass) {
 	rb_raise(rb_eRuntimeError, "sort! reentered");
     }
+    return Qnil;
 }
 
 static int
 sort_1(const void *ap, const void *bp, void *dummy)
 {
+    VALUE retval = check_reentered(dummy);
     VALUE a = *(const VALUE *)ap, b = *(const VALUE *)bp;
-    VALUE retval = rb_yield_values(2, a, b);
     int n;
 
+    retval = rb_yield_values(2, a, b);
     n = rb_cmpint(retval, a, b);
     check_reentered(dummy);
     return n;
@@ -1465,7 +1467,7 @@
 static int
 sort_2(const void *ap, const void *bp, void *dummy)
 {
-    VALUE retval;
+    VALUE retval = check_reentered(dummy);
     VALUE a = *(const VALUE *)ap, b = *(const VALUE *)bp;
     int n;
 
@@ -1515,6 +1517,8 @@
 	RARRAY(ary)->len = RARRAY(tmp)->len;
 	RARRAY(ary)->aux.capa = RARRAY(tmp)->aux.capa;
 	FL_UNSET(ary, ELTS_SHARED);
+	RARRAY(tmp)->ptr = 0;
+	RARRAY(tmp)->len = 0;
 	RBASIC(tmp)->klass = RBASIC(ary)->klass;
     }
     return ary;
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16320)
+++ ChangeLog	(revision 16321)
@@ -1,6 +1,7 @@
-Thu May  8 08:56:31 2008  Nobuyoshi Nakada  <nobu@r...>
+Thu May  8 09:51:52 2008  Nobuyoshi Nakada  <nobu@r...>
 
-	* array.c (sort_1, sort_2): check reentered.  [ruby-core:16679]
+	* array.c (sort_1, sort_2): check for reentered and if elements are
+	  accessible.  [ruby-core:16679]
 
 Thu May  8 06:43:52 2008  Nobuyoshi Nakada  <nobu@r...>
 

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

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