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",