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/