summaryrefslogtreecommitdiff
path: root/Zend/zend_execute_API.c
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2002-06-26 15:13:14 +0000
committerAndi Gutmans <andi@php.net>2002-06-26 15:13:14 +0000
commit737de1bd0c19a1b77808affe8ba6d945e7ac831b (patch)
tree76cf2ee4ebcf2c6874f70362459329f5005078a8 /Zend/zend_execute_API.c
parent28247f572a226c9e58d9c1593e7be8dae8da8bd8 (diff)
downloadphp-git-737de1bd0c19a1b77808affe8ba6d945e7ac831b.tar.gz
- Autoloading support based on patch from Ivan Ristic.
- Again I hope this feature ends up working well because if it doesn't we - might need to nuke it. This only works for global scoped classes and it - will never work for sub-classes so don't even ask!!!!! - Just define an __autoload() function in the global scope and it will be - called with the class name as the parameter if it doesn't manage to find - the class.
Diffstat (limited to 'Zend/zend_execute_API.c')
-rw-r--r--Zend/zend_execute_API.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 36596e0228..d6120bf7ce 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -639,9 +639,36 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun
ZEND_API int zend_lookup_class(char *name, int name_length, zend_class_entry ***ce TSRMLS_DC)
{
- return zend_hash_find(EG(class_table), name, name_length+1, (void **) ce);
-}
+ zval **args[1];
+ zval *autoload_function;
+ zval *class_name;
+ zval *retval_ptr;
+ int retval;
+
+ if (zend_hash_find(EG(class_table), name, name_length+1, (void **) ce) == SUCCESS) {
+ return SUCCESS;
+ }
+
+ MAKE_STD_ZVAL(autoload_function);
+ ZVAL_STRINGL(autoload_function, "__autoload", sizeof("__autoload")-1, 1);
+
+ MAKE_STD_ZVAL(class_name);
+ ZVAL_STRINGL(class_name, name, name_length, 1);
+ args[0] = &class_name;
+
+ retval = call_user_function_ex(EG(function_table), NULL, autoload_function, &retval_ptr, 1, args, 0, NULL TSRMLS_CC);
+ zval_ptr_dtor(&autoload_function);
+ zval_ptr_dtor(&class_name);
+
+ if (retval == FAILURE) {
+ return FAILURE;
+ }
+
+ zval_ptr_dtor(&retval_ptr);
+
+ return zend_hash_find(EG(class_table), name, name_length + 1, (void **) ce);
+}
ZEND_API int zend_eval_string(char *str, zval *retval_ptr, char *string_name TSRMLS_DC)
{