Use IMP func for final method call from Go. CGO can't deal with macros, and for a final method which is also novel, the method invocation symbol is a macro which resolves to the implementing function. Use the implementing function instead of the macro alias so that CGO doesn't choke.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/160d20ea Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/160d20ea Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/160d20ea Branch: refs/heads/master Commit: 160d20ea26c01d1d39785ed9104d253082b7241a Parents: b30e855 Author: Marvin Humphrey <[email protected]> Authored: Thu Apr 9 19:55:08 2015 -0700 Committer: Marvin Humphrey <[email protected]> Committed: Wed May 6 14:28:16 2015 -0700 ---------------------------------------------------------------------- compiler/src/CFCGoMethod.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/160d20ea/compiler/src/CFCGoMethod.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCGoMethod.c b/compiler/src/CFCGoMethod.c index b15243f..2575153 100644 --- a/compiler/src/CFCGoMethod.c +++ b/compiler/src/CFCGoMethod.c @@ -156,7 +156,13 @@ CFCGoMethod_func_def(CFCGoMethod *self, CFCClass *invoker) { char *name = CFCGoFunc_go_meth_name(CFCMethod_get_macro_sym(novel_method)); char *first_line = CFCGoFunc_func_start(parcel, name, invoker, param_list, ret_type, true); - char *full_meth_sym = CFCMethod_full_method_sym(novel_method, NULL); + char *cfunc; + if (CFCMethod_novel(self->method) && CFCMethod_final(self->method)) { + cfunc = CFCUtil_strdup(CFCMethod_imp_func(self->method)); + } + else { + cfunc = CFCMethod_full_method_sym(novel_method, NULL); + } char *cfargs = S_prep_cfargs(invoker, param_list); @@ -212,11 +218,12 @@ CFCGoMethod_func_def(CFCGoMethod *self, CFCClass *invoker) { "}\n" ; char *content = CFCUtil_sprintf(pattern, first_line, maybe_retval, - full_meth_sym, cfargs, maybe_return); + cfunc, cfargs, maybe_return); FREEMEM(maybe_retval); FREEMEM(maybe_return); FREEMEM(ret_type_str); + FREEMEM(cfunc); FREEMEM(cfargs); FREEMEM(first_line); FREEMEM(name);
