Generate OVERRIDEs for non-overrideable meths. Generate error-throwing OVERRIDE routines for methods which cannot be overridden.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/02617ac0 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/02617ac0 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/02617ac0 Branch: refs/heads/master Commit: 02617ac057b70a2358233d9f65fb205123b308e1 Parents: 91622db Author: Marvin Humphrey <[email protected]> Authored: Wed Jan 27 19:14:25 2016 -0800 Committer: Marvin Humphrey <[email protected]> Committed: Tue Feb 23 18:22:05 2016 -0800 ---------------------------------------------------------------------- compiler/src/CFCPyMethod.c | 76 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/02617ac0/compiler/src/CFCPyMethod.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCPyMethod.c b/compiler/src/CFCPyMethod.c index 2892b86..3cc7b96 100644 --- a/compiler/src/CFCPyMethod.c +++ b/compiler/src/CFCPyMethod.c @@ -14,6 +14,7 @@ * limitations under the License. */ +#include <string.h> #include "CFCPyMethod.h" #include "CFCPyTypeMap.h" @@ -32,7 +33,80 @@ #define false 0 #endif +/* Take a NULL-terminated list of CFCVariables and build up a string of + * directives like: + * + * UNUSED_VAR(var1); + * UNUSED_VAR(var2); + */ +static char* +S_build_unused_vars(CFCVariable **vars); + +/* Create an unreachable return statement if necessary, in order to thwart + * compiler warnings. */ +static char* +S_maybe_unreachable(CFCType *return_type); + char* CFCPyMethod_callback_def(CFCMethod *method, CFCClass *invoker) { - return CFCUtil_strdup(""); + CFCParamList *param_list = CFCMethod_get_param_list(method); + CFCVariable **vars = CFCParamList_get_variables(param_list); + CFCType *return_type = CFCMethod_get_return_type(method); + const char *ret_type_str = CFCType_to_c(return_type); + const char *params = CFCParamList_to_c(param_list); + char *override_sym = CFCMethod_full_override_sym(method, invoker); + char *content; + + //if (CFCMethod_can_be_bound(method)) { + if (false) { + } + else { + char *unused = S_build_unused_vars(vars); + char *unreachable = S_maybe_unreachable(return_type); + char *meth_sym = CFCMethod_full_method_sym(method, invoker); + const char pattern[] = + "%s\n" + "%s(%s) {%s\n" + " CFISH_THROW(CFISH_ERR, \"Can't override %s via binding\");%s\n" + "}\n"; + content = CFCUtil_sprintf(pattern, ret_type_str, override_sym, + params, unused, meth_sym, unreachable); + FREEMEM(meth_sym); + FREEMEM(unused); + FREEMEM(unreachable); + } + + FREEMEM(override_sym); + return content; } + +static char* +S_build_unused_vars(CFCVariable **vars) { + char *unused = CFCUtil_strdup(""); + + for (int i = 0; vars[i] != NULL; i++) { + const char *var_name = CFCVariable_get_name(vars[i]); + size_t size = strlen(unused) + strlen(var_name) + 80; + unused = (char*)REALLOCATE(unused, size); + strcat(unused, "\n CFISH_UNUSED_VAR("); + strcat(unused, var_name); + strcat(unused, ");"); + } + + return unused; +} + +static char* +S_maybe_unreachable(CFCType *return_type) { + char *return_statement; + if (CFCType_is_void(return_type)) { + return_statement = CFCUtil_strdup(""); + } + else { + const char *ret_type_str = CFCType_to_c(return_type); + char pattern[] = "\n CFISH_UNREACHABLE_RETURN(%s);"; + return_statement = CFCUtil_sprintf(pattern, ret_type_str); + } + return return_statement; +} +
