aboutsummaryrefslogtreecommitdiffstats
path: root/test/ruby
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2022-11-17 15:57:11 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2022-11-18 08:31:56 -0800
commit10788166e7e568fdcd0b748e8d5dab442dcdc7ef (patch)
treeee195186a3fed8333bc1875f66ddab0c85c3d7db /test/ruby
parentf0ce1186620273a1182e6084559765143099eb88 (diff)
downloadruby-10788166e7e568fdcd0b748e8d5dab442dcdc7ef.tar.gz
Differentiate T_OBJECT shapes from other objects
We would like to differentiate types of objects via their shape. This commit adds a special T_OBJECT shape when we allocate an instance of T_OBJECT. This allows us to avoid testing whether an object is an instance of a T_OBJECT or not, we can just check the shape.
Diffstat (limited to 'test/ruby')
-rw-r--r--test/ruby/test_shapes.rb19
1 files changed, 14 insertions, 5 deletions
diff --git a/test/ruby/test_shapes.rb b/test/ruby/test_shapes.rb
index 326ff3a453..848bb4971a 100644
--- a/test/ruby/test_shapes.rb
+++ b/test/ruby/test_shapes.rb
@@ -88,8 +88,8 @@ class TestShapes < Test::Unit::TestCase
class TestObject; end
- def test_new_obj_has_root_shape
- assert_shape_equal(RubyVM::Shape.root_shape, RubyVM::Shape.of(TestObject.new))
+ def test_new_obj_has_t_object_shape
+ assert_shape_equal(RubyVM::Shape.root_shape, RubyVM::Shape.of(TestObject.new).parent)
end
def test_str_has_root_shape
@@ -114,14 +114,23 @@ class TestShapes < Test::Unit::TestCase
def test_basic_shape_transition
obj = Example.new
- refute_equal(RubyVM::Shape.root_shape, RubyVM::Shape.of(obj))
- assert_shape_equal(RubyVM::Shape.root_shape.edges[:@a], RubyVM::Shape.of(obj))
+ shape = RubyVM::Shape.of(obj)
+ refute_equal(RubyVM::Shape.root_shape, shape)
+ assert_equal :@a, shape.edge_name
+ assert_equal RubyVM::Shape::SHAPE_IVAR, shape.type
+
+ shape = shape.parent
+ assert_equal RubyVM::Shape::SHAPE_T_OBJECT, shape.type
+
+ shape = shape.parent
+ assert_equal(RubyVM::Shape.root_shape.id, shape.id)
assert_equal(obj.instance_variable_get(:@a), 1)
end
def test_different_objects_make_same_transition
- obj = Example.new
+ obj = []
obj2 = ""
+ obj.instance_variable_set(:@a, 1)
obj2.instance_variable_set(:@a, 1)
assert_shape_equal(RubyVM::Shape.of(obj), RubyVM::Shape.of(obj2))
end