Skip to content

Commit 8646d9a

Browse files
committed
Fixed type-hint compatibility check in namespaces
1 parent 98b3c24 commit 8646d9a

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

Zend/tests/ns_056.phpt

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--TEST--
2+
056: type-hint compatibility in namespaces
3+
--SKIPIF--
4+
<?php if (!extension_loaded("spl")) die("skip SPL is no available"); ?>
5+
--FILE--
6+
<?php
7+
namespace test::ns1;
8+
9+
class Foo implements SplObserver {
10+
function update(SplSubject $x) {
11+
echo "ok\n";
12+
}
13+
}
14+
15+
class Bar implements SplSubject {
16+
function attach(SplObserver $x) {
17+
echo "ok\n";
18+
}
19+
function notify() {
20+
}
21+
function detach(SplObserver $x) {
22+
}
23+
}
24+
$foo = new Foo();
25+
$bar = new Bar();
26+
$bar->attach($foo);
27+
$foo->update($bar);
28+
?>
29+
--EXPECT--
30+
ok
31+
ok

Zend/zend_compile.c

+12-1
Original file line numberDiff line numberDiff line change
@@ -2176,7 +2176,18 @@ static zend_bool zend_do_perform_implementation_check(zend_function *fe, zend_fu
21762176
}
21772177
if (fe->common.arg_info[i].class_name
21782178
&& strcmp(fe->common.arg_info[i].class_name, proto->common.arg_info[i].class_name)!=0) {
2179-
return 0;
2179+
char *colon;
2180+
2181+
if (fe->common.type == ZEND_USER_FUNCTION &&
2182+
strchr(proto->common.arg_info[i].class_name, ':') == NULL &&
2183+
(colon = zend_memrchr(fe->common.arg_info[i].class_name, ':', fe->common.arg_info[i].class_name_len)) != NULL &&
2184+
strcmp(colon+1, proto->common.arg_info[i].class_name) == 0) {
2185+
efree((char*)fe->common.arg_info[i].class_name);
2186+
fe->common.arg_info[i].class_name = estrndup(proto->common.arg_info[i].class_name, proto->common.arg_info[i].class_name_len);
2187+
fe->common.arg_info[i].class_name_len = proto->common.arg_info[i].class_name_len;
2188+
} else {
2189+
return 0;
2190+
}
21802191
}
21812192
if (fe->common.arg_info[i].array_type_hint != proto->common.arg_info[i].array_type_hint) {
21822193
/* Only one has an array type hint and the other one doesn't */

0 commit comments

Comments
 (0)