]> granicus.if.org Git - php/commitdiff
Allowed multiple namespaces per file (Gregory)
authorDmitry Stogov <dmitry@php.net>
Thu, 13 Dec 2007 08:58:28 +0000 (08:58 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 13 Dec 2007 08:58:28 +0000 (08:58 +0000)
Zend/tests/ns_060.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/Zend/tests/ns_060.phpt b/Zend/tests/ns_060.phpt
new file mode 100644 (file)
index 0000000..cc86d0e
--- /dev/null
@@ -0,0 +1,23 @@
+--TEST--
+060: multiple namespaces per file
+--FILE--
+<?php
+namespace Foo;
+use Bar::A as B;
+class A {}
+$a = new B;
+$b = new A;
+echo get_class($a)."\n";
+echo get_class($b)."\n";
+namespace Bar;
+use Foo::A as B;
+$a = new B;
+$b = new A;
+echo get_class($a)."\n";
+echo get_class($b)."\n";
+class A {}
+--EXPECT--
+Bar::A
+Foo::A
+Foo::A
+Bar::A
index 8dfcc14a1af9b26bd957d61af6e4df7b96d3fdab..d37e1a7e3d5ac8fd75b8def84de29bba861a71f6 100644 (file)
@@ -5248,13 +5248,10 @@ void zend_do_namespace(znode *name TSRMLS_DC) /* {{{ */
                        CG(active_op_array)->opcodes[num-1].opcode == ZEND_TICKS)) {
                        --num;
                }
-               if (num > 0) {
+               if (!CG(current_namespace) && num > 0) {
                        zend_error(E_COMPILE_ERROR, "Namespace declaration statement has to be the very first statement in the script");
                }
        }
-       if (CG(current_namespace)) {
-               zend_error(E_COMPILE_ERROR, "Namespace cannot be declared twice");
-       }
        lcname = zend_u_str_case_fold(Z_TYPE(name->u.constant), Z_UNIVAL(name->u.constant), Z_UNILEN(name->u.constant), 0, &lcname_len);
        if (((lcname_len == sizeof("self")-1) &&
           ZEND_U_EQUAL(Z_TYPE(name->u.constant), lcname, lcname_len, "self", sizeof("self")-1)) ||
@@ -5264,7 +5261,17 @@ void zend_do_namespace(znode *name TSRMLS_DC) /* {{{ */
        }
        efree(lcname.v);
 
-       ALLOC_ZVAL(CG(current_namespace));
+       if (CG(current_namespace)) {
+               zval_dtor(CG(current_namespace));
+       } else {
+               ALLOC_ZVAL(CG(current_namespace));
+       }
+       if (CG(current_import)) {
+               zend_hash_destroy(CG(current_import));
+               efree(CG(current_import));
+               CG(current_import) = NULL;
+       }
+
        *CG(current_namespace) = name->u.constant;
 }
 /* }}} */
@@ -5407,7 +5414,7 @@ void zend_do_end_compilation(TSRMLS_D) /* {{{ */
 {
        if (CG(current_namespace)) {
                zval_dtor(CG(current_namespace));
-               efree(CG(current_namespace));
+               FREE_ZVAL(CG(current_namespace));
                CG(current_namespace) = NULL;
        }
        if (CG(current_import)) {