summaryrefslogtreecommitdiff
path: root/shape.c
diff options
context:
space:
mode:
Diffstat (limited to 'shape.c')
-rw-r--r--shape.c78
1 files changed, 9 insertions, 69 deletions
diff --git a/shape.c b/shape.c
index 7a02b23073..24f1394f6c 100644
--- a/shape.c
+++ b/shape.c
@@ -409,14 +409,10 @@ rb_obj_shape_id(VALUE obj)
if (BUILTIN_TYPE(obj) == T_CLASS || BUILTIN_TYPE(obj) == T_MODULE) {
VALUE fields_obj = RCLASS_WRITABLE_FIELDS_OBJ(obj);
- shape_id_t base = ROOT_SHAPE_ID;
if (fields_obj) {
- // Remove the layout from the fields object. We want to
- // combine the shape of the fields object with the layout of the
- // class / module object.
- base = RBASIC_SHAPE_ID(fields_obj) & ~SHAPE_ID_LAYOUT_MASK;
+ return RBASIC_SHAPE_ID(fields_obj);
}
- return rb_shape_layout(RBASIC_SHAPE_ID(obj)) | base;
+ return ROOT_SHAPE_ID;
}
return RBASIC_SHAPE_ID(obj);
}
@@ -701,7 +697,7 @@ rb_shape_transition_object_id(shape_id_t original_shape_id)
bool dont_care;
rb_shape_t *shape = get_next_shape_internal(RSHAPE(original_shape_id), id_object_id, SHAPE_OBJ_ID, &dont_care, true);
if (!shape) {
- return rb_shape_layout(original_shape_id) | ROOT_COMPLEX_WITH_OBJ_ID | RSHAPE_FLAGS(original_shape_id);
+ return ROOT_COMPLEX_WITH_OBJ_ID | RSHAPE_FLAGS(original_shape_id);
}
RUBY_ASSERT(shape);
@@ -1229,55 +1225,17 @@ rb_shape_foreach_field(shape_id_t initial_shape_id, rb_shape_foreach_transition_
}
#if RUBY_DEBUG
-/*
- * Get the layout of this object. The "layout" indicates what strategy
- * we should use for fetching instance variables from `obj`. It's based
- * on the C struct layout for each particular object.
- *
- * TODO: make Struct have a similar layout to RDATA
- */
-static shape_id_t
-rb_shape_expected_layout(VALUE obj)
-{
- switch (BUILTIN_TYPE(obj)) {
- case T_OBJECT:
- return SHAPE_ID_LAYOUT_ROBJECT;
- case T_CLASS:
- case T_MODULE:
- if (FL_TEST_RAW(obj, RCLASS_BOXABLE)) {
- return SHAPE_ID_LAYOUT_OTHER;
- }
- return SHAPE_ID_LAYOUT_RCLASS;
- case T_DATA:
- return SHAPE_ID_LAYOUT_RDATA;
- case T_IMEMO:
- if (IMEMO_TYPE_P(obj, imemo_fields)) {
- return SHAPE_ID_LAYOUT_ROBJECT;
- }
- return SHAPE_ID_LAYOUT_OTHER;
- default:
- return SHAPE_ID_LAYOUT_OTHER;
- }
-}
-
bool
rb_shape_verify_consistency(VALUE obj, shape_id_t shape_id)
{
- if (shape_id == INVALID_SHAPE_ID) {
- rb_bug("Can't set INVALID_SHAPE_ID on an object");
- }
-
- shape_id_t actual_layout = rb_shape_layout(rb_obj_shape_id(obj));
- shape_id_t expected_layout = rb_shape_expected_layout(obj);
- if (actual_layout != expected_layout) {
- rb_bug("shape_id layout mismatch: expected=%x actual=%x shape_id=%u obj=%s",
- expected_layout, actual_layout, shape_id, rb_obj_info(obj));
- }
-
if (shape_id == ROOT_SHAPE_ID) {
return true;
}
+ if (shape_id == INVALID_SHAPE_ID) {
+ rb_bug("Can't set INVALID_SHAPE_ID on an object");
+ }
+
rb_shape_t *shape = RSHAPE(shape_id);
bool has_object_id = false;
@@ -1291,11 +1249,13 @@ rb_shape_verify_consistency(VALUE obj, shape_id_t shape_id)
if (rb_shape_has_object_id(shape_id)) {
if (!has_object_id) {
+ rb_p(obj);
rb_bug("shape_id claim having obj_id but doesn't shape_id=%u, obj=%s", shape_id, rb_obj_info(obj));
}
}
else {
if (has_object_id) {
+ rb_p(obj);
rb_bug("shape_id claim not having obj_id but it does shape_id=%u, obj=%s", shape_id, rb_obj_info(obj));
}
}
@@ -1370,25 +1330,6 @@ shape_has_object_id_p(VALUE self)
}
static VALUE
-shape_layout(VALUE self)
-{
- shape_id_t shape_id = NUM2UINT(rb_struct_getmember(self, rb_intern("id")));
-
- switch (rb_shape_layout(shape_id)) {
- case SHAPE_ID_LAYOUT_ROBJECT:
- return ID2SYM(rb_intern("robject"));
- case SHAPE_ID_LAYOUT_RCLASS:
- return ID2SYM(rb_intern("rclass"));
- case SHAPE_ID_LAYOUT_RDATA:
- return ID2SYM(rb_intern("rdata"));
- case SHAPE_ID_LAYOUT_OTHER:
- return ID2SYM(rb_intern("other"));
- default:
- rb_bug("unknown shape layout: %u", rb_shape_layout(shape_id));
- }
-}
-
-static VALUE
parse_key(ID key)
{
if (is_instance_id(key)) {
@@ -1687,7 +1628,6 @@ Init_shape(void)
rb_define_method(rb_cShape, "complex?", shape_complex, 0);
rb_define_method(rb_cShape, "shape_frozen?", shape_frozen, 0);
rb_define_method(rb_cShape, "has_object_id?", shape_has_object_id_p, 0);
- rb_define_method(rb_cShape, "layout", shape_layout, 0);
rb_define_const(rb_cShape, "SHAPE_ROOT", INT2NUM(SHAPE_ROOT));
rb_define_const(rb_cShape, "SHAPE_IVAR", INT2NUM(SHAPE_IVAR));