From 3bdc5ea71d94ca6a127be687b30e74d30fee06d3 Mon Sep 17 00:00:00 2001 From: Randy Stauner Date: Fri, 13 Dec 2024 16:31:28 -0700 Subject: [PATCH] Update NoMethodError message to not use object#inspect --- CHANGELOG.md | 1 + .../core/exception/no_method_error_tags.txt | 1 - .../core/truffle/exception_operations.rb | 22 +++++++++++++------ 3 files changed, 16 insertions(+), 8 deletions(-) delete mode 100644 spec/tags/core/exception/no_method_error_tags.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 7abe680d689f..667df8398948 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ Compatibility: * Support `symbolize_names` argument to `MatchData#named_captures` (#3681, @rwstauner). * Support `Proc#initialize_{dup,copy}` for subclasses (#3681, @rwstauner). * Remove deprecated `Encoding#replicate` method (#3681, @rwstauner). +* Update NoMethodError message to not use object#inspect (#3681, @rwstauner). Performance: diff --git a/spec/tags/core/exception/no_method_error_tags.txt b/spec/tags/core/exception/no_method_error_tags.txt deleted file mode 100644 index 62866325d544..000000000000 --- a/spec/tags/core/exception/no_method_error_tags.txt +++ /dev/null @@ -1 +0,0 @@ -fails:NoMethodError#message does not call receiver.inspect even when calling Exception#message diff --git a/src/main/ruby/truffleruby/core/truffle/exception_operations.rb b/src/main/ruby/truffleruby/core/truffle/exception_operations.rb index 4c5b9303db2f..8a4513f1769d 100644 --- a/src/main/ruby/truffleruby/core/truffle/exception_operations.rb +++ b/src/main/ruby/truffleruby/core/truffle/exception_operations.rb @@ -75,20 +75,28 @@ def self.class_name(receiver) # MRI: name_err_mesg_to_str def self.receiver_string(receiver) ret = begin - if Primitive.respond_to?(receiver, :inspect, false) + case receiver + when NilClass, TrueClass, FalseClass Truffle::Type.rb_inspect(receiver) + when Class + unless receiver.singleton_class? + "class #{receiver}" + end + # otherwise fall through to rb_any_to_s + when Module + "module #{receiver}" else - nil + klass = Primitive.metaclass(receiver) + if klass.name + "an instance of #{klass.name}" + end + # else fall through to rb_any_to_s end rescue Exception # rubocop:disable Lint/RescueException nil end ret = Primitive.rb_any_to_s(receiver) unless ret && ret.bytesize <= 65 - if ret.start_with?('#') - ret - else - "#{ret}:#{class_name(receiver)}" - end + ret end # MRI: inspect_frozen_obj