]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Add CCodeBaseModule.get_this_class_cexpression() and use where possible
authorRico Tzschichholz <ricotz@ubuntu.com>
Mon, 3 May 2021 19:12:38 +0000 (21:12 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 3 May 2021 19:12:38 +0000 (21:12 +0200)
codegen/valaccodebasemodule.vala
codegen/valaccodememberaccessmodule.vala
codegen/valaccodemethodcallmodule.vala

index d9eb216c74d91fb571cb609fe9dbf52a2a55b10b..55435ea1cbdcbeddee4ab6f499fa5fbb60a410b2 100644 (file)
@@ -2539,6 +2539,25 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                return get_cexpression ("self");
        }
 
+       public CCodeExpression get_this_class_cexpression (Class cl, TargetValue? instance = null) {
+               CCodeExpression cast;
+               if (instance != null) {
+                       // Accessing the member of an instance
+                       var call = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (cl)));
+                       call.add_argument (get_cvalue_ (instance));
+                       cast = call;
+               } else if (get_this_type () != null) {
+                       // Accessing the member from within an instance method
+                       var call = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (cl)));
+                       call.add_argument (get_this_cexpression ());
+                       cast = call;
+               } else {
+                       // Accessing the member from a static or class constructor
+                       cast = new CCodeIdentifier ("klass");
+               }
+               return cast;
+       }
+
        public CCodeExpression get_this_interface_cexpression (Interface iface) {
                if (current_class.implements (iface)) {
                        return new CCodeIdentifier ("%s_%s_parent_iface".printf (get_ccode_lower_case_name (current_class), get_ccode_lower_case_name (iface)));
@@ -4207,18 +4226,10 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        l = get_cvalue (((MemberAccess) resource).inner);
                        l = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (l, "priv"), get_symbol_lock_name (get_ccode_name (member)));
                } else if (member.is_class_member ()) {
-                       CCodeExpression klass;
-
-                       if (get_this_type () != null) {
-                               var k = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function ((Class) parent))));
-                               k.add_argument (new CCodeIdentifier ("self"));
-                               klass = k;
-                       } else {
-                               klass = new CCodeIdentifier ("klass");
-                       }
-
-                       var get_class_private_call = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_class_get_private_function ((Class) parent)));
-                       get_class_private_call.add_argument (klass);
+                       unowned Class cl = (Class) parent;
+                       var cast = get_this_class_cexpression (cl);
+                       var get_class_private_call = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_class_get_private_function (cl)));
+                       get_class_private_call.add_argument (cast);
                        l = new CCodeMemberAccess.pointer (get_class_private_call, get_symbol_lock_name (get_ccode_name (member)));
                } else {
                        string lock_name = "%s_%s".printf (get_ccode_lower_case_name (parent), get_ccode_name (member));
index b1f130eb990f62b1de354032c4965df993dbf26d..944aa3ea8253d4e5faa2d4cf1408c43da543668d 100644 (file)
@@ -702,31 +702,11 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                }
                        }
                } else if (field.binding == MemberBinding.CLASS) {
-                       var cl = (Class) field.parent_symbol;
-                       var cast = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_class_type_function (cl)));
-
-                       CCodeExpression klass;
-                       if (instance == null) {
-                               if (get_this_type () == null) {
-                                       // Accessing the field from a static or class constructor
-                                       klass = new CCodeIdentifier ("klass");
-                               } else {
-                                       // Accessing the field from within an instance method
-                                       var k = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (cl)));
-                                       k.add_argument (new CCodeIdentifier ("self"));
-                                       klass = k;
-                               }
-                       } else {
-                               // Accessing the field of an instance
-                               var k = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (cl)));
-                               k.add_argument (get_cvalue_ (instance));
-                               klass = k;
-                       }
-                       cast.add_argument (klass);
-
+                       unowned Class cl = (Class) field.parent_symbol;
+                       var cast = get_this_class_cexpression (cl, instance);
                        if (field.access == SymbolAccessibility.PRIVATE) {
                                var ccall = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_class_get_private_function (cl)));
-                               ccall.add_argument (klass);
+                               ccall.add_argument (cast);
                                result.cvalue = new CCodeMemberAccess.pointer (ccall, get_ccode_name (field));
                        } else {
                                result.cvalue = new CCodeMemberAccess.pointer (cast, get_ccode_name (field));
index 8f9a197b90468f017213444ff28ea884bad9c2ee..399a0572180edffc52a53822ce53165591b70538 100644 (file)
@@ -289,28 +289,8 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                in_arg_map.set (get_param_pos (get_ccode_instance_pos (m)), instance);
                        }
                } else if (m != null && m.binding == MemberBinding.CLASS) {
-                       var cl = (Class) m.parent_symbol;
-                       var cast = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_class_type_function (cl)));
-
-                       CCodeExpression klass;
-                       if (ma.inner == null) {
-                               if (get_this_type () == null) {
-                                       // Accessing the method from a static or class constructor
-                                       klass = new CCodeIdentifier ("klass");
-                               } else {
-                                       // Accessing the method from within an instance method
-                                       var k = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (cl));
-                                       k.add_argument (get_this_cexpression ());
-                                       klass = k;
-                               }
-                       } else {
-                               // Accessing the method of an instance
-                               var k = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (cl)));
-                               k.add_argument (get_cvalue (ma.inner));
-                               klass = k;
-                       }
-
-                       cast.add_argument (klass);
+                       unowned Class cl = (Class) m.parent_symbol;
+                       var cast = get_this_class_cexpression (cl, ma.inner != null ? ma.inner.target_value : null);
                        in_arg_map.set (get_param_pos (get_ccode_instance_pos (m)), cast);
                        out_arg_map.set (get_param_pos (get_ccode_instance_pos (m)), cast);
                }