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
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

Reply via email to