Bug #5696
closedrexml BaseParser uses instance_eval unnecessarily on listener add
Description
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.
Updated by ayumin (Ayumu AIZAWA) almost 13 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r34202.
Charles, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
- lib/rexml/parsers/baseparser.rb: rexml BaseParser uses
instance_eval unnecessarily on listener add.
patch from Charles Nutter. [Bug #5696] [ruby-core:41437]