Project

General

Profile

Backport #3359

Updated by jeremyevans0 (Jeremy Evans) almost 5 years ago

=begin 
  
  Date::Format::Bag spends a lot of time in method_missing for a limited number of method selectors. 
 
  The hack below removed ~ 3% of time from a ActiveRecord/Rails app that parses and formats many Date objects. 
 
  <pre> 
  class Date::Format::Bag 
      def method_missing(sel, *args) # , &block) 
        sel = sel.to_s 
        t = sel.dup 
        set = t.chomp!('=') 
        t = t.intern 
        if set 
          value = @elem[t] = args[0] 
          expr = "def #{sel}(arg); @elem[#{t.inspect}] = arg; end" 
        else 
          value = @elem[t] 
          # 
          # There appear to be no callers like: 
          # 
          #     e.foo(something) 
          # 
          # Thus do not interpret any arguments as 
          # the *rest parameter creates Arrays that are 
          # never referenced. 
          # 
          # expr = "def #{sel}(*rest); @elem[#{t.inspect}]; end" 
          expr = "def #{sel}(); @elem[#{t.inspect}]; end" 
        end 
        expr = "class #{self.class}; #{expr}; end;" 
        # $stderr.puts "    **** #{self.class}\##{sel} => #{expr}" 
        eval(expr) 
        value 
      end 
    end 
  </pre> 
 
  Might be better to just enumerate all the possible Hash slot getter/setters using a simple class macro, 
  since Date::Format::Bag is not used by anything outside of Date. 
 
 =end 
 

Back