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 2012/12/27 19:20:55 UTC

[lucy-commits] [7/12] git commit: refs/heads/cfc-sprintf - Simplify symbol accessors in CFCMethod

Simplify symbol accessors in CFCMethod


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

Branch: refs/heads/cfc-sprintf
Commit: 04f339b6c008278a17fa84c800b69fb30f9ee064
Parents: 0bbc0a7
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Wed Dec 26 22:35:04 2012 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Wed Dec 26 22:35:04 2012 +0100

----------------------------------------------------------------------
 clownfish/compiler/perl/lib/Clownfish/CFC.xs |   36 ++--------
 clownfish/compiler/src/CFCBindClass.c        |   48 +++++--------
 clownfish/compiler/src/CFCBindMethod.c       |   33 ++-------
 clownfish/compiler/src/CFCDumpable.c         |   18 +----
 clownfish/compiler/src/CFCMethod.c           |   76 +++++++--------------
 clownfish/compiler/src/CFCMethod.h           |   35 ++++------
 clownfish/compiler/src/CFCPerlMethod.c       |   24 +++----
 7 files changed, 88 insertions(+), 182 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/04f339b6/clownfish/compiler/perl/lib/Clownfish/CFC.xs
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/lib/Clownfish/CFC.xs b/clownfish/compiler/perl/lib/Clownfish/CFC.xs
index 3a23bd7..415338e 100644
--- a/clownfish/compiler/perl/lib/Clownfish/CFC.xs
+++ b/clownfish/compiler/perl/lib/Clownfish/CFC.xs
@@ -884,47 +884,27 @@ ALIAS:
     short_typedef     = 4
     full_typedef      = 5
 CODE:
-    size_t size = 0;
-    switch (ix) {
-        case 1:
-            size = CFCMethod_short_method_sym(self, invoker, NULL, 0);
-            break;
-        case 2:
-            size = CFCMethod_full_method_sym(self, invoker, NULL, 0);
-            break;
-        case 3:
-            size = CFCMethod_full_offset_sym(self, invoker, NULL, 0);
-            break;
-        case 4:
-            size = CFCMethod_short_typedef(self, invoker, NULL, 0);
-            break;
-        case 5:
-            size = CFCMethod_full_typedef(self, invoker, NULL, 0);
-            break;
-        default: croak("Unexpected ix: %d", (int)ix);
-    }
-    RETVAL = newSV(size);
-    SvPOK_on(RETVAL);
-    char *buf = SvPVX(RETVAL);
+    char *buf;
     switch (ix) {
         case 1:
-            CFCMethod_short_method_sym(self, invoker, buf, size);
+            buf = CFCMethod_short_method_sym(self, invoker);
             break;
         case 2:
-            CFCMethod_full_method_sym(self, invoker, buf, size);
+            buf = CFCMethod_full_method_sym(self, invoker);
             break;
         case 3:
-            CFCMethod_full_offset_sym(self, invoker, buf, size);
+            buf = CFCMethod_full_offset_sym(self, invoker);
             break;
         case 4:
-            CFCMethod_short_typedef(self, invoker, buf, size);
+            buf = CFCMethod_short_typedef(self, invoker);
             break;
         case 5:
-            CFCMethod_full_typedef(self, invoker, buf, size);
+            buf = CFCMethod_full_typedef(self, invoker);
             break;
         default: croak("Unexpected ix: %d", (int)ix);
     }
-    SvCUR_set(RETVAL, strlen(buf));
+    RETVAL = newSVpvn(buf, strlen(buf));
+    FREEMEM(buf);
 OUTPUT: RETVAL
 
 void

