]> granicus.if.org Git - php/commitdiff
zend_ast_destroy() optimization
authorDmitry Stogov <dmitry@zend.com>
Wed, 14 Mar 2018 21:05:00 +0000 (00:05 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 14 Mar 2018 21:05:00 +0000 (00:05 +0300)
Zend/zend_ast.c
Zend/zend_ast.h

index 4da7c538af102d7b9b0ecfe160b3c892510d8356..e6b454ea55c7f798752b3f81c9c286b8703c815d 100644 (file)
@@ -556,49 +556,41 @@ ZEND_API zend_ast_ref *zend_ast_copy(zend_ast *ast)
        return ref;
 }
 
-ZEND_API void zend_ast_destroy(zend_ast *ast) {
+ZEND_API void ZEND_FASTCALL zend_ast_destroy(zend_ast *ast) {
        if (!ast) {
                return;
        }
 
-       switch (ast->kind) {
-               case ZEND_AST_ZVAL:
-                       zval_ptr_dtor_nogc(zend_ast_get_zval(ast));
-                       break;
-               case ZEND_AST_CONSTANT:
-                       zend_string_release(zend_ast_get_constant_name(ast));
-                       break;
-               case ZEND_AST_FUNC_DECL:
-               case ZEND_AST_CLOSURE:
-               case ZEND_AST_METHOD:
-               case ZEND_AST_CLASS:
-               {
-                       zend_ast_decl *decl = (zend_ast_decl *) ast;
-                       if (decl->name) {
-                           zend_string_release(decl->name);
-                       }
-                       if (decl->doc_comment) {
-                               zend_string_release(decl->doc_comment);
-                       }
-                       zend_ast_destroy(decl->child[0]);
-                       zend_ast_destroy(decl->child[1]);
-                       zend_ast_destroy(decl->child[2]);
-                       zend_ast_destroy(decl->child[3]);
-                       break;
+       if (EXPECTED(ast->kind >= ZEND_AST_VAR)) {
+               uint32_t i, children = zend_ast_get_num_children(ast);
+
+               for (i = 0; i < children; i++) {
+                       zend_ast_destroy(ast->child[i]);
                }
-               default:
-                       if (zend_ast_is_list(ast)) {
-                               zend_ast_list *list = zend_ast_get_list(ast);
-                               uint32_t i;
-                               for (i = 0; i < list->children; i++) {
-                                       zend_ast_destroy(list->child[i]);
-                               }
-                       } else {
-                               uint32_t i, children = zend_ast_get_num_children(ast);
-                               for (i = 0; i < children; i++) {
-                                       zend_ast_destroy(ast->child[i]);
-                               }
-                       }
+       } else if (EXPECTED(ast->kind == ZEND_AST_ZVAL)) {
+               zval_ptr_dtor_nogc(zend_ast_get_zval(ast));
+       } else if (EXPECTED(zend_ast_is_list(ast))) {
+               zend_ast_list *list = zend_ast_get_list(ast);
+               uint32_t i;
+
+               for (i = 0; i < list->children; i++) {
+                       zend_ast_destroy(list->child[i]);
+               }
+       } else if (EXPECTED(ast->kind == ZEND_AST_CONSTANT)) {
+               zend_string_release(zend_ast_get_constant_name(ast));
+       } else if (EXPECTED(ast->kind >= ZEND_AST_FUNC_DECL)) {
+               zend_ast_decl *decl = (zend_ast_decl *) ast;
+
+               if (decl->name) {
+                   zend_string_release(decl->name);
+               }
+               if (decl->doc_comment) {
+                       zend_string_release(decl->doc_comment);
+               }
+               zend_ast_destroy(decl->child[0]);
+               zend_ast_destroy(decl->child[1]);
+               zend_ast_destroy(decl->child[2]);
+               zend_ast_destroy(decl->child[3]);
        }
 }
 
index b9c8ed1b19d26f6d100ef74079d1a7711dda9cc7..a9b45ab0805fa29715ff69d552cbdd74d1ac8178 100644 (file)
@@ -211,7 +211,7 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
 ZEND_API zend_string *zend_ast_export(const char *prefix, zend_ast *ast, const char *suffix);
 
 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_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);