]> granicus.if.org Git - php/commitdiff
- Autoloading support based on patch from Ivan Ristic.
authorAndi Gutmans <andi@php.net>
Wed, 26 Jun 2002 15:13:14 +0000 (15:13 +0000)
committerAndi Gutmans <andi@php.net>
Wed, 26 Jun 2002 15:13:14 +0000 (15:13 +0000)
- 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.

Zend/zend_execute_API.c

index 36596e022887e691225c6c32e2c1344bb8d95902..d6120bf7ce047b539cf29e467add28b38198d6b2 100644 (file)
@@ -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)
 {