--- /dev/null
+--TEST--
+056: type-hint compatibility in namespaces
+--SKIPIF--
+<?php if (!extension_loaded("spl")) die("skip SPL is no available"); ?>
+--FILE--
+<?php
+namespace test::ns1;
+
+class Foo implements SplObserver {
+ function update(SplSubject $x) {
+ echo "ok\n";
+ }
+}
+
+class Bar implements SplSubject {
+ function attach(SplObserver $x) {
+ echo "ok\n";
+ }
+ function notify() {
+ }
+ function detach(SplObserver $x) {
+ }
+}
+$foo = new Foo();
+$bar = new Bar();
+$bar->attach($foo);
+$foo->update($bar);
+?>
+--EXPECT--
+ok
+ok
(fe->common.arg_info[i].class_name_len != proto->common.arg_info[i].class_name_len ||
(!UG(unicode) && zend_binary_strcasecmp(fe->common.arg_info[i].class_name.s, fe->common.arg_info[i].class_name_len, proto->common.arg_info[i].class_name.s, proto->common.arg_info[i].class_name_len) != 0) ||
(UG(unicode) && zend_u_binary_strcasecmp(fe->common.arg_info[i].class_name.u, fe->common.arg_info[i].class_name_len, proto->common.arg_info[i].class_name.u, proto->common.arg_info[i].class_name_len) != 0))) {
- return 0;
+
+ zstr colon;
+
+ if (fe->common.type == ZEND_USER_FUNCTION &&
+ ((UG(unicode) &&
+ u_strchr(proto->common.arg_info[i].class_name.u, ':') == NULL &&
+ (colon.u = u_memrchr(fe->common.arg_info[i].class_name.u, ':', fe->common.arg_info[i].class_name_len)) != NULL &&
+ fe->common.arg_info[i].class_name_len - (colon.u + 1 - fe->common.arg_info[i].class_name.u) == proto->common.arg_info[i].class_name_len &&
+ zend_u_binary_strcasecmp(colon.u + 1, proto->common.arg_info[i].class_name_len, proto->common.arg_info[i].class_name.u, proto->common.arg_info[i].class_name_len) == 0) ||
+ (!UG(unicode) &&
+ strchr(proto->common.arg_info[i].class_name.s, ':') == NULL &&
+ (colon.s = zend_memrchr(fe->common.arg_info[i].class_name.s, ':', fe->common.arg_info[i].class_name_len)) != NULL &&
+ fe->common.arg_info[i].class_name_len - (colon.s + 1 - fe->common.arg_info[i].class_name.s) == proto->common.arg_info[i].class_name_len &&
+ zend_binary_strcasecmp(colon.s + 1, proto->common.arg_info[i].class_name_len, proto->common.arg_info[i].class_name.s, proto->common.arg_info[i].class_name_len) == 0))) {
+
+ efree((char*)fe->common.arg_info[i].class_name.v);
+ if (UG(unicode)) {
+ fe->common.arg_info[i].class_name.u = eustrndup(proto->common.arg_info[i].class_name.u, proto->common.arg_info[i].class_name_len);
+ } else {
+ fe->common.arg_info[i].class_name.s = estrndup(proto->common.arg_info[i].class_name.s, proto->common.arg_info[i].class_name_len);
+ }
+ fe->common.arg_info[i].class_name_len = proto->common.arg_info[i].class_name_len;
+ } else {
+ return 0;
+ }
}
if (fe->common.arg_info[i].array_type_hint != proto->common.arg_info[i].array_type_hint) {
/* Only one has an array type hint and the other one doesn't */