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 2013/06/14 05:47:39 UTC
[lucy-commits] [1/5] git commit: refs/heads/LUCY-256-thunk-hack1 - Generate a method
aliases file.
Updated Branches:
refs/heads/LUCY-256-thunk-hack1 [created] a665f5aec
Generate a method aliases file.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/e130baf2
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/e130baf2
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/e130baf2
Branch: refs/heads/LUCY-256-thunk-hack1
Commit: e130baf2ff1dd71f2477ec85a2a9fcd3659c48c4
Parents: 2108a96
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Fri Jun 7 17:36:32 2013 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Jun 13 20:25:50 2013 -0700
----------------------------------------------------------------------
clownfish/compiler/src/CFCBindClass.c | 19 +++++++++++++++++++
clownfish/compiler/src/CFCBindClass.h | 5 +++++
clownfish/compiler/src/CFCBindCore.c | 29 +++++++++++++++++++++++++++++
3 files changed, 53 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/e130baf2/clownfish/compiler/src/CFCBindClass.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindClass.c b/clownfish/compiler/src/CFCBindClass.c
index 2cd5efd..690f993 100644
--- a/clownfish/compiler/src/CFCBindClass.c
+++ b/clownfish/compiler/src/CFCBindClass.c
@@ -229,6 +229,25 @@ S_to_c_header_dynamic(CFCBindClass *self) {
}
char*
+CFCBindClass_method_aliases(CFCBindClass *self) {
+ int offset = 56; // offsetof(cfish_VTable, methods)
+ CFCMethod **methods = CFCClass_methods(self->client);
+ char *aliases = CFCUtil_strdup("");
+
+ for (int meth_num = 0; methods[meth_num] != NULL; meth_num++) {
+ offset += 8; // sizeof(void*)
+ CFCMethod *method = methods[meth_num];
+ char *full_meth_sym = CFCMethod_full_method_sym(method, self->client);
+ char *line = CFCUtil_sprintf("_cfish_thunk%d _%s\n", offset,
+ full_meth_sym);
+ aliases = CFCUtil_cat(aliases, line, NULL);
+ FREEMEM(line);
+ FREEMEM(full_meth_sym);
+ }
+ return aliases;
+}
+
+char*
CFCBindClass_to_c_data(CFCBindClass *self) {
CFCClass *client = self->client;
http://git-wip-us.apache.org/repos/asf/lucy/blob/e130baf2/clownfish/compiler/src/CFCBindClass.h
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindClass.h b/clownfish/compiler/src/CFCBindClass.h
index 6cb9347..f443398 100644
--- a/clownfish/compiler/src/CFCBindClass.h
+++ b/clownfish/compiler/src/CFCBindClass.h
@@ -43,6 +43,11 @@ CFCBindClass_init(struct CFCBindClass *self, struct CFCClass *client);
void
CFCBindClass_destroy(CFCBindClass *self);
+/** Return a mapping of method symbols to method thunks, one per line.
+ */
+char*
+CFCBindClass_method_aliases(CFCBindClass *self);
+
/** Return the .h file which contains autogenerated C code defining the
* class's interface: all method invocation functions, etc...
*/
http://git-wip-us.apache.org/repos/asf/lucy/blob/e130baf2/clownfish/compiler/src/CFCBindCore.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindCore.c b/clownfish/compiler/src/CFCBindCore.c
index c1f200e..fff63ef 100644
--- a/clownfish/compiler/src/CFCBindCore.c
+++ b/clownfish/compiler/src/CFCBindCore.c
@@ -127,6 +127,33 @@ CFCBindCore_write_all_modified(CFCBindCore *self, int modified) {
return modified;
}
+static void
+S_write_aliases_txt(CFCBindCore *self, CFCParcel *parcel) {
+ const char *prefix = CFCParcel_get_prefix(parcel);
+ char *file_content = CFCUtil_strdup("");
+ char *typedefs = CFCUtil_strdup("");
+ CFCClass **ordered = CFCHierarchy_ordered_classes(self->hierarchy);
+ for (int i = 0; ordered[i] != NULL; i++) {
+ CFCClass *klass = ordered[i];
+ if (!CFCClass_inert(klass)) {
+ CFCBindClass *class_binding = CFCBindClass_new(klass);
+ char *aliases = CFCBindClass_method_aliases(class_binding);
+ file_content = CFCUtil_cat(file_content, aliases, NULL);
+ FREEMEM(aliases);
+ }
+ }
+ FREEMEM(ordered);
+
+ // Unlink then write file.
+ const char *dest = CFCHierarchy_get_dest(self->hierarchy);
+ char *filepath = CFCUtil_sprintf("%s" CHY_DIR_SEP "%saliases.txt", dest,
+ prefix);
+ remove(filepath);
+ CFCUtil_write_file(filepath, file_content, strlen(file_content));
+ FREEMEM(filepath);
+ FREEMEM(file_content);
+}
+
/* Write the "parcel.h" header file, which contains common symbols needed by
* all classes, plus typedefs for all class structs.
*/
@@ -328,6 +355,8 @@ S_write_parcel_h(CFCBindCore *self, CFCParcel *parcel) {
static void
S_write_parcel_c(CFCBindCore *self, CFCParcel *parcel) {
+ S_write_aliases_txt(self, parcel); // hack
+
CFCHierarchy *hierarchy = self->hierarchy;
const char *prefix = CFCParcel_get_prefix(parcel);
[lucy-commits] [2/5] git commit: refs/heads/LUCY-256-thunk-hack1 - Specify
-alias_list.
Posted by ma...@apache.org.
Specify -alias_list.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/9b52f057
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/9b52f057
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/9b52f057
Branch: refs/heads/LUCY-256-thunk-hack1
Commit: 9b52f057f72bfca6eb82afdb142b9b0d97706f47
Parents: 687b754
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Fri Jun 7 18:14:53 2013 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Jun 13 20:36:06 2013 -0700
----------------------------------------------------------------------
common/charmonizer.c | 2 ++
common/charmonizer.main | 2 ++
perl/Build.PL | 1 +
3 files changed, 5 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/9b52f057/common/charmonizer.c
----------------------------------------------------------------------
diff --git a/common/charmonizer.c b/common/charmonizer.c
index e1bcf8d..fc3cc78 100644
--- a/common/charmonizer.c
+++ b/common/charmonizer.c
@@ -7064,6 +7064,8 @@ S_write_makefile(struct chaz_CLIArgs *args) {
free(scratch);
link_flags = chaz_CC_new_cflags();
+ chaz_CFlags_append(link_flags, "-Wl,-alias_list");
+ chaz_CFlags_append(link_flags, "-Wl,autogen/lucy_aliases.txt");
if (chaz_CC_msvc_version_num()) {
chaz_CFlags_append(link_flags, "/nologo");
}
http://git-wip-us.apache.org/repos/asf/lucy/blob/9b52f057/common/charmonizer.main
----------------------------------------------------------------------
diff --git a/common/charmonizer.main b/common/charmonizer.main
index 6d76c16..51d9007 100644
--- a/common/charmonizer.main
+++ b/common/charmonizer.main
@@ -322,6 +322,8 @@ S_write_makefile(struct chaz_CLIArgs *args) {
free(scratch);
link_flags = chaz_CC_new_cflags();
+ chaz_CFlags_append(link_flags, "-Wl,-alias_list");
+ chaz_CFlags_append(link_flags, "-Wl,autogen/lucy_aliases.txt");
if (chaz_CC_msvc_version_num()) {
chaz_CFlags_append(link_flags, "/nologo");
}
http://git-wip-us.apache.org/repos/asf/lucy/blob/9b52f057/perl/Build.PL
----------------------------------------------------------------------
diff --git a/perl/Build.PL b/perl/Build.PL
index 8c7307a..c225c21 100644
--- a/perl/Build.PL
+++ b/perl/Build.PL
@@ -71,6 +71,7 @@ my $builder = Lucy::Build->new(
extra_compiler_flags => join( ' ', map { "-DCFP_$_" } qw(
CFISH TESTCFISH LUCY TESTLUCY
) ),
+ extra_linker_flags => "-Wl,-alias_list -Wl,autogen/lucy_aliases.txt",
add_to_cleanup => [
qw(
Lucy-*
[lucy-commits] [5/5] git commit: refs/heads/LUCY-256-thunk-hack1 - Change method
invocation to use thunks.
Posted by ma...@apache.org.
Change method invocation to use thunks.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/a665f5ae
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/a665f5ae
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/a665f5ae
Branch: refs/heads/LUCY-256-thunk-hack1
Commit: a665f5aec756e3973e3633770897b10b26cad875
Parents: 2621c29
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Thu Jun 13 20:43:02 2013 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Jun 13 20:43:02 2013 -0700
----------------------------------------------------------------------
clownfish/compiler/src/CFCBindMethod.c | 24 ++++++------------------
1 file changed, 6 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/a665f5ae/clownfish/compiler/src/CFCBindMethod.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindMethod.c b/clownfish/compiler/src/CFCBindMethod.c
index c2214a1..1f12c1c 100644
--- a/clownfish/compiler/src/CFCBindMethod.c
+++ b/clownfish/compiler/src/CFCBindMethod.c
@@ -88,23 +88,16 @@ S_virtual_method_def(CFCMethod *method, CFCClass *klass) {
CFCParamList *param_list = CFCMethod_get_param_list(method);
const char *PREFIX = CFCClass_get_PREFIX(klass);
const char *invoker_struct = CFCClass_full_struct_sym(klass);
- const char *common_struct
- = CFCType_get_specifier(CFCMethod_self_type(method));
char *full_meth_sym = CFCMethod_full_method_sym(method, klass);
char *full_offset_sym = CFCMethod_full_offset_sym(method, klass);
- char *full_typedef = CFCMethod_full_typedef(method, klass);
// Prepare parameter lists, minus invoker. The invoker gets forced to
// "self" later.
if (CFCParamList_variadic(param_list)) {
CFCUtil_die("Variadic methods not supported");
}
- const char *arg_names_minus_invoker = CFCParamList_name_list(param_list);
const char *params_minus_invoker = CFCParamList_to_c(param_list);
- while (*arg_names_minus_invoker && *arg_names_minus_invoker != ',') {
- arg_names_minus_invoker++;
- }
while (*params_minus_invoker && *params_minus_invoker != ',') {
params_minus_invoker++;
}
@@ -116,21 +109,16 @@ S_virtual_method_def(CFCMethod *method, CFCClass *klass) {
const char pattern[] =
"extern %sVISIBLE size_t %s;\n"
- "static CFISH_INLINE %s\n"
- "%s(const %s *self%s) {\n"
- " const %s method = (%s)cfish_obj_method(self, %s);\n"
- " %smethod((%s*)self%s);\n"
- "}\n";
+ "%sVISIBLE %s\n"
+ "%s(const %s *self%s);\n"
+ "\n";
char *method_def
- = CFCUtil_sprintf(pattern, PREFIX, full_offset_sym, ret_type_str,
- full_meth_sym, invoker_struct, params_minus_invoker,
- full_typedef, full_typedef, full_offset_sym,
- maybe_return, common_struct,
- arg_names_minus_invoker);
+ = CFCUtil_sprintf(pattern, PREFIX, full_offset_sym,
+ PREFIX, ret_type_str, full_meth_sym,
+ invoker_struct, params_minus_invoker);
FREEMEM(full_offset_sym);
FREEMEM(full_meth_sym);
- FREEMEM(full_typedef);
return method_def;
}
[lucy-commits] [4/5] git commit: refs/heads/LUCY-256-thunk-hack1 - Add thunk
declarations to parcel headers.
Posted by ma...@apache.org.
Add thunk declarations to parcel headers.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/2621c292
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/2621c292
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/2621c292
Branch: refs/heads/LUCY-256-thunk-hack1
Commit: 2621c292619314be7e15786faf67cd66828dd6ec
Parents: 9b52f05
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Thu Jun 13 20:42:30 2013 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Jun 13 20:42:30 2013 -0700
----------------------------------------------------------------------
clownfish/compiler/src/CFCBindCore.c | 30 ++++++++++++++++++++++++++++--
1 file changed, 28 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/2621c292/clownfish/compiler/src/CFCBindCore.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindCore.c b/clownfish/compiler/src/CFCBindCore.c
index a145a7a..794c5dd 100644
--- a/clownfish/compiler/src/CFCBindCore.c
+++ b/clownfish/compiler/src/CFCBindCore.c
@@ -154,6 +154,26 @@ S_write_aliases_txt(CFCBindCore *self, CFCParcel *parcel) {
FREEMEM(file_content);
}
+static char*
+S_gen_cfish_thunk_declarations() {
+ int offset = 56; // offsetof(cfish_VTable, methods)
+ int max_methods = 256;
+ char *thunks = CFCUtil_strdup("\n");
+ static const char pattern[] =
+ "CFISH_VISIBLE void\n"
+ "cfish_thunk%d(const void *vself);\n"
+ "\n";
+ char buf[sizeof(pattern) + 32];
+
+ for (int i = 0; i < max_methods; i++) {
+ sprintf(buf, pattern, offset);
+ thunks = CFCUtil_cat(thunks, buf, NULL);
+ offset += 8; // sizeof(void*)
+ }
+
+ return thunks;
+}
+
/* Write the "parcel.h" header file, which contains common symbols needed by
* all classes, plus typedefs for all class structs.
*/
@@ -295,6 +315,10 @@ S_write_parcel_h(CFCBindCore *self, CFCParcel *parcel) {
FREEMEM(dep_parcels);
}
+ char *thunk_decs = (strcmp(prefix, "cfish_") == 0)
+ ? S_gen_cfish_thunk_declarations()
+ : CFCUtil_strdup("");
+
const char pattern[] =
"%s\n"
"#ifndef CFISH_%sPARCEL_H\n"
@@ -316,6 +340,7 @@ S_write_parcel_h(CFCBindCore *self, CFCParcel *parcel) {
"%s" // Typedefs.
"\n"
"%s" // Extra definitions.
+ "%s" // Thunk declarations.
"%sVISIBLE void\n"
"%sbootstrap_inheritance();\n"
"\n"
@@ -336,8 +361,8 @@ S_write_parcel_h(CFCBindCore *self, CFCParcel *parcel) {
char *file_content
= CFCUtil_sprintf(pattern, self->header, PREFIX, PREFIX,
extra_includes, privacy_sym, PREFIX, PREFIX,
- typedefs, extra_defs, PREFIX, prefix, PREFIX, prefix,
- prefix, PREFIX, self->footer);
+ typedefs, extra_defs, thunk_decs, PREFIX, prefix,
+ PREFIX, prefix, prefix, PREFIX, self->footer);
// Unlink then write file.
const char *inc_dest = CFCHierarchy_get_include_dest(hierarchy);
@@ -350,6 +375,7 @@ S_write_parcel_h(CFCBindCore *self, CFCParcel *parcel) {
FREEMEM(charmony_defines);
FREEMEM(typedefs);
FREEMEM(extra_includes);
+ FREEMEM(thunk_decs);
FREEMEM(file_content);
}
[lucy-commits] [3/5] git commit: refs/heads/LUCY-256-thunk-hack1 - Generate thunks.
Posted by ma...@apache.org.
Generate thunks.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/687b754f
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/687b754f
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/687b754f
Branch: refs/heads/LUCY-256-thunk-hack1
Commit: 687b754fe835dda01b7c48fb8a0cd60d678e5cfb
Parents: e130baf
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Fri Jun 7 18:14:35 2013 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Jun 13 20:36:06 2013 -0700
----------------------------------------------------------------------
clownfish/compiler/src/CFCBindCore.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/687b754f/clownfish/compiler/src/CFCBindCore.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindCore.c b/clownfish/compiler/src/CFCBindCore.c
index fff63ef..a145a7a 100644
--- a/clownfish/compiler/src/CFCBindCore.c
+++ b/clownfish/compiler/src/CFCBindCore.c
@@ -353,6 +353,30 @@ S_write_parcel_h(CFCBindCore *self, CFCParcel *parcel) {
FREEMEM(file_content);
}
+static char*
+S_gen_cfish_thunks() {
+ int offset = 56; // offsetof(cfish_VTable, methods)
+ int max_methods = 256;
+ char *thunks = CFCUtil_strdup("");
+ static const char pattern[] =
+ "CFISH_VISIBLE void\n"
+ "cfish_thunk%d(const void *vself) {\n"
+ " char *vtable_address = (char*)((cfish_Dummy*)vself)->vtable;\n"
+ " cfish_method_t method = *((cfish_method_t*)(vtable_address + %d));\n"
+ " method(vself);\n"
+ "}\n"
+ "\n";
+ char buf[sizeof(pattern) + 32];
+
+ for (int i = 0; i < max_methods; i++) {
+ sprintf(buf, pattern, offset, offset);
+ thunks = CFCUtil_cat(thunks, buf, NULL);
+ offset += 8; // sizeof(void*)
+ }
+
+ return thunks;
+}
+
static void
S_write_parcel_c(CFCBindCore *self, CFCParcel *parcel) {
S_write_aliases_txt(self, parcel); // hack
@@ -367,6 +391,11 @@ S_write_parcel_c(CFCBindCore *self, CFCParcel *parcel) {
char *vt_specs = CFCUtil_strdup(
"static cfish_VTableSpec vtable_specs[] = {\n");
int num_specs = 0;
+ if (strcmp(prefix, "cfish_") == 0) {
+ char *thunks = S_gen_cfish_thunks();
+ c_data = CFCUtil_cat(c_data, thunks, NULL);
+ FREEMEM(thunks);
+ }
CFCClass **ordered = CFCHierarchy_ordered_classes(hierarchy);
for (int i = 0; ordered[i] != NULL; i++) {
CFCClass *klass = ordered[i];