Store CFCClass pointer in parser state Store a CFCClass pointer instead of the class name.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/1ff6ed0f Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/1ff6ed0f Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/1ff6ed0f Branch: refs/heads/master Commit: 1ff6ed0f9ce59fce928d03f0807c47fc57fd501a Parents: 850d69b Author: Nick Wellnhofer <wellnho...@aevum.de> Authored: Wed Mar 1 14:01:40 2017 +0100 Committer: Nick Wellnhofer <wellnho...@aevum.de> Committed: Thu Mar 2 20:08:03 2017 +0100 ---------------------------------------------------------------------- compiler/perl/lib/Clownfish/CFC.xs | 8 ++++---- compiler/perl/t/200-function.t | 6 +++++- compiler/perl/t/201-method.t | 6 +++++- compiler/perl/t/401-class.t | 16 +++++++-------- compiler/perl/t/600-parser.t | 8 ++++++-- compiler/src/CFCParseHeader.y | 11 +++++----- compiler/src/CFCParser.c | 36 ++++++++++----------------------- compiler/src/CFCParser.h | 13 ++++-------- compiler/src/CFCTestClass.c | 4 ++-- compiler/src/CFCTestFunction.c | 12 ++++++++++- compiler/src/CFCTestMethod.c | 11 +++++++++- compiler/src/CFCTestParser.c | 11 ++++++++-- 12 files changed, 81 insertions(+), 61 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1ff6ed0f/compiler/perl/lib/Clownfish/CFC.xs ---------------------------------------------------------------------- diff --git a/compiler/perl/lib/Clownfish/CFC.xs b/compiler/perl/lib/Clownfish/CFC.xs index 8abe174..9bae35d 100644 --- a/compiler/perl/lib/Clownfish/CFC.xs +++ b/compiler/perl/lib/Clownfish/CFC.xs @@ -2509,11 +2509,11 @@ PPCODE: CFCParser_set_parcel(self, parcel); void -set_class_name(self, class_name) - CFCParser *self; - const char *class_name; +set_class(self, klass) + CFCParser *self; + CFCClass *klass; PPCODE: - CFCParser_set_class_name(self, class_name); + CFCParser_set_class(self, klass); SV* get_parcel(self) http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1ff6ed0f/compiler/perl/t/200-function.t ---------------------------------------------------------------------- diff --git a/compiler/perl/t/200-function.t b/compiler/perl/t/200-function.t index 98455b8..8fc719d 100644 --- a/compiler/perl/t/200-function.t +++ b/compiler/perl/t/200-function.t @@ -44,7 +44,11 @@ like( $@, qr/extra_arg/, "Extra arg kills constructor" ); eval { Clownfish::CFC::Model::Function->new( %args, name => 'Uh_Oh' ); }; like( $@, qr/Uh_Oh/, "invalid name kills constructor" ); -$parser->set_class_name("Neato::Obj"); +my $neato_obj = Clownfish::CFC::Model::Class->create( + parcel => "Neato", + class_name => "Neato::Obj", +); +$parser->set_class($neato_obj); isa_ok( $parser->parse($_), "Clownfish::CFC::Model::Function", http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1ff6ed0f/compiler/perl/t/201-method.t ---------------------------------------------------------------------- diff --git a/compiler/perl/t/201-method.t b/compiler/perl/t/201-method.t index f3467a7..3c8a74c 100644 --- a/compiler/perl/t/201-method.t +++ b/compiler/perl/t/201-method.t @@ -133,7 +133,11 @@ for my $meth_meth (qw( short_method_sym full_method_sym full_offset_sym)) { like( $@, qr/invoker/, "$meth_meth requires invoker" ); } -$parser->set_class_name("Neato::Obj"); +my $neato_obj = Clownfish::CFC::Model::Class->create( + parcel => "Neato", + class_name => "Neato::Obj", +); +$parser->set_class($neato_obj); isa_ok( $parser->parse($_), "Clownfish::CFC::Model::Method", http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1ff6ed0f/compiler/perl/t/401-class.t ---------------------------------------------------------------------- diff --git a/compiler/perl/t/401-class.t b/compiler/perl/t/401-class.t index cafb70c..26d4742 100644 --- a/compiler/perl/t/401-class.t +++ b/compiler/perl/t/401-class.t @@ -99,24 +99,24 @@ is( $final_foo->get_parent_class_name, 'Foo::FooJr', "get_parent_class_name" ); $parser->parse("parcel Neato;"); -$parser->set_class_name("Foo"); +$parser->set_class($foo); my $do_stuff = $parser->parse('void Do_Stuff(Foo *self);') or die "parsing failure"; $foo->add_method($do_stuff); -$parser->set_class_name("InertFoo"); -my $inert_do_stuff = $parser->parse('void Do_Stuff(InertFoo *self);') - or die "parsing failure"; -$parser->set_class_name(""); - my %inert_args = ( parcel => 'Neato', class_name => 'InertFoo', inert => 1, ); +my $inert_foo = Clownfish::CFC::Model::Class->create(%inert_args); +$parser->set_class($inert_foo); +my $inert_do_stuff = $parser->parse('void Do_Stuff(InertFoo *self);') + or die "parsing failure"; +$parser->set_class(undef); + eval { - my $class = Clownfish::CFC::Model::Class->create(%inert_args); - $class->add_method($inert_do_stuff); + $inert_foo->add_method($inert_do_stuff); }; like( $@, http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1ff6ed0f/compiler/perl/t/600-parser.t ---------------------------------------------------------------------- diff --git a/compiler/perl/t/600-parser.t b/compiler/perl/t/600-parser.t index 9530dfd..7d59ad5 100644 --- a/compiler/perl/t/600-parser.t +++ b/compiler/perl/t/600-parser.t @@ -121,10 +121,14 @@ is_deeply( "initial values" ); -$parser->set_class_name('Stuff::Obj'); +my $stuff_obj = Clownfish::CFC::Model::Class->create( + parcel => "Crustacean", + class_name => "Crust::Stuff", +); +$parser->set_class($stuff_obj); ok( $parser->parse($_), "declaration statement: $_" ) for ( - 'public Foo* Spew_Foo(Obj *self, uint32_t *how_many);', + 'public Foo* Spew_Foo(Stuff *self, uint32_t *how_many);', 'public inert Hash *hash;', ); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1ff6ed0f/compiler/src/CFCParseHeader.y ---------------------------------------------------------------------- diff --git a/compiler/src/CFCParseHeader.y b/compiler/src/CFCParseHeader.y index edbd9d4..14e5f1b 100644 --- a/compiler/src/CFCParseHeader.y +++ b/compiler/src/CFCParseHeader.y @@ -49,12 +49,11 @@ S_start_class(CFCParser *state, CFCDocuComment *docucomment, char *exposure, is_inert = !!strstr(modifiers, "inert"); is_abstract = !!strstr(modifiers, "abstract"); } - CFCParser_set_class_name(state, class_name); - CFCParser_set_class_final(state, is_final); CFCClass *klass = CFCClass_create(CFCParser_get_parcel(state), exposure, class_name, class_nickname, docucomment, file_spec, inheritance, is_final, is_inert, is_abstract); + CFCParser_set_class(state, klass); CFCBase_decref((CFCBase*)docucomment); return klass; } @@ -92,7 +91,8 @@ S_new_sub(CFCParser *state, CFCDocuComment *docucomment, is_inline = !!strstr(modifiers, "inline"); is_inert = !!strstr(modifiers, "inert"); } - if (CFCParser_get_class_final(state) && !is_inert) { + CFCClass *klass = CFCParser_get_class(state); + if (CFCClass_final(klass) && !is_inert) { is_final = true; } @@ -112,7 +112,8 @@ S_new_sub(CFCParser *state, CFCDocuComment *docucomment, if (is_inline) { CFCUtil_die("Methods must not be inline"); } - const char *class_name = CFCParser_get_class_name(state); + CFCClass *klass = CFCParser_get_class(state); + const char *class_name = CFCClass_get_name(klass); sub = (CFCBase*)CFCMethod_new(exposure, name, type, param_list, docucomment, class_name, is_final, is_abstract); @@ -337,7 +338,7 @@ parcel_definition(A) ::= PARCEL qualified_id(B) SEMICOLON. class_declaration(A) ::= class_defs(B) RIGHT_CURLY_BRACE. { A = B; - CFCParser_set_class_name(state, NULL); + CFCParser_set_class(state, NULL); } class_head(A) ::= docucomment(B) exposure_specifier(C) declaration_modifier_list(D) CLASS qualified_id(E) nickname(F) class_inheritance(G). { A = S_start_class(state, B, C, D, E, F, G ); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1ff6ed0f/compiler/src/CFCParser.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCParser.c b/compiler/src/CFCParser.c index b1c74f7..efb31cb 100644 --- a/compiler/src/CFCParser.c +++ b/compiler/src/CFCParser.c @@ -20,6 +20,7 @@ #define CFC_NEED_BASE_STRUCT_DEF #include "CFCBase.h" #include "CFCParser.h" +#include "CFCClass.h" #include "CFCParcel.h" #include "CFCFile.h" #include "CFCFileSpec.h" @@ -39,8 +40,7 @@ struct CFCParser { struct CFCBase *result; int errors; int lineno; - char *class_name; - int class_is_final; + CFCClass *klass; CFCFileSpec *file_spec; CFCMemPool *pool; CFCParcel *parcel; @@ -67,7 +67,7 @@ CFCParser_init(CFCParser *self) { self->result = NULL; self->errors = false; self->lineno = 0; - self->class_name = NULL; + self->klass = NULL; self->file_spec = NULL; self->pool = NULL; self->parcel = NULL; @@ -77,7 +77,7 @@ CFCParser_init(CFCParser *self) { void CFCParser_destroy(CFCParser *self) { CFCParseHeaderFree(self->header_parser, free); - FREEMEM(self->class_name); + CFCBase_decref((CFCBase*)self->klass); CFCBase_decref((CFCBase*)self->file_spec); CFCBase_decref((CFCBase*)self->pool); CFCBase_decref(self->result); @@ -176,29 +176,15 @@ CFCParser_get_parcel(CFCParser *self) { } void -CFCParser_set_class_name(CFCParser *self, const char *class_name) { - FREEMEM(self->class_name); - if (class_name) { - self->class_name = CFCUtil_strdup(class_name); - } - else { - self->class_name = NULL; - } -} - -const char* -CFCParser_get_class_name(CFCParser *self) { - return self->class_name; +CFCParser_set_class(CFCParser *self, CFCClass *klass) { + CFCBase_incref((CFCBase*)klass); + CFCBase_decref((CFCBase*)self->klass); + self->klass = klass; } -void -CFCParser_set_class_final(CFCParser *self, int is_final) { - self->class_is_final = is_final; -} - -int -CFCParser_get_class_final(CFCParser *self) { - return self->class_is_final; +CFCClass* +CFCParser_get_class(CFCParser *self) { + return self->klass; } void http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1ff6ed0f/compiler/src/CFCParser.h ---------------------------------------------------------------------- diff --git a/compiler/src/CFCParser.h b/compiler/src/CFCParser.h index cd862c0..6d3d874 100644 --- a/compiler/src/CFCParser.h +++ b/compiler/src/CFCParser.h @@ -30,6 +30,7 @@ extern "C" { typedef struct CFCParser CFCParser; struct CFCBase; +struct CFCClass; struct CFCParcel; struct CFCFile; struct CFCFileSpec; @@ -83,16 +84,10 @@ struct CFCParcel* CFCParser_get_parcel(CFCParser *self); void -CFCParser_set_class_name(CFCParser *self, const char *class_name); +CFCParser_set_class(CFCParser *self, struct CFCClass *klass); -const char* -CFCParser_get_class_name(CFCParser *self); - -void -CFCParser_set_class_final(CFCParser *self, int is_final); - -int -CFCParser_get_class_final(CFCParser *self); +struct CFCClass* +CFCParser_get_class(CFCParser *self); void CFCParser_set_file_spec(CFCParser *self, struct CFCFileSpec *file_spec); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1ff6ed0f/compiler/src/CFCTestClass.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestClass.c b/compiler/src/CFCTestClass.c index 266a692..793f2c7 100644 --- a/compiler/src/CFCTestClass.c +++ b/compiler/src/CFCTestClass.c @@ -156,7 +156,7 @@ S_run_tests(CFCTest *test) { } CFCParser_set_parcel(parser, neato); - CFCParser_set_class_name(parser, "Foo"); + CFCParser_set_class(parser, foo); CFCMethod *do_stuff = CFCTest_parse_method(test, parser, "void Do_Stuff(Foo *self);"); CFCClass_add_method(foo, do_stuff); @@ -166,7 +166,7 @@ S_run_tests(CFCTest *test) { false, true, false); { - CFCParser_set_class_name(parser, "InertFoo"); + CFCParser_set_class(parser, inert_foo); CFCMethod *inert_do_stuff = CFCTest_parse_method(test, parser, "void Do_Stuff(InertFoo *self);"); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1ff6ed0f/compiler/src/CFCTestFunction.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestFunction.c b/compiler/src/CFCTestFunction.c index 459fea1..49bdc73 100644 --- a/compiler/src/CFCTestFunction.c +++ b/compiler/src/CFCTestFunction.c @@ -18,6 +18,7 @@ #define CFC_USE_TEST_MACROS #include "CFCBase.h" +#include "CFCClass.h" #include "CFCFunction.h" #include "CFCParamList.h" #include "CFCParcel.h" @@ -26,6 +27,11 @@ #include "CFCType.h" #include "CFCUtil.h" +#ifndef true + #define true 1 + #define false 0 +#endif + static void S_run_tests(CFCTest *test); @@ -68,7 +74,10 @@ S_run_tests(CFCTest *test) { } { - CFCParser_set_class_name(parser, "Neato::Obj"); + CFCClass *neato_obj + = CFCClass_create(neato_parcel, NULL, "Neato::Obj", NULL, NULL, + NULL, NULL, false, false, false); + CFCParser_set_class(parser, neato_obj); static const char *func_strings[2] = { "inert int running_count(int biscuit);", "public inert Hash* init_fave_hash(int32_t num_buckets," @@ -79,6 +88,7 @@ S_run_tests(CFCTest *test) { = CFCTest_parse_function(test, parser, func_strings[i]); CFCBase_decref((CFCBase*)func); } + CFCBase_decref((CFCBase*)neato_obj); } CFCBase_decref((CFCBase*)return_type); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1ff6ed0f/compiler/src/CFCTestMethod.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestMethod.c b/compiler/src/CFCTestMethod.c index d92bbdc..e927fe4 100644 --- a/compiler/src/CFCTestMethod.c +++ b/compiler/src/CFCTestMethod.c @@ -28,6 +28,11 @@ #include "CFCType.h" #include "CFCUtil.h" +#ifndef true + #define true 1 + #define false 0 +#endif + static void S_run_tests(CFCTest *test); @@ -225,7 +230,10 @@ S_run_parser_tests(CFCTest *test) { CFCParser *parser = CFCParser_new(); CFCParcel *neato_parcel = CFCTest_parse_parcel(test, parser, "parcel Neato;"); - CFCParser_set_class_name(parser, "Neato::Obj"); + CFCClass *neato_obj + = CFCClass_create(neato_parcel, NULL, "Neato::Obj", NULL, NULL, NULL, + NULL, false, false, false); + CFCParser_set_class(parser, neato_obj); { static const char *method_strings[4] = { @@ -249,6 +257,7 @@ S_run_parser_tests(CFCTest *test) { CFCBase_decref((CFCBase*)method); } + CFCBase_decref((CFCBase*)neato_obj); CFCBase_decref((CFCBase*)neato_parcel); CFCBase_decref((CFCBase*)parser); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1ff6ed0f/compiler/src/CFCTestParser.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCTestParser.c b/compiler/src/CFCTestParser.c index 219acb6..15f4103 100644 --- a/compiler/src/CFCTestParser.c +++ b/compiler/src/CFCTestParser.c @@ -42,7 +42,7 @@ S_test_initial_value(CFCTest *test, CFCParser *parser, const CFCTestBatch CFCTEST_BATCH_PARSER = { "Clownfish::CFC::Model::Parser", - 203, + 205, S_run_tests }; @@ -261,7 +261,11 @@ S_run_tests(CFCTest *test) { } { - CFCParser_set_class_name(parser, "Stuff::Obj"); + CFCParcel *stuff = CFCTest_parse_parcel(test, parser, "parcel Stuff;"); + CFCClass *stuff_obj + = CFCClass_create(stuff, NULL, "Stuff::Obj", NULL, NULL, NULL, + NULL, false, false, false); + CFCParser_set_class(parser, stuff_obj); const char *method_string = "public Foo* Spew_Foo(Obj *self, uint32_t *how_many);"; @@ -272,6 +276,9 @@ S_run_tests(CFCTest *test) { "public inert Hash *hash;"; CFCVariable *var = CFCTest_parse_variable(test, parser, var_string); CFCBase_decref((CFCBase*)var); + + CFCBase_decref((CFCBase*)stuff_obj); + CFCBase_decref((CFCBase*)stuff); } {