Skip to content

Commit 4df39f4

Browse files
committed
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.
1 parent c8a8c47 commit 4df39f4

File tree

5 files changed

+17
-20
lines changed

5 files changed

+17
-20
lines changed

Zend/zend_compile.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8927,7 +8927,7 @@ void zend_compile_instanceof(znode *result, zend_ast *ast) /* {{{ */
89278927
}
89288928

89298929
zend_compile_class_ref(&class_node, class_ast,
8930-
ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_EXCEPTION);
8930+
ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_EXCEPTION | ZEND_FETCH_CLASS_SILENT);
89318931

89328932
opline = zend_emit_op_tmp(result, ZEND_INSTANCEOF, &obj_node, NULL);
89338933

Zend/zend_execute.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,7 +1002,7 @@ static zend_always_inline bool zend_check_type_slow(
10021002
}
10031003
} else {
10041004
ce = zend_fetch_class(ZEND_TYPE_NAME(*list_type),
1005-
(ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD));
1005+
ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
10061006
if (!ce) {
10071007
if (HAVE_CACHE_SLOT) {
10081008
cache_slot++;
@@ -1032,7 +1032,8 @@ static zend_always_inline bool zend_check_type_slow(
10321032
*cache_slot = ce;
10331033
}
10341034
} else {
1035-
ce = zend_fetch_class(ZEND_TYPE_NAME(*type), (ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD));
1035+
ce = zend_fetch_class(ZEND_TYPE_NAME(*type),
1036+
ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
10361037
if (UNEXPECTED(!ce)) {
10371038
goto builtin_types;
10381039
}

Zend/zend_execute_API.c

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1523,9 +1523,8 @@ zend_class_entry *zend_fetch_class(zend_string *class_name, int fetch_type) /* {
15231523
break;
15241524
}
15251525

1526-
if (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD) {
1527-
return zend_lookup_class_ex(class_name, NULL, fetch_type);
1528-
} else if ((ce = zend_lookup_class_ex(class_name, NULL, fetch_type)) == NULL) {
1526+
ce = zend_lookup_class_ex(class_name, NULL, fetch_type);
1527+
if (!ce) {
15291528
if (!(fetch_type & ZEND_FETCH_CLASS_SILENT) && !EG(exception)) {
15301529
if (fetch_sub_type == ZEND_FETCH_CLASS_INTERFACE) {
15311530
zend_throw_or_error(fetch_type, NULL, "Interface \"%s\" not found", ZSTR_VAL(class_name));
@@ -1543,11 +1542,8 @@ zend_class_entry *zend_fetch_class(zend_string *class_name, int fetch_type) /* {
15431542

15441543
zend_class_entry *zend_fetch_class_by_name(zend_string *class_name, zend_string *key, int fetch_type) /* {{{ */
15451544
{
1546-
zend_class_entry *ce;
1547-
1548-
if (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD) {
1549-
return zend_lookup_class_ex(class_name, key, fetch_type);
1550-
} else if ((ce = zend_lookup_class_ex(class_name, key, fetch_type)) == NULL) {
1545+
zend_class_entry *ce = zend_lookup_class_ex(class_name, key, fetch_type);
1546+
if (!ce) {
15511547
if (fetch_type & ZEND_FETCH_CLASS_SILENT) {
15521548
return NULL;
15531549
}

Zend/zend_vm_def.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4556,7 +4556,7 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, JMP_ADDR, LAST_CATCH|CACHE_SLOT)
45564556
}
45574557
catch_ce = CACHED_PTR(opline->extended_value & ~ZEND_LAST_CATCH);
45584558
if (UNEXPECTED(catch_ce == NULL)) {
4559-
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);
4559+
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);
45604560

45614561
CACHE_PTR(opline->extended_value & ~ZEND_LAST_CATCH, catch_ce);
45624562
}
@@ -7667,7 +7667,7 @@ ZEND_VM_C_LABEL(try_instanceof):
76677667
if (OP2_TYPE == IS_CONST) {
76687668
ce = CACHED_PTR(opline->extended_value);
76697669
if (UNEXPECTED(ce == NULL)) {
7670-
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);
7670+
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);
76717671
if (EXPECTED(ce)) {
76727672
CACHE_PTR(opline->extended_value, ce);
76737673
}

Zend/zend_vm_execute.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4567,7 +4567,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_HANDLER(ZEND_
45674567
}
45684568
catch_ce = CACHED_PTR(opline->extended_value & ~ZEND_LAST_CATCH);
45694569
if (UNEXPECTED(catch_ce == NULL)) {
4570-
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);
4570+
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);
45714571

45724572
CACHE_PTR(opline->extended_value & ~ZEND_LAST_CATCH, catch_ce);
45734573
}
@@ -16064,7 +16064,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_CONST_H
1606416064
if (IS_CONST == IS_CONST) {
1606516065
ce = CACHED_PTR(opline->extended_value);
1606616066
if (UNEXPECTED(ce == NULL)) {
16067-
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);
16067+
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);
1606816068
if (EXPECTED(ce)) {
1606916069
CACHE_PTR(opline->extended_value, ce);
1607016070
}
@@ -17462,7 +17462,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_HAN
1746217462
if (IS_VAR == IS_CONST) {
1746317463
ce = CACHED_PTR(opline->extended_value);
1746417464
if (UNEXPECTED(ce == NULL)) {
17465-
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);
17465+
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);
1746617466
if (EXPECTED(ce)) {
1746717467
CACHE_PTR(opline->extended_value, ce);
1746817468
}
@@ -17745,7 +17745,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED_
1774517745
if (IS_UNUSED == IS_CONST) {
1774617746
ce = CACHED_PTR(opline->extended_value);
1774717747
if (UNEXPECTED(ce == NULL)) {
17748-
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);
17748+
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);
1774917749
if (EXPECTED(ce)) {
1775017750
CACHE_PTR(opline->extended_value, ce);
1775117751
}
@@ -42327,7 +42327,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_CONST_HANDL
4232742327
if (IS_CONST == IS_CONST) {
4232842328
ce = CACHED_PTR(opline->extended_value);
4232942329
if (UNEXPECTED(ce == NULL)) {
42330-
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);
42330+
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);
4233142331
if (EXPECTED(ce)) {
4233242332
CACHE_PTR(opline->extended_value, ce);
4233342333
}
@@ -46114,7 +46114,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_VAR_HANDLER
4611446114
if (IS_VAR == IS_CONST) {
4611546115
ce = CACHED_PTR(opline->extended_value);
4611646116
if (UNEXPECTED(ce == NULL)) {
46117-
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);
46117+
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);
4611846118
if (EXPECTED(ce)) {
4611946119
CACHE_PTR(opline->extended_value, ce);
4612046120
}
@@ -47408,7 +47408,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_UNUSED_HAND
4740847408
if (IS_UNUSED == IS_CONST) {
4740947409
ce = CACHED_PTR(opline->extended_value);
4741047410
if (UNEXPECTED(ce == NULL)) {
47411-
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);
47411+
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);
4741247412
if (EXPECTED(ce)) {
4741347413
CACHE_PTR(opline->extended_value, ce);
4741447414
}

0 commit comments

Comments
 (0)