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/01 00:45:46 UTC

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

Author: marvin
Date: Mon Feb 28 23:45:46 2011
New Revision: 1075593

URL: http://svn.apache.org/viewvc?rev=1075593&view=rev
Log:
Finish porting 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=1075593&r1=1075592&r2=1075593&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Mon Feb 28 23:45:46 2011
@@ -100,30 +100,32 @@ PPCODE:
 MODULE = Clownfish    PACKAGE = Clownfish::Class
 
 SV*
-_create(klass, parcel, exposure, class_name_sv, class_cnick_sv, micro_sym_sv, docucomment, source_class_sv, parent_class_name_sv, is_final, is_inert)
+_create(klass, parcel, exposure_sv, class_name_sv, cnick_sv, micro_sym_sv, docucomment, source_class_sv, parent_class_name_sv, is_final, is_inert)
     const char *klass;
     CFCParcel *parcel;
-    const char *exposure;
+    SV *exposure_sv;
     SV *class_name_sv;
-    SV *class_cnick_sv;
+    SV *cnick_sv;
     SV *micro_sym_sv;
     CFCDocuComment *docucomment;
     SV *source_class_sv;
     SV *parent_class_name_sv;
-    int is_final;
-    int is_inert;
+    bool is_final;
+    bool is_inert;
 CODE:
+    const char *exposure = SvOK(exposure_sv)
+                         ? SvPV_nolen(exposure_sv) : NULL;
     const char *class_name = SvOK(class_name_sv) 
                            ? SvPV_nolen(class_name_sv) : NULL;
