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/07/22 21:22:05 UTC

[lucy-commits] svn commit: r1149698 - in /incubator/lucy/trunk/clownfish: lib/Clownfish.xs lib/Clownfish/Binding/Perl/Class.pm src/CFCPerlClass.c src/CFCPerlClass.h

Author: marvin
Date: Fri Jul 22 19:22:04 2011
New Revision: 1149698

URL: http://svn.apache.org/viewvc?rev=1149698&view=rev
Log:
Migrate some member vars to C.

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

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish.xs
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish.xs?rev=1149698&r1=1149697&r2=1149698&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Fri Jul 22 19:22:04 2011
@@ -1932,9 +1932,17 @@ OUTPUT: RETVAL
 MODULE = Clownfish   PACKAGE = Clownfish::Binding::Perl::Class
 
 SV*
-_new()
+_new(parcel, class_name, client, xs_code_sv)
+    CFCParcel  *parcel;
+    const char *class_name;
+    CFCClass   *client;
+    SV         *xs_code_sv;
 CODE:
-    CFCPerlClass *self = CFCPerlClass_new();
+    const char *xs_code = SvOK(xs_code_sv)
+                          ? SvPV_nolen(xs_code_sv)
+                          : NULL;
+    CFCPerlClass *self
+        = CFCPerlClass_new(parcel, class_name, client,xs_code);
     RETVAL = S_cfcbase_to_perlref(self);
     CFCBase_decref((CFCBase*)self);
 OUTPUT: RETVAL
@@ -1945,3 +1953,34 @@ _destroy(self)
 PPCODE:
     CFCPerlClass_destroy(self);
 
+void
+_set_or_get(self, ...)
+    CFCPerlClass *self;
+ALIAS:
+    get_class_name     = 2
+    get_client         = 4
+    get_xs_code        = 6
+PPCODE:
+{
+    START_SET_OR_GET_SWITCH
+        case 2: {
+                const char *value = CFCPerlClass_get_class_name(self);
+                retval = newSVpvn(value, strlen(value));
+            }
+            break;
+        case 4: {
+                CFCClass *value = CFCPerlClass_get_client(self);
+                retval = S_cfcbase_to_perlref(value);
+            }
+            break;
+        case 6: {
+                const char *value = CFCPerlClass_get_xs_code(self);
+                retval = value
+                         ? newSVpvn(value, strlen(value))
+                         : newSV(0);
+            }
+            break;
+    END_SET_OR_GET_SWITCH
+}
+
+

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Class.pm
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Class.pm?rev=1149698&r1=1149697&r2=1149698&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Class.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Class.pm Fri Jul 22 19:22:04 2011
@@ -33,17 +33,14 @@ our %register_PARAMS = (
     client            => undef,
 );
 
-our %parcel;
-our %class_name;
 our %bind_methods;
 our %bind_constructors;
 our %make_pod;
