]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use append_array_size for field access
authorJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 15:29:35 +0000 (17:29 +0200)
committerJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 16:12:17 +0000 (18:12 +0200)
codegen/valaccodearraymodule.vala
codegen/valaccodebasemodule.vala
codegen/valaccodememberaccessmodule.vala

index cc137ee8886cfed6aef490bda96630292e6c6083..3aa662849a6f4a03a7eccf010a10eaed7874b76c 100644 (file)
@@ -181,7 +181,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                                return size[dim - 1];
                        }
                } else if (array_expr.symbol_reference != null) {
-                       if (array_expr.symbol_reference is FormalParameter || array_expr.symbol_reference is LocalVariable) {
+                       if (array_expr.symbol_reference is FormalParameter || array_expr.symbol_reference is LocalVariable || array_expr.symbol_reference is Field) {
                                List<CCodeExpression> size = get_array_sizes (array_expr);
                                if (size != null && size.size >= dim) {
                                        if (is_out) {
@@ -191,92 +191,6 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                                                return size[dim - 1];
                                        }
                                }
-                       } else if (array_expr.symbol_reference is Field) {
-                               var field = (Field) array_expr.symbol_reference;
-                               if (field.array_null_terminated) {
-                                       var ma = (MemberAccess) array_expr;
-
-                                       CCodeExpression carray_expr = null;
-
-                                       if (field.binding == MemberBinding.INSTANCE) {
-                                               var cl = field.parent_symbol as Class;
-                                               bool is_gtypeinstance = (cl != null && !cl.is_compact);
-
-                                               string array_cname = field.get_cname ();
-                                               CCodeExpression typed_inst = (CCodeExpression) get_ccodenode (ma.inner);
-
-                                               CCodeExpression inst;
-                                               if (is_gtypeinstance && field.access == SymbolAccessibility.PRIVATE) {
-                                                       inst = new CCodeMemberAccess.pointer (typed_inst, "priv");
-                                               } else {
-                                                       inst = typed_inst;
-                                               }
-                                               if (((TypeSymbol) field.parent_symbol).is_reference_type ()) {
-                                                       carray_expr = new CCodeMemberAccess.pointer (inst, array_cname);
-                                               } else {
-                                                       carray_expr = new CCodeMemberAccess (inst, array_cname);
-                                               }
-                                       } else {
-                                               carray_expr = new CCodeIdentifier (field.get_cname ());
-                                       }
-
-                                       requires_array_length = true;
-                                       var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
-                                       len_call.add_argument (carray_expr);
-                                       return len_call;
-                               } else if (!field.no_array_length) {
-                                       var ma = (MemberAccess) array_expr;
-
-                                       CCodeExpression length_expr = null;
-
-                                       if (field.has_array_length_cexpr) {
-                                               length_expr = new CCodeConstant (field.get_array_length_cexpr ());
-                                       } else if (field.binding == MemberBinding.INSTANCE) {
-                                               var cl = field.parent_symbol as Class;
-                                               bool is_gtypeinstance = (cl != null && !cl.is_compact);
-
-                                               string length_cname;
-                                               if (field.has_array_length_cname) {
-                                                       length_cname = field.get_array_length_cname ();
-                                               } else {
-                                                       length_cname = get_array_length_cname (field.name, dim);
-                                               }
-                                               CCodeExpression typed_inst = (CCodeExpression) get_ccodenode (ma.inner);
-
-                                               CCodeExpression inst;
-                                               if (is_gtypeinstance && field.access == SymbolAccessibility.PRIVATE) {
-                                                       inst = new CCodeMemberAccess.pointer (typed_inst, "priv");
-                                               } else {
-                                                       inst = typed_inst;
-                                               }
-                                               if (((TypeSymbol) field.parent_symbol).is_reference_type ()) {
-                                                       length_expr = new CCodeMemberAccess.pointer (inst, length_cname);
-                                               } else {
-                                                       length_expr = new CCodeMemberAccess (inst, length_cname);
-                                               }
-
-                                               if (field.array_length_type != null) {
-                                                       // cast if field does not use int for array length
-                                                       var parent_expr = array_expr.parent_node as Expression;
-                                                       if (array_expr.lvalue) {
-                                                               // don't cast if array is used as lvalue
-                                                       } else if (parent_expr != null && parent_expr.symbol_reference is ArrayLengthField &&
-                                                                  parent_expr.lvalue) {
-                                                               // don't cast if array length is used as lvalue
-                                                       } else {
-                                                               length_expr = new CCodeCastExpression (length_expr, "gint");
-                                                       }
-                                               }
-                                       } else {
-                                               length_expr = new CCodeIdentifier (get_array_length_cname (field.get_cname (), dim));
-                                       }
-
-                                       if (is_out) {
-                                               return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
-                                       } else {
-                                               return length_expr;
-                                       }
-                               }
                        } else if (array_expr.symbol_reference is Constant) {
                                var constant = (Constant) array_expr.symbol_reference;
                                var ccall = new CCodeFunctionCall (new CCodeIdentifier ("G_N_ELEMENTS"));
index 344ec72411a2e52ad94dab2cac95a9d575608664..0c735e364c80bc49246b81e55c61a3991f47f1f7 100644 (file)
@@ -934,7 +934,9 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                        set_cvalue (this_access, new CCodeIdentifier ("self"));
                                        var ma = new MemberAccess (this_access, f.name);
                                        ma.symbol_reference = f;
-                                       
+                                       ma.value_type = f.variable_type.copy ();
+                                       visit_member_access (ma);
+
                                        List<Expression> sizes = ((ArrayCreationExpression) f.initializer).get_sizes ();
                                        for (int dim = 1; dim <= array_type.rank; dim++) {
                                                var array_len_lhs = get_array_length_cexpression (ma, dim);
@@ -978,6 +980,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                var ma = new MemberAccess (this_access, f.name);
                                ma.symbol_reference = f;
                                ma.value_type = f.variable_type.copy ();
+                               visit_member_access (ma);
                                ccode.add_expression (get_unref_expression (lhs, f.variable_type, ma));
 
                                pop_context ();
@@ -1010,6 +1013,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                        var ma = new MemberAccess.simple (local.name);
                                        ma.symbol_reference = local;
                                        ma.value_type = local.variable_type.copy ();
+                                       visit_member_access (ma);
                                        ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
                                }
 
@@ -1135,7 +1139,9 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                                        var array_type = (ArrayType) f.variable_type;
                                                        var ma = new MemberAccess.simple (f.name);
                                                        ma.symbol_reference = f;
-                                       
+                                                       ma.value_type = f.variable_type.copy ();
+                                                       visit_member_access (ma);
+
                                                        List<Expression> sizes = ((ArrayCreationExpression) f.initializer).get_sizes ();
                                                        for (int dim = 1; dim <= array_type.rank; dim++) {
                                                                var array_len_lhs = get_array_length_cexpression (ma, dim);
@@ -5505,6 +5511,8 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                                        var ma = new MemberAccess (this_access, f.name);
                                        ma.symbol_reference = f;
+                                       ma.value_type = f.variable_type.copy ();
+                                       visit_member_access (ma);
                                        cblock.add_statement (new CCodeExpressionStatement (get_unref_expression (lhs, f.variable_type, ma)));
                                }
                        }
@@ -5541,6 +5549,8 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                                        set_cvalue (this_access, new CCodeIdentifier ("(*self)"));
                                        var ma = new MemberAccess (this_access, f.name);
                                        ma.symbol_reference = f;
+                                       ma.value_type = f.variable_type.copy ();
+                                       visit_member_access (ma);
                                        copy = get_ref_cexpression (f.variable_type, copy, ma, f);
                                }
                                var dest = new CCodeMemberAccess.pointer (new CCodeIdentifier ("dest"), f.name);
index fb8d08599f4e10d77ce50c7473ed15e89d2dbcac..a3cec43bb9e6ed60ef45fe9d8eeb6d1c8f4b6054 100644 (file)
@@ -96,15 +96,15 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                        }
                        set_cvalue (expr, get_array_length_cexpression (expr.inner, 1));
                } else if (expr.symbol_reference is Field) {
-                       var f = (Field) expr.symbol_reference;
-                       if (f.binding == MemberBinding.INSTANCE) {
-                               var instance_target_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
+                       var field = (Field) expr.symbol_reference;
+                       if (field.binding == MemberBinding.INSTANCE) {
+                               var instance_target_type = get_data_type_for_symbol ((TypeSymbol) field.parent_symbol);
 
                                var cl = instance_target_type.data_type as Class;
                                bool is_gtypeinstance = ((instance_target_type.data_type == cl) && (cl == null || !cl.is_compact));
 
                                CCodeExpression inst;
-                               if (is_gtypeinstance && f.access == SymbolAccessibility.PRIVATE) {
+                               if (is_gtypeinstance && field.access == SymbolAccessibility.PRIVATE) {
                                        inst = new CCodeMemberAccess.pointer (pub_inst, "priv");
                                } else {
                                        if (cl != null) {
@@ -113,20 +113,71 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                        inst = pub_inst;
                                }
                                if (instance_target_type.data_type.is_reference_type () || (expr.inner != null && expr.inner.value_type is PointerType)) {
-                                       set_cvalue (expr, new CCodeMemberAccess.pointer (inst, f.get_cname ()));
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (inst, field.get_cname ()));
                                } else {
                                        if (inst is CCodeCommaExpression) {
                                                var ccomma = inst as CCodeCommaExpression;
                                                var inner = ccomma.get_inner ();
                                                var last = inner.get (inner.size - 1);
-                                               ccomma.set_expression (inner.size - 1, new CCodeMemberAccess (last, f.get_cname ()));
+                                               ccomma.set_expression (inner.size - 1, new CCodeMemberAccess (last, field.get_cname ()));
                                                set_cvalue (expr, ccomma);
                                        } else {
-                                               set_cvalue (expr, new CCodeMemberAccess (inst, f.get_cname ()));
+                                               set_cvalue (expr, new CCodeMemberAccess (inst, field.get_cname ()));
                                        }
                                }
-                       } else if (f.binding == MemberBinding.CLASS) {
-                               var cl = (Class) f.parent_symbol;
+
+                               if (array_type != null) {
+                                       if (field.array_null_terminated) {
+                                               CCodeExpression carray_expr = null;
+                                               if (instance_target_type.data_type.is_reference_type () || (expr.inner != null && expr.inner.value_type is PointerType)) {
+                                                       carray_expr = new CCodeMemberAccess.pointer (inst, field.get_cname ());
+                                               } else {
+                                                       carray_expr = new CCodeMemberAccess (inst, field.get_cname ());
+                                               }
+
+                                               requires_array_length = true;
+                                               var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
+                                               len_call.add_argument (carray_expr);
+                                               append_array_size (expr, len_call);
+                                       } else if (!field.no_array_length) {
+                                               for (int dim = 1; dim <= array_type.rank; dim++) {
+                                                       CCodeExpression length_expr = null;
+
+                                                       if (field.has_array_length_cexpr) {
+                                                               length_expr = new CCodeConstant (field.get_array_length_cexpr ());
+                                                       } else {
+                                                               string length_cname;
+                                                               if (field.has_array_length_cname) {
+                                                                       length_cname = field.get_array_length_cname ();
+                                                               } else {
+                                                                       length_cname = get_array_length_cname (field.name, dim);
+                                                               }
+
+                                                               if (((TypeSymbol) field.parent_symbol).is_reference_type ()) {
+                                                                       length_expr = new CCodeMemberAccess.pointer (inst, length_cname);
+                                                               } else {
+                                                                       length_expr = new CCodeMemberAccess (inst, length_cname);
+                                                               }
+
+                                                               if (field.array_length_type != null) {
+                                                                       // cast if field does not use int for array length
+                                                                       var parent_expr = expr.parent_node as Expression;
+                                                                       if (expr.lvalue) {
+                                                                               // don't cast if array is used as lvalue
+                                                                       } else if (parent_expr != null && parent_expr.symbol_reference is ArrayLengthField &&
+                                                                                  parent_expr.lvalue) {
+                                                                               // don't cast if array length is used as lvalue
+                                                                       } else {
+                                                                               length_expr = new CCodeCastExpression (length_expr, "gint");
+                                                                       }
+                                                               }
+                                                       }
+                                                       append_array_size (expr, length_expr);
+                                               }
+                                       }
+                               }
+                       } else if (field.binding == MemberBinding.CLASS) {
+                               var cl = (Class) field.parent_symbol;
                                var cast = new CCodeFunctionCall (new CCodeIdentifier (cl.get_upper_case_cname (null) + "_CLASS"));
 
                                CCodeExpression klass;
@@ -148,18 +199,35 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                }
                                cast.add_argument (klass);
 
-                               if (f.access == SymbolAccessibility.PRIVATE) {
+                               if (field.access == SymbolAccessibility.PRIVATE) {
                                        var ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS_PRIVATE".printf (cl.get_upper_case_cname ())));
                                        ccall.add_argument (klass);
-                                       set_cvalue (expr, new CCodeMemberAccess.pointer (ccall, f.get_cname ()));
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (ccall, field.get_cname ()));
                                } else {
-                                       set_cvalue (expr, new CCodeMemberAccess.pointer (cast, f.get_cname ()));
+                                       set_cvalue (expr, new CCodeMemberAccess.pointer (cast, field.get_cname ()));
                                }
 
                        } else {
-                               generate_field_declaration (f, cfile);
+                               generate_field_declaration (field, cfile);
+
+                               set_cvalue (expr, new CCodeIdentifier (field.get_cname ()));
 
-                               set_cvalue (expr, new CCodeIdentifier (f.get_cname ()));
+                               if (array_type != null) {
+                                       if (field.array_null_terminated) {
+                                               requires_array_length = true;
+                                               var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
+                                               len_call.add_argument (new CCodeIdentifier (field.get_cname ()));
+                                               append_array_size (expr, len_call);
+                                       } else if (!field.no_array_length) {
+                                               for (int dim = 1; dim <= array_type.rank; dim++) {
+                                                       if (field.has_array_length_cexpr) {
+                                                               append_array_size (expr, new CCodeConstant (field.get_array_length_cexpr ()));
+                                                       } else {
+                                                               append_array_size (expr, new CCodeIdentifier (get_array_length_cname (field.get_cname (), dim)));
+                                                       }
+                                               }
+                                       }
+                               }
                        }
                } else if (expr.symbol_reference is EnumValue) {
                        var ev = (EnumValue) expr.symbol_reference;