diff --git a/shape.c b/shape.c index 2d5c2109c7d333..c78a02a1cb1ae8 100644 --- a/shape.c +++ b/shape.c @@ -733,9 +733,10 @@ rb_shape_get_next(rb_shape_t *shape, VALUE obj, ID id) if (RCLASS_EXT(klass)->variation_count >= SHAPE_MAX_VARIATIONS) { rb_category_warn( RB_WARN_CATEGORY_PERFORMANCE, - "Maximum shapes variations (%d) reached by %"PRIsVALUE", instance variables accesses will be slower.", - SHAPE_MAX_VARIATIONS, - rb_class_path(klass) + "The class %"PRIsVALUE" reached %d shape variations, instance variables accesses will be slower and memory usage increased.\n" + "It is recommended to define instance variable in a consistent order, for instance by eagerly defining them all in the `initialize` method.", + rb_class_path(klass), + SHAPE_MAX_VARIATIONS ); } } diff --git a/test/ruby/test_object.rb b/test/ruby/test_object.rb index acc913b9c0ad2d..0bb9e633a1cc3d 100644 --- a/test/ruby/test_object.rb +++ b/test/ruby/test_object.rb @@ -458,7 +458,7 @@ def test_check_to_integer end def test_max_shape_variation_with_performance_warnings - assert_in_out_err([], <<-INPUT, %w(), /Maximum shapes variations \(8\) reached by Foo, instance variables accesses will be slower\.$/) + assert_in_out_err([], <<-INPUT, %w(), /The class Foo reached 8 shape variations, instance variables accesses will be slower and memory usage increased/) $VERBOSE = false Warning[:performance] = true