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

ruby-changes:4826

From: ko1@a...
Date: Thu, 8 May 2008 08:57:16 +0900 (JST)
Subject: [ruby-changes:4826] nobu - Ruby:r16320 (trunk): * array.c (sort_1, sort_2): check reentered.

nobu	2008-05-08 08:56:33 +0900 (Thu, 08 May 2008)

  New Revision: 16320

  Modified files:
    trunk/ChangeLog
    trunk/array.c

  Log:
    * array.c (sort_1, sort_2): check reentered.  [ruby-core:16679]


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

Index: array.c
===================================================================
--- array.c	(revision 16319)
+++ array.c	(revision 16320)
@@ -1442,6 +1442,14 @@
     return rb_ary_reverse(rb_ary_dup(ary));
 }
 
+static void
+check_reentered(VALUE *klass)
+{
+    if (*klass) {
+	rb_raise(rb_eRuntimeError, "sort! reentered");
+    }
+}
+
 static int
 sort_1(const void *ap, const void *bp, void *dummy)
 {
@@ -1450,6 +1458,7 @@
     int n;
 
     n = rb_cmpint(retval, a, b);
+    check_reentered(dummy);
     return n;
 }
 
@@ -1471,6 +1480,7 @@
 
     retval = rb_funcall(a, id_cmp, 1, b);
     n = rb_cmpint(retval, a, b);
+    check_reentered(dummy);
 
     return n;
 }
@@ -1500,12 +1510,12 @@
 
 	RBASIC(tmp)->klass = 0;
 	ruby_qsort(RARRAY_PTR(tmp), RARRAY_LEN(tmp), sizeof(VALUE),
-		   rb_block_given_p()?sort_1:sort_2, 0);
+		   rb_block_given_p()?sort_1:sort_2, &RBASIC(tmp)->klass);
 	RARRAY(ary)->ptr = RARRAY(tmp)->ptr;
 	RARRAY(ary)->len = RARRAY(tmp)->len;
 	RARRAY(ary)->aux.capa = RARRAY(tmp)->aux.capa;
 	FL_UNSET(ary, ELTS_SHARED);
-	rb_gc_force_recycle(tmp);
+	RBASIC(tmp)->klass = RBASIC(ary)->klass;
     }
     return ary;
 }
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16319)
+++ ChangeLog	(revision 16320)
@@ -1,3 +1,7 @@
+Thu May  8 08:56:31 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* array.c (sort_1, sort_2): check reentered.  [ruby-core:16679]
+
 Thu May  8 06:43:52 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* dln.c (dln_find_exe_r, dln_find_file_r): reentrant versions.

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

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