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/23 03:11:14 UTC

[lucy-commits] svn commit: r1073577 - in /incubator/lucy/trunk/clownfish: lib/Clownfish.xs lib/Clownfish/Method.pm src/CFCMethod.c src/CFCMethod.h

Author: marvin
Date: Wed Feb 23 02:11:14 2011
New Revision: 1073577

URL: http://svn.apache.org/viewvc?rev=1073577&view=rev
Log:
Move some string symbols in CFCMethod from Perl to C.

Modified:
    incubator/lucy/trunk/clownfish/lib/Clownfish.xs
    incubator/lucy/trunk/clownfish/lib/Clownfish/Method.pm
    incubator/lucy/trunk/clownfish/src/CFCMethod.c
    incubator/lucy/trunk/clownfish/src/CFCMethod.h

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish.xs
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish.xs?rev=1073577&r1=1073576&r2=1073577&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Wed Feb 23 02:11:14 2011
@@ -584,10 +584,14 @@ ALIAS:
     get_macro_sym      = 2
     _set_short_typedef = 3
     short_typedef      = 4
-    abstract           = 6
-    _set_novel         = 7
-    novel              = 8
-    final              = 10
+    full_typedef       = 6
+    full_callback_sym  = 8
+    full_override_sym  = 10
+    abstract           = 12
+    _set_novel         = 13
+    novel              = 14
+    final              = 16
+    self_type          = 18
 PPCODE:
 {
     START_SET_OR_GET_SWITCH
@@ -604,18 +608,38 @@ PPCODE:
                 retval = newSVpvn(short_typedef, strlen(short_typedef));
             }
             break;
-        case 6:
+        case 6: {
+                const char *value = CFCMethod_full_typedef(self);
+                retval = newSVpvn(value, strlen(value));
+            }
+            break;
+        case 8: {
+                const char *value = CFCMethod_full_callback_sym(self);
+                retval = newSVpvn(value, strlen(value));
+            }
+            break;
+        case 10: {
+                const char *value = CFCMethod_full_override_sym(self);
+                retval = newSVpvn(value, strlen(value));
+            }
+            break;
+        case 12:
             retval = newSViv(CFCMethod_abstract(self));
             break;
-        case 7:
+        case 13:
             CFCMethod_set_novel(self, !!SvIV(ST(1)));
             break;
-        case 8:
+        case 14:
             retval = newSViv(CFCMethod_novel(self));
             break;
-        case 10:
+        case 16:
             retval = newSViv(CFCMethod_final(self));
             break;
+        case 18: {
+                CFCType *type = CFCMethod_self_type(self);
+                retval = newRV(CFCBase_get_perl_obj((CFCBase*)type));
+            }
+            break;
     END_SET_OR_GET_SWITCH
 }
 

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish/Method.pm
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish/Method.pm?rev=1073577&r1=1073576&r2=1073577&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Method.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Method.pm Wed Feb 23 02:11:14 2011
@@ -73,8 +73,6 @@ sub new {
     return $self;
 }
 
