Include OBJ_HEAD only when needed If there's an ancestor from a different parcel, the OBJ_HEAD is already part of that parcel's ivars struct.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/d33f6013 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/d33f6013 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/d33f6013 Branch: refs/heads/ivars_fixes Commit: d33f601308c2cf750e8f4caa134c1fbd807dd55e Parents: 6e1e407 Author: Nick Wellnhofer <[email protected]> Authored: Fri Jul 25 18:27:00 2014 +0200 Committer: Nick Wellnhofer <[email protected]> Committed: Sat Jul 26 15:34:52 2014 +0200 ---------------------------------------------------------------------- compiler/src/CFCBindClass.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/d33f6013/compiler/src/CFCBindClass.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCBindClass.c b/compiler/src/CFCBindClass.c index b767f19..4b24629 100644 --- a/compiler/src/CFCBindClass.c +++ b/compiler/src/CFCBindClass.c @@ -423,6 +423,7 @@ CFCBindClass_to_c_data(CFCBindClass *self) { static char* S_struct_definition(CFCBindClass *self) { CFCClass *const client = self->client; + char *member_decs = CFCUtil_strdup(""); const char *struct_sym = NULL; // Try to find first ancestor from a different parcel. @@ -436,6 +437,8 @@ S_struct_definition(CFCBindClass *self) { if (!ancestor) { // All ancestors are in the same parcel. Populate full struct sym. struct_sym = CFCClass_full_struct_sym(client); + // Add object head. + member_decs = CFCUtil_cat(member_decs, " CFISH_OBJ_HEAD\n", NULL); } else { // There's an ancestor from a different parcel. Populate ivars struct. @@ -447,16 +450,16 @@ S_struct_definition(CFCBindClass *self) { // Add all member variables declared by classes in this package. CFCVariable **member_vars = CFCClass_member_vars(client); - char *member_decs = CFCUtil_strdup(""); for (int i = num_non_package_members; member_vars[i] != NULL; i++) { const char *member_dec = CFCVariable_local_declaration(member_vars[i]); - size_t needed = strlen(member_decs) + strlen(member_dec) + 10; - member_decs = (char*)REALLOCATE(member_decs, needed); - strcat(member_decs, "\n "); - strcat(member_decs, member_dec); + member_decs + = CFCUtil_cat(member_decs, " ", member_dec, "\n", NULL); } - char pattern[] = "struct %s {\n CFISH_OBJ_HEAD%s\n};\n"; + char pattern[] = + "struct %s {\n" + "%s" + "};\n"; char *struct_def = CFCUtil_sprintf(pattern, struct_sym, member_decs); FREEMEM(member_decs);
