From a935c230319acb23c38acd0e77d539bd155a637c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20D=C3=B6tsch?= Date: Fri, 17 Jul 2020 19:52:55 +0200 Subject: [PATCH 1/3] opcache optimizer: optimize some more functions on compile time - dirname(string[, int]) - md5(string) - crc32(string) - sha1(string) - array_unique(array) - array_filter(array) - basename(string[, string]) --- ext/opcache/Optimizer/sccp.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index ee8ccc34a7783..37b380215f702 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -844,13 +844,20 @@ static inline int ct_eval_func_call( || zend_string_equals_literal(name, "urldecode") || zend_string_equals_literal(name, "rawurlencode") || zend_string_equals_literal(name, "rawurldecode") - || zend_string_equals_literal(name, "php_uname")) { + || zend_string_equals_literal(name, "php_uname") + || zend_string_equals_literal(name, "dirname") + || zend_string_equals_literal(name, "basename") + || zend_string_equals_literal(name, "md5") + || zend_string_equals_literal(name, "crc32") + || zend_string_equals_literal(name, "sha1")) { if (Z_TYPE_P(args[0]) != IS_STRING) { return FAILURE; } /* pass */ } else if (zend_string_equals_literal(name, "array_keys") - || zend_string_equals_literal(name, "array_values")) { + || zend_string_equals_literal(name, "array_values") + || zend_string_equals_literal(name, "array_unique") + || zend_string_equals_literal(name, "array_filter")) { if (Z_TYPE_P(args[0]) != IS_ARRAY) { return FAILURE; } @@ -906,6 +913,12 @@ static inline int ct_eval_func_call( return FAILURE; } /* pass */ + } else if (zend_string_equals_literal(name, "dirname")) { + if (Z_TYPE_P(args[0]) != IS_STRING + || (Z_TYPE_P(args[1]) != IS_LONG)) { + return FAILURE; + } + /* pass */ } else if (zend_string_equals_literal(name, "trim") || zend_string_equals_literal(name, "rtrim") || zend_string_equals_literal(name, "ltrim") @@ -962,7 +975,8 @@ static inline int ct_eval_func_call( || zend_string_equals_literal(name, "str_contains") || zend_string_equals_literal(name, "str_starts_with") || zend_string_equals_literal(name, "str_ends_with") - || zend_string_equals_literal(name, "version_compare")) { + || zend_string_equals_literal(name, "version_compare") + || zend_string_equals_literal(name, "basename")) { if (Z_TYPE_P(args[0]) != IS_STRING || Z_TYPE_P(args[1]) != IS_STRING) { return FAILURE; @@ -1004,7 +1018,8 @@ static inline int ct_eval_func_call( } } /* pass */ - } else if (zend_string_equals_literal(name, "version_compare")) { + } else if (zend_string_equals_literal(name, "version_compare") + || zend_string_equals_literal(name, "str_replace")) { if (Z_TYPE_P(args[0]) != IS_STRING || Z_TYPE_P(args[1]) != IS_STRING || Z_TYPE_P(args[2]) != IS_STRING) { From f1e43b713fc106689f036151698451a2fc99e58c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20D=C3=B6tsch?= Date: Sun, 19 Jul 2020 11:20:32 +0200 Subject: [PATCH 2/3] opcache optimizer: optimize some more functions on compile time - don't optimize basename(), version_compare(string, string, string) - optimize strtolower(string), strtoupper() --- ext/opcache/Optimizer/sccp.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index 37b380215f702..f731f5754e867 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -844,19 +844,16 @@ static inline int ct_eval_func_call( || zend_string_equals_literal(name, "urldecode") || zend_string_equals_literal(name, "rawurlencode") || zend_string_equals_literal(name, "rawurldecode") - || zend_string_equals_literal(name, "php_uname") + || zend_string_equals_literal(name, "strtoupper") + || zend_string_equals_literal(name, "strtolower") || zend_string_equals_literal(name, "dirname") - || zend_string_equals_literal(name, "basename") - || zend_string_equals_literal(name, "md5") - || zend_string_equals_literal(name, "crc32") - || zend_string_equals_literal(name, "sha1")) { + || zend_string_equals_literal(name, "crc32")) { if (Z_TYPE_P(args[0]) != IS_STRING) { return FAILURE; } /* pass */ } else if (zend_string_equals_literal(name, "array_keys") || zend_string_equals_literal(name, "array_values") - || zend_string_equals_literal(name, "array_unique") || zend_string_equals_literal(name, "array_filter")) { if (Z_TYPE_P(args[0]) != IS_ARRAY) { return FAILURE; @@ -874,7 +871,8 @@ static inline int ct_eval_func_call( } } ZEND_HASH_FOREACH_END(); /* pass */ - } else if (zend_string_equals_literal(name, "implode")) { + } else if (zend_string_equals_literal(name, "implode") + || zend_string_equals_literal(name, "array_unique")) { zval *entry; if (Z_TYPE_P(args[0]) != IS_ARRAY) { @@ -975,8 +973,7 @@ static inline int ct_eval_func_call( || zend_string_equals_literal(name, "str_contains") || zend_string_equals_literal(name, "str_starts_with") || zend_string_equals_literal(name, "str_ends_with") - || zend_string_equals_literal(name, "version_compare") - || zend_string_equals_literal(name, "basename")) { + || zend_string_equals_literal(name, "version_compare")) { if (Z_TYPE_P(args[0]) != IS_STRING || Z_TYPE_P(args[1]) != IS_STRING) { return FAILURE; @@ -1018,8 +1015,7 @@ static inline int ct_eval_func_call( } } /* pass */ - } else if (zend_string_equals_literal(name, "version_compare") - || zend_string_equals_literal(name, "str_replace")) { + } else if (zend_string_equals_literal(name, "str_replace")) { if (Z_TYPE_P(args[0]) != IS_STRING || Z_TYPE_P(args[1]) != IS_STRING || Z_TYPE_P(args[2]) != IS_STRING) { From 4997f816a6fd354f7b87814b30ddba827bec09b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20D=C3=B6tsch?= Date: Sun, 19 Jul 2020 11:20:32 +0200 Subject: [PATCH 3/3] opcache optimizer: optimize some more functions on compile time - don't optimize basename(), version_compare(string, string, string) --- ext/opcache/Optimizer/sccp.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index f731f5754e867..b93cc00febfc5 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -844,8 +844,7 @@ static inline int ct_eval_func_call( || zend_string_equals_literal(name, "urldecode") || zend_string_equals_literal(name, "rawurlencode") || zend_string_equals_literal(name, "rawurldecode") - || zend_string_equals_literal(name, "strtoupper") - || zend_string_equals_literal(name, "strtolower") + || zend_string_equals_literal(name, "php_uname") || zend_string_equals_literal(name, "dirname") || zend_string_equals_literal(name, "crc32")) { if (Z_TYPE_P(args[0]) != IS_STRING) { @@ -872,7 +871,7 @@ static inline int ct_eval_func_call( } ZEND_HASH_FOREACH_END(); /* pass */ } else if (zend_string_equals_literal(name, "implode") - || zend_string_equals_literal(name, "array_unique")) { + || zend_string_equals_literal(name, "array_unique")) { zval *entry; if (Z_TYPE_P(args[0]) != IS_ARRAY) { @@ -916,6 +915,11 @@ static inline int ct_eval_func_call( || (Z_TYPE_P(args[1]) != IS_LONG)) { return FAILURE; } + if (Z_LVAL_P(args[1]) < 1) { + // levels must be >= 1, else we get a ValueError + return FAILURE; + } + /* pass */ } else if (zend_string_equals_literal(name, "trim") || zend_string_equals_literal(name, "rtrim") @@ -1015,6 +1019,7 @@ static inline int ct_eval_func_call( } } /* pass */ + // todo: version_compare with 3 arguments got removed, as we should add a proper check for the comperator, else we hide a ValueError } else if (zend_string_equals_literal(name, "str_replace")) { if (Z_TYPE_P(args[0]) != IS_STRING || Z_TYPE_P(args[1]) != IS_STRING