-our %xs_code;
-our %client;
 
 sub register {
     my ( $either, %args ) = @_;
     verify_args( \%register_PARAMS, %args ) or confess $@;
+    $args{parcel} = Clownfish::Parcel->acquire( $args{parcel} );
 
     # Validate.
     confess("Missing required param 'class_name'")
@@ -66,14 +63,10 @@ sub register {
     }
 
     # Create object.
-    my $self = _new();
-    $parcel{$self}            = $args{parcel};
-    $class_name{$self}        = $args{class_name};
+    my $self = _new( @args{qw( parcel class_name client xs_code ) } );
     $bind_methods{$self}      = $args{bind_methods};
     $bind_constructors{$self} = $args{bind_constructors};
     $make_pod{$self}          = $args{make_pod};
-    $xs_code{$self}           = $args{xs_code};
-    $client{$self}            = $args{client};
 
     # Add to registry.
     $registry{ $args{class_name} } = $self;
@@ -83,22 +76,15 @@ sub register {
 
 sub DESTROY {
     my $self = shift;
-    delete $parcel{$self};
-    delete $class_name{$self};
     delete $bind_methods{$self};
     delete $bind_constructors{$self};
     delete $make_pod{$self};
-    delete $xs_code{$self};
-    delete $client{$self};
     _destroy($self);
 }
 
-sub get_class_name        { $class_name{ +shift } }
 sub get_bind_methods      { $bind_methods{ +shift } }
 sub get_bind_constructors { $bind_constructors{ +shift } }
 sub get_make_pod          { $make_pod{ +shift } }
-sub get_client            { $client{ +shift } }
-sub get_xs_code           { $xs_code{ +shift } }
 
 sub constructor_bindings {
     my $self  = shift;

Modified: incubator/lucy/trunk/clownfish/src/CFCPerlClass.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCPerlClass.c?rev=1149698&r1=1149697&r2=1149698&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCPerlClass.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCPerlClass.c Fri Jul 22 19:22:04 2011
@@ -18,26 +18,59 @@
 #include "CFCBase.h"
 #include "CFCPerlClass.h"
 #include "CFCUtil.h"
+#include "CFCClass.h"
+#include "CFCParcel.h"
 
 struct CFCPerlClass {
     CFCBase base;
+    CFCParcel *parcel;
+    char *class_name;
+    CFCClass *client;
+    char *xs_code;
 };
 
 CFCPerlClass*
-CFCPerlClass_new(void) {
+CFCPerlClass_new(CFCParcel *parcel, const char *class_name, CFCClass *client, 
+                 const char *xs_code) {
     CFCPerlClass *self
         = (CFCPerlClass*)CFCBase_allocate(sizeof(CFCPerlClass),
                                           "Clownfish::Binding::Perl::Class");
-    return CFCPerlClass_init(self);
+    return CFCPerlClass_init(self, parcel, class_name, client, xs_code);
 }
 
 CFCPerlClass*
-CFCPerlClass_init(CFCPerlClass *self) {
+CFCPerlClass_init(CFCPerlClass *self, CFCParcel *parcel, const char *class_name,
+                  CFCClass *client, const char *xs_code) {
+    CFCUTIL_NULL_CHECK(parcel);
+    CFCUTIL_NULL_CHECK(class_name);
+    self->parcel = (CFCParcel*)CFCBase_incref((CFCBase*)parcel);
+    self->client = (CFCClass*)CFCBase_incref((CFCBase*)client);
+    self->class_name = CFCUtil_strdup(class_name);
+    self->xs_code = xs_code ? CFCUtil_strdup(xs_code) : NULL;
     return self;
 }
 
 void
 CFCPerlClass_destroy(CFCPerlClass *self) {
     CFCBase_destroy((CFCBase*)self);
+    CFCBase_decref((CFCBase*)self->parcel);
+    CFCBase_decref((CFCBase*)self->client);
+    FREEMEM(self->class_name);
+    FREEMEM(self->xs_code);
+}
+
+CFCClass*
+CFCPerlClass_get_client(CFCPerlClass *self) {
+    return self->client;
+}
+
+const char*
+CFCPerlClass_get_class_name(CFCPerlClass *self) {
+    return self->class_name;
+}
+
+const char*
+CFCPerlClass_get_xs_code(CFCPerlClass *self) {
+    return self->xs_code;
 }
 

Modified: incubator/lucy/trunk/clownfish/src/CFCPerlClass.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCPerlClass.h?rev=1149698&r1=1149697&r2=1149698&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCPerlClass.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCPerlClass.h Fri Jul 22 19:22:04 2011
@@ -22,16 +22,31 @@ extern "C" {
 #endif
 
 typedef struct CFCPerlClass CFCPerlClass;
+struct CFCParcel;
+struct CFCClass;
 
 CFCPerlClass*
-CFCPerlClass_new(void);
+CFCPerlClass_new(struct CFCParcel *parcel, const char *class_name,
+                 struct CFCClass *client, const char *xs_code);
 
 CFCPerlClass*
-CFCPerlClass_init(CFCPerlClass *self);
+CFCPerlClass_init(CFCPerlClass *self, struct CFCParcel *parcel,
+                  const char *class_name, struct CFCClass *client,
+                  const char *xs_code);
 
 void
 CFCPerlClass_destroy(CFCPerlClass *self);
 
+struct CFCClass*
+CFCPerlClass_get_client(CFCPerlClass *self);
+
+const char*
+CFCPerlClass_get_class_name(CFCPerlClass *self);
+
+const char*
+CFCPerlClass_get_xs_code(CFCPerlClass *self);
+
+
 #ifdef __cplusplus
 }
 #endif