From d47c88feb2f3603bfbc63e99ef8a6d71a211fc77 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 13 Dec 2007 08:58:28 +0000 Subject: [PATCH] Allowed multiple namespaces per file (Gregory) --- Zend/tests/ns_060.phpt | 23 +++++++++++++++++++++++ Zend/zend_compile.c | 19 +++++++++++++------ 2 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 Zend/tests/ns_060.phpt 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_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)) { -- 2.40.0