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 01:46:07 UTC

[lucy-commits] svn commit: r1149406 - in /incubator/lucy/trunk/clownfish: lib/Clownfish.xs lib/Clownfish/Binding/Perl/Subroutine.pm src/CFCPerlSub.c src/CFCPerlSub.h

Author: marvin
Date: Thu Jul 21 23:46:06 2011
New Revision: 1149406

URL: http://svn.apache.org/viewvc?rev=1149406&view=rev
Log:
Move some variables from Perl-space to C.

As part of porting Clownfish::Binding::Perl::Subroutine, change some member
vars from inside-out Perl to C-struct.

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

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish.xs
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish.xs?rev=1149406&r1=1149405&r2=1149406&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Thu Jul 21 23:46:06 2011
@@ -1851,17 +1851,55 @@ PPCODE:
 MODULE = Clownfish   PACKAGE = Clownfish::Binding::Perl::Subroutine
 
 SV*
-_new(klass)
-    const char *klass
+_new(klass, param_list, class_name, alias, retval_type, use_labeled_params)
+    const char *klass;
+    CFCParamList *param_list;
+    const char *class_name;
+    const char *alias;
+    CFCType *retval_type;
+    int use_labeled_params;
 CODE:
-    CFCPerlSub *self = CFCPerlSub_new(klass);
+    CFCPerlSub *self = CFCPerlSub_new(klass, param_list, class_name,
+                                      alias, retval_type, use_labeled_params);
     RETVAL = S_cfcbase_to_perlref(self);
     CFCBase_decref((CFCBase*)self);
 OUTPUT: RETVAL
 
 void
-_destroy(self)
+DESTROY(self)
     CFCPerlSub *self;
 PPCODE:
     CFCPerlSub_destroy(self);
 
+void
+_set_or_get(self, ...)
+    CFCPerlSub *self;
+ALIAS:
+    get_class_name     = 2
+    use_labeled_params = 4
+    perl_name          = 6
+    get_param_list     = 8
+PPCODE:
+{
+    START_SET_OR_GET_SWITCH
+        case 2: {
+                const char *value = CFCPerlSub_get_class_name(self);
+                retval = newSVpvn(value, strlen(value));
+            }
+            break;
+        case 4:
+            retval = newSViv(CFCPerlSub_use_labeled_params(self));
+            break;
+        case 6: {
+                const char *value = CFCPerlSub_perl_name(self);
+                retval = newSVpvn(value, strlen(value));
+            }
+            break;
+        case 8: {
+                CFCParamList *value = CFCPerlSub_get_param_list(self);
+                retval = S_cfcbase_to_perlref(value);
+            }
+            break;
+    END_SET_OR_GET_SWITCH
+}
+

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Subroutine.pm
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Subroutine.pm?rev=1149406&r1=1149405&r2=1149406&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Subroutine.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Subroutine.pm Thu Jul 21 23:46:06 2011
@@ -44,35 +44,10 @@ our %perl_name;
 sub new {
     my ( $either, %args ) = @_;
     verify_args( \%new_PARAMS, %args ) or confess $@;
-    for (qw( param_list class_name alias retval_type )) {
-        confess("$_ is required") unless defined $args{$_};
-    }
-    my $self = _new( ref($either) || $either );
-    $param_list{$self}         = $args{param_list};
-    $alias{$self}              = $args{alias};
-    $class_name{$self}         = $args{class_name};
-    $retval_type{$self}        = $args{retval_type};
-    $use_labeled_params{$self} = $args{use_labeled_params};
-    $perl_name{$self}          = "$args{class_name}::$args{alias}";
-    return $self;
+    return _new( ref($either) || $either,
+        @args{qw( param_list class_name alias retval_type use_labeled_params )} );
 }
 
