cvs: php-src(PHP_5_3) /ext/reflection php_reflection.c /ext/reflection/tests closures_003.phpt closures_004.phpt
reflectionParameter_invalidMethodInConstructor.phpt

From: Date: Mon, 11 Aug 2008 22:31:23 +0000
Subject: cvs: php-src(PHP_5_3) /ext/reflection php_reflection.c /ext/reflection/tests closures_003.phpt closures_004.phpt
reflectionParameter_invalidMethodInConstructor.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-52241@lists.php.net to get a copy of this message
cseiler Mon Aug 11 22:31:23 2008 UTC Added files: (Branch: PHP_5_3) /php-src/ext/reflection/tests closures_003.phpt closures_004.phpt reflectionParameter_invalidMethodInConstructor.phpt Modified files: /php-src/ext/reflection php_reflection.c Log: MFH: Fixed segfaults (tests added) http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/php_reflection.c?r1=1.164.2.33.2.45.2.32&r2=1.164.2.33.2.45.2.33&diff_format=u Index: php-src/ext/reflection/php_reflection.c diff -u php-src/ext/reflection/php_reflection.c:1.164.2.33.2.45.2.32 php-src/ext/reflection/php_reflection.c:1.164.2.33.2.45.2.33 --- php-src/ext/reflection/php_reflection.c:1.164.2.33.2.45.2.32 Mon Aug 11 19:35:00 2008 +++ php-src/ext/reflection/php_reflection.c Mon Aug 11 22:31:21 2008 @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_reflection.c,v 1.164.2.33.2.45.2.32 2008/08/11 19:35:00 helly Exp $ */ +/* $Id: php_reflection.c,v 1.164.2.33.2.45.2.33 2008/08/11 22:31:21 cseiler Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -231,6 +231,24 @@ class_entry->interfaces[num_interfaces - 1] = interface_entry; } +static zend_function *_copy_function(zend_function *fptr TSRMLS_DC) /* {{{ */ +{ + if (fptr + && fptr->type == ZEND_INTERNAL_FUNCTION + && (fptr->internal_function.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0) + { + zend_function *copy_fptr; + copy_fptr = emalloc(sizeof(zend_function)); + memcpy(copy_fptr, fptr, sizeof(zend_function)); + copy_fptr->internal_function.function_name = estrdup(fptr->internal_function.function_name); + return copy_fptr; + } else { + /* no copy needed */ + return fptr; + } +} +/* }}} */ + static void _free_function(zend_function *fptr TSRMLS_DC) /* {{{ */ { if (fptr @@ -1782,7 +1800,7 @@ zval *parameter; ALLOC_ZVAL(parameter); - reflection_parameter_factory(fptr, arg_info, i, fptr->common.required_num_args, parameter TSRMLS_CC); + reflection_parameter_factory(_copy_function(fptr TSRMLS_CC), arg_info, i, fptr->common.required_num_args, parameter TSRMLS_CC); add_next_index_zval(return_value, parameter); arg_info++; @@ -2033,9 +2051,9 @@ GET_REFLECTION_OBJECT_PTR(param); if (!param->fptr->common.scope) { - reflection_function_factory(param->fptr, return_value TSRMLS_CC); + reflection_function_factory(_copy_function(param->fptr TSRMLS_CC), return_value TSRMLS_CC); } else { - reflection_method_factory(param->fptr->common.scope, param->fptr, return_value TSRMLS_CC); + reflection_method_factory(param->fptr->common.scope, _copy_function(param->fptr TSRMLS_CC), return_value TSRMLS_CC); } } /* }}} */ @@ -2393,7 +2411,14 @@ /* Returns from this function */ } - zend_create_closure(return_value, mptr, mptr->common.scope, obj TSRMLS_CC); + /* This is an original closure object and __invoke is to be called. */ + if (Z_OBJCE_P(obj) == zend_ce_closure && mptr->type == ZEND_INTERNAL_FUNCTION && + (mptr->internal_function.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0) + { + RETURN_ZVAL(obj, 1, 0); + } else { + zend_create_closure(return_value, mptr, mptr->common.scope, obj TSRMLS_CC); + } } } /* }}} */ @@ -5217,7 +5242,7 @@ php_info_print_table_start(); php_info_print_table_header(2, "Reflection", "enabled"); - php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v 1.164.2.33.2.45.2.32 2008/08/11 19:35:00 helly Exp $"); + php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v 1.164.2.33.2.45.2.33 2008/08/11 22:31:21 cseiler Exp $"); php_info_print_table_end(); } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/closures_003.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/closures_003.phpt +++ php-src/ext/reflection/tests/closures_003.phpt --TEST-- Reflection on closures: Segfaults with getParameters() and getDeclaringFunction() --FILE-- <?php $closure = function($a, $b = 0) { }; $method = new ReflectionMethod ($closure); $params = $method->getParameters (); unset ($method); $method = $params[0]->getDeclaringFunction (); unset ($params); echo $method->getName ()."\n"; $parameter = new ReflectionParameter ($closure, 'b'); $method = $parameter->getDeclaringFunction (); unset ($parameter); echo $method->getName ()."\n"; ?> ===DONE=== --EXPECTF-- __invoke __invoke ===DONE=== http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/closures_004.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/closures_004.phpt +++ php-src/ext/reflection/tests/closures_004.phpt --TEST-- Reflection on closures: Segfault with getClosure() on closure itself --FILE-- <?php $closure = function() { echo "Invoked!\n"; }; $method = new ReflectionMethod ($closure); $closure2 = $method->getClosure ($closure); $closure2 (); $closure2->__invoke (); unset ($closure); $closure2 (); $closure2->__invoke (); ?> ===DONE=== --EXPECTF-- Invoked! Invoked! Invoked! Invoked! ===DONE=== http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/reflectionParameter_invalidMethodInConstructor.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/reflectionParameter_invalidMethodInConstructor.phpt +++ php-src/ext/reflection/tests/reflectionParameter_invalidMethodInConstructor.phpt

« previous php.cvs (#52241) next »