}
}
- function_add_ref(fn);
- new_fn = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
- memcpy(new_fn, fn, sizeof(zend_op_array));
- new_fn->common.fn_flags |= ZEND_ACC_ARENA_ALLOCATED;
+ if (UNEXPECTED(fn->type == ZEND_INTERNAL_FUNCTION)) {
+ new_fn = zend_arena_alloc(&CG(arena), sizeof(zend_internal_function));
+ memcpy(new_fn, fn, sizeof(zend_internal_function));
+ new_fn->common.fn_flags |= ZEND_ACC_ARENA_ALLOCATED;
+ } else {
+ function_add_ref(fn);
+ new_fn = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
+ memcpy(new_fn, fn, sizeof(zend_op_array));
+ }
fn = zend_hash_update_ptr(&ce->function_table, key, new_fn);
zend_add_magic_methods(ce, key, fn);
}