summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Pena <felipe@php.net>2011-06-12 21:10:31 +0000
committerFelipe Pena <felipe@php.net>2011-06-12 21:10:31 +0000
commit209bfe82e53c0af03f74119a84c65f3a466ccae2 (patch)
tree362c5d8ab163a437227fdfa0e0f2de3f35c04407
parent9d80c250054b39b4e35a4cf3b32cf732f57c7c36 (diff)
downloadphp-git-209bfe82e53c0af03f74119a84c65f3a466ccae2.tar.gz
- Fixed bug #54624 (class_alias and type hint)
-rw-r--r--NEWS1
-rw-r--r--Zend/tests/bug54624.phpt26
-rw-r--r--Zend/zend_compile.c20
3 files changed, 43 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index d86221fc30..f2173e4479 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,7 @@ PHP NEWS
name). (Dmitry)
. Fixed bug #54804 (__halt_compiler and imported namespaces).
(Pierrick, Felipe)
+ . Fixed bug #54624 (class_alias and type hint). (Felipe)
. Fixed bug #54585 (track_errors causes segfault). (Dmitry)
. Fixed bug #54423 (classes from dl()'ed extensions are not destroyed).
(Tony, Dmitry)
diff --git a/Zend/tests/bug54624.phpt b/Zend/tests/bug54624.phpt
new file mode 100644
index 0000000000..1d0c1ce87c
--- /dev/null
+++ b/Zend/tests/bug54624.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Bug #54624 (class_alias and type hint)
+--FILE--
+<?php
+class A
+{
+ function foo(A $param) {
+ }
+
+}
+
+class_alias('A', 'AliasA');
+
+eval('
+ class B extends A
+ {
+ function foo(AliasA $param) {
+ }
+
+ }
+');
+
+echo "DONE\n";
+?>
+--EXPECTF--
+DONE
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 9b5166f9ae..85600f29ea 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -2572,11 +2572,23 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c
&& strcasecmp(fe->common.arg_info[i].class_name, proto->common.arg_info[i].class_name)!=0) {
char *colon;
- if (fe->common.type != ZEND_USER_FUNCTION ||
- strchr(proto->common.arg_info[i].class_name, '\\') != NULL ||
- (colon = zend_memrchr(fe->common.arg_info[i].class_name, '\\', fe->common.arg_info[i].class_name_len)) == NULL ||
- strcasecmp(colon+1, proto->common.arg_info[i].class_name) != 0) {
+ if (fe->common.type != ZEND_USER_FUNCTION) {
return 0;
+ } else if (strchr(proto->common.arg_info[i].class_name, '\\') != NULL ||
+ (colon = zend_memrchr(fe->common.arg_info[i].class_name, '\\', fe->common.arg_info[i].class_name_len)) == NULL ||
+ strcasecmp(colon+1, proto->common.arg_info[i].class_name) != 0) {
+ zend_class_entry **fe_ce, **proto_ce;
+ TSRMLS_FETCH();
+ int found = zend_lookup_class(fe->common.arg_info[i].class_name, fe->common.arg_info[i].class_name_len, &fe_ce TSRMLS_CC);
+ int found2 = zend_lookup_class(proto->common.arg_info[i].class_name, proto->common.arg_info[i].class_name_len, &proto_ce TSRMLS_CC);
+
+ /* Check for class alias */
+ if (found != SUCCESS || found2 != SUCCESS ||
+ (*fe_ce)->type == ZEND_INTERNAL_CLASS ||
+ (*proto_ce)->type == ZEND_INTERNAL_CLASS ||
+ *fe_ce != *proto_ce) {
+ return 0;
+ }
}
}
if (fe->common.arg_info[i].array_type_hint != proto->common.arg_info[i].array_type_hint) {