com php-src: turn zend_get_property_guard into a fu nction pointer, re PR #1524: Zend/zend .c Zend/zend_object_handlers.c Zend/zend_object _handlers.h
| From: | Joe Watkins | Date: | Fri, 18 Sep 2015 08:24:49 +0000 |
| Subject: | com php-src: turn zend_get_property_guard into a fu nction pointer, re PR #1524: Zend/zend .c Zend/zend_object_handlers.c Zend/zend_object _handlers.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-89066@lists.php.net to get a copy of this message | ||
Commit: 433a3d21f2ef7a680e346b05aaa2174ca6592647
Author: Joe Watkins <krakjoe@php.net> Fri, 18 Sep 2015 09:24:49 +0100
Parents: fac5649ddad790dd25ac19036413df691c70bde0
Branches: zend_get_property_guard_as_function_pointer
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=433a3d21f2ef7a680e346b05aaa2174ca6592647
Log:
turn zend_get_property_guard into a function pointer, re PR #1524
Bugs:
https://bugs.php.net/1524
Changed paths:
M Zend/zend.c
M Zend/zend_object_handlers.c
M Zend/zend_object_handlers.h
Diff:
diff --git a/Zend/zend.c b/Zend/zend.c
index c521df9..fcccf4f 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -686,6 +686,7 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions) /
#endif /* HAVE_SYS_SDT_H */
zend_compile_string = compile_string;
zend_throw_exception_hook = NULL;
+ zend_get_property_guard = zend_std_get_property_guard;
/* Set up the default garbage collection implementation. */
gc_collect_cycles = zend_gc_collect_cycles;
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 8587a82..671e694 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -115,6 +115,37 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
}
/* }}} */
+static void zend_std_property_guard_dtor(zval *el) /* {{{ */ {
+ efree_size(Z_PTR_P(el), sizeof(zend_ulong));
+}
+/* }}} */
+
+ZEND_API zend_long *zend_std_get_property_guard(zend_object *zobj, zend_string *member) /* {{{ */
+{
+ HashTable *guards;
+ zend_long stub, *guard;
+ zval tmp;
+
+ ZEND_ASSERT(GC_FLAGS(zobj) & IS_OBJ_USE_GUARDS);
+ if (GC_FLAGS(zobj) & IS_OBJ_HAS_GUARDS) {
+ guards = Z_PTR(zobj->properties_table[zobj->ce->default_properties_count]);
+ ZEND_ASSERT(guards != NULL);
+ if ((guard = (zend_long *)zend_hash_find_ptr(guards, member)) != NULL) {
+ return guard;
+ }
+ } else {
+ ALLOC_HASHTABLE(guards);
+ zend_hash_init(guards, 8, NULL, zend_std_property_guard_dtor, 0);
+ ZVAL_PTR(&tmp, guards);
+ Z_PTR(zobj->properties_table[zobj->ce->default_properties_count]) = guards;
+ GC_FLAGS(zobj) |= IS_OBJ_HAS_GUARDS;
+ }
+
+ stub = 0;
+ return (zend_long *)zend_hash_add_mem(guards, member, &stub, sizeof(zend_ulong));
+}
+/* }}} */
+
ZEND_API HashTable *zend_std_get_properties(zval *object) /* {{{ */
{
zend_object *zobj;
@@ -485,37 +516,6 @@ ZEND_API int zend_check_property_access(zend_object *zobj, zend_string
*prop_inf
}
/* }}} */
-static void zend_property_guard_dtor(zval *el) /* {{{ */ {
- efree_size(Z_PTR_P(el), sizeof(zend_ulong));
-}
-/* }}} */
-
-static zend_long *zend_get_property_guard(zend_object *zobj, zend_string *member) /* {{{ */
-{
- HashTable *guards;
- zend_long stub, *guard;
- zval tmp;
-
- ZEND_ASSERT(GC_FLAGS(zobj) & IS_OBJ_USE_GUARDS);
- if (GC_FLAGS(zobj) & IS_OBJ_HAS_GUARDS) {
- guards = Z_PTR(zobj->properties_table[zobj->ce->default_properties_count]);
- ZEND_ASSERT(guards != NULL);
- if ((guard = (zend_long *)zend_hash_find_ptr(guards, member)) != NULL) {
- return guard;
- }
- } else {
- ALLOC_HASHTABLE(guards);
- zend_hash_init(guards, 8, NULL, zend_property_guard_dtor, 0);
- ZVAL_PTR(&tmp, guards);
- Z_PTR(zobj->properties_table[zobj->ce->default_properties_count]) = guards;
- GC_FLAGS(zobj) |= IS_OBJ_HAS_GUARDS;
- }
-
- stub = 0;
- return (zend_long *)zend_hash_add_mem(guards, member, &stub, sizeof(zend_ulong));
-}
-/* }}} */
-
zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) /*
{{{ */
{
zend_object *zobj;
diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h
index 0bd8c7e..9e5cc82 100644
--- a/Zend/zend_object_handlers.h
+++ b/Zend/zend_object_handlers.h
@@ -170,6 +170,7 @@ ZEND_API HashTable *zend_std_get_properties(zval *object);
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 void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot);
+ZEND_API zend_long *zend_std_get_property_guard(zend_object *zobj, zend_string *member);
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);
@@ -180,6 +181,8 @@ ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_inf
ZEND_API zend_function *zend_get_call_trampoline_func(zend_class_entry *ce, zend_string
*method_name, int is_static);
+ZEND_API zend_long* (*zend_get_property_guard)(zend_object *zobj, zend_string *member);
+
#define zend_free_trampoline(func) do { \
if ((func) == &EG(trampoline)) { \
EG(trampoline).common.function_name = NULL; \