And here is the final version of my class redeclaration patch.
class Foo {}
class Foo {}
-> Fatal error: Cannot redeclare class foo
(previously declared in /home/wez/source/php/PHPDEV/wez.declare.class.php:3)
in /home/wez/source/php/PHPDEV/wez.declare.class.php on line 5
class Directory {}
-> Fatal error: Cannot redeclare built-in class directory in
/home/wez/source/php/PHPDEV/wez.declare.class.php on line 3
--Wez.
Index: zend_API.h
===================================================================
RCS file: /repository/Zend/zend_API.h,v
retrieving revision 1.113
diff -u -r1.113 zend_API.h
--- zend_API.h 10 Sep 2002 15:33:45 -0000 1.113
+++ zend_API.h 29 Sep 2002 12:48:24 -0000
@@ -92,6 +92,7 @@
class_container.handle_function_call = NULL;
\
class_container.handle_property_get = NULL;
\
class_container.handle_property_set = NULL;
\
+ class_container.def_file = NULL; \
}
#define INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions,
handle_fcall, handle_propget, handle_propset) \
@@ -102,6 +103,7 @@
class_container.handle_function_call = handle_fcall; \
class_container.handle_property_get = handle_propget; \
class_container.handle_property_set = handle_propset; \
+ class_container.def_file = NULL; \
}
Index: zend_compile.c
===================================================================
RCS file: /repository/Zend/zend_compile.c,v
retrieving revision 1.237
diff -u -r1.237 zend_compile.c
--- zend_compile.c 26 Sep 2002 18:39:28 -0000 1.237
+++ zend_compile.c 29 Sep 2002 12:48:26 -0000
@@ -1180,18 +1180,33 @@
}
break;
case ZEND_DECLARE_CLASS: {
- zend_class_entry *ce;
+ zend_class_entry *ce, *exist_ce;
if (zend_hash_find(class_table,
opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len, (void **)
&ce)==FAILURE) {
zend_error(E_ERROR, "Internal Zend error -
Missing class information for %s", opline->op1.u.constant.value.str.val);
return FAILURE;
}
+
+ if (zend_hash_find(class_table,
+opline->op2.u.constant.value.str.val, opline->op2.u.constant.value.str.len+1,
+ (void **) &exist_ce) ==
+SUCCESS) {
+ if (!compile_time) {
+ if (exist_ce->def_file) {
+ zend_error(E_ERROR, "Cannot
+redeclare class %s (previously declared in %s:%d)",
+
+opline->op2.u.constant.value.str.val,
+ exist_ce->def_file,
+ exist_ce->def_lineno);
+ } else {
+ zend_error(E_ERROR, "Cannot
+redeclare built-in class %s",
+
+opline->op2.u.constant.value.str.val);
+ }
+ }
+ return FAILURE;
+ }
+
(*ce->refcount)++;
if (zend_hash_add(class_table,
opline->op2.u.constant.value.str.val, opline->op2.u.constant.value.str.len+1, ce,
sizeof(zend_class_entry), NULL)==FAILURE) {
+ /* this case should already have been handled
+above */
(*ce->refcount)--;
- if (!compile_time) {
- zend_error(E_ERROR, "Cannot redeclare
class %s", opline->op2.u.constant.value.str.val);
- }
return FAILURE;
} else {
return SUCCESS;
@@ -1581,6 +1596,9 @@
CG(class_entry).handle_property_set = NULL;
CG(class_entry).handle_property_get = NULL;
+ CG(class_entry).def_file = estrdup(zend_get_compiled_filename(TSRMLS_C));
+ CG(class_entry).def_lineno = CG(zend_lineno);
+
/* code for inheritance from parent class */
if (parent_class_name) {
zend_class_entry *parent_class;
Index: zend_opcode.c
===================================================================
RCS file: /repository/Zend/zend_opcode.c,v
retrieving revision 1.56
diff -u -r1.56 zend_opcode.c
--- zend_opcode.c 6 Jan 2002 15:21:09 -0000 1.56
+++ zend_opcode.c 29 Sep 2002 12:48:26 -0000
@@ -115,6 +115,7 @@
case ZEND_USER_CLASS:
efree(ce->name);
efree(ce->refcount);
+ efree(ce->def_file);
zend_hash_destroy(&ce->function_table);
zend_hash_destroy(&ce->default_properties);
break;
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php