mirror of
https://github.com/php/php-src.git
synced 2024-11-28 04:14:26 +08:00
Fixed covariance of return-by-ref constraints
This commit is contained in:
parent
21638aed88
commit
9d25e7ee7b
1
NEWS
1
NEWS
@ -50,6 +50,7 @@
|
||||
large amount of data) (CVE-2010-3710). (Adam)
|
||||
- Fixed ReflectionProperty::isDefault() giving a wrong result for properties
|
||||
obtained with ReflectionClass::getProperties(). (Gustavo)
|
||||
- Fixed covariance of return-by-ref constraints. (Etienne)
|
||||
|
||||
- Fixed bug #53198 (changing INI setting "from" with ini_set did not have any
|
||||
effect). (Gustavo)
|
||||
|
40
Zend/tests/objects_032.phpt
Normal file
40
Zend/tests/objects_032.phpt
Normal file
@ -0,0 +1,40 @@
|
||||
--TEST--
|
||||
Covariant return-by-ref constraints
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class A implements ArrayAccess {
|
||||
public $foo = array();
|
||||
|
||||
public function &offsetGet($n) {
|
||||
return $this->foo[$n];
|
||||
}
|
||||
|
||||
public function offsetSet($n, $v) {
|
||||
}
|
||||
public function offsetUnset($n) {
|
||||
}
|
||||
public function offsetExists($n) {
|
||||
}
|
||||
}
|
||||
|
||||
$a = new A;
|
||||
|
||||
$a['foo']['bar'] = 2;
|
||||
|
||||
var_dump($a);
|
||||
|
||||
?>
|
||||
==DONE==
|
||||
--EXPECTF--
|
||||
object(A)#1 (1) {
|
||||
["foo"]=>
|
||||
array(1) {
|
||||
["foo"]=>
|
||||
array(1) {
|
||||
["bar"]=>
|
||||
int(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
==DONE==
|
@ -2557,7 +2557,8 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (fe->common.return_reference != proto->common.return_reference) {
|
||||
/* by-ref constraints on return values are covariant */
|
||||
if (proto->common.return_reference && !fe->common.return_reference) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2581,6 +2582,8 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c
|
||||
/* Only one has an array type hint and the other one doesn't */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* by-ref constraints on arguments are invariant */
|
||||
if (fe->common.arg_info[i].pass_by_reference != proto->common.arg_info[i].pass_by_reference) {
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user