summaryrefslogtreecommitdiff
path: root/Zend/zend_variables.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-01-16 00:57:47 +0300
committerDmitry Stogov <dmitry@zend.com>2018-01-16 00:57:47 +0300
commit022e029984b431c014545630d4dfac811607754b (patch)
treeee9f22338efb0de0973348bdba55882a851e7ef8 /Zend/zend_variables.c
parent08478abc5927f3225a0bf7e487d0e6171b80748c (diff)
downloadphp-git-022e029984b431c014545630d4dfac811607754b.tar.gz
Optimize zval_dtor_func()
Diffstat (limited to 'Zend/zend_variables.c')
-rw-r--r--Zend/zend_variables.c111
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)) {