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/07/17 16:12:45 UTC

[lucy-commits] [25/34] git commit: refs/heads/master - Make object structs outside of Clownfish opaque.

Make object structs outside of Clownfish opaque.

Do not define object struct definitions outside the Clownfish package,
forcing all access to go through IVARS structs.


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

Branch: refs/heads/master
Commit: 0a4871214993943df1a64b5bafad99cee7e2ecd2
Parents: bbdd3c7
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Thu Jul 11 15:27:52 2013 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Tue Jul 16 16:08:43 2013 -0700

----------------------------------------------------------------------
 clownfish/compiler/src/CFCBindClass.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/0a487121/clownfish/compiler/src/CFCBindClass.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindClass.c b/clownfish/compiler/src/CFCBindClass.c
index 33b4d71..452b58f 100644
--- a/clownfish/compiler/src/CFCBindClass.c
+++ b/clownfish/compiler/src/CFCBindClass.c
@@ -157,6 +157,7 @@ S_ivars_hack(CFCBindClass *self) {
     const char *full_ivars  = CFCClass_full_ivars_name(self->client);
     const char *short_ivars = CFCClass_short_ivars_name(self->client);
     const char *prefix      = CFCClass_get_prefix(self->client);
+    const char *PREFIX      = CFCClass_get_PREFIX(self->client);
     const char *class_cnick = CFCClass_get_cnick(self->client);
     char pattern[] =
         "typedef struct %s %s;\n"
@@ -169,8 +170,8 @@ S_ivars_hack(CFCBindClass *self) {
         "  #define %s_IVARS %s%s_IVARS\n"
         "#endif\n";
     char *content
-        = CFCUtil_sprintf(pattern, full_struct, full_ivars, full_ivars, prefix,
-                          class_cnick, full_struct, full_ivars, prefix,
+        = CFCUtil_sprintf(pattern, full_ivars, full_ivars, full_ivars, prefix,
+                          class_cnick, full_struct, full_ivars, PREFIX,
                           short_ivars, full_ivars, class_cnick, prefix,
                           class_cnick);
     return content;
@@ -360,7 +361,15 @@ CFCBindClass_to_c_data(CFCBindClass *self) {
 // Create the definition for the instantiable object struct.
 static char*
 S_struct_definition(CFCBindClass *self) {
-    const char *struct_sym = CFCClass_full_struct_sym(self->client);
+    const char *struct_sym;
+    const char *prefix = CFCClass_get_prefix(self->client);
+    if (strcmp(prefix, "cfish_") == 0) {
+        struct_sym = CFCClass_full_struct_sym(self->client);
+    }
+    else {
+        struct_sym = CFCClass_full_ivars_name(self->client);
+    }
+
     CFCVariable **member_vars = CFCClass_member_vars(self->client);
     char *member_decs = CFCUtil_strdup("");
 
@@ -410,18 +419,24 @@ CFCBindClass_spec_def(CFCBindClass *self) {
     FREEMEM(fresh_methods);
     const char *ms_var = num_fresh ? self->method_specs_var : "NULL";
 
+    // Hack to get size of object.  TODO: This will have to be replaced by
+    // dynamic initialization.
+    char *ivars_or_not = strcmp(CFCClass_get_prefix(client), "cfish_") == 0
+                         ? "" : "IVARS";
+
     char pattern[] =
         "    {\n"
         "        &%s, /* vtable */\n"
         "        %s, /* parent */\n"
         "        \"%s\", /* name */\n"
-        "        sizeof(%s), /* obj_alloc_size */\n"
+        "        sizeof(%s%s), /* obj_alloc_size */\n"
         "        %d, /* num_fresh */\n"
         "        %d, /* num_novel */\n"
         "        %s /* method_specs */\n"
         "    }";
     char *code = CFCUtil_sprintf(pattern, vt_var, parent_ref, class_name,
-                                 struct_sym, num_fresh, num_novel, ms_var);
+                                 struct_sym, ivars_or_not,
+                                 num_fresh, num_novel, ms_var);
 
     FREEMEM(parent_ref);
     return code;