You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2017/03/18 18:18:01 UTC
[15/20] lucy-clownfish git commit: Simplify CFCBindMeth_method_def
Simplify CFCBindMeth_method_def
Remove unneeded static functions.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/821bf0d0
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/821bf0d0
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/821bf0d0
Branch: refs/heads/master
Commit: 821bf0d0b8c31609ebbc54949f8262ef38393e3a
Parents: 8fbf9c9
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Tue Feb 28 16:41:14 2017 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Thu Mar 2 20:08:05 2017 +0100
----------------------------------------------------------------------
compiler/src/CFCBindMethod.c | 50 +++++++++++----------------------------
1 file changed, 14 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/821bf0d0/compiler/src/CFCBindMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCBindMethod.c b/compiler/src/CFCBindMethod.c
index e6880b4..fad6fd5 100644
--- a/compiler/src/CFCBindMethod.c
+++ b/compiler/src/CFCBindMethod.c
@@ -32,44 +32,8 @@
#define false 0
#endif
-static char*
-S_method_def(CFCMethod *method, CFCClass *klass, int optimized_final_meth);
-
-/* Create a method invocation routine that resolves to a function name
- * directly, since this method may not be overridden.
- */
-static char*
-S_optimized_final_method_def(CFCMethod *method, CFCClass *klass) {
- return S_method_def(method, klass, true);
-}
-
-/* Create a method invocation routine which uses vtable dispatch.
- */
-static char*
-S_virtual_method_def(CFCMethod *method, CFCClass *klass) {
- return S_method_def(method, klass, false);
-}
-
char*
CFCBindMeth_method_def(CFCMethod *method, CFCClass *klass) {
- // If the method is final and the class where it is declared final is in
- // the same parcel as the invocant, we can optimize the call by resolving
- // to the implementing function directly.
- if (CFCMethod_final(method)) {
- CFCClass *ancestor = klass;
- while (ancestor && !CFCMethod_is_fresh(method, ancestor)) {
- ancestor = CFCClass_get_parent(ancestor);
- }
- if (CFCClass_get_parcel(ancestor) == CFCClass_get_parcel(klass)) {
- return S_optimized_final_method_def(method, klass);
- }
- }
-
- return S_virtual_method_def(method, klass);
-}
-
-static char*
-S_method_def(CFCMethod *method, CFCClass *klass, int optimized_final_meth) {
CFCParamList *param_list = CFCMethod_get_param_list(method);
const char *PREFIX = CFCClass_get_PREFIX(klass);
const char *invoker_struct = CFCClass_full_struct_sym(klass);
@@ -95,6 +59,20 @@ S_method_def(CFCMethod *method, CFCClass *klass, int optimized_final_meth) {
const char *ret_type_str = CFCType_to_c(return_type);
const char *maybe_return = CFCType_is_void(return_type) ? "" : "return ";
+ // If the method is final and the class where it is declared final is in
+ // the same parcel as the invocant, we can optimize the call by resolving
+ // to the implementing function directly.
+ int optimized_final_meth = false;
+ if (CFCMethod_final(method)) {
+ CFCClass *ancestor = klass;
+ while (ancestor && !CFCMethod_is_fresh(method, ancestor)) {
+ ancestor = CFCClass_get_parent(ancestor);
+ }
+ if (CFCClass_in_same_parcel(ancestor, klass)) {
+ optimized_final_meth = true;
+ }
+ }
+
const char innards_pattern[] =
" const %s method = (%s)cfish_obj_method(%s, %s);\n"
" %smethod(%s);\n"