Remove global class registry Replaced by the class array in CFCParcel.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/682278c4 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/682278c4 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/682278c4 Branch: refs/heads/master Commit: 682278c45ec3f72ace0412317c5e68b16032ec0a Parents: 81cdda1 Author: Nick Wellnhofer <[email protected]> Authored: Tue Feb 28 00:45:46 2017 +0100 Committer: Nick Wellnhofer <[email protected]> Committed: Thu Mar 2 20:08:04 2017 +0100 ---------------------------------------------------------------------- compiler/c/cfc.c | 1 - compiler/perl/lib/Clownfish/CFC.pm | 1 - compiler/perl/lib/Clownfish/CFC.xs | 16 ------- compiler/perl/t/401-class.t | 3 -- compiler/perl/t/404-file.t | 2 - compiler/perl/t/600-parser.t | 1 - compiler/src/CFCClass.c | 74 --------------------------------- compiler/src/CFCClass.h | 20 --------- compiler/src/CFCHierarchy.c | 18 ++++---- compiler/src/CFCParcel.c | 26 ++++++++++++ compiler/src/CFCTestClass.c | 1 - compiler/src/CFCTestFile.c | 2 - compiler/src/CFCTestHierarchy.c | 6 --- compiler/src/CFCTestMethod.c | 4 -- compiler/src/CFCTestParamList.c | 1 - compiler/src/CFCTestParcel.c | 1 - compiler/src/CFCTestParser.c | 2 - compiler/src/CFCTestType.c | 2 - compiler/src/CFCTestVariable.c | 1 - 19 files changed, 36 insertions(+), 146 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/c/cfc.c ---------------------------------------------------------------------- diff --git a/compiler/c/cfc.c b/compiler/c/cfc.c index 21bd989..2d92659 100644 --- a/compiler/c/cfc.c +++ b/compiler/c/cfc.c @@ -263,7 +263,6 @@ main(int argc, char **argv) { FREEMEM(header); FREEMEM(footer); - CFCClass_clear_registry(); CFCDocument_clear_registry(); CFCParcel_reap_singletons(); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/perl/lib/Clownfish/CFC.pm ---------------------------------------------------------------------- diff --git a/compiler/perl/lib/Clownfish/CFC.pm b/compiler/perl/lib/Clownfish/CFC.pm index cd6dae0..3a11a78 100644 --- a/compiler/perl/lib/Clownfish/CFC.pm +++ b/compiler/perl/lib/Clownfish/CFC.pm @@ -22,7 +22,6 @@ $VERSION = eval $VERSION; our $MAJOR_VERSION = 0.006000; END { - Clownfish::CFC::Model::Class->_clear_registry(); Clownfish::CFC::Model::Parcel->reap_singletons(); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/perl/lib/Clownfish/CFC.xs ---------------------------------------------------------------------- diff --git a/compiler/perl/lib/Clownfish/CFC.xs b/compiler/perl/lib/Clownfish/CFC.xs index 775d46c..81504f4 100644 --- a/compiler/perl/lib/Clownfish/CFC.xs +++ b/compiler/perl/lib/Clownfish/CFC.xs @@ -183,22 +183,6 @@ CODE: CFCBase_decref((CFCBase*)self); OUTPUT: RETVAL -SV* -fetch_singleton(unused, class_name) - SV *unused; - const char *class_name; -CODE: - CHY_UNUSED_VAR(unused); - CFCClass *klass = CFCClass_fetch_singleton(class_name); - RETVAL = S_cfcbase_to_perlref(klass); -OUTPUT: RETVAL - -void -_clear_registry(...) -PPCODE: - CHY_UNUSED_VAR(items); - CFCClass_clear_registry(); - void add_child(self, child) CFCClass *self; http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/perl/t/401-class.t ---------------------------------------------------------------------- diff --git a/compiler/perl/t/401-class.t b/compiler/perl/t/401-class.t index 26d4742..3dcc2d9 100644 --- a/compiler/perl/t/401-class.t +++ b/compiler/perl/t/401-class.t @@ -242,7 +242,6 @@ $class_content = qq| $class = $parser->parse($class_content); ok( $class->final, "final class_declaration" ); -Clownfish::CFC::Model::Class->_clear_registry(); Clownfish::CFC::Model::Parcel->reap_singletons(); { @@ -253,7 +252,6 @@ Clownfish::CFC::Model::Parcel->reap_singletons(); }; like( $@, qr/inert class/i, "inert class can't inherit" ); - Clownfish::CFC::Model::Class->_clear_registry(); Clownfish::CFC::Model::Parcel->reap_singletons(); } @@ -265,7 +263,6 @@ Clownfish::CFC::Model::Parcel->reap_singletons(); }; like( $@, qr/inert class/i, "can't inherit from inert class" ); - Clownfish::CFC::Model::Class->_clear_registry(); Clownfish::CFC::Model::Parcel->reap_singletons(); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/perl/t/404-file.t ---------------------------------------------------------------------- diff --git a/compiler/perl/t/404-file.t b/compiler/perl/t/404-file.t index b907d69..9faa1fb 100644 --- a/compiler/perl/t/404-file.t +++ b/compiler/perl/t/404-file.t @@ -88,8 +88,6 @@ my $file_spec = Clownfish::CFC::Model::FileSpec->new( isa_ok( $blocks->[1], "Clownfish::CFC::Model::Class" ); isa_ok( $blocks->[2], "Clownfish::CFC::Model::Class" ); isa_ok( $blocks->[3], "Clownfish::CFC::Model::CBlock" ); - - Clownfish::CFC::Model::Class->_clear_registry(); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/perl/t/600-parser.t ---------------------------------------------------------------------- diff --git a/compiler/perl/t/600-parser.t b/compiler/perl/t/600-parser.t index 7d59ad5..6fb1e46 100644 --- a/compiler/perl/t/600-parser.t +++ b/compiler/perl/t/600-parser.t @@ -138,7 +138,6 @@ for (qw( Foo FooJr FooIII Foo4th )) { $type->resolve; is( $type->get_specifier, "crust_$_", "object_type_specifier: $_" ) } -Clownfish::CFC::Model::Class->_clear_registry(); SKIP: { skip( "Can't recover from bad specifier under flex/lemon parser", 6 ); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCClass.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCClass.c b/compiler/src/CFCClass.c index cdfe096..9d63055 100644 --- a/compiler/src/CFCClass.c +++ b/compiler/src/CFCClass.c @@ -35,14 +35,6 @@ #include "CFCFileSpec.h" #include "CFCJson.h" -static CFCClass **registry = NULL; -static size_t registry_size = 0; -static size_t registry_cap = 0; - -// Store a new CFCClass in a registry. -static void -S_register(CFCClass *self); - struct CFCClass { CFCBase base; CFCWeakPtr parcel; @@ -298,8 +290,6 @@ CFCClass_do_create(CFCClass *self, struct CFCParcel *parcel, char *error; CFCUTIL_TRY { - // Store in registry. - S_register(self); CFCParcel_add_class(parcel, self); } CFCUTIL_CATCH(error); @@ -353,70 +343,6 @@ CFCClass_destroy(CFCClass *self) { CFCBase_destroy((CFCBase*)self); } -static void -S_register(CFCClass *self) { - if (registry_size == registry_cap) { - size_t new_cap = registry_cap + 10; - registry = (CFCClass**)REALLOCATE( - registry, - (new_cap + 1) * sizeof(CFCClass*)); - for (size_t i = registry_cap; i <= new_cap; i++) { - registry[i] = NULL; - } - registry_cap = new_cap; - } - - const char *name = self->name; - - for (size_t i = 0; i < registry_size; i++) { - CFCClass *other = registry[i]; - - if (strcmp(name, other->name) == 0) { - CFCUtil_die("Two classes with name %s", name); - } - } - - registry[registry_size] = (CFCClass*)CFCBase_incref((CFCBase*)self); - registry_size++; -} - -#define MAX_SINGLETON_LEN 256 - -CFCClass* -CFCClass_fetch_singleton(const char *class_name) { - CFCUTIL_NULL_CHECK(class_name); - - for (size_t i = 0; i < registry_size; i++) { - if (strcmp(registry[i]->name, class_name) == 0) { - return registry[i]; - } - } - return NULL; -} - -CFCClass* -CFCClass_fetch_by_struct_sym(const char *struct_sym) { - CFCUTIL_NULL_CHECK(struct_sym); - - for (size_t i = 0; i < registry_size; i++) { - if (strcmp(registry[i]->full_struct_sym, struct_sym) == 0) { - return registry[i]; - } - } - return NULL; -} - -void -CFCClass_clear_registry(void) { - for (size_t i = 0; i < registry_size; i++) { - CFCBase_decref((CFCBase*)registry[i]); - } - FREEMEM(registry); - registry_size = 0; - registry_cap = 0; - registry = NULL; -} - void CFCClass_add_child(CFCClass *self, CFCClass *child) { CFCUTIL_NULL_CHECK(child); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCClass.h ---------------------------------------------------------------------- diff --git a/compiler/src/CFCClass.h b/compiler/src/CFCClass.h index 072b71c..bcb87f4 100644 --- a/compiler/src/CFCClass.h +++ b/compiler/src/CFCClass.h @@ -87,26 +87,6 @@ CFCClass_do_create(CFCClass *self, struct CFCParcel *parcel, void CFCClass_destroy(CFCClass *self); -/** Retrieve a Class, if one has already been created. - * - * @param class_name The name of the Class. - */ -CFCClass* -CFCClass_fetch_singleton(const char *class_name); - -/** Retrieve a Class by its struct sym. - * - * @param full_struct_sym The Class's full struct sym. - */ -CFCClass* -CFCClass_fetch_by_struct_sym(const char *full_struct_sym); - -/** Empty out the registry, decrementing the refcount of all Class singleton - * objects. - */ -void -CFCClass_clear_registry(void); - /** Add a child class. */ void http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCHierarchy.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCHierarchy.c b/compiler/src/CFCHierarchy.c index 0bc1b5f..1e44db3 100644 --- a/compiler/src/CFCHierarchy.c +++ b/compiler/src/CFCHierarchy.c @@ -232,12 +232,6 @@ CFCHierarchy_build(CFCHierarchy *self) { S_find_prereqs(self, source_parcels[i]); } - // Read .cfh and .md files. - for (size_t i = 0; self->sources[i] != NULL; i++) { - S_parse_cf_files(self, self->sources[i], false); - S_find_doc_files(self->sources[i]); - } - // Read .cfh files of included parcels. parcels = CFCParcel_all_parcels(); for (size_t i = 0; parcels[i] != NULL; i++) { @@ -248,6 +242,12 @@ CFCHierarchy_build(CFCHierarchy *self) { } } + // Read .cfh and .md files of source parcels. + for (size_t i = 0; self->sources[i] != NULL; i++) { + S_parse_cf_files(self, self->sources[i], false); + S_find_doc_files(self->sources[i]); + } + for (int i = 0; self->classes[i] != NULL; i++) { CFCClass_resolve_types(self->classes[i]); } @@ -375,10 +375,12 @@ S_find_prereq(CFCHierarchy *self, CFCParcel *parent, CFCPrereq *prereq) { CFCParcel_get_name(parent)); } - CFCParcel_register(parcel); - + // Make sure to register prereq parcels first, so that prereq + // parent classes precede subclasses. S_find_prereqs(self, parcel); + CFCParcel_register(parcel); + CFCBase_decref((CFCBase*)parcel); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCParcel.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCParcel.c b/compiler/src/CFCParcel.c index b126a29..35f4cee 100644 --- a/compiler/src/CFCParcel.c +++ b/compiler/src/CFCParcel.c @@ -55,6 +55,9 @@ struct CFCParcel { static void S_set_prereqs(CFCParcel *self, CFCJson *node, const char *path); +static CFCClass* +S_fetch_class(CFCParcel *self, const char *class_name, int search_prereqs); + static CFCParcel **registry = NULL; static size_t num_registered = 0; @@ -591,12 +594,20 @@ CFCParcel_read_host_data_json(CFCParcel *self, const char *host_lang) { void CFCParcel_add_class(CFCParcel *self, CFCClass *klass) { + // Ensure unique class name. + const char *class_name = CFCClass_get_name(klass); + CFCClass *other = S_fetch_class(self, class_name, true); + if (other) { + CFCUtil_die("Two classes with name %s", class_name); + } + const char *struct_sym = CFCClass_get_struct_sym(klass); const char *nickname = CFCClass_get_nickname(klass); for (size_t i = 0; self->classes[i]; ++i) { CFCClass *other = self->classes[i]; + // Ensure unique struct symbol and nickname in parcel. if (strcmp(struct_sym, CFCClass_get_struct_sym(other)) == 0) { CFCUtil_die("Class name conflict between %s and %s", CFCClass_get_name(klass), CFCClass_get_name(other)); @@ -688,6 +699,11 @@ CFCParcel_sort_classes(CFCParcel *self) { CFCClass* CFCParcel_class(CFCParcel *self, const char *class_name) { + return S_fetch_class(self, class_name, false); +} + +static CFCClass* +S_fetch_class(CFCParcel *self, const char *class_name, int search_prereqs) { for (size_t i = 0; self->classes[i]; ++i) { CFCClass *klass = self->classes[i]; if (strcmp(CFCClass_get_name(klass), class_name) == 0) { @@ -695,6 +711,16 @@ CFCParcel_class(CFCParcel *self, const char *class_name) { } } + if (!search_prereqs) { return NULL; } + + for (size_t i = 0; self->prereqs[i]; ++i) { + const char *prereq_name = CFCPrereq_get_name(self->prereqs[i]); + CFCParcel *prereq_parcel = CFCParcel_fetch(prereq_name); + + CFCClass *klass = S_fetch_class(prereq_parcel, class_name, true); + if (klass) { return klass; } + } + return NULL; } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCTestClass.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestClass.c b/compiler/src/CFCTestClass.c index 793f2c7..e894bc0 100644 --- a/compiler/src/CFCTestClass.c +++ b/compiler/src/CFCTestClass.c @@ -449,7 +449,6 @@ S_run_tests(CFCTest *test) { CFCBase_decref((CFCBase*)inert_foo); CFCBase_decref((CFCBase*)do_stuff); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCTestFile.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestFile.c b/compiler/src/CFCTestFile.c index 5d55912..ee26cc1 100644 --- a/compiler/src/CFCTestFile.c +++ b/compiler/src/CFCTestFile.c @@ -119,8 +119,6 @@ S_run_tests(CFCTest *test) { OK(test, blocks[4] == NULL, "blocks[4]"); CFCBase_decref((CFCBase*)file); - - CFCClass_clear_registry(); } CFCBase_decref((CFCBase*)file_spec); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCTestHierarchy.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestHierarchy.c b/compiler/src/CFCTestHierarchy.c index 77a1ab8..a105f90 100644 --- a/compiler/src/CFCTestHierarchy.c +++ b/compiler/src/CFCTestHierarchy.c @@ -165,7 +165,6 @@ S_run_basic_tests(CFCTest *test) { CFCBase_decref((CFCBase*)hierarchy); FREEMEM(cfbase_path); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } @@ -210,7 +209,6 @@ S_run_include_tests(CFCTest *test) { OK(test, all_included, "All classes included"); CFCBase_decref((CFCBase*)hierarchy); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } @@ -248,7 +246,6 @@ S_run_include_tests(CFCTest *test) { OK(test, all_not_included, "All classes not included"); CFCBase_decref((CFCBase*)hierarchy); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } @@ -286,7 +283,6 @@ S_run_clash_tests(CFCTest *test) { "source/source filename clash"); CFCBase_decref((CFCBase*)hierarchy); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } @@ -307,7 +303,6 @@ S_run_clash_tests(CFCTest *test) { "source/include class name clash"); CFCBase_decref((CFCBase*)hierarchy); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } @@ -330,7 +325,6 @@ S_run_clash_tests(CFCTest *test) { "source class with included parcel"); CFCBase_decref((CFCBase*)hierarchy); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCTestMethod.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestMethod.c b/compiler/src/CFCTestMethod.c index 634e1de..c0cf67b 100644 --- a/compiler/src/CFCTestMethod.c +++ b/compiler/src/CFCTestMethod.c @@ -205,7 +205,6 @@ S_run_basic_tests(CFCTest *test) { CFCBase_decref((CFCBase*)param_list); CFCBase_decref((CFCBase*)method); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } @@ -245,7 +244,6 @@ S_run_parser_tests(CFCTest *test) { CFCBase_decref((CFCBase*)neato_parcel); CFCBase_decref((CFCBase*)parser); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } @@ -288,7 +286,6 @@ S_run_overridden_tests(CFCTest *test) { CFCBase_decref((CFCBase*)overrider_param_list); CFCBase_decref((CFCBase*)overrider); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } @@ -337,7 +334,6 @@ S_run_final_tests(CFCTest *test) { CFCBase_decref((CFCBase*)not_final); CFCBase_decref((CFCBase*)final); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCTestParamList.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestParamList.c b/compiler/src/CFCTestParamList.c index 9dab0b8..aba3d38 100644 --- a/compiler/src/CFCTestParamList.c +++ b/compiler/src/CFCTestParamList.c @@ -89,7 +89,6 @@ S_run_tests(CFCTest *test) { CFCBase_decref((CFCBase*)neato_parcel); CFCBase_decref((CFCBase*)obj_class); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCTestParcel.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestParcel.c b/compiler/src/CFCTestParcel.c index d1c89f3..7ee28ac 100644 --- a/compiler/src/CFCTestParcel.c +++ b/compiler/src/CFCTestParcel.c @@ -307,7 +307,6 @@ S_run_extended_tests(CFCTest *test) { CFCBase_decref((CFCBase*)cfish); CFCBase_decref((CFCBase*)foo_file_spec); CFCBase_decref((CFCBase*)foo); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCTestParser.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestParser.c b/compiler/src/CFCTestParser.c index 15f4103..92155ab 100644 --- a/compiler/src/CFCTestParser.c +++ b/compiler/src/CFCTestParser.c @@ -137,7 +137,6 @@ S_run_tests(CFCTest *test) { for (int i = 0; i < 7; ++i) { CFCBase_decref((CFCBase*)class_list[i]); } - CFCClass_clear_registry(); } { @@ -316,7 +315,6 @@ S_run_tests(CFCTest *test) { CFCBase_decref((CFCBase*)parser); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCTestType.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestType.c b/compiler/src/CFCTestType.c index ba1799b..9c77aaf 100644 --- a/compiler/src/CFCTestType.c +++ b/compiler/src/CFCTestType.c @@ -337,7 +337,6 @@ S_run_object_tests(CFCTest *test) { } CFCBase_decref((CFCBase*)klass); - CFCClass_clear_registry(); } CFCBase_decref((CFCBase*)neato_parcel); @@ -441,7 +440,6 @@ S_run_object_tests(CFCTest *test) { CFCBase_decref((CFCBase*)foo_class); CFCBase_decref((CFCBase*)foo); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/682278c4/compiler/src/CFCTestVariable.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestVariable.c b/compiler/src/CFCTestVariable.c index 617bf15..c088b85 100644 --- a/compiler/src/CFCTestVariable.c +++ b/compiler/src/CFCTestVariable.c @@ -139,7 +139,6 @@ S_run_tests(CFCTest *test) { CFCBase_decref((CFCBase*)neato_parcel); CFCBase_decref((CFCBase*)foo_class); - CFCClass_clear_registry(); CFCParcel_reap_singletons(); }
