summaryrefslogtreecommitdiff
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
parent08478abc5927f3225a0bf7e487d0e6171b80748c (diff)
downloadphp-git-022e029984b431c014545630d4dfac811607754b.tar.gz
Optimize zval_dtor_func()
-rw-r--r--Zend/zend_ast.c6
-rw-r--r--Zend/zend_ast.h1
-rw-r--r--Zend/zend_types.h2
-rw-r--r--Zend/zend_variables.c111
4 files changed, 79 insertions, 41 deletions
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index 6f75496857..1f83aeb026 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -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);
diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h
index 4783d33a98..bde2d65a14 100644
--- a/Zend/zend_ast.h
+++ b/Zend/zend_ast.h
@@ -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);
diff --git a/Zend/zend_types.h b/Zend/zend_types.h
index b85a91ef60..fe260a02a2 100644
--- a/Zend/zend_types.h
+++ b/Zend/zend_types.h
@@ -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
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)) {