You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2012/11/14 03:22:12 UTC
[lucy-commits] [7/7] git commit: refs/heads/master - Have host language write
callbacks.
Have host language write callbacks.
In anticiption of having callback wrappers access the host language C
API directly, give responsibility for writing out the callback code to
the host language binding.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/17b608b6
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/17b608b6
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/17b608b6
Branch: refs/heads/master
Commit: 17b608b676bb1f58ccdeb7488fa373e2b06b63dc
Parents: b407d11
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Fri Nov 9 16:48:18 2012 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Tue Nov 13 17:16:42 2012 -0800
----------------------------------------------------------------------
clownfish/compiler/perl/lib/Clownfish/CFC.xs | 6 ++
.../compiler/perl/lib/Clownfish/CFC/Perl/Build.pm | 1 +
clownfish/compiler/src/CFCBindClass.c | 8 +-
clownfish/compiler/src/CFCBindMethod.c | 21 +++++
clownfish/compiler/src/CFCBindMethod.h | 5 +
clownfish/compiler/src/CFCPerl.c | 60 +++++++++++++++
clownfish/compiler/src/CFCPerl.h | 5 +
7 files changed, 102 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/17b608b6/clownfish/compiler/perl/lib/Clownfish/CFC.xs
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/lib/Clownfish/CFC.xs b/clownfish/compiler/perl/lib/Clownfish/CFC.xs
index f1e834a..fd7012e 100644
--- a/clownfish/compiler/perl/lib/Clownfish/CFC.xs
+++ b/clownfish/compiler/perl/lib/Clownfish/CFC.xs
@@ -1928,6 +1928,12 @@ PPCODE:
CFCPerl_write_bindings(self);
void
+write_callbacks(self)
+ CFCPerl *self;
+PPCODE:
+ CFCPerl_write_callbacks(self);
+
+void
write_xs_typemap(self)
CFCPerl *self;
PPCODE:
http://git-wip-us.apache.org/repos/asf/lucy/blob/17b608b6/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build.pm
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build.pm b/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build.pm
index 099838f..b0fe049 100644
--- a/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build.pm
+++ b/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build.pm
@@ -322,6 +322,7 @@ sub ACTION_clownfish {
if ($modified) {
$self->add_to_cleanup($xs_filepath);
+ $perl_binding->write_callbacks;
$perl_binding->write_boot;
$perl_binding->write_bindings;
$self->_write_pod($perl_binding);
http://git-wip-us.apache.org/repos/asf/lucy/blob/17b608b6/clownfish/compiler/src/CFCBindClass.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindClass.c b/clownfish/compiler/src/CFCBindClass.c
index 03949d7..1eb2560 100644
--- a/clownfish/compiler/src/CFCBindClass.c
+++ b/clownfish/compiler/src/CFCBindClass.c
@@ -320,12 +320,12 @@ CFCBindClass_to_c_data(CFCBindClass *self) {
FREEMEM(method_def);
}
- // Define callback.
+ // Declare (but don't define) callback.
if ((CFCMethod_public(method) || CFCMethod_abstract(method))
&& CFCMethod_novel(method)) {
- char *cb_def = CFCBindMeth_callback_def(method);
- cb_funcs = CFCUtil_cat(cb_funcs, cb_def, "\n", NULL);
- FREEMEM(cb_def);
+ char *cb_dec = CFCBindMeth_callback_dec(method);
+ cb_funcs = CFCUtil_cat(cb_funcs, cb_dec, "\n", NULL);
+ FREEMEM(cb_dec);
}
// Define MethodSpec struct.
http://git-wip-us.apache.org/repos/asf/lucy/blob/17b608b6/clownfish/compiler/src/CFCBindMethod.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindMethod.c b/clownfish/compiler/src/CFCBindMethod.c
index 02ea167..68ba38a 100644
--- a/clownfish/compiler/src/CFCBindMethod.c
+++ b/clownfish/compiler/src/CFCBindMethod.c
@@ -336,6 +336,27 @@ 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";
+ size_t size = sizeof(pattern)
+ + strlen(ret_type_str)
+ + strlen(override_sym)
+ + strlen(params);
+
+ char *callback_dec = (char*)MALLOCATE(size);
+ sprintf(callback_dec, pattern, ret_type_str, override_sym, params);
+
+ return callback_dec;
+}
+
+char*
CFCBindMeth_callback_def(CFCMethod *method) {
CFCType *return_type = CFCMethod_get_return_type(method);
char *params = S_callback_params(method);
http://git-wip-us.apache.org/repos/asf/lucy/blob/17b608b6/clownfish/compiler/src/CFCBindMethod.h
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindMethod.h b/clownfish/compiler/src/CFCBindMethod.h
index 56956d6..fc15c4f 100644
--- a/clownfish/compiler/src/CFCBindMethod.h
+++ b/clownfish/compiler/src/CFCBindMethod.h
@@ -57,6 +57,11 @@ CFCBindMeth_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 implementing a callback to the Host for this method. This
* code is used when a Host method has overridden a method in a Clownfish
* class.
http://git-wip-us.apache.org/repos/asf/lucy/blob/17b608b6/clownfish/compiler/src/CFCPerl.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerl.c b/clownfish/compiler/src/CFCPerl.c
index 52d5cbe..5c28f07 100644
--- a/clownfish/compiler/src/CFCPerl.c
+++ b/clownfish/compiler/src/CFCPerl.c
@@ -22,8 +22,10 @@
#include "CFCPerl.h"
#include "CFCParcel.h"
#include "CFCClass.h"
+#include "CFCMethod.h"
#include "CFCHierarchy.h"
#include "CFCUtil.h"
+#include "CFCBindMethod.h"
#include "CFCPerlClass.h"
#include "CFCPerlSub.h"
#include "CFCPerlConstructor.h"
@@ -497,6 +499,64 @@ CFCPerl_write_bindings(CFCPerl *self) {
}
void
+CFCPerl_write_callbacks(CFCPerl *self) {
+ CFCClass **ordered = CFCHierarchy_ordered_classes(self->hierarchy);
+ static const char start[] =
+ "/* DO NOT EDIT!!!! This is an auto-generated file. */\n"
+ "\n"
+ "/* Licensed to the Apache Software Foundation (ASF) under one or more\n"
+ " * contributor license agreements. See the NOTICE file distributed with\n"
+ " * this work for additional information regarding copyright ownership.\n"
+ " * The ASF licenses this file to You under the Apache License, Version 2.0\n"
+ " * (the \"License\"); you may not use this file except in compliance with\n"
+ " * the License. You may obtain a copy of the License at\n"
+ " *\n"
+ " * http://www.apache.org/licenses/LICENSE-2.0\n"
+ " *\n"
+ " * Unless required by applicable law or agreed to in writing, software\n"
+ " * distributed under the License is distributed on an \"AS IS\" BASIS,\n"
+ " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"
+ " * See the License for the specific language governing permissions and\n"
+ " * limitations under the License.\n"
+ " */\n"
+ "\n"
+ "#include \"XSBind.h\"\n"
+ "#include \"parcel.h\"\n"
+ "#include \"Clownfish/Host.h\"\n"
+ "\n";
+ char *content = CFCUtil_strdup(start);
+
+ for (size_t i = 0; ordered[i] != NULL; i++) {
+ CFCClass *klass = ordered[i];
+ if (CFCClass_inert(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];
+
+ // Define callback.
+ if ((CFCMethod_public(method) || CFCMethod_abstract(method))
+ && CFCMethod_novel(method)) {
+ char *cb_def = CFCBindMeth_callback_def(method);
+ content = CFCUtil_cat(content, cb_def, "\n", NULL);
+ FREEMEM(cb_def);
+ }
+ }
+ FREEMEM(fresh_methods);
+ }
+
+ // Write if changed.
+ const char *src_dest = CFCHierarchy_get_source_dest(self->hierarchy);
+ char *filepath = CFCUtil_cat(CFCUtil_strdup(""), src_dest,
+ CFCUTIL_PATH_SEP, "callbacks.c", NULL);
+ CFCUtil_write_if_changed(filepath, content, strlen(content));
+
+ FREEMEM(filepath);
+ FREEMEM(content);
+ FREEMEM(ordered);
+}
+
+void
CFCPerl_write_xs_typemap(CFCPerl *self) {
CFCPerlTypeMap_write_xs_typemap(self->hierarchy);
}
http://git-wip-us.apache.org/repos/asf/lucy/blob/17b608b6/clownfish/compiler/src/CFCPerl.h
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerl.h b/clownfish/compiler/src/CFCPerl.h
index 6ea3778..8dfb61f 100644
--- a/clownfish/compiler/src/CFCPerl.h
+++ b/clownfish/compiler/src/CFCPerl.h
@@ -98,6 +98,11 @@ CFCPerl_write_boot(CFCPerl *self);
void
CFCPerl_write_bindings(CFCPerl *self);
+/** Generate routines which call back from C into Perl for all methods.
+ */
+void
+CFCPerl_write_callbacks(CFCPerl *self);
+
/** Generate the "typemap" file needed by the XS compiler.
*/
void