Repository: lucy-clownfish
Updated Branches:
  refs/heads/master f6960c564 -> 1ea150153


Break out Go return statement code gen.


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

Branch: refs/heads/master
Commit: e655dc21086e1d0cd00b7bf391ab02f61e01e603
Parents: 3764af0
Author: Marvin Humphrey <[email protected]>
Authored: Fri May 22 16:30:57 2015 -0700
Committer: Marvin Humphrey <[email protected]>
Committed: Thu May 28 05:39:50 2015 -0700

----------------------------------------------------------------------
 compiler/src/CFCGoFunc.c   | 46 +++++++++++++++++++++++++++++++++++++++++
 compiler/src/CFCGoFunc.h   | 13 ++++++++++++
 compiler/src/CFCGoMethod.c | 38 ++--------------------------------
 3 files changed, 61 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/e655dc21/compiler/src/CFCGoFunc.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCGoFunc.c b/compiler/src/CFCGoFunc.c
index 59ac1ed..79c129a 100644
--- a/compiler/src/CFCGoFunc.c
+++ b/compiler/src/CFCGoFunc.c
@@ -101,3 +101,49 @@ CFCGoFunc_func_start(CFCParcel *parcel, const char *name, 
CFCClass *invoker,
     return content;
 }
 
+char*
+CFCGoFunc_return_statement(CFCParcel *parcel, CFCType *return_type,
+                           const char *cf_retval) {
+    char *statement = NULL;
+    if (CFCType_is_void(return_type)) {
+        return CFCUtil_strdup("");
+    }
+    else {
+        char *ret_type_str = CFCGoTypeMap_go_type_name(return_type, parcel);
+        if (ret_type_str == NULL) {
+            CFCUtil_die("Can't convert type to Go: %s",
+                        CFCType_to_c(return_type));
+        }
+
+        if (CFCType_is_primitive(return_type)) {
+            statement = CFCUtil_sprintf("\treturn %s(retvalCF)\n", 
ret_type_str);
+        }
+        else if (CFCType_is_object(return_type)) {
+            char *go_type_name = CFCGoTypeMap_go_type_name(return_type, 
parcel);
+            char *struct_name  = go_type_name;
+            char *go_package   = CFCUtil_strdup(go_type_name);
+            for (int i = strlen(go_package) - 1; i >= 0; i--) {
+                if (go_package[i] == '.') {
+                    struct_name += i + 1;
+                    break;
+                }
+                go_package[i] = '\0';
+            }
+            char *pattern;
+            if (CFCType_incremented(return_type)) {
+                pattern = "\treturn %sWRAP%s(unsafe.Pointer(retvalCF))\n";
+            }
+            else {
+                pattern = "\treturn 
%sWRAP%s(unsafe.Pointer(C.cfish_inc_refcount(unsafe.Pointer(retvalCF))))\n";
+            }
+            statement = CFCUtil_sprintf(pattern, go_package, struct_name);
+            FREEMEM(go_type_name);
+            FREEMEM(go_package);
+        }
+        else {
+            CFCUtil_die("Unexpected type: %s", CFCType_to_c(return_type));
+        }
+    }
+
+    return statement;
+}

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/e655dc21/compiler/src/CFCGoFunc.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCGoFunc.h b/compiler/src/CFCGoFunc.h
index a8a47c3..213b550 100644
--- a/compiler/src/CFCGoFunc.h
+++ b/compiler/src/CFCGoFunc.h
@@ -37,6 +37,19 @@ CFCGoFunc_func_start(struct CFCParcel *parcel, const char 
*name,
                      struct CFCParamList *param_list,
                      struct CFCType *return_type, int is_method);
 
+/** Generate a Go return statement which maps from a CGO Clownfish type to a
+ * Go type.
+ *
+ * @param parcel The parcel in which the code is being generated.
+ * @param type The type of return value, which must be convertible.
+ * @param cf_retval A Go expression representing the return value of a
+ * Clownfish subroutine.
+ */
+char*
+CFCGoFunc_return_statement(struct CFCParcel *parcel,
+                           struct CFCType *return_type,
+                           const char *cf_retval);
+
 #ifdef __cplusplus
 }
 #endif

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/e655dc21/compiler/src/CFCGoMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCGoMethod.c b/compiler/src/CFCGoMethod.c
index a6d0496..9626e59 100644
--- a/compiler/src/CFCGoMethod.c
+++ b/compiler/src/CFCGoMethod.c
@@ -199,49 +199,16 @@ CFCGoMethod_func_def(CFCGoMethod *self, CFCClass 
*invoker) {
 
     char *cfargs = S_prep_cfargs(invoker, param_list);
 
-    char *ret_type_str;
     char *maybe_retval;
     char *maybe_return;
     if (CFCType_is_void(ret_type)) {
-        ret_type_str = CFCUtil_strdup("");
         maybe_retval = CFCUtil_strdup("");
         maybe_return = CFCUtil_strdup("");
     }
     else {
-        ret_type_str = CFCGoTypeMap_go_type_name(ret_type, parcel);
-        if (ret_type_str == NULL) {
-            CFCUtil_die("Can't convert invalid type in method %s", name);
-        }
         maybe_retval = CFCUtil_strdup("retvalCF := ");
-
-        if (CFCType_is_primitive(ret_type)) {
-            maybe_return = CFCUtil_sprintf("\treturn %s(retvalCF)\n", 
ret_type_str);
-        }
-        else if (CFCType_is_object(ret_type)) {
-            char *go_type_name = CFCGoTypeMap_go_type_name(ret_type, parcel);
-            char *struct_name  = go_type_name;
-            char *go_package   = CFCUtil_strdup(go_type_name);
-            for (int i = strlen(go_package) - 1; i >= 0; i--) {
-                if (go_package[i] == '.') {
-                    struct_name += i + 1;
-                    break;
-                }
-                go_package[i] = '\0';
-            }
-            char *pattern;
-            if (CFCType_incremented(ret_type)) {
-                pattern = "\treturn %sWRAP%s(unsafe.Pointer(retvalCF))\n";
-            }
-            else {
-                pattern = "\treturn 
%sWRAP%s(unsafe.Pointer(C.cfish_inc_refcount(unsafe.Pointer(retvalCF))))\n";
-            }
-            maybe_return = CFCUtil_sprintf(pattern, go_package, struct_name);
-            FREEMEM(go_type_name);
-            FREEMEM(go_package);
-        }
-        else {
-            CFCUtil_die("Unexpected type: %s", CFCType_to_c(ret_type));
-        }
+        maybe_return = CFCGoFunc_return_statement(parcel, ret_type,
+                                                  "retvalCF");
     }
 
     char pattern[] =
@@ -255,7 +222,6 @@ CFCGoMethod_func_def(CFCGoMethod *self, CFCClass *invoker) {
 
     FREEMEM(maybe_retval);
     FREEMEM(maybe_return);
-    FREEMEM(ret_type_str);
     FREEMEM(cfunc);
     FREEMEM(cfargs);
     FREEMEM(first_line);

Reply via email to