Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Zend/zend.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,8 @@ struct _zend_class_entry {
zend_function *__serialize;
zend_function *__unserialize;

const zend_object_handlers *default_object_handlers;

/* allocated only if class implements Iterator or IteratorAggregate interface */
zend_class_iterator_funcs *iterator_funcs_ptr;
/* allocated only if class implements ArrayAccess interface */
Expand Down
2 changes: 2 additions & 0 deletions Zend/zend_API.h
Original file line number Diff line number Diff line change
Expand Up @@ -272,11 +272,13 @@ typedef struct _zend_fcall_info_cache {
{ \
memset(&class_container, 0, sizeof(zend_class_entry)); \
class_container.name = zend_string_init_interned(class_name, class_name_len, 1); \
class_container.default_object_handlers = &std_object_handlers; \
class_container.info.internal.builtin_functions = functions; \
}

#define INIT_CLASS_ENTRY_INIT_METHODS(class_container, functions) \
{ \
class_container.default_object_handlers = &std_object_handlers; \
class_container.constructor = NULL; \
class_container.destructor = NULL; \
class_container.clone = NULL; \
Expand Down
14 changes: 1 addition & 13 deletions Zend/zend_attributes.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,18 +131,6 @@ ZEND_METHOD(SensitiveParameterValue, __debugInfo)
RETURN_EMPTY_ARRAY();
}

static zend_object *attributes_sensitive_parameter_value_new(zend_class_entry *ce)
{
zend_object *object;

object = zend_objects_new(ce);
object->handlers = &attributes_object_handlers_sensitive_parameter_value;

object_properties_init(object, ce);

return object;
}

static HashTable *attributes_sensitive_parameter_value_get_properties_for(zend_object *zobj, zend_prop_purpose purpose)
{
return NULL;
Expand Down Expand Up @@ -382,7 +370,7 @@ void zend_register_attribute_ce(void)

/* This is not an actual attribute, thus the zend_mark_internal_attribute() call is missing. */
zend_ce_sensitive_parameter_value = register_class_SensitiveParameterValue();
zend_ce_sensitive_parameter_value->create_object = attributes_sensitive_parameter_value_new;
zend_ce_sensitive_parameter_value->default_object_handlers = &attributes_object_handlers_sensitive_parameter_value;
}

void zend_attributes_shutdown(void)
Expand Down
2 changes: 1 addition & 1 deletion Zend/zend_closures.c
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,6 @@ static zend_object *zend_closure_new(zend_class_entry *class_type) /* {{{ */
memset(closure, 0, sizeof(zend_closure));

zend_object_std_init(&closure->std, class_type);
closure->std.handlers = &closure_handlers;

return (zend_object*)closure;
}
Expand Down Expand Up @@ -678,6 +677,7 @@ void zend_register_closure_ce(void) /* {{{ */
{
zend_ce_closure = register_class_Closure();
zend_ce_closure->create_object = zend_closure_new;
zend_ce_closure->default_object_handlers = &closure_handlers;

memcpy(&closure_handlers, &std_object_handlers, sizeof(zend_object_handlers));
closure_handlers.free_obj = zend_closure_free_storage;
Expand Down
1 change: 1 addition & 0 deletions Zend/zend_compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -1828,6 +1828,7 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, bool nullify_hand
ZEND_MAP_PTR_INIT(ce->static_members_table, NULL);
ZEND_MAP_PTR_INIT(ce->mutable_data, NULL);

ce->default_object_handlers = &std_object_handlers;
ce->default_properties_count = 0;
ce->default_static_members_count = 0;
ce->properties_info_table = NULL;
Expand Down
4 changes: 2 additions & 2 deletions Zend/zend_enum.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ zend_object *zend_enum_new(zval *result, zend_class_entry *ce, zend_string *case
ZVAL_COPY(OBJ_PROP_NUM(zobj, 1), backing_value_zv);
}

zobj->handlers = &enum_handlers;

return zobj;
}

Expand Down Expand Up @@ -184,6 +182,8 @@ void zend_enum_add_interfaces(zend_class_entry *ce)
ce->interface_names[num_interfaces_before + 1].name = zend_string_copy(zend_ce_backed_enum->name);
ce->interface_names[num_interfaces_before + 1].lc_name = zend_string_init("backedenum", sizeof("backedenum") - 1, 0);
}

