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/02/28 18:57:21 UTC

[lucy-commits] svn commit: r1075450 - in /incubator/lucy/trunk/clownfish: lib/Clownfish.xs lib/Clownfish/Class.pm src/CFCClass.c src/CFCClass.h

Author: marvin
Date: Mon Feb 28 17:57:21 2011
New Revision: 1075450

URL: http://svn.apache.org/viewvc?rev=1075450&view=rev
Log:
Port remaining inheritance-related code in CFCClass from Perl to C.  Now that
it's all self-contained within one file, reduce the scope of some of the
routines by changing them to static visibility.

Modified:
    incubator/lucy/trunk/clownfish/lib/Clownfish.xs
    incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm
    incubator/lucy/trunk/clownfish/src/CFCClass.c
    incubator/lucy/trunk/clownfish/src/CFCClass.h

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish.xs
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish.xs?rev=1075450&r1=1075449&r2=1075450&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Mon Feb 28 17:57:21 2011
@@ -210,22 +210,10 @@ CODE:
 OUTPUT: RETVAL
 
 void
-_bequeath_methods(self)
+grow_tree(self)
     CFCClass *self;
 PPCODE:
-    CFCClass_bequeath_methods(self);
-
-void
-_bequeath_member_vars(self)
-    CFCClass *self;
-PPCODE:
-    CFCClass_bequeath_member_vars(self);
-
-void
-_establish_ancestry(self)
-    CFCClass *self;
-PPCODE:
-    CFCClass_establish_ancestry(self);
+    CFCClass_grow_tree(self);
 
 void
 add_inert_var(self, var)
@@ -278,8 +266,6 @@ _set_or_get(self, ...)
     CFCClass *self;
 ALIAS:
     get_cnick             = 2
-    _set_tree_grown       = 3
-    _tree_grown           = 4
     set_parent            = 5
     get_parent            = 6
     get_autocode          = 8
@@ -310,12 +296,6 @@ PPCODE:
                 retval = newSVpvn(value, strlen(value));
             }
             break;
