summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2021-03-18 15:15:21 +0100
committerNikita Popov <nikita.ppv@gmail.com>2021-03-18 15:15:21 +0100
commit4df39f4bd093ac70bb6582eb6dbaf29f45a8c1fd (patch)
treeaca4c5c3a7a3bc2f37c42e192a42957dd1918688 /Zend
parentc8a8c47f7eef7ef2a5853f2b6733e4114e72cbd0 (diff)
downloadphp-git-4df39f4bd093ac70bb6582eb6dbaf29f45a8c1fd.tar.gz
Don't imply SILENT from NO_AUTOLOAD
We have separate flags for non-autoloading class fetches and silent class fetches. There's no reason why NO_AUTOLOAD should be special-cased to be implicitly silent.
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_compile.c2
-rw-r--r--Zend/zend_execute.c5
-rw-r--r--Zend/zend_execute_API.c12
-rw-r--r--Zend/zend_vm_def.h4
-rw-r--r--Zend/zend_vm_execute.h14
5 files changed, 17 insertions, 20 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 76c2ed9644..f7e283d76d 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -8927,7 +8927,7 @@ void zend_compile_instanceof(znode *result, zend_ast *ast) /* {{{ */
}
zend_compile_class_ref(&class_node, class_ast,
- ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_EXCEPTION);
+ ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_EXCEPTION | ZEND_FETCH_CLASS_SILENT);
opline = zend_emit_op_tmp(result, ZEND_INSTANCEOF, &obj_node, NULL);
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 9f69041257..39862a2425 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1002,7 +1002,7 @@ static zend_always_inline bool zend_check_type_slow(
}
} else {
ce = zend_fetch_class(ZEND_TYPE_NAME(*list_type),
- (ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD));
+ ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
if (!ce) {
if (HAVE_CACHE_SLOT) {
cache_slot++;
@@ -1032,7 +1032,8 @@ static zend_always_inline bool zend_check_type_slow(
*cache_slot = ce;
}
} else {
- ce = zend_fetch_class(ZEND_TYPE_NAME(*type), (ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD));
+ ce = zend_fetch_class(ZEND_TYPE_NAME(*type),
+ ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
if (UNEXPECTED(!ce)) {
goto builtin_types;
}
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index ce51ef7960..af3c8cc670 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -1523,9 +1523,8 @@ check_fetch_type:
break;
}
- if (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD) {
- return zend_lookup_class_ex(class_name, NULL, fetch_type);
- } else if ((ce = zend_lookup_class_ex(class_name, NULL, fetch_type)) == NULL) {
+ ce = zend_lookup_class_ex(class_name, NULL, fetch_type);
+ if (!ce) {
if (!(fetch_type & ZEND_FETCH_CLASS_SILENT) && !EG(exception)) {
if (fetch_sub_type == ZEND_FETCH_CLASS_INTERFACE) {
zend_throw_or_error(fetch_type, NULL, "Interface \"%s\" not found", ZSTR_VAL(class_name));
@@ -1543,11 +1542,8 @@ check_fetch_type:
zend_class_entry *zend_fetch_class_by_name(zend_string *class_name, zend_string *key, int fetch_type) /* {{{ */
{
- zend_class_entry *ce;
-
- if (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD) {
- return zend_lookup_class_ex(class_name, key, fetch_type);
- } else if ((ce = zend_lookup_class_ex(class_name, key, fetch_type)) == NULL) {
+ zend_class_entry *ce = zend_lookup_class_ex(class_name, key, fetch_type);
+ if (!ce) {
if (fetch_type & ZEND_FETCH_CLASS_SILENT) {
return NULL;
}
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 39f1216958..115279dcfd 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -4556,7 +4556,7 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, JMP_ADDR, LAST_CATCH|CACHE_SLOT)
}
catch_ce = CACHED_PTR(opline->extended_value & ~ZEND_LAST_CATCH);
if (UNEXPECTED(catch_ce == NULL)) {
- catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
CACHE_PTR(opline->extended_value & ~ZEND_LAST_CATCH, catch_ce);
}
@@ -7667,7 +7667,7 @@ ZEND_VM_C_LABEL(try_instanceof):
if (OP2_TYPE == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index f133eab7db..24a4d67bf2 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -4567,7 +4567,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_HANDLER(ZEND_
}
catch_ce = CACHED_PTR(opline->extended_value & ~ZEND_LAST_CATCH);
if (UNEXPECTED(catch_ce == NULL)) {
- catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
CACHE_PTR(opline->extended_value & ~ZEND_LAST_CATCH, catch_ce);
}
@@ -16064,7 +16064,7 @@ try_instanceof:
if (IS_CONST == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -17462,7 +17462,7 @@ try_instanceof:
if (IS_VAR == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -17745,7 +17745,7 @@ try_instanceof:
if (IS_UNUSED == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -42327,7 +42327,7 @@ try_instanceof:
if (IS_CONST == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -46114,7 +46114,7 @@ try_instanceof:
if (IS_VAR == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -47408,7 +47408,7 @@ try_instanceof:
if (IS_UNUSED == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}