Project

General

Profile

Actions

Feature #8366

open

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

Added by anuraguniyal (anurag uniyal) over 11 years ago. Updated about 10 years ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:54767]

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.

Updated by nobu (Nobuyoshi Nakada) over 11 years ago

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

Updated by anuraguniyal (anurag uniyal) over 11 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?

Updated by nobu (Nobuyoshi Nakada) over 11 years ago

  • Priority changed from 5 to 3

You should define inspect method.

Updated by anuraguniyal (anurag uniyal) over 11 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

Updated by Glass_saga (Masaki Matsushita) about 10 years 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>

Updated by nobu (Nobuyoshi Nakada) about 10 years ago

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

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0