ce->default_object_handlers = &enum_handlers;
}

zend_result zend_enum_build_backed_enum_table(zend_class_entry *ce)
Expand Down
45 changes: 18 additions & 27 deletions Zend/zend_exceptions.c
Original file line number Diff line number Diff line change
Expand Up @@ -240,21 +240,19 @@ ZEND_API void zend_clear_exception(void) /* {{{ */
}
/* }}} */

static zend_object *zend_default_exception_new_ex(zend_class_entry *class_type, bool skip_top_traces) /* {{{ */
static zend_object *zend_default_exception_new(zend_class_entry *class_type) /* {{{ */
{
zval tmp;
zval trace;
zend_class_entry *base_ce;
zend_string *filename;

zend_object *object = zend_objects_new(class_type);
object->handlers = &default_exception_handlers;

object_properties_init(object, class_type);

if (EG(current_execute_data)) {
zend_fetch_debug_backtrace(&trace,
skip_top_traces,
0,
EG(exception_ignore_args) ? DEBUG_BACKTRACE_IGNORE_ARGS : 0, 0);
} else {
array_init(&trace);
Expand Down Expand Up @@ -282,18 +280,6 @@ static zend_object *zend_default_exception_new_ex(zend_class_entry *class_type,
}
/* }}} */

static zend_object *zend_default_exception_new(zend_class_entry *class_type) /* {{{ */
{
return zend_default_exception_new_ex(class_type, 0);
}
/* }}} */

static zend_object *zend_error_exception_new(zend_class_entry *class_type) /* {{{ */
{
return zend_default_exception_new_ex(class_type, 0);
}
/* }}} */

/* {{{ Clone the exception object */
ZEND_COLD ZEND_METHOD(Exception, __clone)
{
Expand Down Expand Up @@ -739,6 +725,11 @@ ZEND_METHOD(Exception, __toString)
}
/* }}} */

static void zend_init_exception_class_entry(zend_class_entry *ce) {
ce->create_object = zend_default_exception_new;
ce->default_object_handlers = &default_exception_handlers;
}

void zend_register_default_exception(void) /* {{{ */
{
zend_ce_throwable = register_class_Throwable(zend_ce_stringable);
Expand All @@ -748,37 +739,37 @@ void zend_register_default_exception(void) /* {{{ */
default_exception_handlers.clone_obj = NULL;

zend_ce_exception = register_class_Exception(zend_ce_throwable);
zend_ce_exception->create_object = zend_default_exception_new;
zend_init_exception_class_entry(zend_ce_exception);

zend_ce_error_exception = register_class_ErrorException(zend_ce_exception);
zend_ce_error_exception->create_object = zend_error_exception_new;
zend_init_exception_class_entry(zend_ce_error_exception);

zend_ce_error = register_class_Error(zend_ce_throwable);
zend_ce_error->create_object = zend_default_exception_new;
zend_init_exception_class_entry(zend_ce_error);

zend_ce_compile_error = register_class_CompileError(zend_ce_error);
zend_ce_compile_error->create_object = zend_default_exception_new;
zend_init_exception_class_entry(zend_ce_compile_error);

zend_ce_parse_error = register_class_ParseError(zend_ce_compile_error);
zend_ce_parse_error->create_object = zend_default_exception_new;
zend_init_exception_class_entry(zend_ce_parse_error);

zend_ce_type_error = register_class_TypeError(zend_ce_error);
zend_ce_type_error->create_object = zend_default_exception_new;
zend_init_exception_class_entry(zend_ce_type_error);

zend_ce_argument_count_error = register_class_ArgumentCountError(zend_ce_type_error);
zend_ce_argument_count_error->create_object = zend_default_exception_new;
zend_init_exception_class_entry(zend_ce_argument_count_error);

zend_ce_value_error = register_class_ValueError(zend_ce_error);
zend_ce_value_error->create_object = zend_default_exception_new;
zend_init_exception_class_entry(zend_ce_value_error);

zend_ce_arithmetic_error = register_class_ArithmeticError(zend_ce_error);
zend_ce_arithmetic_error->create_object = zend_default_exception_new;
zend_init_exception_class_entry(zend_ce_arithmetic_error);

zend_ce_division_by_zero_error = register_class_DivisionByZeroError(zend_ce_arithmetic_error);
zend_ce_division_by_zero_error->create_object = zend_default_exception_new;
zend_init_exception_class_entry(zend_ce_division_by_zero_error);

zend_ce_unhandled_match_error = register_class_UnhandledMatchError(zend_ce_error);
zend_ce_unhandled_match_error->create_object = zend_default_exception_new;
zend_init_exception_class_entry(zend_ce_unhandled_match_error);

INIT_CLASS_ENTRY(zend_ce_unwind_exit, "UnwindExit", NULL);

Expand Down
4 changes: 1 addition & 3 deletions Zend/zend_fibers.c
Original file line number Diff line number Diff line change
Expand Up @@ -574,12 +574,9 @@ static zend_always_inline zend_fiber_transfer zend_fiber_suspend(zend_fiber *fib
static zend_object *zend_fiber_object_create(zend_class_entry *ce)
{
zend_fiber *fiber = emalloc(sizeof(zend_fiber));

memset(fiber, 0, sizeof(zend_fiber));

zend_object_std_init(&fiber->std, ce);
fiber->std.handlers = &zend_fiber_handlers;

return &fiber->std;
}

Expand Down Expand Up @@ -888,6 +885,7 @@ void zend_register_fiber_ce(void)
{
zend_ce_fiber = register_class_Fiber();
zend_ce_fiber->create_object = zend_fiber_object_create;
zend_ce_fiber->default_object_handlers = &zend_fiber_handlers;

zend_fiber_handlers = std_object_handlers;
zend_fiber_handlers.dtor_obj = zend_fiber_object_destroy;
Expand Down
7 changes: 2 additions & 5 deletions Zend/zend_generators.c
Original file line number Diff line number Diff line change
Expand Up @@ -404,9 +404,7 @@ static HashTable *zend_generator_get_gc(zend_object *object, zval **table, int *

static zend_object *zend_generator_create(zend_class_entry *class_type) /* {{{ */
{
zend_generator *generator;

generator = emalloc(sizeof(zend_generator));
zend_generator *generator = emalloc(sizeof(zend_generator));
memset(generator, 0, sizeof(zend_generator));

/* The key will be incremented on first use, so it'll start at 0 */
Expand All @@ -421,8 +419,6 @@ static zend_object *zend_generator_create(zend_class_entry *class_type) /* {{{ *
generator->node.ptr.root = NULL;

zend_object_std_init(&generator->std, class_type);
generator->std.handlers = &zend_generator_handlers;

return (zend_object*)generator;
}
/* }}} */
Expand Down Expand Up @@ -1132,6 +1128,7 @@ void zend_register_generator_ce(void) /* {{{ */
zend_ce_generator->create_object = zend_generator_create;
/* get_iterator has to be assigned *after* implementing the interface */
zend_ce_generator->get_iterator = zend_generator_get_iterator;
zend_ce_generator->default_object_handlers = &zend_generator_handlers;

memcpy(&zend_generator_handlers, &std_object_handlers, sizeof(zend_object_handlers));
zend_generator_handlers.free_obj = zend_generator_free_storage;
Expand Down
1 change: 1 addition & 0 deletions Zend/zend_inheritance.c
Original file line number Diff line number Diff line change
Expand Up @@ -1472,6 +1472,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par
zend_string_release_ex(ce->parent_name, 0);
}
ce->parent = parent_ce;
ce->default_object_handlers = parent_ce->default_object_handlers;
ce->ce_flags |= ZEND_ACC_RESOLVED_PARENT;

/* Inherit properties */
Expand Down
2 changes: 1 addition & 1 deletion Zend/zend_interfaces.c
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,6 @@ typedef struct {
static zend_object *zend_internal_iterator_create(zend_class_entry *ce) {
zend_internal_iterator *intern = emalloc(sizeof(zend_internal_iterator));
zend_object_std_init(&intern->std, ce);
intern->std.handlers = &zend_internal_iterator_handlers;
intern->iter = NULL;
intern->rewind_called = 0;
return &intern->std;
Expand Down Expand Up @@ -655,6 +654,7 @@ ZEND_API void zend_register_interfaces(void)

zend_ce_internal_iterator = register_class_InternalIterator(zend_ce_iterator);
zend_ce_internal_iterator->create_object = zend_internal_iterator_create;
zend_ce_internal_iterator->default_object_handlers = &zend_internal_iterator_handlers;

memcpy(&zend_internal_iterator_handlers, zend_get_std_object_handlers(),
sizeof(zend_object_handlers));
Expand Down
2 changes: 1 addition & 1 deletion Zend/zend_iterators.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ static const zend_object_handlers iterator_object_handlers = {
ZEND_API void zend_register_iterator_wrapper(void)
{
INIT_CLASS_ENTRY(zend_iterator_class_entry, "__iterator_wrapper", NULL);
zend_iterator_class_entry.default_object_handlers = &iterator_object_handlers;
}

static void iter_wrapper_free(zend_object *object)
Expand All @@ -83,7 +84,6 @@ static HashTable *iter_wrapper_get_gc(zend_object *object, zval **table, int *n)
ZEND_API void zend_iterator_init(zend_object_iterator *iter)
{
zend_object_std_init(&iter->std, &zend_iterator_class_entry);
iter->std.handlers = &iterator_object_handlers;
}

ZEND_API void zend_iterator_dtor(zend_object_iterator *iter)
Expand Down
2 changes: 1 addition & 1 deletion Zend/zend_objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ static zend_always_inline void _zend_object_std_init(zend_object *object, zend_c
GC_SET_REFCOUNT(object, 1);
GC_TYPE_INFO(object) = GC_OBJECT;
object->ce = ce;
object->handlers = ce->default_object_handlers;
object->properties = NULL;
zend_objects_store_put(object);
if (UNEXPECTED(ce->ce_flags & ZEND_ACC_USE_GUARDS)) {
Expand Down Expand Up @@ -186,7 +187,6 @@ ZEND_API zend_object* ZEND_FASTCALL zend_objects_new(zend_class_entry *ce)
zend_object *object = emalloc(sizeof(zend_object) + zend_object_properties_size(ce));

_zend_object_std_init(object, ce);
object->handlers = &std_object_handlers;
return object;
}

Expand Down
6 changes: 2 additions & 4 deletions Zend/zend_weakrefs.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,9 +210,6 @@ static zend_object* zend_weakref_new(zend_class_entry *ce) {
zend_weakref *wr = zend_object_alloc(sizeof(zend_weakref), zend_ce_weakref);

zend_object_std_init(&wr->std, zend_ce_weakref);

wr->std.handlers = &zend_weakref_handlers;

return &wr->std;
}

Expand Down Expand Up @@ -304,7 +301,6 @@ static zend_object *zend_weakmap_create_object(zend_class_entry *ce)
{
zend_weakmap *wm = zend_object_alloc(sizeof(zend_weakmap), ce);
zend_object_std_init(&wm->std, ce);
wm->std.handlers = &zend_weakmap_handlers;

zend_hash_init(&wm->ht, 0, NULL, ZVAL_PTR_DTOR, 0);
return &wm->std;
Expand Down Expand Up @@ -651,6 +647,7 @@ void zend_register_weakref_ce(void) /* {{{ */
zend_ce_weakref = register_class_WeakReference();

zend_ce_weakref->create_object = zend_weakref_new;
zend_ce_weakref->default_object_handlers = &zend_weakref_handlers;

memcpy(&zend_weakref_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
zend_weakref_handlers.offset = XtOffsetOf(zend_weakref, std);
Expand All @@ -662,6 +659,7 @@ void zend_register_weakref_ce(void) /* {{{ */

zend_ce_weakmap->create_object = zend_weakmap_create_object;
zend_ce_weakmap->get_iterator = zend_weakmap_get_iterator;
zend_ce_weakmap->default_object_handlers = &zend_weakmap_handlers;

memcpy(&zend_weakmap_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
zend_weakmap_handlers.offset = XtOffsetOf(zend_weakmap, std);
Expand Down
4 changes: 4 additions & 0 deletions ext/com_dotnet/com_extension.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,18 +184,22 @@ PHP_MINIT_FUNCTION(com_dotnet)

php_com_saproxy_class_entry = register_class_com_safearray_proxy();
/* php_com_saproxy_class_entry->constructor->common.fn_flags |= ZEND_ACC_PROTECTED; */
php_com_saproxy_class_entry->default_object_handlers = &php_com_saproxy_handlers;
php_com_saproxy_class_entry->get_iterator = php_com_saproxy_iter_get;

php_com_variant_class_entry = register_class_variant();
php_com_variant_class_entry->default_object_handlers = &php_com_object_handlers;
php_com_variant_class_entry->create_object = php_com_object_new;
php_com_variant_class_entry->get_iterator = php_com_iter_get;

tmp = register_class_com(php_com_variant_class_entry);
tmp->default_object_handlers = &php_com_object_handlers;
tmp->create_object = php_com_object_new;
tmp->get_iterator = php_com_iter_get;

#if HAVE_MSCOREE_H
tmp = register_class_dotnet(php_com_variant_class_entry);
tmp->default_object_handlers = &php_com_object_handlers;
tmp->create_object = php_com_object_new;
tmp->get_iterator = php_com_iter_get;
#endif
Expand Down
1 change: 0 additions & 1 deletion ext/com_dotnet/com_handlers.c
Original file line number Diff line number Diff line change
Expand Up @@ -627,7 +627,6 @@ zend_object* php_com_object_new(zend_class_entry *ce)
obj->ce = ce;

zend_object_std_init(&obj->zo, ce);
obj->zo.handlers = &php_com_object_handlers;

obj->typeinfo = NULL;

Expand Down
2 changes: 0 additions & 2 deletions ext/com_dotnet/com_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ PHP_COM_DOTNET_API void php_com_wrap_dispatch(zval *z, IDispatch *disp,
IDispatch_GetTypeInfo(V_DISPATCH(&obj->v), 0, LANG_NEUTRAL, &obj->typeinfo);

zend_object_std_init(&obj->zo, php_com_variant_class_entry);
obj->zo.handlers = &php_com_object_handlers;
ZVAL_OBJ(z, &obj->zo);
}

Expand All @@ -85,7 +84,6 @@ PHP_COM_DOTNET_API void php_com_wrap_variant(zval *z, VARIANT *v,
}

zend_object_std_init(&obj->zo, php_com_variant_class_entry);
obj->zo.handlers = &php_com_object_handlers;
ZVAL_OBJ(z, &obj->zo);
}

Expand Down
2 changes: 1 addition & 1 deletion ext/com_dotnet/com_persist.c
Original file line number Diff line number Diff line change
Expand Up @@ -709,7 +709,6 @@ static zend_object* helper_new(zend_class_entry *ce)
memset(helper, 0, sizeof(*helper));

zend_object_std_init(&helper->std, helper_ce);
helper->std.handlers = &helper_handlers;

return &helper->std;
}
Expand All @@ -722,6 +721,7 @@ void php_com_persist_minit(INIT_FUNC_ARGS)

helper_ce = register_class_COMPersistHelper();
helper_ce->create_object = helper_new;
helper_ce->default_object_handlers = &helper_handlers;

le_istream = zend_register_list_destructors_ex(istream_dtor,
NULL, "com_dotnet_istream_wrapper", module_number);
Expand Down
Loading