Fix a couple of leaking exceptions
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/ce0dfbb5 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/ce0dfbb5 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/ce0dfbb5 Branch: refs/heads/master Commit: ce0dfbb5a77b55ca59f97eb9cdd6a5de7f59ad86 Parents: 5d0a3ef Author: Nick Wellnhofer <[email protected]> Authored: Sat Mar 5 17:50:13 2016 +0100 Committer: Nick Wellnhofer <[email protected]> Committed: Sat Mar 5 17:51:27 2016 +0100 ---------------------------------------------------------------------- compiler/perl/t/401-class.t | 45 ++++++++++++++++++---------------------- compiler/src/CFCCBlock.c | 5 ++++- compiler/src/CFCClass.c | 14 +++++++++++-- compiler/src/CFCVariable.c | 5 ++++- 4 files changed, 40 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ce0dfbb5/compiler/perl/t/401-class.t ---------------------------------------------------------------------- diff --git a/compiler/perl/t/401-class.t b/compiler/perl/t/401-class.t index f456471..5e0fcba 100644 --- a/compiler/perl/t/401-class.t +++ b/compiler/perl/t/401-class.t @@ -51,32 +51,27 @@ my $should_be_foo = Clownfish::CFC::Model::Class->fetch_singleton( ); is( $$foo, $$should_be_foo, "fetch_singleton" ); -SKIP: { - skip( 'Exceptions leak', 3 ) - if $ENV{LUCY_VALGRIND}; +eval { Clownfish::CFC::Model::Class->create(%foo_create_args) }; +like( $@, qr/two classes with name/i, + "Can't call create for the same class more than once" ); - eval { Clownfish::CFC::Model::Class->create(%foo_create_args) }; - like( $@, qr/two classes with name/i, - "Can't call create for the same class more than once" ); - - eval { - Clownfish::CFC::Model::Class->create( - parcel => 'Neato', - class_name => 'Other::Foo', - ); - }; - like( $@, qr/class name conflict/i, - "Can't create classes wth the same final component" ); - eval { - Clownfish::CFC::Model::Class->create( - parcel => 'Neato', - class_name => 'Bar', - nickname => 'Foo', - ); - }; - like( $@, qr/class nickname conflict/i, - "Can't create classes wth the same nickname" ); -} +eval { + Clownfish::CFC::Model::Class->create( + parcel => 'Neato', + class_name => 'Other::Foo', + ); +}; +like( $@, qr/class name conflict/i, + "Can't create classes wth the same final component" ); +eval { + Clownfish::CFC::Model::Class->create( + parcel => 'Neato', + class_name => 'Bar', + nickname => 'Foo', + ); +}; +like( $@, qr/class nickname conflict/i, + "Can't create classes wth the same nickname" ); my $foo_jr = Clownfish::CFC::Model::Class->create( parcel => 'Neato', http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ce0dfbb5/compiler/src/CFCCBlock.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCCBlock.c b/compiler/src/CFCCBlock.c index 0231877..01d0b42 100644 --- a/compiler/src/CFCCBlock.c +++ b/compiler/src/CFCCBlock.c @@ -38,7 +38,10 @@ CFCCBlock_new(const char *contents) { CFCCBlock* CFCCBlock_init(CFCCBlock *self, const char *contents) { - CFCUTIL_NULL_CHECK(contents); + if (!contents) { + CFCBase_decref((CFCBase*)self); + CFCUtil_die("contents cannot be NULL"); + } self->contents = CFCUtil_strdup(contents); return self; } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ce0dfbb5/compiler/src/CFCClass.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCClass.c b/compiler/src/CFCClass.c index 7ed3167..5e1f795 100644 --- a/compiler/src/CFCClass.c +++ b/compiler/src/CFCClass.c @@ -310,8 +310,18 @@ CFCClass_do_create(CFCClass *self, struct CFCParcel *parcel, || !parcel_source_dir || strcmp(class_source_dir, parcel_source_dir) == 0 ) { - // Store in registry. - S_register(self); + char *error; + + CFCUTIL_TRY { + // Store in registry. + S_register(self); + } + CFCUTIL_CATCH(error); + + if (error) { + CFCBase_decref((CFCBase*)self); + CFCUtil_rethrow(error); + } CFCParcel_add_struct_sym(parcel, self->struct_sym); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ce0dfbb5/compiler/src/CFCVariable.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCVariable.c b/compiler/src/CFCVariable.c index c2802fc..6636ba6 100644 --- a/compiler/src/CFCVariable.c +++ b/compiler/src/CFCVariable.c @@ -59,7 +59,10 @@ CFCVariable* CFCVariable_init(CFCVariable *self, const char *exposure, const char *name, struct CFCType *type, int inert) { // Validate params. - CFCUTIL_NULL_CHECK(type); + if (!type) { + CFCBase_decref((CFCBase*)self); + CFCUtil_die("type cannot be NULL"); + } // Default exposure to "local". const char *real_exposure = exposure ? exposure : "local";
