From: Charles Nutter Date: 2009-01-02T15:05:06+09:00 Subject: [ruby-core:21059] [Bug #967] Results of const_missing are being cached incorrectly Bug #967: Results of const_missing are being cached incorrectly http://redmine.ruby-lang.org/issues/show/967 Author: Charles Nutter Status: Open, Priority: High Assigned to: Koichi Sasada, Category: YARV Ruby 1.9 sped up constant lookup by adding an inline cache, cleared by a global serial number incremented when any constant is set. This works well for normal constants, but unfortunately 1.9 is also caching the result of const_missing. For example, the following output: ��� ruby1.9 -e "def Object.const_missing(sym); Time.now; end; 5.times { p XXX; sleep 1 }" 2009-01-01 23:59:33 -0600 2009-01-01 23:59:33 -0600 2009-01-01 23:59:33 -0600 2009-01-01 23:59:33 -0600 2009-01-01 23:59:33 -0600 The result of const_missing is being cached at the lookup site for XXX. Here's what the output should look like, with incrementing seconds: ��� ruby -e "def Object.const_missing(sym); Time.now; end; 5.times { p XXX; sleep 1 }" Fri Jan 02 00:02:09 -0600 2009 Fri Jan 02 00:02:10 -0600 2009 Fri Jan 02 00:02:11 -0600 2009 Fri Jan 02 00:02:12 -0600 2009 Fri Jan 02 00:02:13 -0600 2009 Note that this also affects colon2 and colon3 constant lookup: ��� ruby1.9 -e "def Object.const_missing(sym); cls = Class.new; cls.class_eval 'Foo = Time.now'; cls; end; 5.times { p XXX::Foo; sleep 1 }" 2009-01-02 00:02:44 -0600 2009-01-02 00:02:44 -0600 2009-01-02 00:02:44 -0600 2009-01-02 00:02:44 -0600 2009-01-02 00:02:44 -0600 ��� ruby1.9 -e "def Object.const_missing(sym); Time.now; end; 5.times { p ::XXX; sleep 1 }" 2009-01-02 00:03:06 -0600 2009-01-02 00:03:06 -0600 2009-01-02 00:03:06 -0600 2009-01-02 00:03:06 -0600 2009-01-02 00:03:06 -0600 The result of const_missing should never be cached, since doing so would break code that expects const_missing to keep firing (some DSLs for example). This was run against the just-released Ruby 1.9 RC. ---------------------------------------- http://redmine.ruby-lang.org