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 2013/06/15 20:45:14 UTC

[lucy-commits] [3/6] git commit: refs/heads/separate-clownfish-wip4 - Generate code to initialize runtime method metadata

Generate code to initialize runtime method metadata


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

Branch: refs/heads/separate-clownfish-wip4
Commit: b2d5dce6b49b525623ff3a582763234a970bf631
Parents: 10c599b
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Wed Jun 12 23:38:39 2013 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sat Jun 15 20:39:30 2013 +0200

----------------------------------------------------------------------
 clownfish/compiler/src/CFCPerl.c      |  5 +++++
 clownfish/compiler/src/CFCPerlClass.c | 29 +++++++++++++++++++++++++++++
 clownfish/compiler/src/CFCPerlClass.h |  5 +++++
 3 files changed, 39 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/b2d5dce6/clownfish/compiler/src/CFCPerl.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerl.c b/clownfish/compiler/src/CFCPerl.c
index 13dd0ee..d1d0dad 100644
--- a/clownfish/compiler/src/CFCPerl.c
+++ b/clownfish/compiler/src/CFCPerl.c
@@ -249,6 +249,11 @@ S_write_boot_c(CFCPerl *self) {
                 FREEMEM(alias_adds);
                 alias_adds = new_alias_adds;
             }
+
+            char *metadata_code
+                = CFCPerlClass_method_metadata_code(class_binding);
+            alias_adds = CFCUtil_cat(alias_adds, metadata_code, NULL);
+            FREEMEM(metadata_code);
         }
 
         CFCClass *parent = CFCClass_get_parent(klass);

http://git-wip-us.apache.org/repos/asf/lucy/blob/b2d5dce6/clownfish/compiler/src/CFCPerlClass.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerlClass.c b/clownfish/compiler/src/CFCPerlClass.c
index c676fb2..f11b7d9 100644
--- a/clownfish/compiler/src/CFCPerlClass.c
+++ b/clownfish/compiler/src/CFCPerlClass.c
@@ -546,3 +546,32 @@ CFCPerlClass_get_class_aliases(CFCPerlClass *self) {
     return (const char **)self->class_aliases;
 }
 
+// Generate C code which initializes method metadata.
+char*
+CFCPerlClass_method_metadata_code(CFCPerlClass *self) {
+    const char *vtable_var = CFCClass_full_vtable_var(self->client);
+    CFCMethod **fresh_methods = CFCClass_fresh_methods(self->client);
+    char *code = CFCUtil_strdup("");
+
+    for (int i = 0; fresh_methods[i] != NULL; i++) {
+        CFCMethod *method = fresh_methods[i];
+        if (!CFCMethod_novel(method)) { continue; }
+
+        const char *macro_sym = CFCMethod_get_macro_sym(method);
+        const char *alias     = CFCMethod_get_host_alias(method);
+        if (alias) {
+            code = CFCUtil_cat(code, "    Cfish_VTable_Add_Host_Method_Alias(",
+                               vtable_var, ", \"", alias, "\", \"", macro_sym,
+                               "\");\n", NULL);
+        }
+        if (CFCMethod_excluded_from_host(method)) {
+            code = CFCUtil_cat(code, "    Cfish_VTable_Exclude_Host_Method(",
+                               vtable_var, ", \"", macro_sym, "\");\n", NULL);
+        }
+    }
+
+    FREEMEM(fresh_methods);
+    return code;
+}
+
+

http://git-wip-us.apache.org/repos/asf/lucy/blob/b2d5dce6/clownfish/compiler/src/CFCPerlClass.h
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerlClass.h b/clownfish/compiler/src/CFCPerlClass.h
index d5fdda7..89fd1fe 100644
--- a/clownfish/compiler/src/CFCPerlClass.h
+++ b/clownfish/compiler/src/CFCPerlClass.h
@@ -162,6 +162,11 @@ CFCPerlClass_add_class_alias(CFCPerlClass *self, const char *alias);
 const char**
 CFCPerlClass_get_class_aliases(CFCPerlClass *self);
 
+/** Return C code which initializes method metadata.
+ */
+char*
+CFCPerlClass_method_metadata_code(CFCPerlClass *self);
+
 #ifdef __cplusplus
 }
 #endif