Feature #8366
Exception.message take time to execute depending on the instance variables
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
#1
[ruby-core:54768]
Updated by anuraguniyal (anurag uniyal) almost 5 years ago
also tried with ruby 2.0.0 at http://www.compileonline.com/execute_ruby_online.php
#2
[ruby-core:54775]
Updated by nobu (Nobuyoshi Nakada) almost 5 years ago
You can see the reason by reducing the size of the instance variable.
#3
[ruby-core:54776]
Updated by anuraguniyal (anurag uniyal) almost 5 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
[ruby-core:54780]
Updated by nobu (Nobuyoshi Nakada) almost 5 years ago
- Priority changed from 5 to 3
You should define inspect method.
#5
[ruby-core:54836]
Updated by anuraguniyal (anurag uniyal) almost 5 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
[ruby-core:65196]
Updated by Glass_saga (Masaki Matsushita) over 3 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>
#7
[ruby-core:65207]
Updated by nobu (Nobuyoshi Nakada) over 3 years ago
- Tracker changed from Bug to Feature
- Status changed from Closed to Open