[#35631] [Ruby 1.9 - Bug #4558][Open] TestSocket#test_closed_read fails after r31230 — Tomoyuki Chikanaga <redmine@...>

23 messages 2011/04/06

[#35632] [Ruby 1.9 - Bug #4559][Open] Proc#== does not match the documented behaviour — Adam Prescott <redmine@...>

13 messages 2011/04/06

[#35637] [Ruby 1.9 - Bug #4561][Open] 1.9.2 requires parentheses around argument of method call in an array, where 1.8.7 did not — Dave Schweisguth <redmine@...>

9 messages 2011/04/07

[#35666] caching of the ancestor chain — Xavier Noria <fxn@...>

Why does Ruby cache the ancestors chain? I mean, not why the implementation implies that, but why it works that way conceptually.

9 messages 2011/04/09

[#35734] [Ruby 1.9 - Feature #4574][Open] Numeric#within — redmine@...

16 messages 2011/04/13

[#35753] [Ruby 1.9 - Bug #4576][Open] Range#step miss the last value, if end-exclusive and has float number — redmine@...

61 messages 2011/04/14
[#39566] [Ruby 1.9 - Bug #4576] Range#step miss the last value, if end-exclusive and has float number — Marc-Andre Lafortune <ruby-core@...> 2011/09/15

[#39590] [Ruby 1.9 - Bug #4576] Range#step miss the last value, if end-exclusive and has float number — Marc-Andre Lafortune <ruby-core@...> 2011/09/16

[#39593] Re: [Ruby 1.9 - Bug #4576] Range#step miss the last value, if end-exclusive and has float number — Tanaka Akira <akr@...> 2011/09/16

2011/9/17 Marc-Andre Lafortune <ruby-core@marc-andre.ca>:

[#39608] Re: [Ruby 1.9 - Bug #4576] Range#step miss the last value, if end-exclusive and has float number — Masahiro TANAKA <masa16.tanaka@...> 2011/09/17

I have not been watching ruby-core, but let me give a comment for this issue.

[#35765] [Ruby 1.9 - Bug #4579][Open] SecureRandom + OpenSSL may repeat with fork — redmine@...

27 messages 2011/04/15

[#35866] [Ruby 1.9 - Bug #4603][Open] lib/csv.rb: when the :encoding parameter is not provided, the encoding of CSV data is treated as ASCII-8BIT — yu nobuoka <nobuoka@...>

13 messages 2011/04/24

[#35879] [Ruby 1.9 - Bug #4610][Open] Proc#curry behavior is inconsistent with lambdas containing default argument values — Joshua Ballanco <jballanc@...>

11 messages 2011/04/25

[#35883] [Ruby 1.9 - Bug #4611][Open] [BUG] Segementation fault reported — Deryl Doucette <me@...>

15 messages 2011/04/25

[#35895] [Ruby 1.9 - Feature #4614][Open] [RFC/PATCH] thread_pthread.c: lower RUBY_STACK_MIN_LIMIT to 64K — Eric Wong <normalperson@...>

10 messages 2011/04/25

[ruby-core:35622] Re: [Ruby 1.9 - Bug #4289] Timeouts in threads cause SEGV

From: Eric Wong <normalperson@...>
Date: 2011-04-05 23:50:37 UTC
List: ruby-core #35622
Motohiro KOSAKI wrote:
>  Running deadlock_test.rb in [Bug#4266] on trunk makes segfault. git bisect indicate
>  first bad commit is below.
>  
>  ---------------------------------------------------------------------------
>  commit d295957957c828588a8ca3c7b8619c7a93be6b5c
>  Author: akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
>  Date:   Tue Nov 2 22:37:08 2010 +0000
>  
>      * vm_method.c (rb_clear_cache_by_class): just return if the class has
>        no method.  reported by Eric Wong.  [ruby-core:32689]
>  
>  
>      git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29673 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
>  
>  --------------------------------------------------------------------------------
>  
>  Plus, I've confirmed latest trunk + revert d2959579 doesn't makes segfault.

Yes, r29673 is bad, I think.  The method cache caches for the subclass
even if the method belongs to a superclass.  I confirmed it with the
following debug patch that writes to stderr whenever a method-less class
is cleared:

diff --git a/vm_method.c b/vm_method.c
index 278941a..021b703 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -84,9 +84,10 @@ void
 rb_clear_cache_by_class(VALUE klass)
 {
     struct cache_entry *ent, *end;
+    int nr_cleared = 0, check_empty = 0;
 
     if (RCLASS_M_TBL(klass)->num_entries == 0)
-        return;
+	check_empty = 1;
 
     rb_vm_change_state();
 
@@ -98,9 +99,12 @@ rb_clear_cache_by_class(VALUE klass)
 	if (ent->klass == klass || (ent->me && ent->me->klass == klass)) {
 	    ent->me = 0;
 	    ent->mid = 0;
+	    ++nr_cleared;
 	}
 	ent++;
     }
+    if (check_empty && nr_cleared)
+	fprintf(stderr, "cleared %d methods for method-less class\n", nr_cleared);
 }
 
 VALUE

-- 
Eric Wong

In This Thread

Prev Next