-sub self_type { shift->get_param_list->get_variables->[0]->get_type }
-
 sub short_method_sym {
     my ( $self, $invoker ) = @_;
     confess("Missing invoker") unless $invoker;
@@ -93,14 +91,6 @@ sub full_offset_sym {
     return $self->full_method_sym($invoker) . '_OFFSET';
 }
 
-sub full_callback_sym { shift->full_func_sym . "_CALLBACK" }
-sub full_override_sym { shift->full_func_sym . "_OVERRIDE" }
-
-sub full_typedef {
-    my $self = shift;
-    return $self->get_prefix . $self->short_typedef;
-}
-
 sub override {
     my ( $self, $orig ) = @_;
 

Modified: incubator/lucy/trunk/clownfish/src/CFCMethod.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCMethod.c?rev=1073577&r1=1073576&r2=1073577&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCMethod.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCMethod.c Wed Feb 23 02:11:14 2011
@@ -27,6 +27,7 @@
 #include "CFCParamList.h"
 #include "CFCParcel.h"
 #include "CFCDocuComment.h"
+#include "CFCVariable.h"
 
 #ifndef true
     #define true 1
@@ -37,6 +38,9 @@ struct CFCMethod {
     CFCFunction function;
     char *macro_sym;
     char *short_typedef;
+    char *full_typedef;
+    char *full_callback_sym;
+    char *full_override_sym;
     int is_final;
     int is_abstract;
     int is_novel;
@@ -68,9 +72,23 @@ CFCMethod_init(CFCMethod *self, CFCParce
         false);
     self->macro_sym     = CFCUtil_strdup(macro_sym);
     self->short_typedef = NULL;
+    self->full_typedef  = NULL;
     self->is_final      = is_final;
     self->is_abstract   = is_abstract;
 
+    const char *full_func_sym = CFCFunction_full_func_sym((CFCFunction*)self);
+    size_t amount = strlen(full_func_sym) + sizeof("_OVERRIDE") + 1;
+    self->full_callback_sym = (char*)malloc(amount);
+    self->full_override_sym = (char*)malloc(amount);
+    if (!self->full_callback_sym || !self->full_override_sym) {
+        croak("malloc failed");
+    }
+    int check = sprintf(self->full_callback_sym, "%s_CALLBACK", 
+        full_func_sym);
+    if (check < 0) { croak("sprintf failed"); }
+    check = sprintf(self->full_override_sym, "%s_OVERRIDE", full_func_sym);
+    if (check < 0) { croak("sprintf failed"); }
+
     // Assume that this method is novel until we discover when applying
     // inheritance that it was overridden.
     self->is_novel = 1;
@@ -83,6 +101,9 @@ CFCMethod_destroy(CFCMethod *self)
 {
     free(self->macro_sym);
     free(self->short_typedef);
+    free(self->full_typedef);
+    free(self->full_callback_sym);
+    free(self->full_override_sym);
     CFCFunction_destroy((CFCFunction*)self);
 }
 
@@ -96,7 +117,21 @@ void
 CFCMethod_set_short_typedef(CFCMethod *self, const char *short_typedef)
 {
     free(self->short_typedef);
-    self->short_typedef = short_typedef ? CFCUtil_strdup(short_typedef) : NULL;
+    free(self->full_typedef);
+    if (short_typedef) {
+        self->short_typedef = CFCUtil_strdup(short_typedef);
+        const char *prefix = CFCSymbol_get_prefix((CFCSymbol*)self);
+        size_t amount = strlen(prefix) + strlen(short_typedef) + 1;
+        self->full_typedef = (char*)malloc(amount);
+        if (!self->full_typedef) { croak("malloc failed"); }
+        int check = sprintf(self->full_typedef, "%s%s", prefix,
+            short_typedef);
+        if (check < 0) { croak("sprintf failed"); }
+    }
+    else {
+        self->short_typedef = NULL;
+        self->full_typedef = NULL;
+    }
 }
 
 const char*
@@ -105,6 +140,24 @@ CFCMethod_short_typedef(CFCMethod *self)
     return self->short_typedef;
 }
 
+const char*
+CFCMethod_full_typedef(CFCMethod *self)
+{
+    return self->full_typedef;
+}
+
+const char*
+CFCMethod_full_callback_sym(CFCMethod *self)
+{
+    return self->full_callback_sym;
+}
+
+const char*
+CFCMethod_full_override_sym(CFCMethod *self)
+{
+    return self->full_override_sym;
+}
+
 int
 CFCMethod_final(CFCMethod *self)
 {
@@ -129,3 +182,10 @@ CFCMethod_novel(CFCMethod *self)
     return self->is_novel;
 }
 
+CFCType*
+CFCMethod_self_type(CFCMethod *self)
+{
+    CFCVariable **vars = CFCParamList_get_variables(self->function.param_list);
+    return CFCVariable_get_type(vars[0]);
+}
+

Modified: incubator/lucy/trunk/clownfish/src/CFCMethod.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCMethod.h?rev=1073577&r1=1073576&r2=1073577&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCMethod.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCMethod.h Wed Feb 23 02:11:14 2011
@@ -51,6 +51,15 @@ CFCMethod_set_short_typedef(CFCMethod *s
 const char*
 CFCMethod_short_typedef(CFCMethod *self);
 
+const char*
+CFCMethod_full_typedef(CFCMethod *self);
+
+const char*
+CFCMethod_full_callback_sym(CFCMethod *self);
+
+const char*
+CFCMethod_full_override_sym(CFCMethod *self);
+
 int
 CFCMethod_final(CFCMethod *self);
 
@@ -63,5 +72,8 @@ CFCMethod_set_novel(CFCMethod *self, int
 int
 CFCMethod_novel(CFCMethod *self);
 
+struct CFCType*
+CFCMethod_self_type(CFCMethod *self);
+
 #endif /* H_CFCMETHOD */