Feature #8366

Exception.message take time to execute depending on the instance variables

Added by anurag uniyal about 2 years ago. Updated 9 months ago.

[ruby-core:54767]
Status:Open
Priority:Normal
Assignee:-

Description

I am seeing very interesting and catastrophic behavior with ruby, see the code below

class ExceptionTest

  def test
    @result = [0]*500000

    begin
      no_such_method
    rescue Exception => ex
      puts "before #{ex.class}"
      st = Time.now
      ex.message
      puts "after #{Time.now-st} #{ex.message}"
    end

  end
end

ExceptionTest.new.test

Ideally ex.message should not take any time to execute and hence Time taken should be in ms, but here is the output

ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.4.2]
before NameError
after 0.462443 undefined local variable or method `no_such_method' for #<ExceptionTest:0x007fc74a84e4f0>

If I assign [0]*500000 to a local variable instead of instance variable e.g. result = [0]*500000 it runs as expected

ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.4.2]
before NameError
after 2.8e-05 undefined local variable or method `no_such_method' for #<ExceptionTest:0x007ff59204e518>

It looks like somehow ex.message is looping thru the instance variables, why it would do so, please enlighten me!

I have tried it on ruby ruby-1.9.2-p290, ruby-1.9.1-p376 and whatever version the ruby on codepad.org is.

History

#2 Updated by Nobuyoshi Nakada about 2 years ago

You can see the reason by reducing the size of the instance variable.

#3 Updated by anurag uniyal about 2 years ago

nobu (Nobuyoshi Nakada) wrote:

You can see the reason by reducing the size of the instance variable.

What do you mean? I have a big project where I load plugins and each plugin can have megabytes of data and if one plugin does not implement some method, ex.message just hangs, other than that this is huge development nightmare when a typo in code can make scripts hang

It is a bug in NameError#to_s (https://github.com/ruby/ruby/blob/ruby_2_0_0/error.c#L1088-L1095) because it calls obj.inspect and which can be huge and time consuming for objects which have huge instance variables, doesn't Ruby support large instance variables?

#4 Updated by Nobuyoshi Nakada about 2 years ago

  • Priority changed from 5 to 3

You should define inspect method.

#5 Updated by anurag uniyal about 2 years ago

nobu (Nobuyoshi Nakada) wrote:

You should define inspect method.

But it is not practical to define inspect on all the classes I write or add inspect to all third party code or plugins I use, easier and better solution would be to now have obj.inspect called for ex.message

#6 Updated by Masaki Matsushita 10 months ago

  • Category set to core
  • Status changed from Open to Closed
  • Backport changed from 1.9.3: UNKNOWN, 2.0.0: UNKNOWN to 1.9.3: DONTNEED, 2.0.0: DONTNEED

It can't be reproduced with ruby 2.1.3.

ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-linux]
before NameError
after 0.147735733 undefined local variable or method `no_such_method' for #<ExceptionTest:0x007fac810bed90>

#7 Updated by Nobuyoshi Nakada 9 months ago

  • Tracker changed from Bug to Feature
  • Status changed from Closed to Open

Also available in: Atom PDF