summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gc.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/gc.c b/gc.c
index 2b14adb39d..c70f8a35a7 100644
--- a/gc.c
+++ b/gc.c
@@ -2749,11 +2749,22 @@ rb_class_allocate_instance(VALUE klass)
return obj;
}
+static inline void
+rb_data_object_check(VALUE klass)
+{
+ if (klass != rb_cObject && (rb_get_alloc_func(klass) == rb_class_allocate_instance)) {
+ rb_undef_alloc_func(klass);
+#if 0 /* TODO: enable at the next release */
+ rb_warn("undefining the allocator of T_DATA class %"PRIsVALUE, klass);
+#endif
+ }
+}
+
VALUE
rb_data_object_wrap(VALUE klass, void *datap, RUBY_DATA_FUNC dmark, RUBY_DATA_FUNC dfree)
{
RUBY_ASSERT_ALWAYS(dfree != (RUBY_DATA_FUNC)1);
- if (klass) Check_Type(klass, T_CLASS);
+ if (klass) rb_data_object_check(klass);
return newobj_of(klass, T_DATA, (VALUE)dmark, (VALUE)dfree, (VALUE)datap, FALSE, sizeof(RVALUE));
}
@@ -2769,7 +2780,7 @@ VALUE
rb_data_typed_object_wrap(VALUE klass, void *datap, const rb_data_type_t *type)
{
RUBY_ASSERT_ALWAYS(type);
- if (klass) Check_Type(klass, T_CLASS);
+ if (klass) rb_data_object_check(klass);
return newobj_of(klass, T_DATA, (VALUE)type, (VALUE)1, (VALUE)datap, type->flags & RUBY_FL_WB_PROTECTED, sizeof(RVALUE));
}