You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2015/01/05 00:33:50 UTC
[6/8] lucy-clownfish git commit: Move code to generate Perl callback
declarations
Move code to generate Perl callback declarations
The original reason to have the code that generates callback declarations
in the CFCBind* classes was to allow reuse by other host languages. In
order to remove unneeded parameters for invalid callbacks, it's necessary
to move the code to the CFCPerl* classes.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/c64e94db
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/c64e94db
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/c64e94db
Branch: refs/heads/optimize_autogen
Commit: c64e94dbcd5104136de247b7818d0c14fc172f87
Parents: cd8f180
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sun Jan 4 23:11:45 2015 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Mon Jan 5 00:30:22 2015 +0100
----------------------------------------------------------------------
compiler/src/CFCBindClass.c | 21 ----------
compiler/src/CFCBindClass.h | 5 ---
compiler/src/CFCBindCore.c | 65 -------------------------------
compiler/src/CFCBindCore.h | 6 ---
compiler/src/CFCBindMethod.c | 16 --------
compiler/src/CFCBindMethod.h | 5 ---
compiler/src/CFCPerl.c | 80 ++++++++++++++++++++++++++++++++++++---
compiler/src/CFCPerlMethod.c | 16 ++++++++
compiler/src/CFCPerlMethod.h | 5 +++
9 files changed, 96 insertions(+), 123 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c64e94db/compiler/src/CFCBindClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCBindClass.c b/compiler/src/CFCBindClass.c
index 4900111..2de2bd3 100644
--- a/compiler/src/CFCBindClass.c
+++ b/compiler/src/CFCBindClass.c
@@ -562,27 +562,6 @@ CFCBindClass_spec_def(CFCBindClass *self) {
return code;
}
-// Declare host callbacks.
-char*
-CFCBindClass_callback_decs(CFCBindClass *self) {
- CFCClass *client = self->client;
- CFCMethod **fresh_methods = CFCClass_fresh_methods(client);
- char *cb_decs = CFCUtil_strdup("");
-
- for (int meth_num = 0; fresh_methods[meth_num] != NULL; meth_num++) {
- CFCMethod *method = fresh_methods[meth_num];
-
- // Declare callback.
- if (CFCMethod_novel(method) && !CFCMethod_final(method)) {
- char *cb_dec = CFCBindMeth_callback_dec(method);
- cb_decs = CFCUtil_cat(cb_decs, cb_dec, "\n", NULL);
- FREEMEM(cb_dec);
- }
- }
-
- return cb_decs;
-}
-
// Declare typedefs for every method, to ease casting.
static char*
S_method_typedefs(CFCBindClass *self) {
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c64e94db/compiler/src/CFCBindClass.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCBindClass.h b/compiler/src/CFCBindClass.h
index 7dd915a..c915c65 100644
--- a/compiler/src/CFCBindClass.h
+++ b/compiler/src/CFCBindClass.h
@@ -59,11 +59,6 @@ CFCBindClass_to_c_data(CFCBindClass *self);
char*
CFCBindClass_spec_def(CFCBindClass *self);
-/* Return the declarations of the host callbacks of this class.
- */
-char*
-CFCBindClass_callback_decs(CFCBindClass *self);
-
#ifdef __cplusplus
}
#endif
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c64e94db/compiler/src/CFCBindCore.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCBindCore.c b/compiler/src/CFCBindCore.c
index c6adf01..2bf6119 100644
--- a/compiler/src/CFCBindCore.c
+++ b/compiler/src/CFCBindCore.c
@@ -493,71 +493,6 @@ S_write_parcel_c(CFCBindCore *self, CFCParcel *parcel) {
FREEMEM(file_content);
}
-/* Write the "callbacks.h" header file, which contains declarations of host
- * callbacks.
- */
-void
-CFCBindCore_write_callbacks_h(CFCBindCore *self) {
- CFCHierarchy *hierarchy = self->hierarchy;
- CFCClass **ordered = CFCHierarchy_ordered_classes(hierarchy);
- char *includes = CFCUtil_strdup("");
- char *all_cb_decs = CFCUtil_strdup("");
-
- for (int i = 0; ordered[i] != NULL; i++) {
- CFCClass *klass = ordered[i];
-
- const char *include_h = CFCClass_include_h(klass);
- includes = CFCUtil_cat(includes, "#include \"", include_h, "\"\n",
- NULL);
-
- if (!CFCClass_included(klass)) {
- CFCBindClass *class_binding = CFCBindClass_new(klass);
- char *cb_decs = CFCBindClass_callback_decs(class_binding);
- all_cb_decs = CFCUtil_cat(all_cb_decs, cb_decs, NULL);
- FREEMEM(cb_decs);
- CFCBase_decref((CFCBase*)class_binding);
- }
- }
-
- FREEMEM(ordered);
-
- const char pattern[] =
- "%s\n"
- "#ifndef CFCCALLBACKS_H\n"
- "#define CFCCALLBACKS_H 1\n"
- "\n"
- "#ifdef __cplusplus\n"
- "extern \"C\" {\n"
- "#endif\n"
- "\n"
- "%s"
- "\n"
- "%s"
- "\n"
- "#ifdef __cplusplus\n"
- "}\n"
- "#endif\n"
- "\n"
- "#endif /* CFCCALLBACKS_H */\n"
- "\n"
- "%s\n"
- "\n";
- char *file_content
- = CFCUtil_sprintf(pattern, self->c_header, includes, all_cb_decs,
- self->c_footer);
-
- // Unlink then write file.
- const char *inc_dest = CFCHierarchy_get_include_dest(hierarchy);
- char *filepath = CFCUtil_sprintf("%s" CHY_DIR_SEP "callbacks.h", inc_dest);
- remove(filepath);
- CFCUtil_write_file(filepath, file_content, strlen(file_content));
- FREEMEM(filepath);
-
- FREEMEM(includes);
- FREEMEM(all_cb_decs);
- FREEMEM(file_content);
-}
-
/* Write the "cfish_platform.h" header file, which contains platform-specific
* definitions.
*/
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c64e94db/compiler/src/CFCBindCore.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCBindCore.h b/compiler/src/CFCBindCore.h
index f6389d7..04392ef 100644
--- a/compiler/src/CFCBindCore.h
+++ b/compiler/src/CFCBindCore.h
@@ -57,12 +57,6 @@ CFCBindCore_destroy(CFCBindCore *self);
int
CFCBindCore_write_all_modified(CFCBindCore *self, int modified);
-/** Write the "callbacks.h" header file, which contains declarations of host
- * callbacks.
- */
-void
-CFCBindCore_write_callbacks_h(CFCBindCore *self);
-
#ifdef __cplusplus
}
#endif
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c64e94db/compiler/src/CFCBindMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCBindMethod.c b/compiler/src/CFCBindMethod.c
index 0aec672..e907332 100644
--- a/compiler/src/CFCBindMethod.c
+++ b/compiler/src/CFCBindMethod.c
@@ -223,22 +223,6 @@ CFCBindMeth_abstract_method_def(CFCMethod *method) {
}
char*
-CFCBindMeth_callback_dec(CFCMethod *method) {
- CFCType *return_type = CFCMethod_get_return_type(method);
- const char *ret_type_str = CFCType_to_c(return_type);
- const char *override_sym = CFCMethod_full_override_sym(method);
- const char *params = CFCParamList_to_c(CFCMethod_get_param_list(method));
-
- char pattern[] =
- "%s\n"
- "%s(%s);\n";
- char *callback_dec
- = CFCUtil_sprintf(pattern, ret_type_str, override_sym, params);
-
- return callback_dec;
-}
-
-char*
CFCBindMeth_imp_declaration(CFCMethod *method) {
CFCType *return_type = CFCMethod_get_return_type(method);
CFCParamList *param_list = CFCMethod_get_param_list(method);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c64e94db/compiler/src/CFCBindMethod.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCBindMethod.h b/compiler/src/CFCBindMethod.h
index 2f837cb..624a958 100644
--- a/compiler/src/CFCBindMethod.h
+++ b/compiler/src/CFCBindMethod.h
@@ -71,11 +71,6 @@ CFCBindMeth_inherited_spec_def(struct CFCMethod *method,
char*
CFCBindMeth_abstract_method_def(struct CFCMethod *method);
-/** Return C code declaring a callback to the Host for this method.
- */
-char*
-CFCBindMeth_callback_dec(struct CFCMethod *method);
-
/** Return C code declaring the function which implements a method.
*/
char*
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c64e94db/compiler/src/CFCPerl.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerl.c b/compiler/src/CFCPerl.c
index deefc1a..ca0af64 100644
--- a/compiler/src/CFCPerl.c
+++ b/compiler/src/CFCPerl.c
@@ -54,6 +54,9 @@ static void
S_replace_double_colons(char *text, char replacement);
static void
+S_write_callbacks_h(CFCPerl *self);
+
+static void
S_write_callbacks_c(CFCPerl *self);
static const CFCMeta CFCPERL_META = {
@@ -503,14 +506,81 @@ CFCPerl_write_bindings(CFCPerl *self) {
void
CFCPerl_write_callbacks(CFCPerl *self) {
- CFCBindCore *core_binding
- = CFCBindCore_new(self->hierarchy, self->header, self->footer);
- CFCBindCore_write_callbacks_h(core_binding);
- CFCBase_decref((CFCBase*)core_binding);
-
+ S_write_callbacks_h(self);
S_write_callbacks_c(self);
}
+/* Write the "callbacks.h" header file, which contains declarations of host
+ * callbacks.
+ */
+static void
+S_write_callbacks_h(CFCPerl *self) {
+ CFCHierarchy *hierarchy = self->hierarchy;
+ CFCClass **ordered = CFCHierarchy_ordered_classes(hierarchy);
+ char *includes = CFCUtil_strdup("");
+ char *cb_decs = CFCUtil_strdup("");
+
+ for (int i = 0; ordered[i] != NULL; i++) {
+ CFCClass *klass = ordered[i];
+
+ const char *include_h = CFCClass_include_h(klass);
+ includes = CFCUtil_cat(includes, "#include \"", include_h, "\"\n",
+ NULL);
+
+ if (CFCClass_included(klass)) { 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];
+
+ // Declare callback.
+ if (CFCMethod_novel(method) && !CFCMethod_final(method)) {
+ char *cb_dec = CFCPerlMethod_callback_dec(method);
+ cb_decs = CFCUtil_cat(cb_decs, cb_dec, "\n", NULL);
+ FREEMEM(cb_dec);
+ }
+ }
+ }
+
+ FREEMEM(ordered);
+
+ const char pattern[] =
+ "%s\n"
+ "#ifndef CFCCALLBACKS_H\n"
+ "#define CFCCALLBACKS_H 1\n"
+ "\n"
+ "#ifdef __cplusplus\n"
+ "extern \"C\" {\n"
+ "#endif\n"
+ "\n"
+ "%s"
+ "\n"
+ "%s"
+ "\n"
+ "#ifdef __cplusplus\n"
+ "}\n"
+ "#endif\n"
+ "\n"
+ "#endif /* CFCCALLBACKS_H */\n"
+ "\n"
+ "%s\n"
+ "\n";
+ char *file_content
+ = CFCUtil_sprintf(pattern, self->c_header, includes, cb_decs,
+ self->c_footer);
+
+ // Unlink then write file.
+ const char *inc_dest = CFCHierarchy_get_include_dest(hierarchy);
+ char *filepath = CFCUtil_sprintf("%s" CHY_DIR_SEP "callbacks.h", inc_dest);
+ remove(filepath);
+ CFCUtil_write_file(filepath, file_content, strlen(file_content));
+ FREEMEM(filepath);
+
+ FREEMEM(includes);
+ FREEMEM(cb_decs);
+ FREEMEM(file_content);
+}
+
static void
S_write_callbacks_c(CFCPerl *self) {
CFCClass **ordered = CFCHierarchy_ordered_classes(self->hierarchy);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c64e94db/compiler/src/CFCPerlMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlMethod.c b/compiler/src/CFCPerlMethod.c
index 0dd7a98..e39878c 100644
--- a/compiler/src/CFCPerlMethod.c
+++ b/compiler/src/CFCPerlMethod.c
@@ -441,6 +441,22 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
}
char*
+CFCPerlMethod_callback_dec(CFCMethod *method) {
+ CFCType *return_type = CFCMethod_get_return_type(method);
+ const char *ret_type_str = CFCType_to_c(return_type);
+ const char *override_sym = CFCMethod_full_override_sym(method);
+ const char *params = CFCParamList_to_c(CFCMethod_get_param_list(method));
+
+ char pattern[] =
+ "%s\n"
+ "%s(%s);\n";
+ char *callback_dec
+ = CFCUtil_sprintf(pattern, ret_type_str, override_sym, params);
+
+ return callback_dec;
+}
+
+char*
CFCPerlMethod_callback_def(CFCMethod *method) {
// Return a callback wrapper that throws an error if there are no
// bindings for a method.
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c64e94db/compiler/src/CFCPerlMethod.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlMethod.h b/compiler/src/CFCPerlMethod.h
index ee85efe..a0fbd83 100644
--- a/compiler/src/CFCPerlMethod.h
+++ b/compiler/src/CFCPerlMethod.h
@@ -62,6 +62,11 @@ CFCPerlMethod_perl_name(struct CFCMethod *method);
char*
CFCPerlMethod_xsub_def(CFCPerlMethod *self);
+/** Return C code declaring a callback to the Host for this method.
+ */
+char*
+CFCPerlMethod_callback_dec(struct CFCMethod *method);
+
/** Return C code implementing a callback to Perl for this method. This code
* is run when a Perl subclass has overridden a method in a Clownfish base
* class.