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
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php