diff options
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 15 |
1 files changed, 13 insertions, 2 deletions
@@ -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)); } |