]> granicus.if.org Git - php/commitdiff
Don't imply SILENT from NO_AUTOLOAD
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 18 Mar 2021 14:15:21 +0000 (15:15 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 18 Mar 2021 14:15:21 +0000 (15:15 +0100)
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.

Zend/zend_compile.c
Zend/zend_execute.c
Zend/zend_execute_API.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 76c2ed96447dfe71f0f43b94a126dd76fcefafd0..f7e283d76d18e1a09eeadbe87ca62dd8b9f38c76 100644 (file)
@@ -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);
 
index 9f69041257cb258ea31881602273c125e934f7d7..39862a24258e7e7a932c44eee7744d4545d18b4a 100644 (file)
@@ -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;
                                }
index ce51ef7960ec473c1edd5a3e1a1c9be0d964b7f6..af3c8cc67042d1d36fb6611f4e235809414b09ee 100644 (file)
@@ -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;
                }
index 39f121695850507f5928c3b785bcf5e0863d6e00..115279dcfde5b1e3cfedb22ec7b0b7b65636fe40 100644 (file)
@@ -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);
                                }
index f133eab7db11a55aa3745f01f78a82739fc2cd24..24a4d67bf2da81d54abc1a67c9d6c9a065bfbfd0 100644 (file)
@@ -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);
                                }