From: Charles Nutter Date: 2011-12-02T07:35:55+09:00 Subject: [ruby-core:41437] [ruby-trunk - Bug #5696][Open] rexml BaseParser uses instance_eval unnecessarily on listener add Issue #5696 has been reported by Charles Nutter. ---------------------------------------- Bug #5696: rexml BaseParser uses instance_eval unnecessarily on listener add http://redmine.ruby-lang.org/issues/5696 Author: Charles Nutter Status: Open Priority: Normal Assignee: Category: lib Target version: 1.9.3 ruby -v: trunk In add_listener in REXML::BaseParser, there's code to instance eval and replace the old "pull" method with a new one that calls all listeners. I assume this was done to avoid the cost of calling .each on the listeners when there's none registered, but when the list is empty this call is nearly a no-op anyway. The singletonizing effect of instance_eval and the redefinition of #pull, on the other hand, cause a cache flush throughout the system. I have created a patch that removes the instance_eval, initializes the listeners array unconditionally, and does the event #each unconditionally. It passes all tests, and should perform better because it's not damaging the cache. https://gist.github.com/1420383 This can be safely backported to any Ruby version and has no visible behavior change. -- http://redmine.ruby-lang.org