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/20 19:11:24 UTC

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

Author: marvin
Date: Sun Feb 20 18:11:24 2011
New Revision: 1072668

URL: http://svn.apache.org/viewvc?rev=1072668&view=rev
Log:
Move more member vars in CFCClass from Perl 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=1072668&r1=1072667&r2=1072668&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Sun Feb 20 18:11:24 2011
@@ -85,13 +85,17 @@ PPCODE:
 MODULE = Clownfish    PACKAGE = Clownfish::Class
 
 SV*
-_new(klass, parcel, exposure, class_name_sv, class_cnick_sv, micro_sym_sv)
+_new(klass, parcel, exposure, class_name_sv, class_cnick_sv, micro_sym_sv, source_class_sv, parent_class_name_sv, is_final, is_inert)
     const char *klass;
     CFCParcel *parcel;
     const char *exposure;
     SV *class_name_sv;
     SV *class_cnick_sv;
     SV *micro_sym_sv;
+    SV *source_class_sv;
+    SV *parent_class_name_sv;
+    int is_final;
+    int is_inert;
 CODE:
     const char *class_name = SvOK(class_name_sv) 
                            ? SvPV_nolen(class_name_sv) : NULL;
@@ -99,8 +103,12 @@ CODE:
                             ? SvPV_nolen(class_cnick_sv) : NULL;
     const char *micro_sym = SvOK(micro_sym_sv) 
                             ? SvPV_nolen(micro_sym_sv) : NULL;
+    const char *source_class = SvOK(source_class_sv) 
+                            ? SvPV_nolen(source_class_sv) : NULL;
+    const char *parent_class_name = SvOK(parent_class_name_sv) 
+                                  ? SvPV_nolen(parent_class_name_sv) : NULL;
     CFCClass *self = CFCClass_new(parcel, exposure, class_name, class_cnick,
-        micro_sym);
+        micro_sym, source_class, parent_class_name, is_final, is_inert);
     RETVAL = newRV(CFCBase_get_perl_obj((CFCBase*)self));
     CFCBase_decref((CFCBase*)self);
 OUTPUT: RETVAL
@@ -122,12 +130,16 @@ void
 _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
+    get_cnick             = 2
+    _set_tree_grown       = 3
+    _tree_grown           = 4
+    set_parent            = 5
+    get_parent            = 6
+    get_autocode          = 8
+    get_source_class      = 10
+    get_parent_class_name = 12
+    final                 = 14
+    inert                 = 16
 PPCODE:
 {
     START_SET_OR_GET_SWITCH
@@ -165,6 +177,22 @@ PPCODE:
                 retval = newSVpvn(value, strlen(value));
             }
             break;
+        case 10: {
+                const char *value = CFCClass_get_source_class(self);
+                retval = newSVpvn(value, strlen(value));
+            }
+            break;
+        case 12: {
+                const char *value = CFCClass_get_parent_class_name(self);
+                retval = value ? newSVpvn(value, strlen(value)) : newSV(0);
+            }
+            break;
+        case 14:
+            retval = newSViv(CFCClass_final(self));
+            break;
+        case 16:
+            retval = newSViv(CFCClass_inert(self));
+            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=1072668&r1=1072667&r2=1072668&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm Sun Feb 20 18:11:24 2011
@@ -32,12 +32,8 @@ use Scalar::Util qw( reftype );
 
 our %cnick;
 our %struct_sym;
-our %parent_class_name;
-our %source_class;
 our %docucomment;
 our %children;
-our %inert;
-our %final;
 our %attributes;
 our %meth_by_name;
 our %func_by_name;
