Keep array of fresh symbols in CFCClass

Don't destroy the original array of fresh methods and variables in
S_bequeath_{methods|variables}. This makes it possible to get a list of
fresh symbols in the original order from the .cfh file.


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

Branch: refs/heads/master
Commit: c3ef338c14bd6d37c83b88e50574bf5632457090
Parents: cee0450
Author: Nick Wellnhofer <[email protected]>
Authored: Wed Dec 3 19:13:02 2014 +0100
Committer: Nick Wellnhofer <[email protected]>
Committed: Wed Dec 24 16:02:03 2014 +0100

----------------------------------------------------------------------
 compiler/perl/lib/Clownfish/CFC.xs |   2 -
 compiler/perl/t/401-class.t        |  16 ++--
 compiler/perl/t/404-file.t         |   2 +-
 compiler/src/CFCBindClass.c        |   4 -
 compiler/src/CFCC.c                |   2 -
 compiler/src/CFCCMan.c             |   2 -
 compiler/src/CFCClass.c            | 134 ++++++++++++++++++--------------
 compiler/src/CFCClass.h            |   2 +
 compiler/src/CFCPerl.c             |   1 -
 compiler/src/CFCPerlClass.c        |   3 -
 compiler/src/CFCTestClass.c        |  16 ++--
 compiler/src/CFCTestFile.c         |   2 +-
 12 files changed, 93 insertions(+), 93 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c3ef338c/compiler/perl/lib/Clownfish/CFC.xs
