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: 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; \

« previous php.cvs (#89066) next »