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/24 21:27:54 UTC

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

Author: marvin
Date: Thu Feb 24 20:27:54 2011
New Revision: 1074287

URL: http://svn.apache.org/viewvc?rev=1074287&view=rev
Log:
Move "children" member of CFCClass to C.

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=1074287&r1=1074286&r2=1074287&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Thu Feb 24 20:27:54 2011
@@ -129,6 +129,13 @@ PPCODE:
     CFCClass_append_autocode(self, autocode);
 
 void
+add_child(self, child)
+    CFCClass *self;
+    CFCClass *child;
+PPCODE:
+    CFCClass_add_child(self, child);
+
+void
 _set_or_get(self, ...)
     CFCClass *self;
 ALIAS:
@@ -149,6 +156,7 @@ ALIAS:
     full_vtable_type      = 26
     include_h             = 28
     get_docucomment       = 30
+    children              = 32
 PPCODE:
 {
     START_SET_OR_GET_SWITCH
@@ -239,6 +247,18 @@ PPCODE:
                        : newSV(0);
             }
             break;
+        case 32: {
+            AV *av = newAV();
+            CFCClass **children = CFCClass_children(self);
+            size_t i;
+            for (i = 0; children[i] != NULL; i++) {
+                SV *val = newRV(CFCBase_get_perl_obj((CFCBase*)children[i]));
+                av_store(av, i, val);
+            }
+            retval = newRV((SV*)av);
+            SvREFCNT_dec(av);
+            break;
+        }
     END_SET_OR_GET_SWITCH
 }
 

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm?rev=1074287&r1=1074286&r2=1074287&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm Thu Feb 24 20:27:54 2011
@@ -31,7 +31,6 @@ use File::Spec::Functions qw( catfile );
 use Scalar::Util qw( reftype );
 
 our %cnick;
-our %children;
 our %attributes;
 our %meth_by_name;
 our %func_by_name;
@@ -147,7 +146,6 @@ sub create {
         @args{qw( parcel exposure class_name class_cnick micro_sym
         docucomment source_class parent_class_name final inert )} );
 
-    $children{$self}          = [];
     $attributes{$self}        = $attributes;
     $meth_by_name{$self}      = \%methods_by_name;
     $func_by_name{$self}      = \%functions_by_name;
@@ -172,7 +170,6 @@ sub create {
 
 sub DESTROY {
     my $self = shift;
-    delete $children{$self};
     delete $attributes{$self};
     delete $meth_by_name{$self};
     delete $func_by_name{$self};
@@ -196,7 +193,6 @@ sub functions   { $functions{ +shift } }
 sub methods     { $methods{ +shift } }
 sub member_vars { $member_vars{ +shift } }
 sub inert_vars  { $inert_vars{ +shift } }
-sub children    { $children{ +shift } }
 
 sub novel_methods {
     my $self    = shift;
@@ -236,12 +232,6 @@ sub novel_method {
     }
 }
 
-sub add_child {
-    my ( $self, $child ) = @_;
-    confess("Can't call add_child after grow_tree") if $self->_tree_grown;
-    push @{ $self->children }, $child;
-}
-
 sub add_method {
     my ( $self, $method ) = @_;
     confess("Not a Method") unless a_isa_b( $method, "Clownfish::Method" );

Modified: incubator/lucy/trunk/clownfish/src/CFCClass.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.c?rev=1074287&r1=1074286&r2=1074287&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.c Thu Feb 24 20:27:54 2011
@@ -38,6 +38,8 @@ struct CFCClass {
     int tree_grown;
     CFCDocuComment *docucomment;
     struct CFCClass *parent;
+    struct CFCClass **children;
+    size_t num_kids;
     char *autocode;
     char *source_class;
     char *parent_class_name;
@@ -77,6 +79,8 @@ CFCClass_init(CFCClass *self, struct CFC
     self->parent     = NULL;
     self->tree_grown = false;
     self->autocode   = (char*)CALLOCATE(1, sizeof(char));
+    self->children   = (CFCClass**)CALLOCATE(1, sizeof(CFCClass*));
+    self->num_kids   = 0;
     self->parent_class_name = CFCUtil_strdup(parent_class_name);
     self->docucomment 
         = (CFCDocuComment*)CFCBase_incref((CFCBase*)docucomment);
@@ -140,6 +144,11 @@ CFCClass_destroy(CFCClass *self)
 {
     CFCBase_decref((CFCBase*)self->docucomment);
     CFCBase_decref((CFCBase*)self->parent);
+    size_t i;
+    for (i = 0; self->children[i] != NULL; i++) {
+        CFCBase_decref((CFCBase*)self->children[i]);
+    }
+    FREEMEM(self->children);
     FREEMEM(self->autocode);
     FREEMEM(self->source_class);
     FREEMEM(self->parent_class_name);
@@ -151,6 +160,25 @@ CFCClass_destroy(CFCClass *self)
     CFCSymbol_destroy((CFCSymbol*)self);
 }
 
+void
+CFCClass_add_child(CFCClass *self, CFCClass *child)
+{
+    CFCUTIL_NULL_CHECK(child);
+    if (self->tree_grown) { croak("Can't call add_child after grow_tree"); }
+    self->num_kids++;
+    size_t size = (self->num_kids + 1) * sizeof(CFCClass*);
+    self->children = (CFCClass**)REALLOCATE(self->children, size);
+    self->children[self->num_kids - 1] 
+        = (CFCClass*)CFCBase_incref((CFCBase*)child);
+    self->children[self->num_kids] = NULL;
+}
+
+CFCClass**
+CFCClass_children(CFCClass *self)
+{
+    return self->children;
+}
+
 const char*
 CFCClass_get_cnick(CFCClass *self)
 {

Modified: incubator/lucy/trunk/clownfish/src/CFCClass.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.h?rev=1074287&r1=1074286&r2=1074287&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.h Thu Feb 24 20:27:54 2011
@@ -39,6 +39,12 @@ CFCClass_init(CFCClass *self, struct CFC
 void
 CFCClass_destroy(CFCClass *self);
 
+void
+CFCClass_add_child(CFCClass *self, CFCClass *child);
+
+CFCClass**
+CFCClass_children(CFCClass *self);
+
 const char*
 CFCClass_get_cnick(CFCClass *self);