summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-03-15 00:05:00 +0300
committerDmitry Stogov <dmitry@zend.com>2018-03-15 00:05:00 +0300
commit64f64cf0b70ef8cabcc2fcbb77ee825db0825448 (patch)
tree7b36f2e0ca5e9ff9d103ccc457c0feced66f3db8
parent73f7c846857794608a5538817bf104c6888797fa (diff)
downloadphp-git-64f64cf0b70ef8cabcc2fcbb77ee825db0825448.tar.gz
zend_ast_destroy() optimization
-rw-r--r--Zend/zend_ast.c68
-rw-r--r--Zend/zend_ast.h2
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);