]> granicus.if.org Git - php/commitdiff
Optimize zval_dtor_func()
authorDmitry Stogov <dmitry@zend.com>
Mon, 15 Jan 2018 21:57:47 +0000 (00:57 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 15 Jan 2018 21:57:47 +0000 (00:57 +0300)
Zend/zend_ast.c
Zend/zend_ast.h
Zend/zend_types.h
Zend/zend_variables.c

index 6f7549685723492a1775b4ec2d288f9e47269200..1f83aeb02601598d170213993a911f6aedf521f7 100644 (file)
@@ -602,6 +602,12 @@ ZEND_API void zend_ast_destroy(zend_ast *ast) {
        }
 }
 
+ZEND_API void ZEND_FASTCALL zend_ast_ref_destroy(zend_ast_ref *ast)
+{
+       zend_ast_destroy(GC_AST(ast));
+       efree(ast);
+}
+
 ZEND_API void zend_ast_apply(zend_ast *ast, zend_ast_apply_func fn) {
        if (zend_ast_is_list(ast)) {
                zend_ast_list *list = zend_ast_get_list(ast);
index 4783d33a984ad9a919134e78bfaa340f50503281..bde2d65a14fab0a7bf1ba62930671934110e87bd 100644 (file)
@@ -212,6 +212,7 @@ ZEND_API zend_string *zend_ast_export(const char *prefix, zend_ast *ast, const c
 
 ZEND_API zend_ast_ref *zend_ast_copy(zend_ast *ast);
 ZEND_API void zend_ast_destroy(zend_ast *ast);
+ZEND_API void ZEND_FASTCALL zend_ast_ref_destroy(zend_ast_ref *ast);
 
 typedef void (*zend_ast_apply_func)(zend_ast **ast_ptr);
 ZEND_API void zend_ast_apply(zend_ast *ast, zend_ast_apply_func fn);
index b85a91ef60aa103196387e019c0608016858fa5a..fe260a02a259a6522b99e5529d69cc24f9670333 100644 (file)
@@ -374,7 +374,7 @@ struct _zend_ast_ref {
 #define IS_REFERENCE                           10
 
 /* constant expressions */
-#define IS_CONSTANT_AST                                12
+#define IS_CONSTANT_AST                                11
 
 /* internal types */
 #define IS_INDIRECT                    13
index bf8e388586e093eb8a96d82204d29ce0451c54ba..f612a4836daf4d02daee5a828a382ccd3317adfe 100644 (file)
 #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)) {