
Issue #21335 has been updated by mame (Yusuke Endoh). It is possible to change how to display the backtrace to show class names that are not completely bound to constants. I have conservatively designed the current spec of the backtrace to avoid potential confusing output, but I'm not sure which would be better. ```diff diff --git a/vm_backtrace.c b/vm_backtrace.c index 26e0a6fb76..15ec9b7a4d 100644 --- a/vm_backtrace.c +++ b/vm_backtrace.c @@ -201,20 +201,19 @@ VALUE rb_mod_name0(VALUE klass, bool *permanent); VALUE rb_gen_method_name(VALUE owner, VALUE name) { - bool permanent; if (RB_TYPE_P(owner, T_CLASS) || RB_TYPE_P(owner, T_MODULE)) { if (RCLASS_SINGLETON_P(owner)) { VALUE v = RCLASS_ATTACHED_OBJECT(owner); if (RB_TYPE_P(v, T_CLASS) || RB_TYPE_P(v, T_MODULE)) { - v = rb_mod_name0(v, &permanent); - if (permanent && !NIL_P(v)) { + v = rb_mod_name(v); + if (!NIL_P(v)) { return rb_sprintf("%"PRIsVALUE".%"PRIsVALUE, v, name); } } } else { - owner = rb_mod_name0(owner, &permanent); - if (permanent && !NIL_P(owner)) { + owner = rb_mod_name(owner); + if (!NIL_P(owner)) { return rb_sprintf("%"PRIsVALUE"#%"PRIsVALUE, owner, name); } } ``` ``` $ RUBY_NAMESPACE=1 ./miniruby test.rb ./miniruby: warning: Namespace is experimental, and the behavior may change in the future! See doc/namespace.md for know issues, etc. foo.rb:9:in '#<Namespace:0x00007ff4d61f9f20>::Foo.test' foo.rb:7:in '#<Namespace:0x00007ff4d61f93e0>::Foo.test' foo.rb:9:in '#<Namespace:0x00007ff4d61f9f20>::Foo.test' foo.rb:7:in '#<Namespace:0x00007ff4d61f93e0>::Foo.test' foo.rb:9:in '#<Namespace:0x00007ff4d61f9f20>::Foo.test' foo.rb:7:in '#<Namespace:0x00007ff4d61f93e0>::Foo.test' foo.rb:9:in '#<Namespace:0x00007ff4d61f9f20>::Foo.test' foo.rb:7:in '#<Namespace:0x00007ff4d61f93e0>::Foo.test' foo.rb:9:in '#<Namespace:0x00007ff4d61f9f20>::Foo.test' foo.rb:7:in '#<Namespace:0x00007ff4d61f9f20>::Foo.test' test.rb:23:in '<main>' ``` ---------------------------------------- Feature #21335: Namespaces should be present in the backtrace https://bugs.ruby-lang.org/issues/21335#change-113237 * Author: tenderlovemaking (Aaron Patterson) * Status: Open ---------------------------------------- Namespaces can call in to other name spaces. I think it might be helpful if namespace information is in the backtrace. For example: ```ruby File.binwrite "foo.rb", <<-eorb class Foo def self.test(ns1, ns2, count) if count == 0 puts caller else if count % 2 == 0 ns1::Foo.test(ns1, ns2, count - 1) else ns2::Foo.test(ns1, ns2, count - 1) end end end end eorb ns1 = Namespace.new ns1.load "foo.rb" ns2 = Namespace.new ns2.load "foo.rb" ns1::Foo.test(ns1, ns2, 10) ``` The output is like this: ``` See doc/namespace.md for known issues, etc. /Users/aaron/git/ruby/exe/ruby: warning: Namespace is experimental, and the behavior may change in the future! See doc/namespace.md for known issues, etc. /Users/aaron/git/ruby/foo.rb:9:in 'test' /Users/aaron/git/ruby/foo.rb:7:in 'test' /Users/aaron/git/ruby/foo.rb:9:in 'test' /Users/aaron/git/ruby/foo.rb:7:in 'test' /Users/aaron/git/ruby/foo.rb:9:in 'test' /Users/aaron/git/ruby/foo.rb:7:in 'test' /Users/aaron/git/ruby/foo.rb:9:in 'test' /Users/aaron/git/ruby/foo.rb:7:in 'test' /Users/aaron/git/ruby/foo.rb:9:in 'test' /Users/aaron/git/ruby/foo.rb:7:in 'test' ./test.rb:23:in '<main>' ``` `Foo.test` alternates between namespaces when calling a method, but you can't tell from the backtrace. I think we should include namespaces in the backtrace. -- https://bugs.ruby-lang.org/