Per-parcel bootstrap code for Perl bindings

Needed to move tests to a separate binary.


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/3c18e2ff
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/3c18e2ff
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/3c18e2ff

Branch: refs/heads/master
Commit: 3c18e2ff00fbd698b6423abca91c86da3d08aaf2
Parents: feb39e8
Author: Nick Wellnhofer <[email protected]>
Authored: Mon May 30 14:17:30 2016 +0200
Committer: Nick Wellnhofer <[email protected]>
Committed: Mon May 30 14:17:30 2016 +0200

----------------------------------------------------------------------
 compiler/src/CFCPerl.c          | 125 +++++++++++++++++------------------
 runtime/common/charmonizer.c    |   3 +-
 runtime/common/charmonizer.main |   3 +-
 3 files changed, 65 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/3c18e2ff/compiler/src/CFCPerl.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerl.c b/compiler/src/CFCPerl.c
index 5272838..284fdc5 100644
--- a/compiler/src/CFCPerl.c
+++ b/compiler/src/CFCPerl.c
@@ -53,7 +53,6 @@ struct CFCPerl {
     char *pod_header;
     char *pod_footer;
     char *xs_path;
-    char *boot_func;
 };
 
 // Modify a string in place, swapping out "::" for the supplied character.
@@ -105,14 +104,6 @@ CFCPerl_init(CFCPerl *self, CFCHierarchy *hierarchy, const 
char *lib_dir,
                                     boot_class);
     S_replace_double_colons(self->xs_path, CHY_DIR_SEP_CHAR);
 
-    // Derive the name of the bootstrap function.
-    self->boot_func = CFCUtil_sprintf("cfish_%s_bootstrap", boot_class);
-    for (int i = 0; self->boot_func[i] != 0; i++) {
-        if (!CFCUtil_isalnum(self->boot_func[i])) {
-            self->boot_func[i] = '_';
-        }
-    }
-
     return self;
 }
 
@@ -128,7 +119,6 @@ CFCPerl_destroy(CFCPerl *self) {
     FREEMEM(self->pod_header);
     FREEMEM(self->pod_footer);
     FREEMEM(self->xs_path);
-    FREEMEM(self->boot_func);
     CFCBase_destroy((CFCBase*)self);
 }
 
@@ -275,14 +265,11 @@ S_write_standalone_pod(CFCPerl *self) {
 }
 
 static void
