From: Dmitry Stogov Date: Thu, 13 Dec 2007 08:57:52 +0000 (+0000) Subject: Allowed multiple namespaces per file (Gregory) X-Git-Tag: RELEASE_1_3_1~514 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=80e77c1366bcf41f269579c9209fb8d2ef0c3d72;p=php Allowed multiple namespaces per file (Gregory) --- diff --git a/NEWS b/NEWS index 964e9d85df..a513f4709b 100644 --- a/NEWS +++ b/NEWS @@ -16,7 +16,7 @@ PHP NEWS - Added long-option feature to getopt() and made getopt() available also on win32 systems by adding a common getopt implementation into core. (David Soria Parra, Jani) -- Added support for namespaces. (Dmitry, Stas) +- Added support for namespaces. (Dmitry, Stas, Gregory) - Added support for Late Static Binding. (Dmitry, Etienne Kneuss) - Added support for __callstatic() magic method. (Sara) - Added support for dynamic access of static members using $foo::myFunc(). diff --git a/Zend/tests/ns_060.phpt b/Zend/tests/ns_060.phpt new file mode 100644 index 0000000000..cc86d0e087 --- /dev/null +++ b/Zend/tests/ns_060.phpt @@ -0,0 +1,23 @@ +--TEST-- +060: multiple namespaces per file +--FILE-- +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_str_tolower_dup(Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant)); if (((Z_STRLEN(name->u.constant) == sizeof("self")-1) && !memcmp(lcname, "self", sizeof("self")-1)) || @@ -4765,7 +4762,17 @@ void zend_do_namespace(znode *name TSRMLS_DC) /* {{{ */ } efree(lcname); - 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; } /* }}} */ @@ -4884,7 +4891,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)) {