-    const char *class_cnick = SvOK(class_cnick_sv) 
-                            ? SvPV_nolen(class_cnick_sv) : NULL;
+    const char *cnick = SvOK(cnick_sv) 
+                      ? SvPV_nolen(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_create(parcel, exposure, class_name, class_cnick,
+    CFCClass *self = CFCClass_create(parcel, exposure, class_name, cnick,
         micro_sym, docucomment, source_class, parent_class_name, is_final, 
         is_inert);
     RETVAL = newRV(CFCBase_get_perl_obj((CFCBase*)self));
@@ -137,10 +139,11 @@ PPCODE:
     CFCClass_destroy(self);
 
 SV*
-_fetch_from_registry(key)
-    const char *key;
+_fetch_singleton(parcel, class_name)
+    CFCParcel *parcel;
+    const char *class_name;
 CODE:
-    CFCClass *klass = CFCClass_fetch_from_registry(key);
+    CFCClass *klass = CFCClass_fetch_singleton(parcel, class_name);
     RETVAL = klass
            ? newRV(CFCBase_get_perl_obj((CFCBase*)klass))
            : newSV(0);

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm?rev=1075593&r1=1075592&r2=1075593&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm Mon Feb 28 23:45:46 2011
@@ -50,22 +50,14 @@ our %fetch_singleton_PARAMS = (
 sub fetch_singleton {
     my ( undef, %args ) = @_;
     verify_args( \%fetch_singleton_PARAMS, %args ) or confess $@;
-
-    # Start with the class identifier.
-    my $class_name = $args{class_name};
-    confess("Missing required param 'class_name'") unless defined $class_name;
-    $class_name =~ /(\w+)$/ or confess("Invalid class name: '$class_name'");
-    my $key = $1;
-
     # Maybe prepend parcel prefix.
     my $parcel = $args{parcel};
     if ( defined $parcel ) {
         if ( !a_isa_b( $parcel, "Clownfish::Parcel" ) ) {
             $parcel = Clownfish::Parcel->singleton( name => $parcel );
         }
-        $key = $parcel->get_prefix . $key;
     }
-    return _fetch_from_registry($key);
+    return _fetch_singleton( $parcel, $args{class_name} );
 }
 
 sub new { confess("The constructor for Clownfish::Class is create()") }
@@ -73,24 +65,11 @@ sub new { confess("The constructor for C
 sub create {
     my ( $either, %args ) = @_;
     verify_args( \%create_PARAMS, %args ) or confess $@;
-    $args{class_cnick} = delete $args{cnick};
-    my $class_name = $args{class_name};
-    confess("Missing required param 'class_name'") unless $class_name;
-    $args{inert} ||= 0;
-    $args{final} ||= 0;
-
-    my $package = ref($either) || $either;
     $args{parcel} = Clownfish::Parcel->acquire( $args{parcel} );
-    $args{exposure}  ||= 'parcel';
-    $args{micro_sym} ||= 'class';
-    my $self = $either->_create(
-        @args{qw( parcel exposure class_name class_cnick micro_sym
+    my $package = ref($either) || $either;
+    return _create( $package, 
+        @args{qw( parcel exposure class_name cnick micro_sym
         docucomment source_class parent_class_name final inert )} );
-
-    # Store in registry.
-    $self->_register;
-
-    return $self;
 }
 
 1;

Modified: incubator/lucy/trunk/clownfish/src/CFCClass.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.c?rev=1075593&r1=1075592&r2=1075593&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.c Mon Feb 28 23:45:46 2011
@@ -105,14 +105,14 @@ S_bequeath_methods(CFCClass *self);
 
 CFCClass*
 CFCClass_create(struct CFCParcel *parcel, const char *exposure, 
-                const char *class_name, const char *class_cnick, 
+                const char *class_name, const char *cnick, 
                 const char *micro_sym, CFCDocuComment *docucomment, 
                 const char *source_class, const char *parent_class_name, 
                 int is_final, int is_inert)
 {
     CFCClass *self = (CFCClass*)CFCBase_allocate(sizeof(CFCClass),
         "Clownfish::Class");
-    return CFCClass_do_create(self, parcel, exposure, class_name, class_cnick,
+    return CFCClass_do_create(self, parcel, exposure, class_name, cnick,
         micro_sym, docucomment, source_class, parent_class_name, is_final, 
         is_inert);
 }
@@ -120,12 +120,15 @@ CFCClass_create(struct CFCParcel *parcel
 CFCClass*
 CFCClass_do_create(CFCClass *self, struct CFCParcel *parcel, 
                    const char *exposure, const char *class_name, 
-                   const char *class_cnick, const char *micro_sym, 
+                   const char *cnick, const char *micro_sym, 
                    CFCDocuComment *docucomment, 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);
+    CFCUTIL_NULL_CHECK(class_name);
+    exposure  = exposure  ? exposure  : "parcel";
+    micro_sym = micro_sym ? micro_sym : "class";
+    CFCSymbol_init((CFCSymbol*)self, parcel, exposure, class_name, cnick, 
+        micro_sym);
     self->parent     = NULL;
     self->tree_grown = false;
     self->autocode   = (char*)CALLOCATE(1, sizeof(char));
@@ -196,6 +199,9 @@ CFCClass_do_create(CFCClass *self, struc
     self->is_final = !!is_final;
     self->is_inert = !!is_inert;
 
+    // Store in registry.
+    CFCClass_register(self);
+
     return self;
 }
 
@@ -246,7 +252,6 @@ CFCClass_destroy(CFCClass *self)
 void
 CFCClass_register(CFCClass *self)
 {
-    const char *key = self->full_struct_sym;
     if (registry_size == registry_cap) {
         size_t new_cap = registry_cap + 10;
         registry = (CFCClassRegEntry*)REALLOCATE(registry,
@@ -258,7 +263,10 @@ CFCClass_register(CFCClass *self)
         }
         registry_cap = new_cap;
     }
-    CFCClass *existing = CFCClass_fetch_from_registry(key);
+    CFCParcel *parcel = CFCSymbol_get_parcel((CFCSymbol*)self);
+    const char *class_name = CFCSymbol_get_class_name((CFCSymbol*)self);
+    CFCClass *existing = CFCClass_fetch_singleton(parcel, class_name);
+    const char *key = self->full_struct_sym;
     if (existing) {
         croak("New class %s conflicts with existing class %s", 
              CFCSymbol_get_class_name((CFCSymbol*)self),
@@ -270,9 +278,25 @@ CFCClass_register(CFCClass *self)
 }
 
 CFCClass*
-CFCClass_fetch_from_registry(const char *key)
+CFCClass_fetch_singleton(CFCParcel *parcel, const char *class_name)
 {
-    if (!key) { return NULL; }
+    CFCUTIL_NULL_CHECK(class_name);
+
+    // Build up the key.
+    const char *last_colon = strrchr(class_name, ':');
+    const char *struct_sym = last_colon 
+                           ? last_colon + 1
+                           : class_name;
+    const char *prefix = parcel ? CFCParcel_get_prefix(parcel) : "";
+    size_t prefix_len = strlen(prefix);
+    size_t struct_sym_len = strlen(struct_sym);
+    const size_t MAX_LEN = 256;
+    if (prefix_len + struct_sym_len > MAX_LEN) {
+        croak("names too long: '%s', '%s'", prefix, struct_sym);
+    }
+    char key[MAX_LEN + 1];
+    int check = sprintf(key, "%s%s", prefix, struct_sym);
+    if (check < 0) { croak("sprintf failed"); }
     size_t i;
     for (i = 0; i < registry_size; i++) {
         if (strcmp(registry[i].key, key) == 0) {

Modified: incubator/lucy/trunk/clownfish/src/CFCClass.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.h?rev=1075593&r1=1075592&r2=1075593&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.h Mon Feb 28 23:45:46 2011
@@ -26,7 +26,7 @@ struct CFCVariable;
 
 CFCClass*
 CFCClass_create(struct CFCParcel *parcel, const char *exposure, 
-                const char *class_name, const char *class_cnick, 
+                const char *class_name, const char *cnick, 
                 const char *micro_sym, struct CFCDocuComment *docucomment,
                 const char *source_class, const char *parent_class_name, 
                 int is_final, int is_inert);
@@ -34,7 +34,7 @@ CFCClass_create(struct CFCParcel *parcel
 CFCClass*
 CFCClass_do_create(CFCClass *self, struct CFCParcel *parcel, 
                    const char *exposure, const char *class_name, 
-                   const char *class_cnick, const char *micro_sym,
+                   const char *cnick, const char *micro_sym,
                    struct CFCDocuComment *docucomment, 
                    const char *source_class, const char *parent_class_name, 
                    int is_final, int is_inert);
@@ -43,7 +43,7 @@ void
 CFCClass_destroy(CFCClass *self);
 
 CFCClass*
-CFCClass_fetch_from_registry(const char *key);
+CFCClass_fetch_singleton(struct CFCParcel *parcel, const char *class_name);
 
 void
 CFCClass_register(CFCClass *self);