]> granicus.if.org Git - php/commitdiff
Accept flags argument in zend_lookup_class_ex()
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 24 May 2019 12:41:38 +0000 (14:41 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 27 May 2019 07:36:25 +0000 (09:36 +0200)
Instead of a single boolean, so we have space for extension here.

Zend/zend_API.c
Zend/zend_builtin_functions.c
Zend/zend_closures.c
Zend/zend_compile.c
Zend/zend_execute.h
Zend/zend_execute_API.c
Zend/zend_inheritance.c

index a6115db38cc5aa6ecdc51114d4b6e682a5fab8ad..0dafa9d7dbd6b47ea0b57b23c3b0739fa9371c0e 100644 (file)
@@ -2892,7 +2892,7 @@ static int zend_is_callable_check_class(zend_string *name, zend_class_entry *sco
                        *strict_class = 1;
                        ret = 1;
                }
-       } else if ((ce = zend_lookup_class_ex(name, NULL, 1)) != NULL) {
+       } else if ((ce = zend_lookup_class(name)) != NULL) {
                zend_class_entry *scope;
                zend_execute_data *ex = EG(current_execute_data);
 
index b8b82575695a32b4890595a3b3708d5608d56535..5fc69c24bf4b029218b9787bc3d5253893700c68 100644 (file)
@@ -1057,7 +1057,7 @@ static void is_a_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool only_subclass) /*
        if (!only_subclass && EXPECTED(zend_string_equals(instance_ce->name, class_name))) {
                retval = 1;
        } else {
-               ce = zend_lookup_class_ex(class_name, NULL, 0);
+               ce = zend_lookup_class_ex(class_name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
                if (!ce) {
                        retval = 0;
                } else {
@@ -1504,7 +1504,7 @@ ZEND_FUNCTION(class_alias)
                return;
        }
 
-       ce = zend_lookup_class_ex(class_name, NULL, autoload);
+       ce = zend_lookup_class_ex(class_name, NULL, !autoload ? ZEND_FETCH_CLASS_NO_AUTOLOAD : 0);
 
        if (ce) {
                if (ce->type == ZEND_USER_CLASS) {
index 70b70d9723952ec443d51b75f4011516a967440c..faeadd6fd74f69283d8bfbcabda224214c0fc76a 100644 (file)
@@ -209,7 +209,7 @@ ZEND_METHOD(Closure, bind)
                        zend_string *class_name = zval_get_tmp_string(scope_arg, &tmp_class_name);
                        if (zend_string_equals_literal(class_name, "static")) {
                                ce = closure->func.common.scope;
-                       } else if ((ce = zend_lookup_class_ex(class_name, NULL, 1)) == NULL) {
+                       } else if ((ce = zend_lookup_class(class_name)) == NULL) {
                                zend_error(E_WARNING, "Class '%s' not found", ZSTR_VAL(class_name));
                                zend_string_release_ex(class_name, 0);
                                RETURN_NULL();
index b66ac4dcba659854e025f2b0b6d759cae393545b..d0d5c7af1937dddbac8e472388eb4e4ca0f2576d 100644 (file)
@@ -6394,7 +6394,8 @@ zend_op *zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */
                /* We currently don't early-bind classes that implement interfaces or use traits */
         && !(ce->ce_flags & (ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))) {
                if (extends_ast) {
-                       zend_class_entry *parent_ce = zend_lookup_class_ex(ce->parent_name, NULL, 0);
+                       zend_class_entry *parent_ce = zend_lookup_class_ex(
+                               ce->parent_name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
 
                        if (parent_ce
                         && !(CG(compiler_options) & ZEND_COMPILE_PRELOAD) /* delay inheritance till preloading */
index c3fee42f2418acc83b600fda303eecc0d0c973a3..36a47a01dcbdc8d1b97209bbd00c1de4cd18c2f7 100644 (file)
@@ -41,7 +41,7 @@ ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value);
 ZEND_API void execute_ex(zend_execute_data *execute_data);
 ZEND_API void execute_internal(zend_execute_data *execute_data, zval *return_value);
 ZEND_API zend_class_entry *zend_lookup_class(zend_string *name);
-ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *lcname, int use_autoload);
+ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *lcname, uint32_t flags);
 ZEND_API zend_class_entry *zend_get_called_scope(zend_execute_data *ex);
 ZEND_API zend_object *zend_get_this_object(zend_execute_data *ex);
 ZEND_API int zend_eval_string(char *str, zval *retval_ptr, char *string_name);
index 0d5ceb86274c69faf59c30790ec3d7dbd6a04d14..575f2851671838ad8bf1cd99f866cad522a0aff3 100644 (file)
@@ -886,7 +886,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
 }
 /* }}} */
 
-ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *key, int use_autoload) /* {{{ */
+ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *key, uint32_t flags) /* {{{ */
 {
        zend_class_entry *ce = NULL;
        zval args[1], *zv;
@@ -925,7 +925,7 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *
        /* The compiler is not-reentrant. Make sure we __autoload() only during run-time
         * (doesn't impact functionality of __autoload()
        */
-       if (!use_autoload || zend_is_compiling()) {
+       if ((flags & ZEND_FETCH_CLASS_NO_AUTOLOAD) || zend_is_compiling()) {
                if (!key) {
                        zend_string_release_ex(lc_name, 0);
                }
@@ -1006,7 +1006,7 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *
 
 ZEND_API zend_class_entry *zend_lookup_class(zend_string *name) /* {{{ */
 {
-       return zend_lookup_class_ex(name, NULL, 1);
+       return zend_lookup_class_ex(name, NULL, 0);
 }
 /* }}} */
 
@@ -1397,8 +1397,8 @@ check_fetch_type:
        }
 
        if (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD) {
-               return zend_lookup_class_ex(class_name, NULL, 0);
-       } else if ((ce = zend_lookup_class_ex(class_name, NULL, 1)) == NULL) {
+               return zend_lookup_class_ex(class_name, NULL, fetch_type);
+       } else if ((ce = zend_lookup_class_ex(class_name, NULL, fetch_type)) == NULL) {
                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));
@@ -1419,8 +1419,8 @@ zend_class_entry *zend_fetch_class_by_name(zend_string *class_name, zend_string
        zend_class_entry *ce;
 
        if (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD) {
-               return zend_lookup_class_ex(class_name, key, 0);
-       } else if ((ce = zend_lookup_class_ex(class_name, key, 1)) == NULL) {
+               return zend_lookup_class_ex(class_name, key, fetch_type);
+       } else if ((ce = zend_lookup_class_ex(class_name, key, fetch_type)) == NULL) {
                if (fetch_type & ZEND_FETCH_CLASS_SILENT) {
                        return NULL;
                }
index 36d765386df4d8bc366b12071d96cad250cdcdeb..8541a22df0abbeac7de250eca60e2fcdb5d63f8e 100644 (file)
@@ -204,7 +204,7 @@ static zend_class_entry *lookup_class(const zend_function *fe, zend_string *name
                        return ce;
                }
        } else {
-               ce = zend_lookup_class_ex(name, NULL, /* autoload */ 0);
+               ce = zend_lookup_class_ex(name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
                if (ce && class_visible(ce)) {
                        return ce;
                }