Skip to content

Commit

Permalink
- Fixed bug #51905 (ReflectionParameter fails if default value is an …
Browse files Browse the repository at this point in the history
…array with an access to self::)
  • Loading branch information
felipensp committed May 26, 2010
1 parent 433cb86 commit 79d2aaf
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 1 deletion.
2 changes: 2 additions & 0 deletions Zend/zend_execute.h
Expand Up @@ -156,6 +156,8 @@ static zend_always_inline int i_zend_is_true(zval *op)
}

ZEND_API int zval_update_constant(zval **pp, void *arg TSRMLS_DC);
ZEND_API int zval_update_constant_inline_change(zval **pp, void *arg TSRMLS_DC);
ZEND_API int zval_update_constant_no_inline_change(zval **pp, void *arg TSRMLS_DC);
ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *scope TSRMLS_DC);

/* dedicated Zend executor functions - do not use! */
Expand Down
14 changes: 13 additions & 1 deletion Zend/zend_execute_API.c
Expand Up @@ -684,13 +684,25 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco
}
zval_dtor(&const_value);
}
zend_hash_apply_with_argument(Z_ARRVAL_P(p), (apply_func_arg_t) zval_update_constant, (void *) 1 TSRMLS_CC);
zend_hash_apply_with_argument(Z_ARRVAL_P(p), (apply_func_arg_t) zval_update_constant_inline_change, (void *) scope TSRMLS_CC);
zend_hash_internal_pointer_reset(Z_ARRVAL_P(p));
}
return 0;
}
/* }}} */

ZEND_API int zval_update_constant_inline_change(zval **pp, void *scope TSRMLS_DC) /* {{{ */
{
return zval_update_constant_ex(pp, (void*)1, scope TSRMLS_CC);
}
/* }}} */

ZEND_API int zval_update_constant_no_inline_change(zval **pp, void *scope TSRMLS_DC) /* {{{ */
{
return zval_update_constant_ex(pp, (void*)0, scope TSRMLS_CC);
}
/* }}} */

ZEND_API int zval_update_constant(zval **pp, void *arg TSRMLS_DC) /* {{{ */
{
return zval_update_constant_ex(pp, arg, NULL TSRMLS_CC);
Expand Down
28 changes: 28 additions & 0 deletions ext/reflection/tests/bug51905.phpt
@@ -0,0 +1,28 @@
--TEST--
Bug #51905 (ReflectionParameter fails if default value is an array with an access to self::)
--FILE--
<?php

class Bar {
const Y = 20;
}

class Foo extends Bar {
const X = 12;
public function x($x = 1, $y = array(self::X), $z = parent::Y) {}
}

$clazz = new ReflectionClass('Foo');
$method = $clazz->getMethod('x');
foreach ($method->getParameters() as $param) {
if ( $param->isDefaultValueAvailable())
echo '$', $param->getName(), ' : ', var_export($param->getDefaultValue(), 1), "\n";
}

?>
--EXPECT--
$x : 1
$y : array (
0 => 12,
)
$z : 20

0 comments on commit 79d2aaf

Please sign in to comment.