Re: multiple namespace per file patch
| From: | Sam Barrow | Date: | Tue, 04 Dec 2007 20:32:44 +0000 |
| Subject: | Re: multiple namespace per file patch | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-33692@lists.php.net to get a copy of this message | ||
I support this patch 100%. I have a large application I'm rewriting to
include namespaces, however now I can no longer use my script caching
functionality (which improved performance literally about 500%) that
compiled all of my includes into one file, because many of the files
have namespaces.
On Tue, 2007-12-04 at 12:12 -0600, Gregory Beaver wrote:
> Hi,
>
> There's been enough confusion, here's the patch again, this time against
> 5.3, no tests for clarity
>
> http://pear.php.net/~greg/multi.5.3.patch.txt
>
> This patch allows:
>
> <?php
> namespace A;
> class a {}
> namespace B;
> class a {}
> namespace A;
> import B::a as b;
> class c extends b;
> ?>
>
> It doesn't allow:
> <?php
> $anycode = 1;
> namespace A;
> ?>
>
> so all code must have a namespace declaration. The sole purpose is to
> combine files containing namespace declarations.
>
> Greg
> plain text document attachment (multi.5.3.patch.txt)
> Index: Zend/zend_compile.c
> ===================================================================
> RCS file: /repository/ZendEngine2/zend_compile.c,v
> retrieving revision 1.647.2.27.2.41.2.28
> diff -u -r1.647.2.27.2.41.2.28 zend_compile.c
> --- Zend/zend_compile.c 4 Dec 2007 12:38:42 -0000 1.647.2.27.2.41.2.28
> +++ Zend/zend_compile.c 4 Dec 2007 17:24:34 -0000
> @@ -4722,13 +4722,10 @@
> 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_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)) ||
> @@ -4738,6 +4735,16 @@
> }
> efree(lcname);
>
> + if (CG(current_namespace)) {
> + zval_dtor(CG(current_namespace));
> + efree(CG(current_namespace));
> + }
> + if (CG(current_import)) {
> + zend_hash_destroy(CG(current_import));
> + efree(CG(current_import));
> + }
> + CG(current_import) = NULL;
> +
> ALLOC_ZVAL(CG(current_namespace));
> *CG(current_namespace) = name->u.constant;
> }
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php