-S_write_boot_h(CFCPerl *self) {
-    char *guard = CFCUtil_sprintf("%s_BOOT", self->boot_class);
-    S_replace_double_colons(guard, '_');
-    for (char *ptr = guard; *ptr != '\0'; ptr++) {
-        if (CFCUtil_isalpha(*ptr)) {
-            *ptr = CFCUtil_toupper(*ptr);
-        }
-    }
+S_write_boot_h(CFCPerl *self, CFCParcel *parcel) {
+    const char *prefix = CFCParcel_get_prefix(parcel);
+    const char *PREFIX = CFCParcel_get_PREFIX(parcel);
+
+    char *guard = CFCUtil_sprintf("H_%sBOOT", PREFIX);
 
     const char pattern[] = 
         "%s\n"
@@ -295,7 +282,7 @@ S_write_boot_h(CFCPerl *self) {
         "#endif\n"
         "\n"
         "void\n"
-        "%s();\n"
+        "%sbootstrap_perl(void);\n"
         "\n"
         "#ifdef __cplusplus\n"
         "}\n"
@@ -305,11 +292,12 @@ S_write_boot_h(CFCPerl *self) {
         "\n"
         "%s\n";
     char *content
-        = CFCUtil_sprintf(pattern, self->c_header, guard, guard,
-                          self->boot_func, guard, self->c_footer);
+        = CFCUtil_sprintf(pattern, self->c_header, guard, guard, prefix, guard,
+                          self->c_footer);
 
     const char *inc_dest = CFCHierarchy_get_include_dest(self->hierarchy);
-    char *boot_h_path = CFCUtil_sprintf("%s" CHY_DIR_SEP "boot.h", inc_dest);
+    char *boot_h_path = CFCUtil_sprintf("%s" CHY_DIR_SEP "%sboot.h", inc_dest,
+                                        prefix);
     CFCUtil_write_file(boot_h_path, content, strlen(content));
     FREEMEM(boot_h_path);
 
@@ -318,34 +306,21 @@ S_write_boot_h(CFCPerl *self) {
 }
 
 static void
-S_write_boot_c(CFCPerl *self) {
-    CFCClass  **ordered   = CFCHierarchy_ordered_classes(self->hierarchy);
-    CFCParcel **parcels   = CFCParcel_all_parcels();
-    char *pound_includes  = CFCUtil_strdup("");
-    char *bootstrap_code  = CFCUtil_strdup("");
-    char *alias_adds      = CFCUtil_strdup("");
-    char *isa_pushes      = CFCUtil_strdup("");
-
-    for (size_t i = 0; parcels[i]; ++i) {
-        CFCParcel *parcel = parcels[i];
-
-        if (!CFCParcel_included(parcel)) {
-            const char *prefix = CFCParcel_get_prefix(parcel);
-            pound_includes = CFCUtil_cat(pound_includes, "#include \"", prefix,
-                                         "parcel.h\"\n", NULL);
-            bootstrap_code = CFCUtil_cat(bootstrap_code, "    ", prefix,
-                                         "bootstrap_parcel();\n", NULL);
-        }
-    }
+S_write_boot_c(CFCPerl *self, CFCParcel *parcel) {
+    CFCClass **ordered = CFCHierarchy_ordered_classes(self->hierarchy);
+    const char  *prefix         = CFCParcel_get_prefix(parcel);
+    char        *alias_adds     = CFCUtil_strdup("");
+    char        *isa_pushes     = CFCUtil_strdup("");
 
     for (size_t i = 0; ordered[i] != NULL; i++) {
         CFCClass *klass = ordered[i];
-        if (CFCClass_included(klass) || CFCClass_inert(klass)) { continue; }
+        if (CFCClass_inert(klass)) { continue; }
+        const char *class_prefix = CFCClass_get_prefix(klass);
+        if (strcmp(class_prefix, prefix) != 0) { continue; }
 
         const char *class_name = CFCClass_get_name(klass);
 
-        // Add aliases for selected KinoSearch classes which allow old indexes
-        // to be read.
+        // Add class aliases.
         CFCPerlClass *class_binding = CFCPerlClass_singleton(class_name);
         if (class_binding) {
             const char *class_var = CFCClass_full_class_var(klass);
@@ -382,12 +357,11 @@ S_write_boot_c(CFCPerl *self) {
     }
 
     const char pattern[] =
-        "%s\n"
+        "%s"
         "\n"
-        "#include \"boot.h\"\n"
-        "#include \"Clownfish/String.h\"\n"
+        "#include \"%sboot.h\"\n"
+        "#include \"%sparcel.h\"\n"
         "#include \"Clownfish/Class.h\"\n"
-        "%s\n"
         "\n"
         "/* Avoid conflicts with Clownfish bool type. */\n"
         "#define HAS_BOOL\n"
@@ -397,10 +371,9 @@ S_write_boot_c(CFCPerl *self) {
         "#include \"XSUB.h\"\n"
         "\n"
         "void\n"
-        "%s() {\n"
+        "%sbootstrap_perl() {\n"
         "    dTHX;\n"
-        "\n"
-        "%s"
+        "    %sbootstrap_parcel();\n"
         "\n"
         "%s"
         "\n"
@@ -408,23 +381,21 @@ S_write_boot_c(CFCPerl *self) {
         "%s"
         "}\n"
         "\n"
-        "%s\n"
-        "\n";
+        "%s";
     char *content
-        = CFCUtil_sprintf(pattern, self->c_header, pound_includes,
-                          self->boot_func, bootstrap_code, alias_adds,
-                          isa_pushes, self->c_footer);
+        = CFCUtil_sprintf(pattern, self->c_header, prefix, prefix,
+                          prefix, prefix, alias_adds, isa_pushes,
+                          self->c_footer);
 
     const char *src_dest = CFCHierarchy_get_source_dest(self->hierarchy);
-    char *boot_c_path = CFCUtil_sprintf("%s" CHY_DIR_SEP "boot.c", src_dest);
+    char *boot_c_path = CFCUtil_sprintf("%s" CHY_DIR_SEP "%sboot.c", src_dest,
+                                        prefix);
     CFCUtil_write_file(boot_c_path, content, strlen(content));
     FREEMEM(boot_c_path);
 
     FREEMEM(content);
     FREEMEM(isa_pushes);
     FREEMEM(alias_adds);
-    FREEMEM(bootstrap_code);
-    FREEMEM(pound_includes);
     FREEMEM(ordered);
 }
 
@@ -464,13 +435,32 @@ CFCPerl_write_hostdefs(CFCPerl *self) {
 
 void
 CFCPerl_write_boot(CFCPerl *self) {
-    S_write_boot_h(self);
-    S_write_boot_c(self);
+    CFCParcel **parcels = CFCParcel_all_parcels();
+
+    for (size_t i = 0; parcels[i]; ++i) {
+        CFCParcel *parcel = parcels[i];
+
+        if (!CFCParcel_included(parcel)) {
+            S_write_boot_h(self, parcel);
+            S_write_boot_c(self, parcel);
+        }
+    }
 }
 
 static char*
 S_xs_file_contents(CFCPerl *self, const char *generated_xs,
                    const char *xs_init, const char *hand_rolled_xs) {
+    char *bootstrap_calls = CFCUtil_strdup("");
+    CFCParcel **parcels   = CFCParcel_all_parcels();
+    for (size_t i = 0; parcels[i]; ++i) {
+        if (!CFCParcel_included(parcels[i])) {
+            const char *prefix = CFCParcel_get_prefix(parcels[i]);
+            bootstrap_calls
+                = CFCUtil_cat(bootstrap_calls, "    ", prefix,
+                              "bootstrap_perl();\n", NULL);
+        }
+    }
+
     const char pattern[] =
         "%s"
         "\n"
@@ -481,7 +471,7 @@ S_xs_file_contents(CFCPerl *self, const char *generated_xs,
         "BOOT:\n"
         "{\n"
         "    const char* file = __FILE__;\n"
-        "    %s();\n"
+        "%s"
         "%s"
         "}\n"
         "\n"
@@ -490,9 +480,10 @@ S_xs_file_contents(CFCPerl *self, const char *generated_xs,
         "%s";
     char *contents
         = CFCUtil_sprintf(pattern, self->c_header, generated_xs,
-                          self->boot_class, self->boot_class, self->boot_func,
+                          self->boot_class, self->boot_class, bootstrap_calls,
                           xs_init, hand_rolled_xs, self->c_footer);
 
+    FREEMEM(bootstrap_calls);
     return contents;
 }
 
@@ -527,7 +518,13 @@ CFCPerl_write_bindings(CFCPerl *self) {
 
     // Include XSBind.h and boot.h.
     generated_xs = CFCUtil_cat(generated_xs, "#include \"XSBind.h\"\n", NULL);
-    generated_xs = CFCUtil_cat(generated_xs, "#include \"boot.h\"\n", NULL);
+    for (size_t i = 0; parcels[i]; ++i) {
+        if (!CFCParcel_included(parcels[i])) {
+            const char *prefix = CFCParcel_get_prefix(parcels[i]);
+            generated_xs = CFCUtil_cat(generated_xs, "#include \"", prefix,
+                                       "boot.h\"\n", NULL);
+        }
+    }
 
     // Pound-includes for generated headers.
     for (size_t i = 0; ordered[i] != NULL; i++) {

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/3c18e2ff/runtime/common/charmonizer.c
----------------------------------------------------------------------
diff --git a/runtime/common/charmonizer.c b/runtime/common/charmonizer.c
index 2430139..4cce9da 100644
--- a/runtime/common/charmonizer.c
+++ b/runtime/common/charmonizer.c
@@ -8354,9 +8354,10 @@ cfish_MakeFile_new(chaz_CLI *cli) {
     }
     else if (chaz_CLI_defined(cli, "enable-perl")) {
         static const char *perl_autogen_src_files[] = {
-            "boot",
             "callbacks",
+            "cfish_boot",
             "cfish_parcel",
+            "testcfish_boot",
             "testcfish_parcel",
             NULL
         };

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/3c18e2ff/runtime/common/charmonizer.main
----------------------------------------------------------------------
diff --git a/runtime/common/charmonizer.main b/runtime/common/charmonizer.main
index 52e0758..f065153 100644
--- a/runtime/common/charmonizer.main
+++ b/runtime/common/charmonizer.main
@@ -300,9 +300,10 @@ cfish_MakeFile_new(chaz_CLI *cli) {
     }
     else if (chaz_CLI_defined(cli, "enable-perl")) {
         static const char *perl_autogen_src_files[] = {
-            "boot",
             "callbacks",
+            "cfish_boot",
             "cfish_parcel",
+            "testcfish_boot",
             "testcfish_parcel",
             NULL
         };

Reply via email to