You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2015/05/09 19:49:59 UTC

[02/11] lucy-clownfish git commit: Don't cache override symbol

Don't cache override symbol


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/bfa43f3d
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/bfa43f3d
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/bfa43f3d

Branch: refs/heads/master
Commit: bfa43f3dad6f6eec3d25acf172899cbc64db0d64
Parents: ac313c1
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sat Jul 26 23:38:15 2014 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Thu May 7 21:13:59 2015 +0200

----------------------------------------------------------------------
 compiler/perl/lib/Clownfish/CFC.xs | 10 ++++------
 compiler/src/CFCBindClass.c        |  3 ++-
 compiler/src/CFCBindMethod.c       |  8 ++++++--
 compiler/src/CFCC.c                |  3 ++-
 compiler/src/CFCMethod.c           | 19 ++++++-------------
 compiler/src/CFCMethod.h           |  4 ++--
 compiler/src/CFCPerl.c             |  2 +-
 compiler/src/CFCPerlMethod.c       |  5 +++--
 compiler/src/CFCPerlMethod.h       |  2 +-
 9 files changed, 27 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/bfa43f3d/compiler/perl/lib/Clownfish/CFC.xs
----------------------------------------------------------------------
diff --git a/compiler/perl/lib/Clownfish/CFC.xs b/compiler/perl/lib/Clownfish/CFC.xs
index 02f7eaf..10b2a22 100644
--- a/compiler/perl/lib/Clownfish/CFC.xs
+++ b/compiler/perl/lib/Clownfish/CFC.xs
@@ -895,6 +895,7 @@ ALIAS:
     full_offset_sym   = 3
     short_typedef     = 4
     full_typedef      = 5
+    full_override_sym = 6
 CODE:
     char *buf;
     switch (ix) {
@@ -913,6 +914,9 @@ CODE:
         case 5:
             buf = CFCMethod_full_typedef(self, invoker);
             break;
+        case 6:
+            buf = CFCMethod_full_override_sym(self, invoker);
+            break;
         default: croak("Unexpected ix: %d", (int)ix);
     }
     RETVAL = newSVpvn(buf, strlen(buf));
@@ -923,7 +927,6 @@ void
 _set_or_get(self, ...)
     CFCMethod *self;
 ALIAS:
-    full_override_sym  = 10
     abstract           = 12
     novel              = 14
     final              = 16
