From f1f04caf60e4fc9dc3b12109e0be831f2d692810 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Mon, 27 May 2019 17:52:35 -0700 Subject: [PATCH] Include inspect value of object in FrozenError messages FrozenError#receiver was added recently for getting the related object programmatically. However, there are cases where FrozenError is raised and not handled, and in those cases the resulting error messages lack detail, which makes debugging the error more difficult, especially in cases where the error is not easily reproducible. This includes the inspect value of the frozen object in FrozenError messages, which should make debugging simpler. --- error.c | 10 +++++----- eval.c | 2 +- test/ruby/test_rubyoptions.rb | 2 +- test/ruby/test_variable.rb | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/error.c b/error.c index 98b8c7801a..fc9cf7ee24 100644 --- a/error.c +++ b/error.c @@ -2897,13 +2897,13 @@ rb_error_frozen_object(VALUE frozen_obj) VALUE path = rb_ary_entry(debug_info, 0); VALUE line = rb_ary_entry(debug_info, 1); - rb_frozen_error_raise(frozen_obj, - "can't modify frozen %"PRIsVALUE", created at %"PRIsVALUE":%"PRIsVALUE, - CLASS_OF(frozen_obj), path, line); + rb_frozen_error_raise(frozen_obj, + "can't modify frozen %"PRIsVALUE": %"PRIsVALUE", created at %"PRIsVALUE":%"PRIsVALUE, + CLASS_OF(frozen_obj), rb_inspect(frozen_obj), path, line); } else { - rb_frozen_error_raise(frozen_obj, "can't modify frozen %"PRIsVALUE, - CLASS_OF(frozen_obj)); + rb_frozen_error_raise(frozen_obj, "can't modify frozen %"PRIsVALUE": %"PRIsVALUE, + CLASS_OF(frozen_obj), rb_inspect(frozen_obj)); } } diff --git a/eval.c b/eval.c index b9643803d5..fa3ec22af5 100644 --- a/eval.c +++ b/eval.c @@ -454,7 +454,7 @@ rb_class_modify_check(VALUE klass) goto noclass; } } - rb_frozen_error_raise(klass, "can't modify frozen %s", desc); + rb_frozen_error_raise(klass, "can't modify frozen %s: %"PRIsVALUE, desc, klass); } } diff --git a/test/ruby/test_rubyoptions.rb b/test/ruby/test_rubyoptions.rb index 96edaca6f3..4fdf98fd8c 100644 --- a/test/ruby/test_rubyoptions.rb +++ b/test/ruby/test_rubyoptions.rb @@ -988,7 +988,7 @@ class TestRubyOptions < Test::Unit::TestCase def test_frozen_string_literal_debug with_debug_pat = /created at/ - wo_debug_pat = /can\'t modify frozen String \(FrozenError\)\n\z/ + wo_debug_pat = /can\'t modify frozen String: "\w+" \(FrozenError\)\n\z/ frozen = [ ["--enable-frozen-string-literal", true], ["--disable-frozen-string-literal", false], diff --git a/test/ruby/test_variable.rb b/test/ruby/test_variable.rb index a9b1fd50ff..aa301f2bc7 100644 --- a/test/ruby/test_variable.rb +++ b/test/ruby/test_variable.rb @@ -135,7 +135,7 @@ class TestVariable < Test::Unit::TestCase def test_special_constant_ivars [ true, false, :symbol, "dsym#{rand(9999)}".to_sym, 1, 1.0 ].each do |v| assert_empty v.instance_variables - msg = "can't modify frozen #{v.class}" + msg = "can't modify frozen #{v.class}: #{v.inspect}" assert_raise_with_message(FrozenError, msg) do v.instance_variable_set(:@foo, :bar)