diff options
author | Dmitry Stogov <dmitry@zend.com> | 2018-01-16 00:57:47 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2018-01-16 00:57:47 +0300 |
commit | 022e029984b431c014545630d4dfac811607754b (patch) | |
tree | ee9f22338efb0de0973348bdba55882a851e7ef8 /Zend/zend_variables.c | |
parent | 08478abc5927f3225a0bf7e487d0e6171b80748c (diff) | |
download | php-git-022e029984b431c014545630d4dfac811607754b.tar.gz |
Optimize zval_dtor_func()
Diffstat (limited to 'Zend/zend_variables.c')
-rw-r--r-- | Zend/zend_variables.c | 111 |
1 files changed, 71 insertions, 40 deletions
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index bf8e388586..f612a4836d 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -28,54 +28,85 @@ #include "zend_constants.h" #include "zend_list.h" +static void ZEND_FASTCALL zend_string_destroy(zend_string *str ZEND_FILE_LINE_DC); +static void ZEND_FASTCALL zend_reference_destroy(zend_reference *ref ZEND_FILE_LINE_DC); +static void ZEND_FASTCALL zend_empty_destroy(zend_reference *ref ZEND_FILE_LINE_DC); + +#if ZEND_DEBUG +static void ZEND_FASTCALL zend_array_destroy_wrapper(zend_array *arr ZEND_FILE_LINE_DC); +static void ZEND_FASTCALL zend_object_destroy_wrapper(zend_object *obj ZEND_FILE_LINE_DC); +static void ZEND_FASTCALL zend_resource_destroy_wrapper(zend_resource *res ZEND_FILE_LINE_DC); +static void ZEND_FASTCALL zend_ast_ref_destroy_wrapper(zend_ast_ref *ast ZEND_FILE_LINE_DC); +#else +# define zend_array_destroy_wrapper zend_array_destroy +# define zend_object_destroy_wrapper zend_objects_store_del +# define zend_resource_destroy_wrapper zend_list_free +# define zend_ast_ref_destroy_wrapper zend_ast_ref_destroy +#endif + +typedef void ZEND_FASTCALL (*zend_zval_dtor_func_t)(zend_refcounted *p); + +static const zend_zval_dtor_func_t zend_zval_dtor_func[] = { + /* IS_UNDEF */ (zend_zval_dtor_func_t)zend_empty_destroy, + /* IS_NULL */ (zend_zval_dtor_func_t)zend_empty_destroy, + /* IS_FALSE */ (zend_zval_dtor_func_t)zend_empty_destroy, + /* IS_TRUE */ (zend_zval_dtor_func_t)zend_empty_destroy, + /* IS_LONG */ (zend_zval_dtor_func_t)zend_empty_destroy, + /* IS_DOUBLE */ (zend_zval_dtor_func_t)zend_empty_destroy, + /* IS_STRING */ (zend_zval_dtor_func_t)zend_string_destroy, + /* IS_ARRAY */ (zend_zval_dtor_func_t)zend_array_destroy_wrapper, + /* IS_OBJECT */ (zend_zval_dtor_func_t)zend_object_destroy_wrapper, + /* IS_RESOURCE */ (zend_zval_dtor_func_t)zend_resource_destroy_wrapper, + /* IS_REFERENCE */ (zend_zval_dtor_func_t)zend_reference_destroy, + /* IS_CONSTANT_AST */ (zend_zval_dtor_func_t)zend_ast_ref_destroy_wrapper +}; + ZEND_API void ZEND_FASTCALL _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC) { - switch (GC_TYPE(p)) { - case IS_STRING: { - zend_string *str = (zend_string*)p; - CHECK_ZVAL_STRING_REL(str); - ZEND_ASSERT(!ZSTR_IS_INTERNED(str)); - ZEND_ASSERT(GC_REFCOUNT(str) == 0); - pefree(str, UNEXPECTED(GC_FLAGS(str) & IS_STR_PERSISTENT)); - break; - } - case IS_ARRAY: { - zend_array *arr = (zend_array*)p; - zend_array_destroy(arr); - break; - } - case IS_CONSTANT_AST: { - zend_ast_ref *ast = (zend_ast_ref*)p; + ZEND_ASSERT(GC_TYPE(p) <= IS_CONSTANT_AST); + zend_zval_dtor_func[GC_TYPE(p)](p); +} - zend_ast_destroy(GC_AST(ast)); - efree(ast); - break; - } - case IS_OBJECT: { - zend_object *obj = (zend_object*)p; +static void ZEND_FASTCALL zend_string_destroy(zend_string *str ZEND_FILE_LINE_DC) +{ + CHECK_ZVAL_STRING_REL(str); + ZEND_ASSERT(!ZSTR_IS_INTERNED(str)); + ZEND_ASSERT(GC_REFCOUNT(str) == 0); + pefree(str, UNEXPECTED(GC_FLAGS(str) & IS_STR_PERSISTENT)); +} - zend_objects_store_del(obj); - break; - } - case IS_RESOURCE: { - zend_resource *res = (zend_resource*)p; +static void ZEND_FASTCALL zend_reference_destroy(zend_reference *ref ZEND_FILE_LINE_DC) +{ + i_zval_ptr_dtor(&ref->val ZEND_FILE_LINE_RELAY_CC); + efree_size(ref, sizeof(zend_reference)); +} - /* destroy resource */ - zend_list_free(res); - break; - } - case IS_REFERENCE: { - zend_reference *ref = (zend_reference*)p; +static void ZEND_FASTCALL zend_empty_destroy(zend_reference *ref ZEND_FILE_LINE_DC) +{ +} - i_zval_ptr_dtor(&ref->val ZEND_FILE_LINE_RELAY_CC); - efree_size(ref, sizeof(zend_reference)); - break; - } - default: - break; - } +#if ZEND_DEBUG +static void ZEND_FASTCALL zend_array_destroy_wrapper(zend_array *arr ZEND_FILE_LINE_DC) +{ + zend_array_destroy(arr); } +static void ZEND_FASTCALL zend_object_destroy_wrapper(zend_object *obj ZEND_FILE_LINE_DC) +{ + zend_objects_store_del(obj); +} + +static void ZEND_FASTCALL zend_resource_destroy_wrapper(zend_resource *res ZEND_FILE_LINE_DC) +{ + zend_list_free(res); +} + +static void ZEND_FASTCALL zend_ast_ref_destroy_wrapper(zend_ast_ref *ast ZEND_FILE_LINE_DC) +{ + zend_ast_ref_destroy(ast); +} +#endif + ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC) { switch (Z_TYPE_P(zvalue)) { |