summaryrefslogtreecommitdiff
path: root/Zend/zend_compile.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2021-02-10 18:00:00 +0300
committerDmitry Stogov <dmitry@zend.com>2021-02-10 18:00:00 +0300
commitef5164818576d75929834d9f0c15cdfc095f7139 (patch)
treea7dd0242dc053a42b9885bb031707ec84d2be6c7 /Zend/zend_compile.c
parenta8f6d44c1c36e95c0b053555b2c616fe396ab810 (diff)
downloadphp-git-ef5164818576d75929834d9f0c15cdfc095f7139.tar.gz
Use zend_type.ce_cache__ptr for caching class resulution during argument/result type checks
Diffstat (limited to 'Zend/zend_compile.c')
-rw-r--r--Zend/zend_compile.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index d617547f81..069acae0c1 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -1197,7 +1197,13 @@ zend_string *zend_type_to_string_resolved(zend_type type, zend_class_entry *scop
} else {
if (ZEND_TYPE_HAS_CE_CACHE(*list_type)
&& ZEND_TYPE_CE_CACHE(*list_type)) {
- str = add_type_string(str, ZEND_TYPE_CE_CACHE(*list_type)->name);
+ zend_class_entry *ce = ZEND_TYPE_CE_CACHE(*list_type);
+ if (ce->ce_flags & ZEND_ACC_ANON_CLASS) {
+ zend_string *tmp = zend_string_init(ZSTR_VAL(ce->name), strlen(ZSTR_VAL(ce->name)), 0);
+ str = add_type_string(str, tmp);
+ } else {
+ str = add_type_string(str, ce->name);
+ }
} else {
zend_string *resolved = resolve_class_name(ZEND_TYPE_NAME(*list_type), scope);
str = add_type_string(str, resolved);
@@ -1208,7 +1214,12 @@ zend_string *zend_type_to_string_resolved(zend_type type, zend_class_entry *scop
} else if (ZEND_TYPE_HAS_NAME(type)) {
if (ZEND_TYPE_HAS_CE_CACHE(type)
&& ZEND_TYPE_CE_CACHE(type)) {
- str = zend_string_copy(ZEND_TYPE_CE_CACHE(type)->name);
+ zend_class_entry *ce = ZEND_TYPE_CE_CACHE(type);
+ if (ce->ce_flags & ZEND_ACC_ANON_CLASS) {
+ str = zend_string_init(ZSTR_VAL(ce->name), strlen(ZSTR_VAL(ce->name)), 0);
+ } else {
+ str = zend_string_copy(ce->name);
+ }
} else {
str = resolve_class_name(ZEND_TYPE_NAME(type), scope);
}