-        case 3:
-            CFCClass_set_tree_grown(self, !!SvTRUE(ST(1)));
-            break;
-        case 4:
-            retval = newSViv(CFCClass_tree_grown(self));
-            break;
         case 5: {
                 CFCClass *parent = NULL;
                 if (   SvOK(ST(1))

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm?rev=1075450&r1=1075449&r2=1075450&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm Mon Feb 28 17:57:21 2011
@@ -27,8 +27,6 @@ use Clownfish::Util qw(
     a_isa_b
 );
 use Clownfish::Dumpable;
-use File::Spec::Functions qw( catfile );
-use Scalar::Util qw( reftype );
 
 END { __PACKAGE__->_clear_registry() }
 
@@ -44,8 +42,6 @@ our %create_PARAMS = (
     exposure          => 'parcel',
 );
 
-my $dumpable = Clownfish::Dumpable->new;
-
 our %fetch_singleton_PARAMS = (
     parcel     => undef,
     class_name => undef,
@@ -97,32 +93,6 @@ sub create {
     return $self;
 }
 
-# Create dumpable functions unless hand coded versions were supplied.
-sub _create_dumpables {
-    my $self = shift;
-    $dumpable->add_dumpables($self) if $self->has_attribute('dumpable');
-}
-
-sub grow_tree {
-    my $self = shift;
-    confess("Can't call grow_tree more than once") if $self->_tree_grown;
-    $self->_establish_ancestry;
-    $self->_bequeath_member_vars;
-    $self->_generate_automethods;
-    $self->_bequeath_methods;
-    $self->_set_tree_grown(1);
-}
-
-# Create auto-generated methods.  This must be called after member vars are
-# passed down but before methods are passed down.
-sub _generate_automethods {
-    my $self = shift;
-    $self->_create_dumpables;
-    for my $child ( @{ $self->children } ) {
-        $child->_generate_automethods;
-    }
-}
-
 1;
 
 __END__

Modified: incubator/lucy/trunk/clownfish/src/CFCClass.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.c?rev=1075450&r1=1075449&r2=1075450&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.c Mon Feb 28 17:57:21 2011
@@ -29,6 +29,7 @@
 #define CFC_NEED_SYMBOL_STRUCT_DEF
 #include "CFCSymbol.h"
 #include "CFCClass.h"
+#include "CFCDumpable.h"
 #include "CFCFunction.h"
 #include "CFCMethod.h"
 #include "CFCParcel.h"
@@ -50,6 +51,7 @@ static CFCClassRegEntry *registry = NULL
 static size_t registry_size = 0;
 static size_t registry_cap  = 0;
 
+
 struct CFCClass {
     CFCSymbol symbol;
     int tree_grown;
@@ -80,6 +82,27 @@ struct CFCClass {
     char *include_h;
 };
 
+// Link up parents and kids.
+static void
+S_establish_ancestry(CFCClass *self);
+
+// Pass down member vars to from parent to children.
+static void
+S_bequeath_member_vars(CFCClass *self);
+
+// Create auto-generated methods.  This must be called after member vars are
+// passed down but before methods are passed down.
+static void
+S_generate_automethods(CFCClass *self);
+
+// Create dumpable functions unless hand coded versions were supplied.
+static void
+S_create_dumpables(CFCClass *self);
+
+// Pass down methods to from parent to children.
+static void
+S_bequeath_methods(CFCClass *self);
+
 CFCClass*
 CFCClass_new(struct CFCParcel *parcel, const char *exposure, 
               const char *class_name, const char *class_cnick, 
@@ -319,17 +342,6 @@ CFCClass_add_method(CFCClass *self, CFCM
 }
 
 void
-CFCClass_zap_methods(CFCClass *self)
-{
-    size_t i;
-    for (i = 0; self->methods[i] != NULL; i++) {
-        CFCBase_decref((CFCBase*)self->methods[i]);
-    }
-    self->methods[0] = NULL;
-    self->num_methods = 0;
-}
-
-void
 CFCClass_add_member_var(CFCClass *self, CFCVariable *var)
 {
     CFCUTIL_NULL_CHECK(var);
@@ -440,8 +452,8 @@ CFCClass_novel_method(CFCClass *self, co
 }
 
 // Pass down member vars to from parent to children.
-void
-CFCClass_bequeath_member_vars(CFCClass *self)
+static void
+S_bequeath_member_vars(CFCClass *self)
 {
     size_t i;
     for (i = 0; self->children[i] != NULL; i++) {
@@ -461,12 +473,12 @@ CFCClass_bequeath_member_vars(CFCClass *
         }
         child->num_member_vars = num_vars;
         child->member_vars[num_vars] = NULL;
-        CFCClass_bequeath_member_vars(child);
+        S_bequeath_member_vars(child);
     }
 }
 
-void
-CFCClass_bequeath_methods(CFCClass *self)
+static void
+S_bequeath_methods(CFCClass *self)
 {
     size_t child_num;
     for (child_num = 0; self->children[child_num] != NULL; child_num++) {
@@ -523,14 +535,14 @@ CFCClass_bequeath_methods(CFCClass *self
         child->num_methods = num_methods;
 
         // Pass it all down to the next generation.
-        CFCClass_bequeath_methods(child);
-        CFCClass_set_tree_grown(child, true);
+        S_bequeath_methods(child);
+        child->tree_grown = true;
     }
 }
 
 // Let the children know who their parent class is.
-void
-CFCClass_establish_ancestry(CFCClass *self)
+static void
+S_establish_ancestry(CFCClass *self)
 {
     size_t i;
     for (i = 0; i < self->num_kids; i++) {
@@ -538,7 +550,7 @@ CFCClass_establish_ancestry(CFCClass *se
         // This is a circular reference and thus a memory leak, but we don't
         // care, because we have to have everything in memory at once anyway.
         CFCClass_set_parent(child, self);
-        CFCClass_establish_ancestry(child);
+        S_establish_ancestry(child);
     }
 }
 
@@ -553,6 +565,39 @@ S_family_tree_size(CFCClass *self)
     return count;
 }
 
+static void
+S_create_dumpables(CFCClass *self)
+{
+    if (CFCClass_has_attribute(self, "dumpable")) {
+        CFCDumpable *dumpable = CFCDumpable_new();
+        CFCDumpable_add_dumpables(dumpable, self);
+        CFCBase_decref((CFCBase*)dumpable);
+    }
+}
+
+void
+CFCClass_grow_tree(CFCClass *self)
+{
+    if (self->tree_grown) {
+        croak("Can't call grow_tree more than once");
+    }
+    S_establish_ancestry(self);
+    S_bequeath_member_vars(self);
+    S_generate_automethods(self);
+    S_bequeath_methods(self);
+    self->tree_grown = 1;
+}
+
+static void
+S_generate_automethods(CFCClass *self) 
+{
+    S_create_dumpables(self);
+    size_t i;
+    for (i = 0; i < self->num_kids; i++) {
+        S_generate_automethods(self->children[i]);
+    }
+}
+
 // Return value is valid only so long as object persists (elements are not
 // refcounted).
 CFCClass**
@@ -646,18 +691,6 @@ CFCClass_get_cnick(CFCClass *self)
 }
 
 void
-CFCClass_set_tree_grown(CFCClass *self, int tree_grown)
-{
-    self->tree_grown = !!tree_grown;
-}
-
-int
-CFCClass_tree_grown(CFCClass *self)
-{
-    return self->tree_grown;
-}
-
-void
 CFCClass_set_parent(CFCClass *self, CFCClass *parent)
 {
     CFCBase_decref((CFCBase*)self->parent);

Modified: incubator/lucy/trunk/clownfish/src/CFCClass.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.h?rev=1075450&r1=1075449&r2=1075450&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.h Mon Feb 28 17:57:21 2011
@@ -61,9 +61,6 @@ void
 CFCClass_add_method(CFCClass *self, struct CFCMethod *method);
 
 void
-CFCClass_zap_methods(CFCClass *self);
-
-void
 CFCClass_add_member_var(CFCClass *self, struct CFCVariable *var);
 
 void
@@ -84,19 +81,6 @@ CFCClass_method(CFCClass *self, const ch
 struct CFCMethod*
 CFCClass_novel_method(CFCClass *self, const char *sym);
 
-/** Pass down methods to from parent to children.
- */
-void
-CFCClass_bequeath_methods(CFCClass *self);
-
-/** Pass down member vars to from parent to children.
- */
-void
-CFCClass_bequeath_member_vars(CFCClass *self);
-
-void
-CFCClass_establish_ancestry(CFCClass *self);
-
 CFCClass**
 CFCClass_tree_to_ladder(CFCClass *self);
 
@@ -125,12 +109,6 @@ const char*
 CFCClass_get_cnick(CFCClass *self);
 
 void
-CFCClass_set_tree_grown(CFCClass *self, int tree_grown);
-
-int
-CFCClass_tree_grown(CFCClass *self);
-
-void
 CFCClass_set_parent(CFCClass *self, CFCClass *parent);
 
 CFCClass*