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];