http://git-wip-us.apache.org/repos/asf/lucy/blob/04f339b6/clownfish/compiler/src/CFCBindClass.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindClass.c b/clownfish/compiler/src/CFCBindClass.c
index 50d9141..a053e5c 100644
--- a/clownfish/compiler/src/CFCBindClass.c
+++ b/clownfish/compiler/src/CFCBindClass.c
@@ -262,21 +262,16 @@ CFCBindClass_to_c_data(CFCBindClass *self) {
 
     for (int meth_num = 0; methods[meth_num] != NULL; meth_num++) {
         CFCMethod *method = methods[meth_num];
-        size_t off_sym_size 
-            = CFCMethod_full_offset_sym(method, client, NULL, 0);
-        char *full_offset_sym = (char*)MALLOCATE(off_sym_size);
-        CFCMethod_full_offset_sym(method, client, full_offset_sym,
-                                  off_sym_size);
-        char meth_num_str[20];
-        sprintf(meth_num_str, "%d", meth_num);
-
+        char *full_offset_sym = CFCMethod_full_offset_sym(method, client);
         // Create offset in bytes for the method from the top of the VTable
         // object.
-        offsets = CFCUtil_cat(offsets, "size_t ", full_offset_sym, " = ",
-                              "offsetof(cfish_VTable, method_ptrs) + ",
-                              meth_num_str, " * sizeof(cfish_method_t);\n",
-                              NULL);
+        const char pattern[] =
+            "size_t %s = offsetof(cfish_VTable, method_ptrs)"
+            " + %d * sizeof(cfish_method_t);\n";
+        char *offset = CFCUtil_sprintf(pattern, full_offset_sym, meth_num);
+        offsets = CFCUtil_cat(offsets, offset, NULL);
         FREEMEM(full_offset_sym);
+        FREEMEM(offset);
     }
 
     if (fresh_methods[0] != NULL) {
@@ -562,31 +557,26 @@ S_short_names(CFCBindClass *self) {
         CFCMethod  **methods = CFCClass_methods(client);
         for (int i = 0; methods[i] != NULL; i++) {
             CFCMethod *meth = methods[i];
+            static const char pattern[] = "  #define %s %s\n";
 
             // Method invocation symbols.
-            size_t size = CFCMethod_short_method_sym(meth, client, NULL, 0);
-            char *short_sym = (char*)MALLOCATE(size);
-            CFCMethod_short_method_sym(meth, client, short_sym, size);
-            size = CFCMethod_full_method_sym(meth, client, NULL, 0);
-            char *full_sym = (char*)MALLOCATE(size);
-            CFCMethod_full_method_sym(meth, client, full_sym, size);
-            short_names = CFCUtil_cat(short_names, "  #define ", short_sym,
-                                      " ", full_sym, "\n", NULL);
+            char *short_sym  = CFCMethod_short_method_sym(meth, client);
+            char *full_sym   = CFCMethod_full_method_sym(meth, client);
+            char *define_sym = CFCUtil_sprintf(pattern, short_sym, full_sym);
+            short_names = CFCUtil_cat(short_names, define_sym, NULL);
             FREEMEM(short_sym);
             FREEMEM(full_sym);
+            FREEMEM(define_sym);
 
             // Method typedefs.
-            size = CFCMethod_short_typedef(meth, client, NULL, 0);
-            char *short_typedef = (char*)MALLOCATE(size);
-            CFCMethod_short_typedef(meth, client, short_typedef, size);
-            size = CFCMethod_full_typedef(meth, client, NULL, 0);
-            char *full_typedef = (char*)MALLOCATE(size);
-            CFCMethod_full_typedef(meth, client, full_typedef, size);
-            short_names = CFCUtil_cat(short_names, "  #define ",
-                                      short_typedef, " ", full_typedef, "\n",
-                                      NULL);
+            char *short_typedef  = CFCMethod_short_typedef(meth, client);
+            char *full_typedef   = CFCMethod_full_typedef(meth, client);
+            char *define_typedef = CFCUtil_sprintf(pattern, short_typedef,
+                                                   full_typedef);
+            short_names = CFCUtil_cat(short_names, define_typedef, NULL);
             FREEMEM(short_typedef);
             FREEMEM(full_typedef);
+            FREEMEM(define_typedef);
         }
     }
     short_names = CFCUtil_cat(short_names, "#endif /* ",

http://git-wip-us.apache.org/repos/asf/lucy/blob/04f339b6/clownfish/compiler/src/CFCBindMethod.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindMethod.c b/clownfish/compiler/src/CFCBindMethod.c
index c9ee631..eec71f1 100644
--- a/clownfish/compiler/src/CFCBindMethod.c
+++ b/clownfish/compiler/src/CFCBindMethod.c
@@ -67,13 +67,8 @@ S_final_method_def(CFCMethod *method, CFCClass *klass) {
     const char *arg_names 
         = CFCParamList_name_list(CFCMethod_get_param_list(method));
 
-    size_t meth_sym_size = CFCMethod_full_method_sym(method, klass, NULL, 0);
-    char *full_meth_sym = (char*)MALLOCATE(meth_sym_size);
-    CFCMethod_full_method_sym(method, klass, full_meth_sym, meth_sym_size);
-    
-    size_t offset_sym_size = CFCMethod_full_offset_sym(method, klass, NULL, 0); 
-    char *full_offset_sym = (char*)MALLOCATE(offset_sym_size);
-    CFCMethod_full_offset_sym(method, klass, full_offset_sym, offset_sym_size);
+    char *full_meth_sym   = CFCMethod_full_method_sym(method, klass);
+    char *full_offset_sym = CFCMethod_full_offset_sym(method, klass);
 
     const char pattern[] =
         "extern size_t %s;\n"
@@ -98,17 +93,9 @@ S_virtual_method_def(CFCMethod *method, CFCClass *klass) {
     const char *visibility = CFCClass_included(klass)
                              ? "CHY_IMPORT" : "CHY_EXPORT";
 
-    size_t meth_sym_size = CFCMethod_full_method_sym(method, klass, NULL, 0);
-    char *full_meth_sym = (char*)MALLOCATE(meth_sym_size);
-    CFCMethod_full_method_sym(method, klass, full_meth_sym, meth_sym_size);
-
-    size_t offset_sym_size = CFCMethod_full_offset_sym(method, klass, NULL, 0);
-    char *full_offset_sym = (char*)MALLOCATE(offset_sym_size);
-    CFCMethod_full_offset_sym(method, klass, full_offset_sym, offset_sym_size);
-
-    size_t full_typedef_size = CFCMethod_full_typedef(method, klass, NULL, 0);
-    char *full_typedef = (char*)MALLOCATE(full_typedef_size);
-    CFCMethod_full_typedef(method, klass, full_typedef, full_typedef_size);
+    char *full_meth_sym   = CFCMethod_full_method_sym(method, klass);
+    char *full_offset_sym = CFCMethod_full_offset_sym(method, klass);
+    char *full_typedef    = CFCMethod_full_typedef(method, klass);
 
     // Prepare parameter lists, minus invoker.  The invoker gets forced to
     // "self" later.
@@ -151,11 +138,7 @@ char*
 CFCBindMeth_typedef_dec(struct CFCMethod *method, CFCClass *klass) {
     const char *params = CFCParamList_to_c(CFCMethod_get_param_list(method));
     const char *ret_type = CFCType_to_c(CFCMethod_get_return_type(method));
-
-    size_t full_typedef_size = CFCMethod_full_typedef(method, klass, NULL, 0);
-    char *full_typedef = (char*)MALLOCATE(full_typedef_size);
-    CFCMethod_full_typedef(method, klass, full_typedef, full_typedef_size);
-
+    char *full_typedef = CFCMethod_full_typedef(method, klass);
     char *buf = CFCUtil_sprintf("typedef %s\n(*%s)(%s);\n", ret_type,
                                 full_typedef, params);
     FREEMEM(full_typedef);
@@ -173,9 +156,7 @@ CFCBindMeth_spec_def(CFCMethod *method) {
         full_override_sym = CFCMethod_full_override_sym(method);
     }
 
-    size_t offset_sym_size = CFCMethod_full_offset_sym(method, NULL, NULL, 0);
-    char *full_offset_sym = (char*)MALLOCATE(offset_sym_size);
-    CFCMethod_full_offset_sym(method, NULL, full_offset_sym, offset_sym_size);
+    char *full_offset_sym = CFCMethod_full_offset_sym(method, NULL);
 
     char pattern[] =
         "    {\n"

http://git-wip-us.apache.org/repos/asf/lucy/blob/04f339b6/clownfish/compiler/src/CFCDumpable.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCDumpable.c b/clownfish/compiler/src/CFCDumpable.c
index feec89b..14d6204 100644
--- a/clownfish/compiler/src/CFCDumpable.c
+++ b/clownfish/compiler/src/CFCDumpable.c
@@ -165,13 +165,8 @@ S_add_dump_method(CFCClass *klass) {
     const size_t BUF_SIZE = 400;
     char buf[BUF_SIZE];
 
-    size_t full_typedef_size = CFCMethod_full_typedef(method, klass, NULL, 0); 
-    char *full_typedef = (char*)MALLOCATE(full_typedef_size);
-    CFCMethod_full_typedef(method, klass, full_typedef, full_typedef_size);
-
-    size_t full_meth_size = CFCMethod_full_method_sym(method, klass, NULL, 0); 
-    char *full_meth = (char*)MALLOCATE(full_meth_size);
-    CFCMethod_full_method_sym(method, klass, full_meth, full_meth_size);
+    char *full_typedef = CFCMethod_full_typedef(method, klass);
+    char *full_meth    = CFCMethod_full_method_sym(method, klass);
 
     if (parent && CFCClass_has_attribute(parent, "dumpable")) {
         const char pattern[] =
@@ -226,13 +221,8 @@ S_add_load_method(CFCClass *klass) {
     const size_t BUF_SIZE = 400;
     char buf[BUF_SIZE];
 
-    size_t full_typedef_size = CFCMethod_full_typedef(method, klass, NULL, 0); 
-    char *full_typedef = (char*)MALLOCATE(full_typedef_size);
-    CFCMethod_full_typedef(method, klass, full_typedef, full_typedef_size);
-
-    size_t full_meth_size = CFCMethod_full_method_sym(method, klass, NULL, 0); 
-    char *full_meth = (char*)MALLOCATE(full_meth_size);
-    CFCMethod_full_method_sym(method, klass, full_meth, full_meth_size);
+    char *full_typedef = CFCMethod_full_typedef(method, klass);
+    char *full_meth    = CFCMethod_full_method_sym(method, klass);
 
     if (parent && CFCClass_has_attribute(parent, "dumpable")) {
         const char pattern[] =

http://git-wip-us.apache.org/repos/asf/lucy/blob/04f339b6/clownfish/compiler/src/CFCMethod.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCMethod.c b/clownfish/compiler/src/CFCMethod.c
index 329b109..6524a96 100644
--- a/clownfish/compiler/src/CFCMethod.c
+++ b/clownfish/compiler/src/CFCMethod.c
@@ -223,9 +223,8 @@ CFCMethod_finalize(CFCMethod *self) {
     return finalized;
 }
 
-size_t
-CFCMethod_short_method_sym(CFCMethod *self, CFCClass *invoker, char *buf,
-                           size_t buf_size) {
+static char*
+S_short_method_sym(CFCMethod *self, CFCClass *invoker, const char *postfix) {
     const char *cnick;
     if (invoker) {
         cnick = CFCClass_get_cnick(invoker);
@@ -233,16 +232,11 @@ CFCMethod_short_method_sym(CFCMethod *self, CFCClass *invoker, char *buf,
     else {
         cnick = CFCMethod_get_class_cnick(self);
     }
-    size_t needed = strlen(cnick) + 1 + strlen(self->macro_sym) + 1;
-    if (buf_size >= needed) {
-        sprintf(buf, "%s_%s", cnick, self->macro_sym);
-    }
-    return needed;
+    return CFCUtil_sprintf("%s_%s%s", cnick, self->macro_sym, postfix);
 }
 
-size_t
-CFCMethod_full_method_sym(CFCMethod *self, CFCClass *invoker, char *buf,
-                          size_t buf_size) {
+static char*
+S_full_method_sym(CFCMethod *self, CFCClass *invoker, const char *postfix) {
     const char *Prefix;
     const char *cnick;
     if (invoker) {
@@ -253,27 +247,23 @@ CFCMethod_full_method_sym(CFCMethod *self, CFCClass *invoker, char *buf,
         Prefix = CFCMethod_get_Prefix(self);
         cnick  = CFCMethod_get_class_cnick(self);
     }
-    size_t needed = strlen(Prefix)
-                    + strlen(cnick)
-                    + 1
-                    + strlen(self->macro_sym)
-                    + 1;
-    if (buf_size >= needed) {
-        sprintf(buf, "%s%s_%s", Prefix, cnick, self->macro_sym);
-    }
-    return needed;
+    return CFCUtil_sprintf("%s%s_%s%s", Prefix, cnick, self->macro_sym,
+                           postfix);
 }
 
-size_t
-CFCMethod_full_offset_sym(CFCMethod *self, CFCClass *invoker, char *buf,
-                          size_t buf_size) {
-    size_t needed = CFCMethod_full_method_sym(self, invoker, NULL, 0)
-                    + strlen("_OFFSET");
-    if (buf_size >= needed) {
-        CFCMethod_full_method_sym(self, invoker, buf, buf_size);
-        strcat(buf, "_OFFSET");
-    }
-    return needed;
+char*
+CFCMethod_short_method_sym(CFCMethod *self, CFCClass *invoker) {
+    return S_short_method_sym(self, invoker, "");
+}
+
+char*
+CFCMethod_full_method_sym(CFCMethod *self, CFCClass *invoker) {
+    return S_full_method_sym(self, invoker, "");
+}
+
+char*
+CFCMethod_full_offset_sym(CFCMethod *self, CFCClass *invoker) {
+    return S_full_method_sym(self, invoker, "_OFFSET");
 }
 
 const char*
@@ -286,28 +276,14 @@ CFCMethod_micro_sym(CFCMethod *self) {
     return CFCSymbol_micro_sym((CFCSymbol*)self);
 }
 
-size_t
-CFCMethod_short_typedef(CFCMethod *self, CFCClass *invoker, char *buf,
-                        size_t buf_size) {
-    size_t needed = CFCMethod_short_method_sym(self, invoker, NULL, 0)
-                    + strlen("_t");
-    if (buf_size >= needed) {
-        CFCMethod_short_method_sym(self, invoker, buf, buf_size);
-        strcat(buf, "_t");
-    }
-    return needed;
+char*
+CFCMethod_short_typedef(CFCMethod *self, CFCClass *invoker) {
+    return S_short_method_sym(self, invoker, "_t");
 }
 
-size_t
-CFCMethod_full_typedef(CFCMethod *self, CFCClass *invoker, char *buf,
-                       size_t buf_size) {
-    size_t needed = CFCMethod_full_method_sym(self, invoker, NULL, 0)
-                    + strlen("_t");
-    if (buf_size >= needed) {
-        CFCMethod_full_method_sym(self, invoker, buf, buf_size);
-        strcat(buf, "_t");
-    }
-    return needed;
+char*
+CFCMethod_full_typedef(CFCMethod *self, CFCClass *invoker) {
+    return S_full_method_sym(self, invoker, "_t");
 }
 
 const char*

http://git-wip-us.apache.org/repos/asf/lucy/blob/04f339b6/clownfish/compiler/src/CFCMethod.h
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCMethod.h b/clownfish/compiler/src/CFCMethod.h
index d39ac22..b7f01dd 100644
--- a/clownfish/compiler/src/CFCMethod.h
+++ b/clownfish/compiler/src/CFCMethod.h
@@ -110,11 +110,10 @@ CFCMethod_finalize(CFCMethod *self);
  * @param invoker Class for which the symbol is created. If invoker is NULL,
  * use the class where the method is defined.
  *
- * @return the number of bytes which the symbol would occupy.
+ * @return the symbol.
  */
-size_t
-CFCMethod_short_method_sym(CFCMethod *self, struct CFCClass *invoker,
-                           char *buf, size_t buf_size);
+char*
+CFCMethod_short_method_sym(CFCMethod *self, struct CFCClass *invoker);
 
 /**
  * Create the fully-qualified symbol used to invoke the method, e.g.
@@ -122,22 +121,20 @@ CFCMethod_short_method_sym(CFCMethod *self, struct CFCClass *invoker,
  * @param invoker Class for which the symbol is created. If invoker is NULL,
  * use the class where the method is defined.
  *
- * @return the number of bytes which the symbol would occupy.
+ * @return the symbol.
  */
-size_t
-CFCMethod_full_method_sym(CFCMethod *self, struct CFCClass *invoker, char *buf,
-                          size_t buf_size);
+char*
+CFCMethod_full_method_sym(CFCMethod *self, struct CFCClass *invoker);
 
 /** Create the fully qualified name of the variable which stores the method's
  * vtable offset, e.g. "Crust_LobClaw_Pinch_OFFSET".
  * @param invoker Class for which the symbol is created. If invoker is NULL,
  * use the class where the method is defined.
  *
- * @return the number of bytes which the symbol would occupy.
+ * @return the symbol.
  */
-size_t
-CFCMethod_full_offset_sym(CFCMethod *self, struct CFCClass *invoker, char *buf,
-                          size_t buf_size);
+char*
+CFCMethod_full_offset_sym(CFCMethod *self, struct CFCClass *invoker);
 
 const char*
 CFCMethod_get_macro_sym(CFCMethod *self);
@@ -149,21 +146,19 @@ CFCMethod_micro_sym(CFCMethod *self);
  * @param invoker Class for which the symbol is created. If invoker is NULL,
  * use the class where the method is defined.
  *
- * @return the number of bytes which the symbol would occupy.
+ * @return the symbol.
  */
-size_t
-CFCMethod_short_typedef(CFCMethod *self, struct CFCClass *invoker, char *buf,
-                        size_t buf_size);
+char*
+CFCMethod_short_typedef(CFCMethod *self, struct CFCClass *invoker);
 
 /** Create the fully-qualified typedef symbol, e.g. "Crust_Claw_Pinch_t".
  * @param invoker Class for which the symbol is created. If invoker is NULL,
  * use the class where the method is defined.
  *
- * @return the number of bytes which the symbol would occupy.
+ * @return the symbol.
  */
-size_t
-CFCMethod_full_typedef(CFCMethod *self, struct CFCClass *invoker, char *buf,
-                       size_t buf_size);
+char*
+CFCMethod_full_typedef(CFCMethod *self, struct CFCClass *invoker);
 
 /** Returns the fully qualified name of the function which implements the
  * callback to the host in the event that a host method has been defined which

http://git-wip-us.apache.org/repos/asf/lucy/blob/04f339b6/clownfish/compiler/src/CFCPerlMethod.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerlMethod.c b/clownfish/compiler/src/CFCPerlMethod.c
index 0a3de96..10bb9b2 100644
--- a/clownfish/compiler/src/CFCPerlMethod.c
+++ b/clownfish/compiler/src/CFCPerlMethod.c
@@ -168,20 +168,16 @@ S_xsub_body(CFCPerlMethod *self) {
     }
 
     // Extract the method function pointer.
-    size_t typedef_size
-        = CFCMethod_full_typedef(method, klass, NULL, 0);
-    char *full_typedef = (char*)MALLOCATE(typedef_size);
-    CFCMethod_full_typedef(method, klass, full_typedef, typedef_size);
-
-    size_t meth_size
-        = CFCMethod_full_method_sym(method, klass, NULL, 0);
-    char *full_meth = (char*)MALLOCATE(meth_size);
-    CFCMethod_full_method_sym(method, klass, full_meth, meth_size);
-    body = CFCUtil_cat(body, full_typedef, " method = CFISH_METHOD_PTR(",
-                       CFCClass_full_vtable_var(klass), ", ",
-                       full_meth, ");\n    ", NULL);
+    char *full_typedef = CFCMethod_full_typedef(method, klass);
+    char *full_meth    = CFCMethod_full_method_sym(method, klass);
+    char *method_ptr
+        = CFCUtil_sprintf("%s method = CFISH_METHOD_PTR(%s, %s);\n    ",
+                          full_typedef, CFCClass_full_vtable_var(klass),
+                          full_meth);
+    body = CFCUtil_cat(body, method_ptr, NULL);
     FREEMEM(full_typedef);
     FREEMEM(full_meth);
+    FREEMEM(method_ptr);
 
     // Compensate for functions which eat refcounts.
     for (int i = 0; arg_vars[i] != NULL; i++) {
@@ -573,9 +569,7 @@ S_callback_refcount_mods(CFCMethod *method) {
 
 static char*
 S_invalid_callback_def(CFCMethod *method) {
-    size_t meth_sym_size = CFCMethod_full_method_sym(method, NULL, NULL, 0);
-    char *full_method_sym = (char*)MALLOCATE(meth_sym_size);
-    CFCMethod_full_method_sym(method, NULL, full_method_sym, meth_sym_size);
+    char *full_method_sym = CFCMethod_full_method_sym(method, NULL);
 
     const char *override_sym = CFCMethod_full_override_sym(method);
     CFCParamList *param_list = CFCMethod_get_param_list(method);