You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2011/03/05 03:43:29 UTC

[lucy-commits] svn commit: r1078230 - in /incubator/lucy/trunk/clownfish: lib/Clownfish/Hierarchy.pm src/CFCHierarchy.c

Author: marvin
Date: Sat Mar  5 02:43:29 2011
New Revision: 1078230

URL: http://svn.apache.org/viewvc?rev=1078230&view=rev
Log:
Check for class name conflicts within CFCHierarchy_add_file().

Modified:
    incubator/lucy/trunk/clownfish/lib/Clownfish/Hierarchy.pm
    incubator/lucy/trunk/clownfish/src/CFCHierarchy.c

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish/Hierarchy.pm
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish/Hierarchy.pm?rev=1078230&r1=1078229&r2=1078230&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Hierarchy.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Hierarchy.pm Sat Mar  5 02:43:29 2011
@@ -118,8 +118,6 @@ sub _parse_cf_files {
         
         for my $class ( @{ $file->classes } ) {
             my $class_name = $class->get_class_name;
-            confess "$class_name already defined"
-                if exists $classes{$class_name};
             $classes{$class_name} = $class;
         }
     }

Modified: incubator/lucy/trunk/clownfish/src/CFCHierarchy.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCHierarchy.c?rev=1078230&r1=1078229&r2=1078230&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCHierarchy.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCHierarchy.c Sat Mar  5 02:43:29 2011
@@ -224,9 +224,30 @@ CFCHierarchy_add_file(CFCHierarchy *self
 {
     CFCUTIL_NULL_CHECK(file);
     const char *source_class = CFCFile_get_source_class(file);
-    if (CFCHierarchy_fetch_file(self, source_class)) {
-        CFCUtil_die("File for source class %s already registered", 
-            source_class);
+    CFCClass **classes = CFCFile_classes(file);
+    size_t i;
+    for (i = 0; self->files[i] != NULL; i++) {
+        CFCFile *existing = self->files[i];
+        const char *old_source_class = CFCFile_get_source_class(existing);
+        if (strcmp(source_class, old_source_class) == 0) {
+            CFCUtil_die("File for source class %s already registered", 
+                source_class);
+        }
+        CFCClass **existing_classes = CFCFile_classes(existing);
+        size_t j;
+        for (j = 0; classes[j] != NULL; j++) {
+            const char *new_class_name
+                = CFCSymbol_get_class_name((CFCSymbol*)classes[j]);
+            size_t k; 
+            for (k = 0; existing_classes[k] != NULL; k++) {
+                const char *existing_class_name
+                    = CFCSymbol_get_class_name((CFCSymbol*)existing_classes[k]);
+                if (strcmp(new_class_name, existing_class_name) == 0) {
+                    CFCUtil_die("Class '%s' already registered",
+                        new_class_name);
+                }
+            }
+        }
     }
     self->num_files++;
     size_t size = (self->num_files + 1) * sizeof(CFCFile*);