summaryrefslogtreecommitdiff
path: root/object.c
diff options
context:
space:
mode:
Diffstat (limited to 'object.c')
-rw-r--r--object.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/object.c b/object.c
index d487fe82cc..8b6334020f 100644
--- a/object.c
+++ b/object.c
@@ -1655,6 +1655,7 @@ VALUE
rb_obj_alloc(VALUE klass)
{
VALUE obj;
+ rb_alloc_func_t allocator;
if (RCLASS_SUPER(klass) == 0 && klass != rb_cBasicObject) {
rb_raise(rb_eTypeError, "can't instantiate uninitialized class");
@@ -1662,7 +1663,13 @@ rb_obj_alloc(VALUE klass)
if (FL_TEST(klass, FL_SINGLETON)) {
rb_raise(rb_eTypeError, "can't create instance of singleton class");
}
- obj = rb_funcall(klass, ID_ALLOCATOR, 0, 0);
+ allocator = rb_get_alloc_func(klass);
+ if (!allocator) {
+ rb_raise(rb_eTypeError, "allocator undefined for %"PRIsVALUE,
+ klass);
+ }
+
+ obj = (*allocator)(klass);
if (rb_obj_class(obj) != rb_class_real(klass)) {
rb_raise(rb_eTypeError, "wrong instance allocation");
}