summaryrefslogtreecommitdiff
path: root/Zend/zend_execute_API.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_execute_API.c')
-rw-r--r--Zend/zend_execute_API.c45
1 files changed, 10 insertions, 35 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index b650444d1c..117eea7d66 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -44,6 +44,7 @@
ZEND_API void (*zend_execute_ex)(zend_execute_data *execute_data);
ZEND_API void (*zend_execute_internal)(zend_execute_data *execute_data, zval *return_value);
+ZEND_API zend_class_entry *(*zend_autoload)(zend_string *name, zend_string *lc_name);
/* true globals */
ZEND_API const zend_fcall_info empty_fcall_info = {0};
@@ -140,7 +141,6 @@ void init_executor(void) /* {{{ */
EG(class_table) = CG(class_table);
EG(in_autoload) = NULL;
- EG(autoload_func) = NULL;
EG(error_handling) = EH_NORMAL;
EG(flags) = EG_FLAGS_INITIAL;
@@ -913,11 +913,9 @@ ZEND_API void zend_call_known_instance_method_with_2_params(
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;
- zval local_retval;
+ zval *zv;
zend_string *lc_name;
- zend_fcall_info fcall_info;
- zend_fcall_info_cache fcall_cache;
+ zend_string *autoload_name;
if (key) {
lc_name = key;
@@ -952,9 +950,7 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *
return ce;
}
- /* The compiler is not-reentrant. Make sure we __autoload() only during run-time
- * (doesn't impact functionality of __autoload()
- */
+ /* The compiler is not-reentrant. Make sure we autoload only during run-time. */
if ((flags & ZEND_FETCH_CLASS_NO_AUTOLOAD) || zend_is_compiling()) {
if (!key) {
zend_string_release_ex(lc_name, 0);
@@ -962,15 +958,14 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *
return NULL;
}
- if (!EG(autoload_func)) {
+ if (!zend_autoload) {
if (!key) {
zend_string_release_ex(lc_name, 0);
}
return NULL;
-
}
- /* Verify class name before passing it to __autoload() */
+ /* Verify class name before passing it to the autoloader. */
if (!key && strspn(ZSTR_VAL(name), "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377\\") != ZSTR_LEN(name)) {
zend_string_release_ex(lc_name, 0);
return NULL;
@@ -988,39 +983,19 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *
return NULL;
}
- ZVAL_UNDEF(&local_retval);
-
if (ZSTR_VAL(name)[0] == '\\') {
- ZVAL_STRINGL(&args[0], ZSTR_VAL(name) + 1, ZSTR_LEN(name) - 1);
+ autoload_name = zend_string_init(ZSTR_VAL(name) + 1, ZSTR_LEN(name) - 1, 0);
} else {
- ZVAL_STR_COPY(&args[0], name);
+ autoload_name = zend_string_copy(name);
}
- fcall_info.size = sizeof(fcall_info);
- ZVAL_STR_COPY(&fcall_info.function_name, EG(autoload_func)->common.function_name);
- fcall_info.retval = &local_retval;
- fcall_info.param_count = 1;
- fcall_info.params = args;
- fcall_info.object = NULL;
- fcall_info.no_separation = 1;
-
- fcall_cache.function_handler = EG(autoload_func);
- fcall_cache.called_scope = NULL;
- fcall_cache.object = NULL;
-
zend_exception_save();
- if ((zend_call_function(&fcall_info, &fcall_cache) == SUCCESS) && !EG(exception)) {
- ce = zend_hash_find_ptr(EG(class_table), lc_name);
- }
+ ce = zend_autoload(autoload_name, lc_name);
zend_exception_restore();
- zval_ptr_dtor(&args[0]);
- zval_ptr_dtor_str(&fcall_info.function_name);
-
+ zend_string_release_ex(autoload_name, 0);
zend_hash_del(EG(in_autoload), lc_name);
- zval_ptr_dtor(&local_retval);
-
if (!key) {
zend_string_release_ex(lc_name, 0);
}