Stub out callback-generating code for Python.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/8996f0f6 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/8996f0f6 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/8996f0f6 Branch: refs/heads/master Commit: 8996f0f62d0e07ed3b0d14934041aeb9d71fa698 Parents: 514827b Author: Marvin Humphrey <[email protected]> Authored: Wed Jan 27 16:05:37 2016 -0800 Committer: Marvin Humphrey <[email protected]> Committed: Tue Feb 23 18:22:04 2016 -0800 ---------------------------------------------------------------------- compiler/src/CFCPyMethod.c | 38 ++++++++++++++++++++++++++++++++ compiler/src/CFCPyMethod.h | 39 ++++++++++++++++++++++++++++++++ compiler/src/CFCPython.c | 49 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 125 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/8996f0f6/compiler/src/CFCPyMethod.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCPyMethod.c b/compiler/src/CFCPyMethod.c new file mode 100644 index 0000000..2892b86 --- /dev/null +++ b/compiler/src/CFCPyMethod.c @@ -0,0 +1,38 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "CFCPyMethod.h" +#include "CFCPyTypeMap.h" +#include "CFCUtil.h" +#include "CFCClass.h" +#include "CFCFunction.h" +#include "CFCMethod.h" +#include "CFCSymbol.h" +#include "CFCType.h" +#include "CFCParcel.h" +#include "CFCParamList.h" +#include "CFCVariable.h" + +#ifndef true +#define true 1 +#define false 0 +#endif + +char* +CFCPyMethod_callback_def(CFCMethod *method, CFCClass *invoker) { + return CFCUtil_strdup(""); +} http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/8996f0f6/compiler/src/CFCPyMethod.h ---------------------------------------------------------------------- diff --git a/compiler/src/CFCPyMethod.h b/compiler/src/CFCPyMethod.h new file mode 100644 index 0000000..15fa1e6 --- /dev/null +++ b/compiler/src/CFCPyMethod.h @@ -0,0 +1,39 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef H_CFCPYMETHOD +#define H_CFCPYMETHOD + +#ifdef __cplusplus +extern "C" { +#endif + +struct CFCMethod; +struct CFCClass; + +/** Return C code which knows how to call back into Python for this method. This + * code is run when a Python subclass has overridden a method in a Clownfish base + * class. + */ +char* +CFCPyMethod_callback_def(struct CFCMethod *method, struct CFCClass *invoker); + +#ifdef __cplusplus +} +#endif + +#endif /* H_CFCPYMETHOD */ + http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/8996f0f6/compiler/src/CFCPython.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCPython.c b/compiler/src/CFCPython.c index 3efaa3a..10c9872 100644 --- a/compiler/src/CFCPython.c +++ b/compiler/src/CFCPython.c @@ -24,6 +24,7 @@ #define CFC_NEED_BASE_STRUCT_DEF #include "CFCBase.h" #include "CFCPython.h" +#include "CFCPyMethod.h" #include "CFCParcel.h" #include "CFCClass.h" #include "CFCMethod.h" @@ -108,6 +109,48 @@ S_write_hostdefs(CFCPython *self) { FREEMEM(content); } +static char* +S_gen_callbacks(CFCPython *self, CFCParcel *parcel, CFCClass **ordered) { + char *callbacks = CFCUtil_strdup(""); + + // Generate implementation files containing callback definitions. + for (size_t i = 0; ordered[i] != NULL; i++) { + CFCClass *klass = ordered[i]; + if (CFCClass_included(klass) + || CFCClass_inert(klass) + //|| CFCClass_get_parcel(klass) != parcel + ) { + continue; + } + + CFCMethod **fresh_methods = CFCClass_fresh_methods(klass); + for (int meth_num = 0; fresh_methods[meth_num] != NULL; meth_num++) { + CFCMethod *method = fresh_methods[meth_num]; + + // Define callback. + if (CFCMethod_novel(method) && !CFCMethod_final(method)) { + char *cb_def = CFCPyMethod_callback_def(method, klass); + callbacks = CFCUtil_cat(callbacks, cb_def, "\n", NULL); + FREEMEM(cb_def); + } + } + } + + static const char helpers[] = + "" + ; + + static const char pattern[] = + "%s\n" + "\n" + "%s" + ; + char *content = CFCUtil_sprintf(pattern, helpers, callbacks); + + FREEMEM(callbacks); + return content; +} + static void S_write_module_file(CFCPython *self, CFCParcel *parcel, const char *dest) { const char *parcel_name = CFCParcel_get_name(parcel); @@ -127,6 +170,7 @@ S_write_module_file(CFCPython *self, CFCParcel *parcel, const char *dest) { CFCClass **ordered = CFCHierarchy_ordered_classes(self->hierarchy); CFCParcel **parcels = CFCParcel_all_parcels(); + char *callbacks = S_gen_callbacks(self, parcel, ordered); char *pound_includes = CFCUtil_strdup(""); for (size_t i = 0; ordered[i] != NULL; i++) { @@ -146,6 +190,8 @@ S_write_module_file(CFCPython *self, CFCParcel *parcel, const char *dest) { "#include \"CFBind.h\"\n" "%s\n" "\n" + "%s\n" // callbacks + "\n" "static PyModuleDef module_def = {\n" " PyModuleDef_HEAD_INIT,\n" " \"%s\",\n" // module name @@ -164,7 +210,7 @@ S_write_module_file(CFCPython *self, CFCParcel *parcel, const char *dest) { "\n"; char *content - = CFCUtil_sprintf(pattern, self->header, pound_includes, + = CFCUtil_sprintf(pattern, self->header, pound_includes, callbacks, helper_mod_name, last_component, self->footer); char *filepath = CFCUtil_sprintf("%s" CHY_DIR_SEP "_%s.c", dest, @@ -176,6 +222,7 @@ S_write_module_file(CFCPython *self, CFCParcel *parcel, const char *dest) { FREEMEM(helper_mod_name); FREEMEM(pymod_name); FREEMEM(pound_includes); + FREEMEM(callbacks); FREEMEM(ordered); }
