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