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);
     }
 
     {

Reply via email to