]> granicus.if.org Git - php/commitdiff
Allowed to override internal classaes with "use"
authorDmitry Stogov <dmitry@php.net>
Fri, 20 Jun 2008 17:17:05 +0000 (17:17 +0000)
committerDmitry Stogov <dmitry@php.net>
Fri, 20 Jun 2008 17:17:05 +0000 (17:17 +0000)
Zend/tests/ns_066.phpt [new file with mode: 0644]
Zend/tests/ns_067.inc [new file with mode: 0644]
Zend/tests/ns_067.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/Zend/tests/ns_066.phpt b/Zend/tests/ns_066.phpt
new file mode 100644 (file)
index 0000000..3a7d9a5
--- /dev/null
@@ -0,0 +1,10 @@
+--TEST--
+066: Name ambiguity (import name & internal class name)
+--FILE--
+<?php
+include __DIR__ . '/ns_027.inc';
+use Foo::Bar::Foo as stdClass;
+
+new stdClass();
+--EXPECT--
+Foo::Bar::Foo
diff --git a/Zend/tests/ns_067.inc b/Zend/tests/ns_067.inc
new file mode 100644 (file)
index 0000000..09327b2
--- /dev/null
@@ -0,0 +1,3 @@
+<?php
+use Foo::Bar::Foo as Test;
+new Test();
diff --git a/Zend/tests/ns_067.phpt b/Zend/tests/ns_067.phpt
new file mode 100644 (file)
index 0000000..c509627
--- /dev/null
@@ -0,0 +1,9 @@
+--TEST--
+067: Name ambiguity (import name & internal class name)
+--FILE--
+<?php
+include __DIR__ . '/ns_022.inc';
+include __DIR__ . '/ns_027.inc';
+include __DIR__ . '/ns_067.inc';
+--EXPECT--
+Foo::Bar::Foo
index 8580e35bef99be1c8efde431817412e11bc24865..00f8c11d7c873266125f4af61a85807519b17bda 100644 (file)
@@ -4959,6 +4959,7 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{
        char *lcname;
        zval *name, *ns, tmp;
        zend_bool warn = 0;
+       zend_class_entry **pce;
 
        if (!CG(current_import)) {
                CG(current_import) = emalloc(sizeof(HashTable));
@@ -5012,7 +5013,9 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{
                        efree(tmp);
                }
                efree(ns_name);
-       } else if (zend_hash_exists(CG(class_table), lcname, Z_STRLEN_P(name)+1)) {
+       } else if (zend_hash_find(CG(class_table), lcname, Z_STRLEN_P(name)+1, (void**)&pce) == SUCCESS &&
+                  (*pce)->type == ZEND_USER_CLASS &&
+                  (*pce)->filename == CG(compiled_filename)) {
                char *tmp = zend_str_tolower_dup(Z_STRVAL_P(ns), Z_STRLEN_P(ns));
 
                if (Z_STRLEN_P(ns) != Z_STRLEN_P(name) ||