diff options
author | Dmitry Stogov <dmitry@zend.com> | 2018-03-15 00:05:00 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2018-03-15 00:05:00 +0300 |
commit | 64f64cf0b70ef8cabcc2fcbb77ee825db0825448 (patch) | |
tree | 7b36f2e0ca5e9ff9d103ccc457c0feced66f3db8 | |
parent | 73f7c846857794608a5538817bf104c6888797fa (diff) | |
download | php-git-64f64cf0b70ef8cabcc2fcbb77ee825db0825448.tar.gz |
zend_ast_destroy() optimization
-rw-r--r-- | Zend/zend_ast.c | 68 | ||||
-rw-r--r-- | Zend/zend_ast.h | 2 |
2 files changed, 31 insertions, 39 deletions
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 4da7c538af..e6b454ea55 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -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]); } } diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index b9c8ed1b19..a9b45ab080 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -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); |