@@ -934,11 +937,6 @@ ALIAS:
 PPCODE:
 {
     START_SET_OR_GET_SWITCH
-        case 10: {
-                const char *value = CFCMethod_full_override_sym(self);
-                retval = newSVpvn(value, strlen(value));
-            }
-            break;
         case 12:
             retval = newSViv(CFCMethod_abstract(self));
             break;

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/bfa43f3d/compiler/src/CFCBindClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCBindClass.c b/compiler/src/CFCBindClass.c
index 6faf67d..a5ccfc2 100644
--- a/compiler/src/CFCBindClass.c
+++ b/compiler/src/CFCBindClass.c
@@ -666,7 +666,7 @@ S_override_decs(CFCBindClass *self) {
         if (CFCMethod_final(method) || !CFCMethod_novel(method)) {
             continue;
         }
-        const char *override_sym = CFCMethod_full_override_sym(method);
+        char *override_sym = CFCMethod_full_override_sym(method, self->client);
         CFCType      *return_type  = CFCMethod_get_return_type(method);
         CFCParamList *param_list   = CFCMethod_get_param_list(method);
         const char   *ret_type_str = CFCType_to_c(return_type);
@@ -678,6 +678,7 @@ S_override_decs(CFCBindClass *self) {
             = CFCUtil_sprintf(pattern, ret_type_str, override_sym, params);
         decs = CFCUtil_cat(decs, callback_dec, NULL);
         FREEMEM(callback_dec);
+        FREEMEM(override_sym);
 
         nulls = CFCUtil_cat(nulls, "#define ", override_sym, " NULL\n", NULL);
     }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/bfa43f3d/compiler/src/CFCBindMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCBindMethod.c b/compiler/src/CFCBindMethod.c
index a205861..f98a7bd 100644
--- a/compiler/src/CFCBindMethod.c
+++ b/compiler/src/CFCBindMethod.c
@@ -139,9 +139,12 @@ char*
 CFCBindMeth_novel_spec_def(CFCMethod *method, CFCClass *klass) {
     const char *meth_name = CFCMethod_get_name(method);
 
-    const char *full_override_sym = "NULL";
+    char *full_override_sym;
     if (!CFCMethod_final(method)) {
-        full_override_sym = CFCMethod_full_override_sym(method);
+        full_override_sym = CFCMethod_full_override_sym(method, klass);
+    }
+    else {
+        full_override_sym = CFCUtil_strdup("NULL");
     }
 
     char *imp_func        = CFCMethod_imp_func(method, klass);
@@ -160,6 +163,7 @@ CFCBindMeth_novel_spec_def(CFCMethod *method, CFCClass *klass) {
 
     FREEMEM(full_offset_sym);
     FREEMEM(imp_func);
+    FREEMEM(full_override_sym);
     return def;
 }
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/bfa43f3d/compiler/src/CFCC.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCC.c b/compiler/src/CFCC.c
index 48d3128..f676ad3 100644
--- a/compiler/src/CFCC.c
+++ b/compiler/src/CFCC.c
@@ -91,9 +91,10 @@ S_callback_decs(CFCClass *klass) {
 
         // Define callback to NULL.
         if (CFCMethod_novel(method) && !CFCMethod_final(method)) {
-            const char *override_sym = CFCMethod_full_override_sym(method);
+            char *override_sym = CFCMethod_full_override_sym(method, klass);
             cb_decs = CFCUtil_cat(cb_decs, "#define ", override_sym, " NULL\n",
                                   NULL);
+            FREEMEM(override_sym);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/bfa43f3d/compiler/src/CFCMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCMethod.c b/compiler/src/CFCMethod.c
index 8ee3e9c..f8d1e76 100644
--- a/compiler/src/CFCMethod.c
+++ b/compiler/src/CFCMethod.c
@@ -37,7 +37,6 @@
 struct CFCMethod {
     CFCCallable callable;
     CFCMethod *novel_method;
-    char *full_override_sym;
     char *host_alias;
     int is_final;
     int is_abstract;
@@ -121,7 +120,6 @@ CFCMethod_init(CFCMethod *self, CFCParcel *parcel, const char *exposure,
     }
 
     self->novel_method      = NULL;
-    self->full_override_sym = NULL;
     self->host_alias        = NULL;
     self->is_final          = is_final;
     self->is_abstract       = is_abstract;
@@ -142,7 +140,6 @@ CFCMethod_resolve_types(CFCMethod *self) {
 void
 CFCMethod_destroy(CFCMethod *self) {
     CFCBase_decref((CFCBase*)self->novel_method);
-    FREEMEM(self->full_override_sym);
     FREEMEM(self->host_alias);
     CFCCallable_destroy((CFCCallable*)self);
 }
@@ -356,16 +353,12 @@ CFCMethod_full_typedef(CFCMethod *self, CFCClass *invoker) {
     return S_full_method_sym(self, invoker, "_t");
 }
 
-const char*
-CFCMethod_full_override_sym(CFCMethod *self) {
-    if (!self->full_override_sym) {
-        const char *Prefix   = CFCMethod_get_Prefix(self);
-        const char *nickname = CFCMethod_get_class_nickname(self);
-        const char *name     = CFCMethod_get_name(self);
-        self->full_override_sym
-            = CFCUtil_sprintf("%s%s_%s_OVERRIDE", Prefix, nickname, name);
-    }
-    return self->full_override_sym;
+char*
+CFCMethod_full_override_sym(CFCMethod *self, CFCClass *klass) {
+    const char *Prefix   = CFCClass_get_Prefix(klass);
+    const char *nickname = CFCClass_get_nickname(klass);
+    const char *name     = CFCMethod_get_name(self);
+    return CFCUtil_sprintf("%s%s_%s_OVERRIDE", Prefix, nickname, name);
 }
 
 int

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/bfa43f3d/compiler/src/CFCMethod.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCMethod.h b/compiler/src/CFCMethod.h
index e57eb5c..8ac6395 100644
--- a/compiler/src/CFCMethod.h
+++ b/compiler/src/CFCMethod.h
@@ -175,8 +175,8 @@ CFCMethod_full_typedef(CFCMethod *self, struct CFCClass *invoker);
  * callback to the host in the event that a host method has been defined which
  * overrides this method, e.g. "crust_LobClaw_pinch_OVERRIDE".
  */
-const char*
-CFCMethod_full_override_sym(CFCMethod *self);
+char*
+CFCMethod_full_override_sym(CFCMethod *self, struct CFCClass *klass);
 
 int
 CFCMethod_final(CFCMethod *self);

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/bfa43f3d/compiler/src/CFCPerl.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerl.c b/compiler/src/CFCPerl.c
index 6947542..e537226 100644
--- a/compiler/src/CFCPerl.c
+++ b/compiler/src/CFCPerl.c
@@ -616,7 +616,7 @@ S_write_callbacks_c(CFCPerl *self) {
 
             // Define callback.
             if (CFCMethod_novel(method) && !CFCMethod_final(method)) {
-                char *cb_def = CFCPerlMethod_callback_def(method);
+                char *cb_def = CFCPerlMethod_callback_def(method, klass);
                 content = CFCUtil_cat(content, cb_def, "\n", NULL);
                 FREEMEM(cb_def);
             }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/bfa43f3d/compiler/src/CFCPerlMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlMethod.c b/compiler/src/CFCPerlMethod.c
index cfc474a..08d01a6 100644
--- a/compiler/src/CFCPerlMethod.c
+++ b/compiler/src/CFCPerlMethod.c
@@ -411,7 +411,7 @@ S_xsub_def_positional_args(CFCPerlMethod *self, CFCClass *klass) {
 }
 
 char*
-CFCPerlMethod_callback_def(CFCMethod *method) {
+CFCPerlMethod_callback_def(CFCMethod *method, CFCClass *klass) {
     CFCType *return_type = CFCMethod_get_return_type(method);
     char *callback_body = NULL;
 
@@ -445,7 +445,7 @@ CFCPerlMethod_callback_def(CFCMethod *method) {
         FREEMEM(refcount_mods);
     }
 
-    const char *override_sym = CFCMethod_full_override_sym(method);
+    char *override_sym = CFCMethod_full_override_sym(method, klass);
 
     CFCParamList *param_list = CFCMethod_get_param_list(method);
     const char *params = CFCParamList_to_c(param_list);
@@ -462,6 +462,7 @@ CFCPerlMethod_callback_def(CFCMethod *method) {
                           callback_body);
 
     FREEMEM(callback_body);
+    FREEMEM(override_sym);
     return callback_def;
 }
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/bfa43f3d/compiler/src/CFCPerlMethod.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlMethod.h b/compiler/src/CFCPerlMethod.h
index 2e5b7f3..72cd286 100644
--- a/compiler/src/CFCPerlMethod.h
+++ b/compiler/src/CFCPerlMethod.h
@@ -63,7 +63,7 @@ CFCPerlMethod_xsub_def(CFCPerlMethod *self, struct CFCClass *klass);
  * class.
  */
 char*
-CFCPerlMethod_callback_def(struct CFCMethod *method);
+CFCPerlMethod_callback_def(struct CFCMethod *method, struct CFCClass *klass);
 
 #ifdef __cplusplus
 }