]> granicus.if.org Git - php/commitdiff
- MFZE1
authorAndi Gutmans <andi@php.net>
Sun, 10 Nov 2002 22:02:28 +0000 (22:02 +0000)
committerAndi Gutmans <andi@php.net>
Sun, 10 Nov 2002 22:02:28 +0000 (22:02 +0000)
Zend/zend_compile.c

index 52ed878eaed216652779c41d727de500ffab8eb3..aa31534db4fd743505ad8785caadf361aeadb58e 100644 (file)
@@ -930,8 +930,18 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n
                                short_class_name_length = strlen(short_class_name);
                        }
                }
-               
-               zend_hash_update(&CG(active_class_entry)->function_table, name, name_len+1, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array));
+               if (zend_hash_add(&CG(active_class_entry)->function_table, name, name_len+1, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)) == FAILURE) {
+                       zend_op_array *child_op_array, *parent_op_array;
+                       if (CG(active_class_entry)->parent
+                                       && (zend_hash_find(&CG(active_class_entry)->function_table, name, name_len+1, (void **) &child_op_array) == SUCCESS)
+                                       && (zend_hash_find(&CG(active_class_entry)->parent->function_table, name, name_len+1, (void **) &parent_op_array) == SUCCESS)
+                                       && (child_op_array == parent_op_array)) {
+                               zend_hash_update(&CG(active_class_entry)->function_table, name, name_len+1, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array));
+                       } else {
+                               zend_error(E_COMPILE_ERROR, "Cannot redeclare %s()", name);
+                       }
+               }
+
                if ((short_class_name_length == name_len) && (!memcmp(short_class_name, name, name_len))) {
                        CG(active_class_entry)->constructor = (zend_function *) CG(active_op_array);
                } else if ((function_name->u.constant.value.str.len == sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1) && (!memcmp(function_name->u.constant.value.str.val, ZEND_CONSTRUCTOR_FUNC_NAME, sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)))) {