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 04:12:46 UTC

[lucy-commits] svn commit: r1072483 - in /incubator/lucy/trunk/clownfish: lib/Clownfish.xs lib/Clownfish/Function.pm src/CFCFunction.c src/CFCFunction.h

Author: marvin
Date: Sun Feb 20 03:12:46 2011
New Revision: 1072483

URL: http://svn.apache.org/viewvc?rev=1072483&view=rev
Log:
Finish porting CFCFunction to C.

Modified:
    incubator/lucy/trunk/clownfish/lib/Clownfish.xs
    incubator/lucy/trunk/clownfish/lib/Clownfish/Function.pm
    incubator/lucy/trunk/clownfish/src/CFCFunction.c
    incubator/lucy/trunk/clownfish/src/CFCFunction.h

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish.xs
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish.xs?rev=1072483&r1=1072482&r2=1072483&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Sun Feb 20 03:12:46 2011
@@ -360,6 +360,9 @@ ALIAS:
     get_param_list     = 4
     get_docucomment    = 6
     inline             = 8
+    void               = 10
+    full_func_sym      = 12
+    short_func_sym     = 14
 PPCODE:
 {
     START_SET_OR_GET_SWITCH
@@ -388,6 +391,19 @@ PPCODE:
         case 8:
             retval = newSViv(CFCFunction_inline(self));
             break;
+        case 10:
+            retval = newSViv(CFCFunction_void(self));
+            break;
+        case 12: {
+                const char *full_sym = CFCFunction_full_func_sym(self);
+                retval = newSVpv(full_sym, strlen(full_sym));
+            }
+            break;
+        case 14: {
+                const char *short_sym = CFCFunction_short_func_sym(self);
+                retval = newSVpv(short_sym, strlen(short_sym));
+            }
+            break;
     END_SET_OR_GET_SWITCH
 }
 

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish/Function.pm
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish/Function.pm?rev=1072483&r1=1072482&r2=1072483&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Function.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Function.pm Sun Feb 20 03:12:46 2011
@@ -31,34 +31,24 @@ my %new_PARAMS = (
     micro_sym   => undef,
     docucomment => undef,
     parcel      => undef,
-    inline      => 0,
-    exposure    => 'parcel',
+    inline      => undef,
+    exposure    => undef,
 );
 
 sub new {
     my ( $either, %args ) = @_;
     verify_args( \%new_PARAMS, %args ) or confess $@;
     $args{inline} ||= 0;
-    $args{parcel} = Clownfish::Parcel->acquire($args{parcel});
-    my $class_class = ref($either) || $either;
-    my $self = $class_class->_new(
-        @args{ qw( parcel exposure class_name class_cnick micro_sym
-            return_type param_list docucomment inline ) } );
-
-    # Validate.
-    confess("class_name is mandatory")
-        unless defined $self->get_class_name;
-    confess( "Invalid micro_sym: '" . $self->micro_sym . "'" )
-        unless $self->micro_sym =~ /^[a-z0-9_]+$/;
-
-    return $self;
+    $args{parcel} = Clownfish::Parcel->acquire( $args{parcel} );
+    my $package = ref($either) || $either;
+    return $package->_new(
+        @args{
+            qw( parcel exposure class_name class_cnick micro_sym
+                return_type param_list docucomment inline )
+            }
+    );
 }
 
-sub void { shift->get_return_type->is_void }
-
-sub full_func_sym  { shift->SUPER::full_sym }
-sub short_func_sym { shift->SUPER::short_sym }
-
 1;
 
 __END__

Modified: incubator/lucy/trunk/clownfish/src/CFCFunction.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCFunction.c?rev=1072483&r1=1072482&r2=1072483&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCFunction.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCFunction.c Sun Feb 20 03:12:46 2011
@@ -19,6 +19,11 @@
 #include "perl.h"
 #include "XSUB.h"
 
+#ifndef true;
+    #define true 1
+    #define false 0
+#endif
+
 #define CFC_NEED_FUNCTION_STRUCT_DEF
 #include "CFCFunction.h"
 #include "CFCParcel.h"
@@ -40,6 +45,19 @@ CFCFunction_new(CFCParcel *parcel, const
         micro_sym, return_type, param_list, docucomment, is_inline);
 }
 
+static int
+S_validate_micro_sym(const char *micro_sym)
+{
+    size_t i;
+    size_t len = strlen(micro_sym);
+    if (!len) { return false; }
+    for (i = 0; i < len; i++) {
+        char c = micro_sym[i];
+        if (!islower(c) && !isdigit(c) && c != '_') { return false; }
+    }
+    return true;
+}
+
 CFCFunction*
 CFCFunction_init(CFCFunction *self, CFCParcel *parcel, const char *exposure,
                const char *class_name, const char *class_cnick, 
@@ -47,11 +65,16 @@ CFCFunction_init(CFCFunction *self, CFCP
                CFCParamList *param_list, CFCDocuComment *docucomment, 
                int is_inline)
 {
+
     exposure = exposure ? exposure : "parcel";
     CFCSymbol_init((CFCSymbol*)self, parcel, exposure, class_name,
         class_cnick, micro_sym);
+    CFCUTIL_NULL_CHECK(class_name);
     CFCUTIL_NULL_CHECK(return_type);
     CFCUTIL_NULL_CHECK(param_list);
+    if (!S_validate_micro_sym(micro_sym)) {
+        croak("Invalid micro_sym: '%s'", micro_sym);
+    }
     self->return_type = (CFCType*)CFCBase_incref((CFCBase*)return_type);
     self->param_list  = (CFCParamList*)CFCBase_incref((CFCBase*)param_list);
     self->docucomment = (CFCDocuComment*)CFCBase_incref((CFCBase*)docucomment);
@@ -92,3 +115,21 @@ CFCFunction_inline(CFCFunction *self)
     return self->is_inline;
 }
 
+int
+CFCFunction_void(CFCFunction *self)
+{
+    return CFCType_is_void(self->return_type);
+}
+
+const char*
+CFCFunction_full_func_sym(CFCFunction *self)
+{
+    return CFCSymbol_full_sym((CFCSymbol*)self);
+}
+
+const char*
+CFCFunction_short_func_sym(CFCFunction *self)
+{
+    return CFCSymbol_short_sym((CFCSymbol*)self);
+}
+

Modified: incubator/lucy/trunk/clownfish/src/CFCFunction.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCFunction.h?rev=1072483&r1=1072482&r2=1072483&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCFunction.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCFunction.h Sun Feb 20 03:12:46 2011
@@ -65,5 +65,14 @@ CFCFunction_get_docucomment(CFCFunction 
 int
 CFCFunction_inline(CFCFunction *self);
 
+int
+CFCFunction_void(CFCFunction *self);
+
+const char*
+CFCFunction_full_func_sym(CFCFunction *self);
+
+const char*
+CFCFunction_short_func_sym(CFCFunction *self);
+
 #endif /* H_CFCFUNCTION */