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 <[email protected]> Authored: Sun May 3 16:36:59 2015 -0700 Committer: Marvin Humphrey <[email protected]> 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*
