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);