-sub DESTROY {
-    my $self = shift;
-    delete $param_list{$self};
-    delete $class_name{$self};
-    delete $alias{$self};
-    delete $retval_type{$self};
-    delete $use_labeled_params{$self};
-    delete $perl_name{$self};
-    $self->_destroy;
-}
-
-sub get_class_name     { $class_name{ +shift } }
-sub use_labeled_params { $use_labeled_params{ +shift } }
-sub perl_name          { $perl_name{ +shift } }
-sub get_param_list     { $param_list{ +shift } }
-
 sub c_name {
     my $self   = shift;
     my $c_name = "XS_" . $self->perl_name;

Modified: incubator/lucy/trunk/clownfish/src/CFCPerlSub.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCPerlSub.c?rev=1149406&r1=1149405&r2=1149406&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCPerlSub.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCPerlSub.c Thu Jul 21 23:46:06 2011
@@ -18,25 +18,79 @@
 #include "CFCBase.h"
 #include "CFCPerlSub.h"
 #include "CFCUtil.h"
+#include "CFCType.h"
+#include "CFCParamList.h"
 
 struct CFCPerlSub {
     CFCBase base;
+    CFCParamList *param_list;
+    char *class_name;
+    char *alias;
+    CFCType *retval_type;
+    int use_labeled_params;
+    char *perl_name;
 };
 
 CFCPerlSub*
-CFCPerlSub_new(const char *class_name) {
+CFCPerlSub_new(const char *klass, CFCParamList *param_list,
+               const char *class_name, const char *alias,
+               CFCType *retval_type, int use_labeled_params) {
     CFCPerlSub *self
-        = (CFCPerlSub*)CFCBase_allocate(sizeof(CFCPerlSub), class_name);
-    return CFCPerlSub_init(self);
+        = (CFCPerlSub*)CFCBase_allocate(sizeof(CFCPerlSub), klass);
+    return CFCPerlSub_init(self, param_list, class_name, alias, retval_type,
+                           use_labeled_params);
 }
 
 CFCPerlSub*
-CFCPerlSub_init(CFCPerlSub *self) {
+CFCPerlSub_init(CFCPerlSub *self, CFCParamList *param_list,
+                const char *class_name, const char *alias,
+                CFCType *retval_type, int use_labeled_params) {
+    CFCUTIL_NULL_CHECK(param_list);
+    CFCUTIL_NULL_CHECK(class_name);
+    CFCUTIL_NULL_CHECK(alias);
+    CFCUTIL_NULL_CHECK(retval_type);
+    self->param_list  = (CFCParamList*)CFCBase_incref((CFCBase*)param_list);
+    self->class_name  = CFCUtil_strdup(class_name);
+    self->alias       = CFCUtil_strdup(alias);
+    self->retval_type = (CFCType*)CFCBase_incref((CFCBase*)retval_type);
+    self->use_labeled_params = use_labeled_params;
+    self->perl_name = CFCUtil_cat(CFCUtil_strdup(class_name), "::", alias,
+                                  NULL);
     return self;
 }
 
 void
 CFCPerlSub_destroy(CFCPerlSub *self) {
+    CFCBase_decref((CFCBase*)self->param_list);
+    FREEMEM(self->class_name);
+    FREEMEM(self->alias);
+    CFCBase_decref((CFCBase*)self->retval_type);
+    FREEMEM(self->perl_name);
     CFCBase_destroy((CFCBase*)self);
 }
 
+CFCParamList*
+CFCPerlSub_get_param_list(CFCPerlSub *self) {
+    return self->param_list;
+}
+
+const char*
+CFCPerlSub_get_class_name(CFCPerlSub *self) {
+    return self->class_name;
+}
+
+const char*
+CFCPerlSub_get_alias(CFCPerlSub *self) {
+    return self->alias;
+}
+
+int
+CFCPerlSub_use_labeled_params(CFCPerlSub *self) {
+    return self->use_labeled_params;
+}
+
+const char*
+CFCPerlSub_perl_name(CFCPerlSub *self) {
+    return self->perl_name;
+}
+

Modified: incubator/lucy/trunk/clownfish/src/CFCPerlSub.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCPerlSub.h?rev=1149406&r1=1149405&r2=1149406&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCPerlSub.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCPerlSub.h Thu Jul 21 23:46:06 2011
@@ -22,16 +22,34 @@ extern "C" {
 #endif
 
 typedef struct CFCPerlSub CFCPerlSub;
+struct CFCParamList;
+struct CFCType;
 
 CFCPerlSub*
-CFCPerlSub_new(const char *class_name);
+CFCPerlSub_new(const char *klass, struct CFCParamList *param_list,
+               const char *class_name, const char *alias,
+               struct CFCType *retval_type, int use_labeled_params);
 
 CFCPerlSub*
-CFCPerlSub_init(CFCPerlSub *self);
+CFCPerlSub_init(CFCPerlSub *self, struct CFCParamList *param_list,
+                const char *class_name, const char *alias,
+                struct CFCType *retval_type, int use_labeled_params);
 
 void
 CFCPerlSub_destroy(CFCPerlSub *self);
 
+struct CFCParamList*
+CFCPerlSub_get_param_list(CFCPerlSub *self);
+
+const char*
+CFCPerlSub_get_class_name(CFCPerlSub *self);
+
+int
+CFCPerlSub_use_labeled_params(CFCPerlSub *self);
+
+const char*
+CFCPerlSub_perl_name(CFCPerlSub *self);
+
 #ifdef __cplusplus
 }
 #endif