You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2015/05/07 00:18:43 UTC

[17/23] lucy-clownfish git commit: Final classes mean final methods.

Final classes mean final methods.

All dynamic methods in a final class must be final.

Prior to this commit, CFCClass_fresh_methods would return non-finalized
methods, though CFCClass_methods would return methods which had been
properly finalized.


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/cb8d91b9
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/cb8d91b9
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/cb8d91b9

Branch: refs/heads/master
Commit: cb8d91b9cc44096a77cfe8744ea5ef1eaf561326
Parents: 3acdc85
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Sun May 3 16:36:59 2015 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Wed May 6 14:28:16 2015 -0700

----------------------------------------------------------------------
 compiler/src/CFCParseHeader.y |  4 ++++
 compiler/src/CFCParser.c      | 11 +++++++++++
 compiler/src/CFCParser.h      |  6 ++++++
 3 files changed, 21 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cb8d91b9/compiler/src/CFCParseHeader.y
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParseHeader.y b/compiler/src/CFCParseHeader.y
index 56b2629..bff080e 100644
--- a/compiler/src/CFCParseHeader.y
+++ b/compiler/src/CFCParseHeader.y
@@ -51,6 +51,7 @@ S_start_class(CFCParser *state, CFCDocuComment *docucomment, char *exposure,
     }
     CFCParser_set_class_name(state, class_name);
     CFCParser_set_class_nickname(state, class_nickname);
+    CFCParser_set_class_final(state, is_final);
     CFCClass *klass = CFCClass_create(CFCParser_get_parcel(state), exposure,
                                       class_name, class_nickname, NULL,
                                       docucomment, file_spec, inheritance,
@@ -105,6 +106,9 @@ 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) {
+        is_final = true;
+    }
 
     /* If "inert", it's a function, otherwise it's a method. */
     CFCBase *sub;

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cb8d91b9/compiler/src/CFCParser.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParser.c b/compiler/src/CFCParser.c
index 4ce3f28..01bf47b 100644
--- a/compiler/src/CFCParser.c
+++ b/compiler/src/CFCParser.c
@@ -41,6 +41,7 @@ struct CFCParser {
     int lineno;
     char *class_name;
     char *class_nickname;
+    int class_is_final;
     CFCFileSpec *file_spec;
     CFCMemPool *pool;
     CFCParcel  *parcel;
@@ -210,6 +211,16 @@ CFCParser_get_class_nickname(CFCParser *self) {
 }
 
 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;
+}
+
+void
 CFCParser_set_file_spec(CFCParser *self, CFCFileSpec *file_spec) {
     CFCBase_decref((CFCBase*)self->file_spec);
     self->file_spec = (CFCFileSpec*)CFCBase_incref((CFCBase*)file_spec);

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cb8d91b9/compiler/src/CFCParser.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParser.h b/compiler/src/CFCParser.h
index 51b0f44..cf23153 100644
--- a/compiler/src/CFCParser.h
+++ b/compiler/src/CFCParser.h
@@ -95,6 +95,12 @@ const char*
 CFCParser_get_class_nickname(CFCParser *self);
 
 void
+CFCParser_set_class_final(CFCParser *self, int is_final);
+
+int
+CFCParser_get_class_final(CFCParser *self);
+
+void
 CFCParser_set_file_spec(CFCParser *self, struct CFCFileSpec *file_spec);
 
 struct CFCFileSpec*