@@ -106,21 +102,14 @@ sub create {
     $args{class_cnick} = delete $args{cnick};
     my $class_name = $args{class_name};
     confess("Missing required param 'class_name'") unless $class_name;
-    my $parent_class_name = delete $args{parent_class_name};
     my $docucomment       = delete $args{docucomment};
-    my $inert             = delete $args{inert};
-    my $final             = delete $args{final};
+    $args{inert} ||= 0;
+    $args{final} ||= 0;
 
     # Derive struct name.
     $class_name =~ /(\w+)$/ or confess("Invalid class_name: '$class_name'");
     my $struct_sym = $1;
 
-    # Assume that Foo::Bar should be found in Foo/Bar.h.
-    my $source_class
-        = defined $args{source_class}
-        ? delete $args{source_class}
-        : $class_name;
-
     # Verify that members of supplied arrays meet "is a" requirements.
     my $functions   = delete $args{functions}   || [];
     my $methods     = delete $args{methods}     || [];
@@ -155,22 +144,19 @@ sub create {
 
     # Validate inert param.
     confess("Inert classes can't have methods")
-        if ( $inert and scalar @$methods );
+        if ( $args{inert} and scalar @$methods );
 
     my $package = ref($either) || $either;
     $args{parcel} = Clownfish::Parcel->acquire( $args{parcel} );
     $args{exposure}  ||= 'parcel';
     $args{micro_sym} ||= 'class';
     my $self = $either->_new(
-        @args{qw( parcel exposure class_name class_cnick micro_sym )} );
+        @args{qw( parcel exposure class_name class_cnick micro_sym
+        source_class parent_class_name final inert )} );
 
     $struct_sym{$self}        = $struct_sym;
-    $parent_class_name{$self} = $parent_class_name;
-    $source_class{$self}      = $source_class;
     $docucomment{$self}       = $docucomment;
     $children{$self}          = [];
-    $inert{$self}             = $inert;
-    $final{$self}             = $final;
     $attributes{$self}        = $attributes;
     $meth_by_name{$self}      = \%methods_by_name;
     $func_by_name{$self}      = \%functions_by_name;
@@ -196,12 +182,8 @@ sub create {
 sub DESTROY {
     my $self = shift;
     delete $struct_sym{$self};
-    delete $parent_class_name{$self};
-    delete $source_class{$self};
     delete $docucomment{$self};
     delete $children{$self};
-    delete $inert{$self};
-    delete $final{$self};
     delete $attributes{$self};
     delete $meth_by_name{$self};
     delete $func_by_name{$self};
@@ -232,11 +214,7 @@ sub include_h {
 sub has_attribute { exists $_[0]->_get_attributes->{ $_[1] } }
 
 sub get_struct_sym        { $struct_sym{ +shift } }
-sub get_parent_class_name { $parent_class_name{ +shift } }
-sub get_source_class      { $source_class{ +shift } }
 sub get_docucomment       { $docucomment{ +shift } }
-sub inert                 { $inert{ +shift } }
-sub final                 { $final{ +shift } }
 sub _get_attributes       { $attributes{ +shift } }
 sub _meth_by_name         { $meth_by_name{ +shift } }
 sub _func_by_name         { $func_by_name{ +shift } }

Modified: incubator/lucy/trunk/clownfish/src/CFCClass.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.c?rev=1072668&r1=1072667&r2=1072668&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.c Sun Feb 20 18:11:24 2011
@@ -30,36 +30,54 @@
 #include "CFCSymbol.h"
 #include "CFCClass.h"
 #include "CFCParcel.h"
+#include "CFCUtil.h"
 
 struct CFCClass {
     CFCSymbol symbol;
     int tree_grown;
     struct CFCClass *parent;
     char *autocode;
+    char *source_class;
+    char *parent_class_name;
+    int is_final;
+    int is_inert;
 };
 
 CFCClass*
 CFCClass_new(struct CFCParcel *parcel, const char *exposure, 
               const char *class_name, const char *class_cnick, 
-              const char *micro_sym)
+              const char *micro_sym, const char *source_class,
+              const char *parent_class_name, int is_final, int is_inert)
 {
     CFCClass *self = (CFCClass*)CFCBase_allocate(sizeof(CFCClass),
         "Clownfish::Class");
     if (!self) { croak("malloc failed"); }
     return CFCClass_init(self, parcel, exposure, class_name, class_cnick,
-        micro_sym);
+        micro_sym, source_class, parent_class_name, is_final, is_inert);
 }
 
 CFCClass*
 CFCClass_init(CFCClass *self, struct CFCParcel *parcel, 
                const char *exposure, const char *class_name, 
-               const char *class_cnick, const char *micro_sym)
+               const char *class_cnick, const char *micro_sym,
+               const char *source_class, const char *parent_class_name, 
+               int is_final, int is_inert)
 {
     CFCSymbol_init((CFCSymbol*)self, parcel, exposure, class_name, 
         class_cnick, micro_sym);
     self->parent     = NULL;
     self->tree_grown = false;
     self->autocode   = (char*)calloc(1, sizeof(char));
+    self->parent_class_name = CFCUtil_strdup(parent_class_name);
+
+    // Assume that Foo::Bar should be found in Foo/Bar.h.
+    self->source_class = source_class 
+                       ? CFCUtil_strdup(source_class)
+                       : CFCUtil_strdup(class_name);
+
+    self->is_final = !!is_final;
+    self->is_inert = !!is_inert;
+
     return self;
 }
 
@@ -68,6 +86,8 @@ CFCClass_destroy(CFCClass *self)
 {
     CFCBase_decref((CFCBase*)self->parent);
     free(self->autocode);
+    free(self->source_class);
+    free(self->parent_class_name);
     CFCSymbol_destroy((CFCSymbol*)self);
 }
 
@@ -117,3 +137,26 @@ CFCClass_get_autocode(CFCClass *self)
     return self->autocode;
 }
 
