diff options
author | Dmitry Stogov <dmitry@zend.com> | 2020-03-12 16:31:24 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2020-03-12 16:31:24 +0300 |
commit | 2dddab01ae6a5427d9f6f38770cea4553e93b033 (patch) | |
tree | 5e04f2d91956e224b235fc84f232bceab7da10c4 /Zend/zend_compile.c | |
parent | ddc3f3d595c28b7b9756dc346c0895000cf2631f (diff) | |
download | php-git-2dddab01ae6a5427d9f6f38770cea4553e93b033.tar.gz |
Avoid "Anonymous class wasn't preloaded" error by lazely loading of not preloaded part of a preloaded script
Diffstat (limited to 'Zend/zend_compile.c')
-rw-r--r-- | Zend/zend_compile.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 5661f26439..970011ac08 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1072,11 +1072,21 @@ ZEND_API int do_bind_class(zval *lcname, zend_string *lc_parent_name) /* {{{ */ ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(lcname)); if (ce) { zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name)); + return FAILURE; } else { - ZEND_ASSERT(EG(current_execute_data)->func->op_array.fn_flags & ZEND_ACC_PRELOADED); - zend_error_noreturn(E_ERROR, "Class %s wasn't preloaded", Z_STRVAL_P(lcname)); + do { + if (zend_preload_autoload + && zend_preload_autoload(EG(current_execute_data)->func->op_array.filename) == SUCCESS) { + zv = zend_hash_find_ex(EG(class_table), Z_STR_P(rtd_key), 1); + if (EXPECTED(zv != NULL)) { + break; + } + } + ZEND_ASSERT(EG(current_execute_data)->func->op_array.fn_flags & ZEND_ACC_PRELOADED); + zend_error_noreturn(E_ERROR, "Class %s wasn't preloaded", Z_STRVAL_P(lcname)); + return FAILURE; + } while (0); } - return FAILURE; } /* Register the derived class */ |