[#33640] [Ruby 1.9-Bug#4136][Open] Enumerable#reject should not inherit the receiver's instance variables — Hiro Asari <redmine@...>

Bug #4136: Enumerable#reject should not inherit the receiver's instance variables

10 messages 2010/12/08

[#33667] [Ruby 1.9-Bug#4149][Open] Documentation submission: syslog standard library — mathew murphy <redmine@...>

Bug #4149: Documentation submission: syslog standard library

11 messages 2010/12/10

[#33683] [feature:trunk] Enumerable#categorize — Tanaka Akira <akr@...>

Hi.

14 messages 2010/12/12
[#33684] Re: [feature:trunk] Enumerable#categorize — "Martin J. Dst" <duerst@...> 2010/12/12

[#33687] Towards a standardized AST for Ruby code — Magnus Holm <judofyr@...>

Hey folks,

23 messages 2010/12/12
[#33688] Re: Towards a standardized AST for Ruby code — Charles Oliver Nutter <headius@...> 2010/12/12

On Sun, Dec 12, 2010 at 9:55 AM, Magnus Holm <judofyr@gmail.com> wrote:

[#33689] Re: Towards a standardized AST for Ruby code — "Haase, Konstantin" <Konstantin.Haase@...> 2010/12/12

On Dec 12, 2010, at 17:46 , Charles Oliver Nutter wrote:

[#33763] [Ruby 1.9-Bug#4168][Open] WeakRef is unsafe to use in Ruby 1.9 — Brian Durand <redmine@...>

Bug #4168: WeakRef is unsafe to use in Ruby 1.9

43 messages 2010/12/17

[#33815] trunk warnflags build issue with curb 0.7.9? — Jon <jon.forums@...>

As this may turn out to be a 3rd party issue rather than a bug, I'd like some feedback.

11 messages 2010/12/22

[#33833] Ruby 1.9.2 is going to be released — "Yuki Sonoda (Yugui)" <yugui@...>

-----BEGIN PGP SIGNED MESSAGE-----

15 messages 2010/12/23

[#33846] [Ruby 1.9-Feature#4197][Open] Improvement of the benchmark library — Benoit Daloze <redmine@...>

Feature #4197: Improvement of the benchmark library

15 messages 2010/12/23

[#33910] [Ruby 1.9-Feature#4211][Open] Converting the Ruby and C API documentation to YARD syntax — Loren Segal <redmine@...>

Feature #4211: Converting the Ruby and C API documentation to YARD syntax

10 messages 2010/12/26

[#33923] [Ruby 1.9-Bug#4214][Open] Fiddle::WINDOWS == false on Windows — Jon Forums <redmine@...>

Bug #4214: Fiddle::WINDOWS == false on Windows

15 messages 2010/12/27

[ruby-core:33569] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods

From: Shugo Maeda <shugo@...>
Date: 2010-12-04 13:50:59 UTC
List: ruby-core #33569
Hi,

2010/12/3 Yusuke ENDOH <mame@tsg.ne.jp>:
> I might find serious concurrency problem of Shugo's patch, though I'm
> not sure that this is what you mean. ndeed, we may have to give up
> propagating refinements via block.

I have fixed it with additional overhead:)
Please try the attached patch.

-- 
Shugo Maeda

Attachments (1)

inline_cache_fix_20101204.diff (2.28 KB, text/x-diff)
diff --git a/test/ruby/test_refinement.rb b/test/ruby/test_refinement.rb
index ed01c77..e4bfa95 100644
--- a/test/ruby/test_refinement.rb
+++ b/test/ruby/test_refinement.rb
@@ -354,5 +354,29 @@ class TestRefinement < Test::Unit::TestCase
     assert_equal(Rational(1, 2), refine_in_method)
     assert_equal(0, 1 / 2)
   end
+
+  # [ruby-core:33535]
+  def test_concurrent_module_eval
+    c = Class.new {
+      def test; p :test; end
+    }
+    foo_ext = Module.new {
+      refine(c) { def test; :foo; end }
+    }
+    bar_ext = Module.new {
+      refine(c) { def test; :bar; end }
+    }
+    f = proc {
+      sleep(0.01)
+      c.new.test
+    }
+    assert_equal(:foo, foo_ext.module_eval(&f))
+    assert_equal(:bar, bar_ext.module_eval(&f))
+    ary = [
+      Thread.new { foo_ext.class_eval(&f) },
+      Thread.new { bar_ext.class_eval(&f) }
+    ].collect {|t| t.value }
+    assert_equal([:foo, :bar], ary)
+  end
 end
 
diff --git a/vm_core.h b/vm_core.h
index 5a5d08e..6000739 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -127,6 +127,7 @@ typedef struct rb_compile_option_struct rb_compile_option_t;
 struct iseq_inline_cache_entry {
     VALUE ic_vmstat;
     VALUE ic_class;
+    VALUE ic_omod;
     union {
 	VALUE value;
 	rb_method_entry_t *method;
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 4a4156a..44f81e0 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1375,8 +1375,11 @@ static inline const rb_method_entry_t *
 vm_method_search(VALUE id, VALUE klass, IC ic, VALUE *defined_class_ptr)
 {
     rb_method_entry_t *me;
+    NODE *cref = rb_vm_cref();
+
 #if OPT_INLINE_METHOD_CACHE
     if (LIKELY(klass == ic->ic_class) &&
+	LIKELY(cref->nd_omod == ic->ic_omod) &&
 	LIKELY(GET_VM_STATE_VERSION() == ic->ic_vmstat)) {
 	me = ic->ic_value.method;
 	if (defined_class_ptr)
@@ -1384,10 +1387,12 @@ vm_method_search(VALUE id, VALUE klass, IC ic, VALUE *defined_class_ptr)
     }
     else {
 	VALUE defined_class;
-	me = rb_method_entry(klass, id, &defined_class);
+	me = rb_method_entry_get_with_omod(cref->nd_omod, klass, id,
+					   &defined_class);
 	if (defined_class_ptr)
 	    *defined_class_ptr = defined_class;
 	ic->ic_class = klass;
+	ic->ic_omod = cref->nd_omod;
 	ic->ic_value.method = me;
 	ic->ic_value2.defined_class = defined_class;
 	ic->ic_vmstat = GET_VM_STATE_VERSION();

In This Thread