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 2011/03/02 02:28:48 UTC

[lucy-commits] svn commit: r1076078 - /incubator/lucy/trunk/clownfish/src/CFCDumpable.c

Author: marvin
Date: Wed Mar  2 01:28:48 2011
New Revision: 1076078

URL: http://svn.apache.org/viewvc?rev=1076078&view=rev
Log:
Fix an incorrect iteration over member variables (when there were no "vtable"
and "ref" members in the class because it did not inherit from
Lucy::Object::Obj).

Modified:
    incubator/lucy/trunk/clownfish/src/CFCDumpable.c

Modified: incubator/lucy/trunk/clownfish/src/CFCDumpable.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCDumpable.c?rev=1076078&r1=1076077&r2=1076078&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCDumpable.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCDumpable.c Wed Mar  2 01:28:48 2011
@@ -51,11 +51,13 @@ S_make_method_obj(CFCClass *klass, const
 
 // Generate code for dumping a single member var.
 static void
-S_process_dump_member(CFCVariable *member, char *buf, size_t buf_size);
+S_process_dump_member(CFCClass *klass, CFCVariable *member, char *buf,
+                      size_t buf_size);
 
 // Generate code for loading a single member var.
 static void
-S_process_load_member(CFCVariable *member, char *buf, size_t buf_size);
+S_process_load_member(CFCClass *klass, CFCVariable *member, char *buf,
+                      size_t buf_size);
 
 struct CFCDumpable {
     CFCBase base;
@@ -189,8 +191,7 @@ S_add_dump_method(CFCClass *klass)
         CFCVariable **novel = CFCClass_novel_member_vars(klass);
         size_t i;
         for (i = 0; novel[i] != NULL; i++) {
-            S_process_dump_member(novel[i], buf, BUF_SIZE);
-            CFCClass_append_autocode(klass, buf);
+            S_process_dump_member(klass, novel[i], buf, BUF_SIZE);
         }
         FREEMEM(novel);
     }
@@ -212,11 +213,9 @@ S_add_dump_method(CFCClass *klass)
         CFCClass_append_autocode(klass, autocode);
         FREEMEM(autocode);
         CFCVariable **members = CFCClass_member_vars(klass);
-        // skip self->vtable and self->ref.
         size_t i;
-        for (i = 2; members[i] != NULL; i++) {
-            S_process_dump_member(members[i], buf, BUF_SIZE);
-            CFCClass_append_autocode(klass, buf);
+        for (i = 0; members[i] != NULL; i++) {
+            S_process_dump_member(klass, members[i], buf, BUF_SIZE);
         }
     }
 
@@ -263,8 +262,7 @@ S_add_load_method(CFCClass *klass)
         CFCVariable **novel = CFCClass_novel_member_vars(klass);
         size_t i;
         for (i = 0; novel[i] != NULL; i++) {
-            S_process_load_member(novel[i], buf, BUF_SIZE);
-            CFCClass_append_autocode(klass, buf);
+            S_process_load_member(klass, novel[i], buf, BUF_SIZE);
         }
         FREEMEM(novel);
     }
@@ -290,11 +288,9 @@ S_add_load_method(CFCClass *klass)
         CFCClass_append_autocode(klass, autocode);
         FREEMEM(autocode);
         CFCVariable **members = CFCClass_member_vars(klass);
-        // skip self->vtable and self->ref.
         size_t i;
-        for (i = 2; members[i] != NULL; i++) {
-            S_process_load_member(members[i], buf, BUF_SIZE);
-            CFCClass_append_autocode(klass, buf);
+        for (i = 0; members[i] != NULL; i++) {
+            S_process_load_member(klass, members[i], buf, BUF_SIZE);
         }
     }
 
@@ -302,12 +298,21 @@ S_add_load_method(CFCClass *klass)
 }
 
 static void
-S_process_dump_member(CFCVariable *member, char *buf, size_t buf_size)
+S_process_dump_member(CFCClass *klass, CFCVariable *member, char *buf,
+                      size_t buf_size)
 {
     CFCUTIL_NULL_CHECK(member);
     CFCType *type = CFCVariable_get_type(member);
     const char *name = CFCSymbol_micro_sym((CFCSymbol*)member);
     unsigned name_len = (unsigned)strlen(name);
+    const char *specifier = CFCType_get_specifier(type);
+
+    // Skip the VTable and the refcount/host-object.
+    if (   strcmp(specifier, "lucy_VTable") == 0
+        || strcmp(specifier, "lucy_ref_t") == 0
+    ) {
+        return; 
+    }
 
     if (CFCType_is_integer(type) || CFCType_is_floating(type)) {
         char int_pattern[] = 
@@ -323,7 +328,6 @@ S_process_dump_member(CFCVariable *membe
         }
         int check = sprintf(buf, pattern, name, name_len, name);
         if (check < 0) { croak("sprintf failed"); }
-        return;
     }
     else if (CFCType_is_object(type)) {
         char pattern[] = 
@@ -338,15 +342,17 @@ S_process_dump_member(CFCVariable *membe
         }
         int check = sprintf(buf, pattern, name, name, name_len, name);
         if (check < 0) { croak("sprintf failed"); }
-        return;
     }
     else {
         croak("Don't know how to dump a %s", CFCType_get_specifier(type));
     }
+
+    CFCClass_append_autocode(klass, buf);
 }
 
 static void
-S_process_load_member(CFCVariable *member, char *buf, size_t buf_size)
+S_process_load_member(CFCClass *klass, CFCVariable *member, char *buf,
+                      size_t buf_size)
 {
     CFCUTIL_NULL_CHECK(member);
     CFCType *type = CFCVariable_get_type(member);
@@ -354,6 +360,16 @@ S_process_load_member(CFCVariable *membe
     const char *name = CFCSymbol_micro_sym((CFCSymbol*)member);
     unsigned name_len = (unsigned)strlen(name);
     char extraction[200];
+    const char *specifier = CFCType_get_specifier(type);
+    size_t specifier_len = strlen(specifier);
+
+    // Skip the VTable and the refcount/host-object.
+    if (   strcmp(specifier, "lucy_VTable") == 0
+        || strcmp(specifier, "lucy_ref_t") == 0
+    ) {
+        return; 
+    }
+
     if (strlen(type_str) + 100 > sizeof(extraction)) { // play it safe
         croak("type_str too long: '%s'", type_str);
     }
@@ -366,8 +382,6 @@ S_process_load_member(CFCVariable *membe
         if (check < 0) { croak("sprintf failed"); }
     }
     else if (CFCType_is_object(type)) {
-        const char *specifier = CFCType_get_specifier(type);
-        size_t specifier_len = strlen(specifier);
         char vtable_var[50];
         if (specifier_len > sizeof(vtable_var) - 2) {
             croak("specifier too long: '%s'", specifier);
@@ -382,7 +396,7 @@ S_process_load_member(CFCVariable *membe
         if (check < 0) { croak("sprintf failed"); }
     }
     else {
-        croak("Don't know how to load %s", CFCType_get_specifier(type));
+        croak("Don't know how to load %s", specifier);
     }
     
     const char *pattern = 
@@ -400,6 +414,8 @@ S_process_load_member(CFCVariable *membe
     }
     int check = sprintf(buf, pattern, name, name_len, name, extraction);
     if (check < 0) { croak("sprintf failed"); }
+
+    CFCClass_append_autocode(klass, buf);
 }