----------------------------------------------------------------------
diff --git a/compiler/perl/lib/Clownfish/CFC.xs 
b/compiler/perl/lib/Clownfish/CFC.xs
index a6ea249..408c058 100644
--- a/compiler/perl/lib/Clownfish/CFC.xs
+++ b/compiler/perl/lib/Clownfish/CFC.xs
@@ -396,13 +396,11 @@ PPCODE:
         case 44: {
                 CFCMethod **fresh = CFCClass_fresh_methods(self);
                 retval = S_array_of_cfcbase_to_av((CFCBase**)fresh);
-                FREEMEM(fresh);
                 break;
             }
         case 46: {
                 CFCVariable **fresh = CFCClass_fresh_member_vars(self);
                 retval = S_array_of_cfcbase_to_av((CFCBase**)fresh);
-                FREEMEM(fresh);
                 break;
             }
         case 48: {

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c3ef338c/compiler/perl/t/401-class.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/401-class.t b/compiler/perl/t/401-class.t
index f137cf4..79e5e46 100644
--- a/compiler/perl/t/401-class.t
+++ b/compiler/perl/t/401-class.t
@@ -178,7 +178,7 @@ my $class_content
     = 'public class Foo::Foodie nickname Foodie inherits Foo { int num; }';
 my $class = $parser->parse($class_content);
 isa_ok( $class, "Clownfish::CFC::Model::Class", "class_declaration FooJr" );
-ok( ( scalar grep { $_->micro_sym eq 'num' } @{ $class->member_vars } ),
+ok( ( scalar grep { $_->micro_sym eq 'num' } @{ $class->fresh_member_vars } ),
     "parsed member var" );
 
 $class_content = q|
@@ -217,26 +217,26 @@ ok( ( scalar grep { $_->micro_sym eq 'num_dogs' } @{ 
$class->inert_vars } ),
     "parsed inert var" );
 ok( ( scalar grep { $_->micro_sym eq 'top_dog' } @{ $class->inert_vars } ),
     "parsed public inert var" );
-ok( ( scalar grep { $_->micro_sym eq 'mom' } @{ $class->member_vars } ),
+ok( ( scalar grep { $_->micro_sym eq 'mom' } @{ $class->fresh_member_vars } ),
     "parsed member var" );
-ok( ( scalar grep { $_->micro_sym eq 'squishy' } @{ $class->member_vars } ),
+ok( ( scalar grep { $_->micro_sym eq 'squishy' } @{ $class->fresh_member_vars 
} ),
     "parsed member var" );
 ok( ( scalar grep { $_->micro_sym eq 'init' } @{ $class->functions } ),
     "parsed function" );
-ok( ( scalar grep { $_->micro_sym eq 'destroy' } @{ $class->methods } ),
+ok( ( scalar grep { $_->micro_sym eq 'destroy' } @{ $class->fresh_methods } ),
     "parsed parcel method" );
-ok( ( scalar grep { $_->micro_sym eq 'bury' } @{ $class->methods } ),
+ok( ( scalar grep { $_->micro_sym eq 'bury' } @{ $class->fresh_methods } ),
     "parsed public method" );
-ok( ( scalar grep { $_->micro_sym eq 'scratch' } @{ $class->methods } ),
+ok( ( scalar grep { $_->micro_sym eq 'scratch' } @{ $class->fresh_methods } ),
     "parsed public abstract nullable method" );
 
-for my $method ( @{ $class->methods } ) {
+for my $method ( @{ $class->fresh_methods } ) {
     if ( $method->micro_sym eq 'scratch' ) {
         ok( $method->get_return_type->nullable,
             "public abstract incremented nullable flagged as nullable" );
     }
 }
-is( ( scalar grep { $_->public } @{ $class->methods } ),
+is( ( scalar grep { $_->public } @{ $class->fresh_methods } ),
     6, "pass acl to Method constructor" );
 
 $class_content = qq|

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c3ef338c/compiler/perl/t/404-file.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/404-file.t b/compiler/perl/t/404-file.t
index eec082c..a26ff05 100644
--- a/compiler/perl/t/404-file.t
+++ b/compiler/perl/t/404-file.t
@@ -69,7 +69,7 @@ my $file_spec = Clownfish::CFC::Model::FileSpec->new(
     my $classes = $file->classes;
     is( scalar @$classes, 3, "classes() filters blocks" );
     my $class = $classes->[0];
-    my ( $foo, $bar ) = @{ $class->member_vars };
+    my ( $foo, $bar ) = @{ $class->fresh_member_vars };
     $foo->resolve_type;
     $bar->resolve_type;
     is( $foo->get_type->get_specifier,

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c3ef338c/compiler/src/CFCBindClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCBindClass.c b/compiler/src/CFCBindClass.c
index 5f2ef24..cb8a1db 100644
--- a/compiler/src/CFCBindClass.c
+++ b/compiler/src/CFCBindClass.c
@@ -587,8 +587,6 @@ CFCBindClass_callback_decs(CFCBindClass *self) {
         }
     }
 
-    FREEMEM(fresh_methods);
-
     return cb_decs;
 }
 
@@ -643,7 +641,6 @@ S_sub_declarations(CFCBindClass *self) {
         declarations = CFCUtil_cat(declarations, dec, "\n\n", NULL);
         FREEMEM(dec);
     }
-    FREEMEM(fresh_methods);
     return declarations;
 }
 
@@ -723,7 +720,6 @@ S_short_names(CFCBindClass *self) {
             short_names = CFCUtil_cat(short_names, "  #define ", short_imp,
                                       " ", full_imp, "\n", NULL);
         }
-        FREEMEM(fresh_methods);
 
         CFCMethod  **methods = CFCClass_methods(client);
         for (int i = 0; methods[i] != NULL; i++) {

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c3ef338c/compiler/src/CFCC.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCC.c b/compiler/src/CFCC.c
index 067e84e..9c924cc 100644
--- a/compiler/src/CFCC.c
+++ b/compiler/src/CFCC.c
@@ -139,8 +139,6 @@ S_callback_decs(CFCClass *klass) {
         }
     }
 
-    FREEMEM(fresh_methods);
-
     return cb_decs;
 }
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c3ef338c/compiler/src/CFCCMan.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCCMan.c b/compiler/src/CFCCMan.c
index 17ad340..2ddce72 100644
--- a/compiler/src/CFCCMan.c
+++ b/compiler/src/CFCCMan.c
@@ -248,7 +248,6 @@ S_man_create_methods(CFCClass *klass) {
 
     FREEMEM(methods_man);
     FREEMEM(novel_man);
-    FREEMEM(fresh_methods);
     return result;
 }
 
@@ -278,7 +277,6 @@ S_man_create_inherited_methods(CFCClass *klass) {
         FREEMEM(full_method_sym);
     }
 
-    FREEMEM(fresh_methods);
     return result;
 }
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c3ef338c/compiler/src/CFCClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCClass.c b/compiler/src/CFCClass.c
index a64b9ae..37abb3c 100644
--- a/compiler/src/CFCClass.c
+++ b/compiler/src/CFCClass.c
@@ -56,8 +56,12 @@ struct CFCClass {
     size_t num_kids;
     CFCFunction **functions;
     size_t num_functions;
+    CFCMethod **fresh_methods;
+    size_t num_fresh_meths;
     CFCMethod **methods;
     size_t num_methods;
+    CFCVariable **fresh_vars;
+    size_t num_fresh_vars;
     CFCVariable **member_vars;
     size_t num_member_vars;
     CFCVariable **inert_vars;
@@ -132,9 +136,13 @@ CFCClass_do_create(CFCClass *self, struct CFCParcel 
*parcel,
     self->num_kids        = 0;
     self->functions       = (CFCFunction**)CALLOCATE(1, sizeof(CFCFunction*));
     self->num_functions   = 0;
-    self->methods         = (CFCMethod**)CALLOCATE(1, sizeof(CFCMethod*));
+    self->fresh_methods   = (CFCMethod**)CALLOCATE(1, sizeof(CFCMethod*));
+    self->num_fresh_meths = 0;
+    self->methods         = NULL;
     self->num_methods     = 0;
-    self->member_vars     = (CFCVariable**)CALLOCATE(1, sizeof(CFCVariable*));
+    self->fresh_vars      = (CFCVariable**)CALLOCATE(1, sizeof(CFCVariable*));
+    self->num_fresh_vars  = 0;
+    self->member_vars     = NULL;
     self->num_member_vars = 0;
     self->inert_vars      = (CFCVariable**)CALLOCATE(1, sizeof(CFCVariable*));
     self->num_inert_vars  = 0;
@@ -225,7 +233,9 @@ CFCClass_destroy(CFCClass *self) {
     CFCBase_decref((CFCBase*)self->file_spec);
     S_free_cfcbase_array((CFCBase**)self->children);
     S_free_cfcbase_array((CFCBase**)self->functions);
+    S_free_cfcbase_array((CFCBase**)self->fresh_methods);
     S_free_cfcbase_array((CFCBase**)self->methods);
+    S_free_cfcbase_array((CFCBase**)self->fresh_vars);
     S_free_cfcbase_array((CFCBase**)self->member_vars);
     S_free_cfcbase_array((CFCBase**)self->inert_vars);
     FREEMEM(self->parent_class_name);
@@ -393,12 +403,12 @@ CFCClass_add_method(CFCClass *self, CFCMethod *method) {
     if (self->is_inert) {
         CFCUtil_die("Can't add_method to an inert class");
     }
-    self->num_methods++;
-    size_t size = (self->num_methods + 1) * sizeof(CFCMethod*);
-    self->methods = (CFCMethod**)REALLOCATE(self->methods, size);
-    self->methods[self->num_methods - 1]
+    self->num_fresh_meths++;
+    size_t size = (self->num_fresh_meths + 1) * sizeof(CFCMethod*);
+    self->fresh_methods = (CFCMethod**)REALLOCATE(self->fresh_methods, size);
+    self->fresh_methods[self->num_fresh_meths - 1]
         = (CFCMethod*)CFCBase_incref((CFCBase*)method);
-    self->methods[self->num_methods] = NULL;
+    self->fresh_methods[self->num_fresh_meths] = NULL;
 }
 
 void
@@ -407,12 +417,12 @@ CFCClass_add_member_var(CFCClass *self, CFCVariable *var) 
{
     if (self->tree_grown) {
         CFCUtil_die("Can't call add_member_var after grow_tree");
     }
-    self->num_member_vars++;
-    size_t size = (self->num_member_vars + 1) * sizeof(CFCVariable*);
-    self->member_vars = (CFCVariable**)REALLOCATE(self->member_vars, size);
-    self->member_vars[self->num_member_vars - 1]
+    self->num_fresh_vars++;
+    size_t size = (self->num_fresh_vars + 1) * sizeof(CFCVariable*);
+    self->fresh_vars = (CFCVariable**)REALLOCATE(self->fresh_vars, size);
+    self->fresh_vars[self->num_fresh_vars - 1]
         = (CFCVariable*)CFCBase_incref((CFCBase*)var);
-    self->member_vars[self->num_member_vars] = NULL;
+    self->fresh_vars[self->num_fresh_vars] = NULL;
 }
 
 void
@@ -464,15 +474,7 @@ CFCClass_method(CFCClass *self, const char *sym) {
 
 CFCMethod*
 CFCClass_fresh_method(CFCClass *self, const char *sym) {
-    CFCMethod *method = CFCClass_method(self, sym);
-    if (method) {
-        const char *class_name = CFCClass_get_class_name(self);
-        const char *meth_class_name = CFCMethod_get_class_name(method);
-        if (strcmp(class_name, meth_class_name) == 0) {
-            return method;
-        }
-    }
-    return NULL;
+    return (CFCMethod*)S_find_func((CFCFunction**)self->fresh_methods, sym);
 }
 
 void
@@ -480,11 +482,11 @@ CFCClass_resolve_types(CFCClass *self) {
     for (size_t i = 0; self->functions[i] != NULL; i++) {
         CFCFunction_resolve_types(self->functions[i]);
     }
-    for (size_t i = 0; self->methods[i] != NULL; i++) {
-        CFCMethod_resolve_types(self->methods[i]);
+    for (size_t i = 0; self->fresh_methods[i] != NULL; i++) {
+        CFCMethod_resolve_types(self->fresh_methods[i]);
     }
-    for (size_t i = 0; self->member_vars[i] != NULL; i++) {
-        CFCVariable_resolve_type(self->member_vars[i]);
+    for (size_t i = 0; self->fresh_vars[i] != NULL; i++) {
+        CFCVariable_resolve_type(self->fresh_vars[i]);
     }
     for (size_t i = 0; self->inert_vars[i] != NULL; i++) {
         CFCVariable_resolve_type(self->inert_vars[i]);
@@ -496,16 +498,16 @@ static void
 S_bequeath_member_vars(CFCClass *self) {
     for (size_t i = 0; self->children[i] != NULL; i++) {
         CFCClass *child = self->children[i];
-        size_t num_vars = self->num_member_vars + child->num_member_vars;
+        size_t num_vars = self->num_member_vars + child->num_fresh_vars;
         size_t size = (num_vars + 1) * sizeof(CFCVariable*);
         child->member_vars
             = (CFCVariable**)REALLOCATE(child->member_vars, size);
-        memmove(child->member_vars + self->num_member_vars,
-                child->member_vars,
-                child->num_member_vars * sizeof(CFCVariable*));
         memcpy(child->member_vars, self->member_vars,
                self->num_member_vars * sizeof(CFCVariable*));
-        for (size_t j = 0; self->member_vars[j] != NULL; j++) {
+        memcpy(child->member_vars + self->num_member_vars,
+               child->fresh_vars,
+               child->num_fresh_vars * sizeof(CFCVariable*));
+        for (size_t j = 0; j < num_vars; j++) {
             CFCBase_incref((CFCBase*)child->member_vars[j]);
         }
         child->num_member_vars = num_vars;
@@ -521,7 +523,7 @@ S_bequeath_methods(CFCClass *self) {
 
         // Create array of methods, preserving exact order so vtables match up.
         size_t num_methods = 0;
-        size_t max_methods = self->num_methods + child->num_methods;
+        size_t max_methods = self->num_methods + child->num_fresh_meths;
         CFCMethod **methods = (CFCMethod**)MALLOCATE(
                                   (max_methods + 1) * sizeof(CFCMethod*));
 
@@ -529,7 +531,7 @@ S_bequeath_methods(CFCClass *self) {
         for (size_t i = 0; i < self->num_methods; i++) {
             CFCMethod *method = self->methods[i];
             const char *macro_sym = CFCMethod_get_macro_sym(method);
-            CFCMethod *child_method = CFCClass_method(child, macro_sym);
+            CFCMethod *child_method = CFCClass_fresh_method(child, macro_sym);
             if (child_method) {
                 CFCMethod_override(child_method, method);
                 methods[num_methods++] = child_method;
@@ -541,8 +543,8 @@ S_bequeath_methods(CFCClass *self) {
 
         // Append novel child methods to array.  Child methods which were just
         // marked via CFCMethod_override() a moment ago are skipped.
-        for (size_t i = 0; i < child->num_methods; i++) {
-            CFCMethod *method = child->methods[i];
+        for (size_t i = 0; i < child->num_fresh_meths; i++) {
+            CFCMethod *method = child->fresh_methods[i];
             if (CFCMethod_novel(method)) {
                 methods[num_methods++] = method;
             }
@@ -566,10 +568,6 @@ S_bequeath_methods(CFCClass *self) {
                 CFCBase_incref((CFCBase*)methods[i]);
             }
         }
-        for (size_t i = 0; i < child->num_methods; i++) {
-            CFCBase_decref((CFCBase*)child->methods[i]);
-        }
-        FREEMEM(child->methods);
         child->methods     = methods;
         child->num_methods = num_methods;
 
@@ -600,14 +598,39 @@ S_family_tree_size(CFCClass *self) {
     return count;
 }
 
+static CFCBase**
+S_copy_cfcbase_array(CFCBase **array, size_t num_elems) {
+    CFCBase **copy = (CFCBase**)MALLOCATE((num_elems + 1) * sizeof(CFCBase*));
+    for (size_t i = 0; i < num_elems; i++) {
+        copy[i] = CFCBase_incref(array[i]);
+    }
+    copy[num_elems] = NULL;
+    return copy;
+}
+
 void
 CFCClass_grow_tree(CFCClass *self) {
     if (self->tree_grown) {
         CFCUtil_die("Can't call grow_tree more than once");
     }
     S_establish_ancestry(self);
+
+    // Copy fresh variabless for root class.
+    self->member_vars
+        = (CFCVariable**)S_copy_cfcbase_array((CFCBase**)self->fresh_vars,
+                                              self->num_fresh_vars);
+    self->num_member_vars = self->num_fresh_vars;
+
     S_bequeath_member_vars(self);
+
+    // Copy fresh methods for root class.
+    self->methods
+        = (CFCMethod**)S_copy_cfcbase_array((CFCBase**)self->fresh_methods,
+                                            self->num_fresh_meths);
+    self->num_methods = self->num_fresh_meths;
+
     S_bequeath_methods(self);
+
     self->tree_grown = 1;
 }
 
@@ -631,33 +654,14 @@ CFCClass_tree_to_ladder(CFCClass *self) {
     return ladder;
 }
 
-static CFCSymbol**
-S_fresh_syms(CFCClass *self, CFCSymbol **syms) {
-    const char *class_name = CFCClass_get_class_name(self);
-    size_t count = 0;
-    while (syms[count] != NULL) { count++; }
-    size_t amount = (count + 1) * sizeof(CFCSymbol*);
-    CFCSymbol **fresh = (CFCSymbol**)MALLOCATE(amount);
-    size_t num_fresh = 0;
-    for (size_t i = 0; i < count; i++) {
-        CFCSymbol *sym = syms[i];
-        const char *sym_class_name = CFCSymbol_get_class_name(sym);
-        if (strcmp(sym_class_name, class_name) == 0) {
-            fresh[num_fresh++] = sym;
-        }
-    }
-    fresh[num_fresh] = NULL;
-    return fresh;
-}
-
 CFCMethod**
 CFCClass_fresh_methods(CFCClass *self) {
-    return (CFCMethod**)S_fresh_syms(self, (CFCSymbol**)self->methods);
+    return self->fresh_methods;
 }
 
 CFCVariable**
 CFCClass_fresh_member_vars(CFCClass *self) {
-    return (CFCVariable**)S_fresh_syms(self, (CFCSymbol**)self->member_vars);
+    return self->fresh_vars;
 }
 
 CFCClass**
@@ -672,21 +676,33 @@ CFCClass_functions(CFCClass *self) {
 
 CFCMethod**
 CFCClass_methods(CFCClass *self) {
+    if (!self->tree_grown) {
+        CFCUtil_die("Can't call 'methods' before 'grow_tree'");
+    }
     return self->methods;
 }
 
 size_t
 CFCClass_num_methods(CFCClass *self) {
+    if (!self->tree_grown) {
+        CFCUtil_die("Can't call 'num_methods' before 'grow_tree'");
+    }
     return self->num_methods;
 }
 
 CFCVariable**
 CFCClass_member_vars(CFCClass *self) {
+    if (!self->tree_grown) {
+        CFCUtil_die("Can't call 'member_vars' before 'grow_tree'");
+    }
     return self->member_vars;
 }
 
 size_t
 CFCClass_num_member_vars(CFCClass *self) {
+    if (!self->tree_grown) {
+        CFCUtil_die("Can't call 'num_member_vars' before 'grow_tree'");
+    }
     return self->num_member_vars;
 }
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c3ef338c/compiler/src/CFCClass.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCClass.h b/compiler/src/CFCClass.h
index 877a84a..1aa654e 100644
--- a/compiler/src/CFCClass.h
+++ b/compiler/src/CFCClass.h
@@ -150,11 +150,13 @@ CFCClass**
 CFCClass_tree_to_ladder(CFCClass *self);
 
 /** Return an array of all methods implemented in this class.
+ * Must not be freed by the caller.
  */
 struct CFCMethod**
 CFCClass_fresh_methods(CFCClass *self);
 
 /** Return an array of all member variables declared in this class.
+ * Must not be freed by the caller.
  */
 struct CFCVariable**
 CFCClass_fresh_member_vars(CFCClass *self);

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c3ef338c/compiler/src/CFCPerl.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerl.c b/compiler/src/CFCPerl.c
index a04bb61..6637dee 100644
--- a/compiler/src/CFCPerl.c
+++ b/compiler/src/CFCPerl.c
@@ -610,7 +610,6 @@ S_write_callbacks_c(CFCPerl *self) {
                 FREEMEM(cb_def);
             }
         }
-        FREEMEM(fresh_methods);
     }
 
     content = CFCUtil_cat(content, self->c_footer, NULL);

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c3ef338c/compiler/src/CFCPerlClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlClass.c b/compiler/src/CFCPerlClass.c
index aa3d738..f9a3e20 100644
--- a/compiler/src/CFCPerlClass.c
+++ b/compiler/src/CFCPerlClass.c
@@ -264,8 +264,6 @@ CFCPerlClass_method_bindings(CFCClass *klass) {
         bound[num_bound] = NULL;
     }
 
-    FREEMEM(fresh_methods);
-
     return bound;
 }
 
@@ -517,7 +515,6 @@ CFCPerlClass_method_metadata_code(CFCPerlClass *self) {
         }
     }
 
-    FREEMEM(fresh_methods);
     return code;
 }
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c3ef338c/compiler/src/CFCTestClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestClass.c b/compiler/src/CFCTestClass.c
index c8184ee..762180a 100644
--- a/compiler/src/CFCTestClass.c
+++ b/compiler/src/CFCTestClass.c
@@ -168,9 +168,6 @@ S_run_tests(CFCTest *test) {
         CFCVariable **fresh_member_vars = CFCClass_fresh_member_vars(foo);
         OK(test, fresh_member_vars[0] == thing, "fresh_member_vars[0]");
         OK(test, fresh_member_vars[1] == NULL, "fresh_member_vars[1]");
-
-        FREEMEM(fresh_methods);
-        FREEMEM(fresh_member_vars);
     }
 
     {
@@ -186,14 +183,11 @@ S_run_tests(CFCTest *test) {
 
         CFCVariable **inert_vars = CFCClass_inert_vars(foo_jr);
         OK(test, inert_vars[0] == NULL, "inert_vars[0]");
-
-        FREEMEM(fresh_member_vars);
     }
 
     {
         CFCMethod **fresh_methods = CFCClass_fresh_methods(final_foo);
         OK(test, fresh_methods[0] == NULL, "fresh_methods[0]");
-        FREEMEM(fresh_methods);
     }
 
     {
@@ -237,7 +231,8 @@ S_run_tests(CFCTest *test) {
             "    int num;\n"
             "}\n";
         CFCClass *klass = CFCTest_parse_class(test, parser, class_src);
-        CFCSymbol **member_vars = (CFCSymbol**)CFCClass_member_vars(klass);
+        CFCSymbol **member_vars
+            = (CFCSymbol**)CFCClass_fresh_member_vars(klass);
         OK(test, S_has_symbol(member_vars, "num"),
            "parsed member var");
 
@@ -277,9 +272,10 @@ S_run_tests(CFCTest *test) {
         CFCClass *klass = CFCTest_parse_class(test, parser, class_src);
 
         CFCSymbol **inert_vars  = (CFCSymbol**)CFCClass_inert_vars(klass);
-        CFCSymbol **member_vars = (CFCSymbol**)CFCClass_member_vars(klass);
+        CFCSymbol **member_vars
+            = (CFCSymbol**)CFCClass_fresh_member_vars(klass);
         CFCSymbol **functions   = (CFCSymbol**)CFCClass_functions(klass);
-        CFCSymbol **methods     = (CFCSymbol**)CFCClass_methods(klass);
+        CFCSymbol **methods     = (CFCSymbol**)CFCClass_fresh_methods(klass);
         OK(test, S_has_symbol(inert_vars, "num_dogs"), "parsed inert var");
         OK(test, S_has_symbol(inert_vars, "top_dog"), "parsed public inert 
var");
         OK(test, S_has_symbol(member_vars, "mom"), "parsed member var");
@@ -290,7 +286,7 @@ S_run_tests(CFCTest *test) {
         OK(test, S_has_symbol(methods, "scratch"),
            "parsed public abstract nullable method");
 
-        CFCMethod *scratch = CFCClass_method(klass, "scratch");
+        CFCMethod *scratch = CFCClass_fresh_method(klass, "scratch");
         OK(test, scratch != NULL, "find method 'scratch'");
         OK(test, CFCType_nullable(CFCMethod_get_return_type(scratch)),
            "public abstract incremented nullable flagged as nullable");

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c3ef338c/compiler/src/CFCTestFile.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestFile.c b/compiler/src/CFCTestFile.c
index 4be6cef..921eaf4 100644
--- a/compiler/src/CFCTestFile.c
+++ b/compiler/src/CFCTestFile.c
@@ -95,7 +95,7 @@ S_run_tests(CFCTest *test) {
            classes[0] != NULL && classes[1] != NULL && classes[2] != NULL
            && classes[3] == NULL,
            "classes() filters blocks");
-        CFCVariable **member_vars = CFCClass_member_vars(classes[0]);
+        CFCVariable **member_vars = CFCClass_fresh_member_vars(classes[0]);
         CFCType *foo_type = CFCVariable_get_type(member_vars[0]);
         CFCType_resolve(foo_type);
         STR_EQ(test, CFCType_get_specifier(foo_type), "stuff_Foo",

Reply via email to