summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-05-31 11:57:22 +0300
committerDmitry Stogov <dmitry@zend.com>2018-05-31 11:57:22 +0300
commitf2b4ec4bdc595773fb49b7d6ae8942c61f436288 (patch)
tree528873c7a446929a9298aaaaad4b6cef805fdc69 /Zend
parent0d72bb8fcb0b2d658f9a40e473207f4a1f66df91 (diff)
downloadphp-git-f2b4ec4bdc595773fb49b7d6ae8942c61f436288.tar.gz
Export standard object handlers, to avoid indirect access
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_builtin_functions.c6
-rw-r--r--Zend/zend_closures.c4
-rw-r--r--Zend/zend_exceptions.c2
-rw-r--r--Zend/zend_generators.c2
-rw-r--r--Zend/zend_object_handlers.c28
-rw-r--r--Zend/zend_object_handlers.h28
-rw-r--r--Zend/zend_objects_API.c5
-rw-r--r--Zend/zend_objects_API.h1
8 files changed, 43 insertions, 33 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index ac6a460ed6..c2380f622b 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -2290,7 +2290,7 @@ ZEND_FUNCTION(debug_print_backtrace)
if (object) {
if (func->common.scope) {
class_name = func->common.scope->name;
- } else if (object->handlers->get_class_name == std_object_handlers.get_class_name) {
+ } else if (object->handlers->get_class_name == zend_std_get_class_name) {
class_name = object->ce->name;
} else {
class_name = object->handlers->get_class_name(object);
@@ -2355,7 +2355,7 @@ ZEND_FUNCTION(debug_print_backtrace)
ZEND_PUTS(call_type);
if (object
&& !func->common.scope
- && object->handlers->get_class_name != std_object_handlers.get_class_name) {
+ && object->handlers->get_class_name != zend_std_get_class_name) {
zend_string_release_ex(class_name, 0);
}
}
@@ -2522,7 +2522,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
if (object) {
if (func->common.scope) {
ZVAL_STR_COPY(&tmp, func->common.scope->name);
- } else if (object->handlers->get_class_name == std_object_handlers.get_class_name) {
+ } else if (object->handlers->get_class_name == zend_std_get_class_name) {
ZVAL_STR_COPY(&tmp, object->ce->name);
} else {
ZVAL_STR(&tmp, object->handlers->get_class_name(object));
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index 77ee4c4e6c..50b6796716 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -386,7 +386,7 @@ static zend_function *zend_closure_get_method(zend_object **object, zend_string
return zend_get_closure_invoke_method(*object);
}
- return std_object_handlers.get_method(object, method, key);
+ return zend_std_get_method(object, method, key);
}
/* }}} */
@@ -609,7 +609,7 @@ void zend_register_closure_ce(void) /* {{{ */
zend_ce_closure->serialize = zend_class_serialize_deny;
zend_ce_closure->unserialize = zend_class_unserialize_deny;
- memcpy(&closure_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+ memcpy(&closure_handlers, &std_object_handlers, sizeof(zend_object_handlers));
closure_handlers.free_obj = zend_closure_free_storage;
closure_handlers.get_constructor = zend_closure_get_constructor;
closure_handlers.get_method = zend_closure_get_method;
diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c
index 02a3b972b2..cbc0b8ed52 100644
--- a/Zend/zend_exceptions.c
+++ b/Zend/zend_exceptions.c
@@ -808,7 +808,7 @@ void zend_register_default_exception(void) /* {{{ */
REGISTER_MAGIC_INTERFACE(throwable, Throwable);
- memcpy(&default_exception_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+ memcpy(&default_exception_handlers, &std_object_handlers, sizeof(zend_object_handlers));
default_exception_handlers.clone_obj = NULL;
INIT_CLASS_ENTRY(ce, "Exception", default_exception_functions);
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 07d247d068..90e5529f00 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -1201,7 +1201,7 @@ void zend_register_generator_ce(void) /* {{{ */
zend_ce_generator->get_iterator = zend_generator_get_iterator;
zend_ce_generator->iterator_funcs.funcs = &zend_generator_iterator_functions;
- memcpy(&zend_generator_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+ memcpy(&zend_generator_handlers, &std_object_handlers, sizeof(zend_object_handlers));
zend_generator_handlers.free_obj = zend_generator_free_storage;
zend_generator_handlers.dtor_obj = zend_generator_dtor_storage;
zend_generator_handlers.get_gc = zend_generator_get_gc;
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 07a6847804..08d6a3f94e 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -536,7 +536,7 @@ ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *membe
}
/* }}} */
-zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) /* {{{ */
+ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) /* {{{ */
{
zend_object *zobj;
zval tmp_member, tmp_object;
@@ -770,7 +770,7 @@ exit:
}
/* }}} */
-zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv) /* {{{ */
+ZEND_API zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv) /* {{{ */
{
zend_class_entry *ce = Z_OBJCE_P(object);
zval tmp_offset, tmp_object;
@@ -820,7 +820,7 @@ zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv) /*
}
/* }}} */
-static void zend_std_write_dimension(zval *object, zval *offset, zval *value) /* {{{ */
+ZEND_API void zend_std_write_dimension(zval *object, zval *offset, zval *value) /* {{{ */
{
zend_class_entry *ce = Z_OBJCE_P(object);
zval tmp_offset, tmp_object;
@@ -842,7 +842,7 @@ static void zend_std_write_dimension(zval *object, zval *offset, zval *value) /*
}
/* }}} */
-static int zend_std_has_dimension(zval *object, zval *offset, int check_empty) /* {{{ */
+ZEND_API int zend_std_has_dimension(zval *object, zval *offset, int check_empty) /* {{{ */
{
zend_class_entry *ce = Z_OBJCE_P(object);
zval retval, tmp_offset, tmp_object;
@@ -876,7 +876,7 @@ static int zend_std_has_dimension(zval *object, zval *offset, int check_empty) /
}
/* }}} */
-static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */
+ZEND_API zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */
{
zend_object *zobj;
zend_string *name, *tmp_name;
@@ -940,7 +940,7 @@ static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type,
}
/* }}} */
-static void zend_std_unset_property(zval *object, zval *member, void **cache_slot) /* {{{ */
+ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_slot) /* {{{ */
{
zend_object *zobj;
zval tmp_member;
@@ -1010,7 +1010,7 @@ exit:
}
/* }}} */
-static void zend_std_unset_dimension(zval *object, zval *offset) /* {{{ */
+ZEND_API void zend_std_unset_dimension(zval *object, zval *offset) /* {{{ */
{
zend_class_entry *ce = Z_OBJCE_P(object);
zval tmp_offset, tmp_object;
@@ -1158,7 +1158,7 @@ static zend_always_inline zend_function *zend_get_user_call_function(zend_class_
}
/* }}} */
-static union _zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key) /* {{{ */
+ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key) /* {{{ */
{
zend_object *zobj = *obj_ptr;
zval *func;
@@ -1399,7 +1399,7 @@ ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce
}
/* }}} */
-ZEND_API union _zend_function *zend_std_get_constructor(zend_object *zobj) /* {{{ */
+ZEND_API zend_function *zend_std_get_constructor(zend_object *zobj) /* {{{ */
{
zend_function *constructor = zobj->ce->constructor;
zend_class_entry *scope;
@@ -1450,7 +1450,7 @@ ZEND_API union _zend_function *zend_std_get_constructor(zend_object *zobj) /* {{
}
/* }}} */
-static int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
+ZEND_API int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
{
zend_object *zobj1, *zobj2;
@@ -1522,7 +1522,7 @@ static int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
}
/* }}} */
-static int zend_std_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot) /* {{{ */
+ZEND_API int zend_std_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot) /* {{{ */
{
zend_object *zobj;
int result;
@@ -1640,7 +1640,7 @@ exit:
}
/* }}} */
-zend_string *zend_std_object_get_class_name(const zend_object *zobj) /* {{{ */
+ZEND_API zend_string *zend_std_get_class_name(const zend_object *zobj) /* {{{ */
{
return zend_string_copy(zobj->ce->name);
}
@@ -1708,7 +1708,7 @@ ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int ty
}
/* }}} */
-int zend_std_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr) /* {{{ */
+ZEND_API int zend_std_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr) /* {{{ */
{
zval *func;
zend_class_entry *ce = Z_OBJCE_P(obj);
@@ -1754,7 +1754,7 @@ ZEND_API const zend_object_handlers std_object_handlers = {
zend_std_get_method, /* get_method */
NULL, /* call_method */
zend_std_get_constructor, /* get_constructor */
- zend_std_object_get_class_name, /* get_class_name */
+ zend_std_get_class_name, /* get_class_name */
zend_std_compare_objects, /* compare_objects */
zend_std_cast_object_tostring, /* cast_object */
NULL, /* count_elements */
diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h
index 4da62e524f..1dfed715f3 100644
--- a/Zend/zend_object_handlers.h
+++ b/Zend/zend_object_handlers.h
@@ -100,8 +100,8 @@ typedef HashTable *(*zend_object_get_debug_info_t)(zval *object, int *is_temp);
/* Andi - EX(fbc) (function being called) needs to be initialized already in the INIT fcall opcode so that the parameters can be parsed the right way. We need to add another callback for this.
*/
typedef int (*zend_object_call_method_t)(zend_string *method, zend_object *object, INTERNAL_FUNCTION_PARAMETERS);
-typedef union _zend_function *(*zend_object_get_method_t)(zend_object **object, zend_string *method, const zval *key);
-typedef union _zend_function *(*zend_object_get_constructor_t)(zend_object *object);
+typedef zend_function *(*zend_object_get_method_t)(zend_object **object, zend_string *method, const zval *key);
+typedef zend_function *(*zend_object_get_constructor_t)(zend_object *object);
/* Object maintenance/destruction */
typedef void (*zend_object_dtor_obj_t)(zend_object *object);
@@ -124,7 +124,7 @@ typedef int (*zend_object_cast_t)(zval *readobj, zval *retval, int type);
* Returns FAILURE if the object does not have any sense of overloaded dimensions */
typedef int (*zend_object_count_elements_t)(zval *object, zend_long *count);
-typedef int (*zend_object_get_closure_t)(zval *obj, zend_class_entry **ce_ptr, union _zend_function **fptr_ptr, zend_object **obj_ptr);
+typedef int (*zend_object_get_closure_t)(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr);
typedef HashTable *(*zend_object_get_gc_t)(zval *object, zval **table, int *n);
@@ -167,21 +167,37 @@ struct _zend_object_handlers {
BEGIN_EXTERN_C()
extern const ZEND_API zend_object_handlers std_object_handlers;
+#define zend_get_std_object_handlers() \
+ (&std_object_handlers)
+
#define zend_get_function_root_class(fbc) \
((fbc)->common.prototype ? (fbc)->common.prototype->common.scope : (fbc)->common.scope)
-ZEND_API union _zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name_strval, const zval *key);
+ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name_strval, const zval *key);
ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent);
ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name);
-ZEND_API union _zend_function *zend_std_get_constructor(zend_object *object);
+ZEND_API zend_function *zend_std_get_constructor(zend_object *object);
ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_string *member, int silent);
ZEND_API HashTable *zend_std_get_properties(zval *object);
+ZEND_API HashTable *zend_std_get_gc(zval *object, zval **table, int *n);
ZEND_API HashTable *zend_std_get_debug_info(zval *object, int *is_temp);
ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int type);
+ZEND_API zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot);
+ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv);
ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot);
+ZEND_API int zend_std_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot);
+ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_slot);
+ZEND_API zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv);
+ZEND_API void zend_std_write_dimension(zval *object, zval *offset, zval *value);
+ZEND_API int zend_std_has_dimension(zval *object, zval *offset, int check_empty);
+ZEND_API void zend_std_unset_dimension(zval *object, zval *offset);
+ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key);
+ZEND_API zend_string *zend_std_get_class_name(const zend_object *zobj);
+ZEND_API int zend_std_compare_objects(zval *o1, zval *o2);
+ZEND_API int zend_std_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr);
ZEND_API void rebuild_object_properties(zend_object *zobj);
-ZEND_API int zend_check_private(union _zend_function *fbc, zend_class_entry *ce, zend_string *function_name);
+ZEND_API int zend_check_private(zend_function *fbc, zend_class_entry *ce, zend_string *function_name);
ZEND_API int zend_check_protected(zend_class_entry *ce, zend_class_entry *scope);
diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c
index a2de370b49..633abccabb 100644
--- a/Zend/zend_objects_API.c
+++ b/Zend/zend_objects_API.c
@@ -197,11 +197,6 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object) /* {{{ *
}
/* }}} */
-ZEND_API const zend_object_handlers* ZEND_FASTCALL zend_get_std_object_handlers(void)
-{
- return &std_object_handlers;
-}
-
/*
* Local variables:
* tab-width: 4
diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h
index 2ebaa74360..6fac2b535e 100644
--- a/Zend/zend_objects_API.h
+++ b/Zend/zend_objects_API.h
@@ -67,7 +67,6 @@ static zend_always_inline void zend_object_store_ctor_failed(zend_object *obj)
#define ZEND_OBJECTS_STORE_HANDLERS 0, zend_object_std_dtor, zend_objects_destroy_object, zend_objects_clone_obj
-ZEND_API const zend_object_handlers * ZEND_FASTCALL zend_get_std_object_handlers(void);
END_EXTERN_C()
static zend_always_inline void zend_object_release(zend_object *obj)