colder Mon Apr 7 10:39:43 2008 UTC Added files: /php-src/ext/standard/tests/class_object forward_static_call_001.phpt forward_static_call_002.phpt forward_static_call_003.phpt
Modified files: /php-src/ext/standard basic_functions.c basic_functions.h Log: Implement forward_static_call(_array) to complete LSB. Patch by Mike Lively http://cvs.php.net/viewvc.cgi/php-src/ext/standard/basic_functions.c?r1=1.892&r2=1.893&diff_format=u Index: php-src/ext/standard/basic_functions.c diff -u php-src/ext/standard/basic_functions.c:1.892 php-src/ext/standard/basic_functions.c:1.893 --- php-src/ext/standard/basic_functions.c:1.892 Thu Mar 20 00:50:47 2008 +++ php-src/ext/standard/basic_functions.c Mon Apr 7 10:39:43 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.c,v 1.892 2008/03/20 00:50:47 dsp Exp $ */ +/* $Id: basic_functions.c,v 1.893 2008/04/07 10:39:43 colder Exp $ */ #include "php.h" #include "php_streams.h" @@ -809,6 +809,19 @@ ZEND_END_ARG_INFO() static +ZEND_BEGIN_ARG_INFO_EX(arginfo_forward_static_call, 0, 0, 1) + ZEND_ARG_INFO(0, function_name) + ZEND_ARG_INFO(0, parameter) + ZEND_ARG_INFO(0, ...) +ZEND_END_ARG_INFO() + +static +ZEND_BEGIN_ARG_INFO_EX(arginfo_forward_static_call_array, 0, 0, 2) + ZEND_ARG_INFO(0, function_name) + ZEND_ARG_INFO(0, parameters) /* ARRAY_INFO(0, parameters, 1) */ +ZEND_END_ARG_INFO() + +static ZEND_BEGIN_ARG_INFO(arginfo_register_shutdown_function, 0) ZEND_ARG_INFO(0, function_name) ZEND_END_ARG_INFO() @@ -3398,6 +3411,8 @@ PHP_FE(call_user_func_array, arginfo_call_user_func_array) PHP_DEP_FE(call_user_method, arginfo_call_user_method) PHP_DEP_FE(call_user_method_array, arginfo_call_user_method_array) + PHP_FE(forward_static_call, arginfo_forward_static_call) + PHP_FE(forward_static_call_array, arginfo_forward_static_call_array) PHP_FE(serialize, arginfo_serialize) PHP_FE(unserialize, arginfo_unserialize) @@ -5197,6 +5212,67 @@ } /* }}} */ +/* {{{ proto mixed forward_static_call(mixed function_name [, mixed parmeter] [, mixed ...]) U + Call a user function which is the first parameter */ +PHP_FUNCTION(forward_static_call) +{ + zval *retval_ptr = NULL; + zend_fcall_info fci; + zend_fcall_info_cache fci_cache; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "f*", &fci, &fci_cache, &fci.params, &fci.param_count) == FAILURE) { + return; + } + + if (!EG(active_op_array)->scope) { + zend_error(E_ERROR, "Cannot call forward_static_call() when no class scope is active"); + } + + fci.retval_ptr_ptr = &retval_ptr; + + if (EG(called_scope) && + instanceof_function(EG(called_scope), fci_cache.calling_scope TSRMLS_CC)) { + fci_cache.calling_scope = EG(called_scope); + } + + if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && fci.retval_ptr_ptr && *fci.retval_ptr_ptr) { + COPY_PZVAL_TO_ZVAL(*return_value, *fci.retval_ptr_ptr); + } + + if (fci.params) { + efree(fci.params); + } +} +/* }}} */ + +/* {{{ proto mixed call_user_func_array(string function_name, array parameters) U + Call a user function which is the first parameter with the arguments contained in array */ +PHP_FUNCTION(forward_static_call_array) +{ + zval *params, *retval_ptr = NULL; + zend_fcall_info fci; + zend_fcall_info_cache fci_cache; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "fa/", &fci, &fci_cache, ¶ms) == FAILURE) { + return; + } + + zend_fcall_info_args(&fci, params TSRMLS_CC); + fci.retval_ptr_ptr = &retval_ptr; + + if (EG(called_scope) && + instanceof_function(EG(called_scope), fci_cache.calling_scope TSRMLS_CC)) { + fci_cache.calling_scope = EG(called_scope); + } + + if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && fci.retval_ptr_ptr && *fci.retval_ptr_ptr) { + COPY_PZVAL_TO_ZVAL(*return_value, *fci.retval_ptr_ptr); + } + + zend_fcall_info_args_clear(&fci, 1); +} +/* }}} */ + void user_shutdown_function_dtor(php_shutdown_function_entry *shutdown_function_entry) /* {{{ */ { int i; http://cvs.php.net/viewvc.cgi/php-src/ext/standard/basic_functions.h?r1=1.161&r2=1.162&diff_format=u Index: php-src/ext/standard/basic_functions.h diff -u php-src/ext/standard/basic_functions.h:1.161 php-src/ext/standard/basic_functions.h:1.162 --- php-src/ext/standard/basic_functions.h:1.161 Sun Feb 3 14:44:30 2008 +++ php-src/ext/standard/basic_functions.h Mon Apr 7 10:39:43 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.h,v 1.161 2008/02/03 14:44:30 helly Exp $ */ +/* $Id: basic_functions.h,v 1.162 2008/04/07 10:39:43 colder Exp $ */ #ifndef BASIC_FUNCTIONS_H #define BASIC_FUNCTIONS_H @@ -84,6 +84,8 @@ PHP_FUNCTION(call_user_func_array); PHP_FUNCTION(call_user_method); PHP_FUNCTION(call_user_method_array); +PHP_FUNCTION(forward_static_call); +PHP_FUNCTION(forward_static_call_array); PHP_FUNCTION(register_shutdown_function); PHP_FUNCTION(highlight_file); http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/class_object/forward_static_call_001.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/class_object/forward_static_call_001.phpt +++ php-src/ext/standard/tests/class_object/forward_static_call_001.phpt --TEST-- forward_static_call() called from outside of a method. --FILE-- <?php class A { const NAME = 'A'; public static function test() { echo static::NAME, "\n"; } } class B extends A { const NAME = 'B'; public static function test() { echo self::NAME, "\n"; forward_static_call(array('parent', 'test')); } public static function test2() { echo self::NAME, "\n"; forward_static_call(array('self', 'test')); } public static function test3() { echo self::NAME, "\n"; forward_static_call(array('A', 'test')); } } class C extends B { const NAME = 'C'; public static function test() { echo self::NAME, "\n"; forward_static_call(array('A', 'test')); } } A::test(); echo "-\n"; B::test(); echo "-\n"; B::test2(); echo "-\n"; B::test3(); echo "-\n"; C::test(); echo "-\n"; C::test2(); echo "-\n"; C::test3(); ?> ===DONE=== --EXPECTF-- A - B B - B B B - B B - C C - B B C - B C ===DONE=== http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/class_object/forward_static_call_002.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/class_object/forward_static_call_002.phpt +++ php-src/ext/standard/tests/class_object/forward_static_call_002.phpt --TEST-- forward_static_call() from outside of a class method. --FILE-- <?php class A { public static function test() { echo "A\n"; } } function test() { forward_static_call(array('A', 'test')); } test(); ?> --EXPECTF-- Fatal error: Cannot call forward_static_call() when no class scope is active in %s on line %d http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/class_object/forward_static_call_003.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/class_object/forward_static_call_003.phpt +++ php-src/ext/standard/tests/class_object/forward_static_call_003.phpt --TEST-- forward_static_call() calling outside of the inheritance chain. --FILE-- <?php class A { const NAME = 'A'; public static function test() { echo static::NAME, "\n"; } } class B extends A { const NAME = 'B'; public static function test() { echo self::NAME, "\n"; forward_static_call(array('parent', 'test')); } } class C { const NAME = 'C'; public static function test() { echo self::NAME, "\n"; forward_static_call(array('B', 'test')); } } A::test(); echo "-\n"; B::test(); echo "-\n"; C::test(); ?> ===DONE=== --EXPECTF-- A - B B - C B B ===DONE=== -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php