+const char*
+CFCClass_get_source_class(CFCClass *self)
+{
+    return self->source_class;
+}
+
+const char*
+CFCClass_get_parent_class_name(CFCClass *self)
+{
+    return self->parent_class_name;
+}
+
+int
+CFCClass_final(CFCClass *self)
+{
+    return self->is_final;
+}
+
+int
+CFCClass_inert(CFCClass *self)
+{
+    return self->is_inert;
+}

Modified: incubator/lucy/trunk/clownfish/src/CFCClass.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.h?rev=1072668&r1=1072667&r2=1072668&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.h Sun Feb 20 18:11:24 2011
@@ -21,13 +21,17 @@ typedef struct CFCClass CFCClass;
 struct CFCParcel;
 
 CFCClass*
-CFCClass_new(struct CFCParcel *parcel, const char *exposure, const char *class_name, 
-             const char *class_cnick, const char *micro_sym);
+CFCClass_new(struct CFCParcel *parcel, const char *exposure, 
+              const char *class_name, const char *class_cnick, 
+              const char *micro_sym, const char *source_class,
+              const char *parent_class_name, int is_final, int is_inert);
 
 CFCClass*
-CFCClass_init(CFCClass *self, struct CFCParcel *parcel, const char *exposure, 
-              const char *class_name, const char *class_cnick, 
-              const char *micro_sym);
+CFCClass_init(CFCClass *self, struct CFCParcel *parcel, 
+               const char *exposure, const char *class_name, 
+               const char *class_cnick, const char *micro_sym,
+               const char *source_class, const char *parent_class_name, 
+               int is_final, int is_inert);
 
 void
 CFCClass_destroy(CFCClass *self);
@@ -53,5 +57,17 @@ CFCClass_append_autocode(CFCClass *self,
 const char*
 CFCClass_get_autocode(CFCClass *self);
 
+const char*
+CFCClass_get_source_class(CFCClass *self);
+
+const char*
+CFCClass_get_parent_class_name(CFCClass *self);
+
+int
+CFCClass_final(CFCClass *self);
+
+int
+CFCClass_inert(CFCClass *self);
+
 #endif /* H_CFCCLASS */