From: "Ara.T.Howard" Date: 2005-12-10T05:07:00+09:00 Subject: ruby 1.8.4 rc breaks alias_method/rails in bad ways i'm on a box with latest (today's) ruby and rails. i started seeing bizzare errors with infinite stack recursion for a simple ModelName.find :all the code is kinda deep, but you can see how the problem occurs by looking at activerecord-1.13.1/lib/active_record/callbacks.rb +215 there we see object = instantiate_without_callbacks(record) scanning up a bit we see def self.append_features(base) #:nodoc: super base.extend(ClassMethods) base.class_eval do class << self include Observable alias_method :instantiate_without_callbacks, :instantiate alias_method :instantiate, :instantiate_with_callbacks end the first alias method is supposed to do instantiate_without_callbacks -> ActiveRecord::Base::instaniate the second instantiate -> the yet to be defined ActiveRecord::Callbacks::instantiate_with_callbacks which takes you back to line 215, shows: module ClassMethods #:nodoc: def instantiate_with_callbacks(record) ������ ect = instantiate_without_callbacks(record) what is supposed to happen here is that any call to ActiveRecord::Base::instantiate first calls instantiate_with_callbacks, which calls instantiate_without_callbacks, which calls the, supposedly, __original__ ActiveRecord::Base::instantiate. what __actually__ happens in this: >> Company.find :all - /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:431:in `find_by_sql' - /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:431:in `find_by_sql' - /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:395:in `find' - (irb):1:in `irb_binding' - /usr/local/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding' - /usr/local/lib/ruby/1.8/irb/workspace.rb:52 - /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/callbacks.rb:222:in `instantiate' - /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:431:in `find_by_sql' - /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:431:in `find_by_sql' - /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:395:in `find' - (irb):1:in `irb_binding' - /usr/local/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding' - /usr/local/lib/ruby/1.8/irb/workspace.rb:52 - /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/callbacks.rb:222:in `instantiate' - /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:431:in `find_by_sql' - /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:431:in `find_by_sql' - /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.1/lib/active_record/base.rb:395:in `find' - (irb):1:in `irb_binding' - /usr/local/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding' - /usr/local/lib/ruby/1.8/irb/workspace.rb:52 and so on and so forth. eg. - infinite recursion. it seems the original instanciate is lost in this whole method shuffling approach. this code works in 1.8.2 and 1.8.3. unless the bevhaiour of alias_methods has changed - hard to beleive - this seems to be a bad bug. i've tried to distill this to a simple example with no luck. so i'm afaid there is more to it that the above. all you need do to reproduce is setup a rails dir, create a model, and run YourModel.find :all. system info root:rr# uname -srm FreeBSD 5.3-RELEASE i386 root:rr# ruby -v ruby 1.8.4 (2005-12-01) [i386-freebsd5.3] root:rr# rails -v Rails 0.14.4 hopefully i've not overlooked something obvious here - our water pipes froze today so i haven't been able to drink coffee. thoughts? -a -- =============================================================================== | ara [dot] t [dot] howard [at] noaa [dot] gov | all happiness comes from the desire for others to be happy. all misery | comes from the desire for oneself to be happy. | -- bodhicaryavatara ===============================================================================