]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Add get_array_size_cvalue and set_array_size_cvalue
authorJürg Billeter <j@bitron.ch>
Thu, 21 Oct 2010 14:39:45 +0000 (16:39 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 28 Oct 2010 09:47:07 +0000 (11:47 +0200)
codegen/valaccodearraymodule.vala
codegen/valaccodeassignmentmodule.vala
codegen/valaccodebasemodule.vala
codegen/valaccodememberaccessmodule.vala
codegen/valaccodemethodcallmodule.vala

index c906fb217e8992804a7c81fe9e646491d27d06eb..8e1af80f97674563be0417fa7c1b814763f8fcff 100644 (file)
@@ -167,52 +167,6 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                return "_%s_size_".printf (array_cname);
        }
 
-       public override CCodeExpression get_array_size_cexpression (Expression array_expr) {
-               if (array_expr.symbol_reference is LocalVariable) {
-                       var local = (LocalVariable) array_expr.symbol_reference;
-                       if (local.captured) {
-                               // captured variables are stored on the heap
-                               var block = (Block) local.parent_symbol;
-                               return new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_size_cname (get_variable_cname (local.name)));
-                       } else {
-                               var size_expr = get_variable_cexpression (get_array_size_cname (get_variable_cname (local.name)));
-                               return size_expr;
-                       }
-
-               } else if (array_expr.symbol_reference is Field) {
-                       var field = (Field) array_expr.symbol_reference;
-                       var ma = (MemberAccess) array_expr;
-
-                       CCodeExpression size_expr = null;
-
-                       if (field.binding == MemberBinding.INSTANCE) {
-                               var cl = field.parent_symbol as Class;
-                               bool is_gtypeinstance = (cl != null && !cl.is_compact);
-
-                               string size_cname = get_array_size_cname (field.name);
-                               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 ()) {
-                                       size_expr = new CCodeMemberAccess.pointer (inst, size_cname);
-                               } else {
-                                       size_expr = new CCodeMemberAccess (inst, size_cname);
-                               }
-                       } else {
-                               size_expr = new CCodeIdentifier (get_array_size_cname (field.get_cname ()));
-                       }
-
-                       return size_expr;
-               }
-
-               assert_not_reached ();
-       }
-
        public override void visit_element_access (ElementAccess expr) {
                List<Expression> indices = expr.get_indices ();
                int rank = indices.size;
@@ -779,7 +733,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                var ccall = new CCodeFunctionCall (new CCodeIdentifier (generate_array_add_wrapper (array_type)));
                ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_cvalue (array)));
                ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_array_length_cexpression (array)));
-               ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_array_size_cexpression (array)));
+               ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_array_size_cvalue (array.target_value)));
                ccall.add_argument (handle_struct_argument (value_param, element, get_cvalue (element)));
 
                set_cvalue (assignment, ccall);
index 8745541aa3b4c8e4a5f4a55a9ad5e2507e667a0f..f6168006fc42eb85a9551f9af429690a05932442 100644 (file)
@@ -140,7 +140,7 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
                                        var array_local = array_var as LocalVariable;
                                        if (array_var != null && array_var.is_internal_symbol ()
                                            && ((array_var is LocalVariable && !array_local.captured) || array_var is Field)) {
-                                               var lhs_array_size = get_array_size_cexpression (assignment.left);
+                                               var lhs_array_size = get_array_size_cvalue (assignment.left.target_value);
                                                var rhs_array_len = get_array_length_cexpression (assignment.left, 1);
                                                ccode.add_expression (new CCodeAssignment (lhs_array_size, rhs_array_len));
                                        }
index 4e528495bb37494cfd25f07d6dd5eb5eaa2e696c..845293ea7618fcc0b3f06393947658035df4d62f 100644 (file)
@@ -964,7 +964,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                        }
 
                                        if (array_type.rank == 1 && f.is_internal_symbol ()) {
-                                               var lhs_array_size = get_array_size_cexpression (ma);
+                                               var lhs_array_size = get_array_size_cvalue (ma.target_value);
                                                var rhs_array_len = get_array_length_cexpression (ma, 1);
                                                ccode.add_expression (new CCodeAssignment (lhs_array_size, rhs_array_len));
                                        }
@@ -2068,7 +2068,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                ccode.add_expression (new CCodeAssignment (lhs_array_len, rhs_array_len));
                                        }
                                        if (array_type.rank == 1 && !local.captured) {
-                                               var lhs_array_size = get_array_size_cexpression (ma);
+                                               var lhs_array_size = get_array_size_cvalue (ma.target_value);
                                                var rhs_array_len = get_array_length_cexpression (ma, 1);
                                                ccode.add_expression (new CCodeAssignment (lhs_array_size, rhs_array_len));
                                        }
@@ -5888,10 +5888,6 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                return "";
        }
 
-       public virtual CCodeExpression get_array_size_cexpression (Expression array_expr) {
-               return new CCodeConstant ("");
-       }
-
        public virtual void add_simple_check (CodeNode node, bool always_fails = false) {
        }
 
@@ -5917,6 +5913,16 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                glib_value.cvalue = cvalue;
        }
 
+       public CCodeExpression? get_array_size_cvalue (TargetValue value) {
+               var glib_value = (GLibValue) value;
+               return glib_value.array_size_cvalue;
+       }
+
+       public void set_array_size_cvalue (TargetValue value, CCodeExpression? cvalue) {
+               var glib_value = (GLibValue) value;
+               glib_value.array_size_cvalue = cvalue;
+       }
+
        public CCodeExpression? get_delegate_target (Expression expr) {
                if (expr.target_value == null) {
                        return null;
@@ -5974,6 +5980,7 @@ public class Vala.GLibValue : TargetValue {
        public CCodeExpression cvalue;
 
        public List<CCodeExpression> array_length_cvalues;
+       public CCodeExpression? array_size_cvalue;
 
        public CCodeExpression? delegate_target_cvalue;
        public CCodeExpression? delegate_target_destroy_notify_cvalue;
index d0b4eb38783f31e959ff78109cd2ad7c968bae37..b2fd33260cd13b3078b0367a53f365ad1c3dd2e1 100644 (file)
@@ -198,6 +198,15 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                                        }
                                                        append_array_size (expr, length_expr);
                                                }
+                                               if (array_type.rank == 1 && field.is_internal_symbol ()) {
+                                                       string size_cname = get_array_size_cname (field.name);
+
+                                                       if (((TypeSymbol) field.parent_symbol).is_reference_type ()) {
+                                                               set_array_size_cvalue (expr.target_value, new CCodeMemberAccess.pointer (inst, size_cname));
+                                                       } else {
+                                                               set_array_size_cvalue (expr.target_value, new CCodeMemberAccess (inst, size_cname));
+                                                       }
+                                               }
                                        }
                                } else if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
                                        string target_cname = get_delegate_target_cname (field.get_cname ());
@@ -270,6 +279,9 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                                                append_array_size (expr, new CCodeIdentifier (get_array_length_cname (field.get_cname (), dim)));
                                                        }
                                                }
+                                               if (array_type.rank == 1 && field.is_internal_symbol ()) {
+                                                       set_array_size_cvalue (expr.target_value, new CCodeIdentifier (get_array_size_cname (field.get_cname ())));
+                                               }
                                        }
                                } else if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
                                        set_delegate_target_destroy_notify (expr, new CCodeConstant ("NULL"));
@@ -612,6 +624,9 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                for (int dim = 1; dim <= array_type.rank; dim++) {
                                        result.append_array_length_cvalue (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_length_cname (get_variable_cname (local.name), dim)));
                                }
+                               if (array_type.rank == 1) {
+                                       result.array_size_cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_size_cname (get_variable_cname (local.name)));
+                               }
                        } else if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
                                result.delegate_target_cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_cname (get_variable_cname (local.name)));
                                result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_destroy_notify_cname (get_variable_cname (local.name)));
@@ -622,6 +637,9 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                for (int dim = 1; dim <= array_type.rank; dim++) {
                                        result.append_array_length_cvalue (get_variable_cexpression (get_array_length_cname (get_variable_cname (local.name), dim)));
                                }
+                               if (array_type.rank == 1) {
+                                       result.array_size_cvalue = get_variable_cexpression (get_array_size_cname (get_variable_cname (local.name)));
+                               }
                        } else if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
                                if (current_method != null && current_method.coroutine) {
                                        result.delegate_target_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_cname (get_variable_cname (local.name)));
index 0083b63419061eba5d23ed2adae6e3a035d76c4f..c6c0140b942fa42ac0e5935007921677fd285bc5 100644 (file)
@@ -729,7 +729,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        var array_local = array_var as LocalVariable;
                        if (array_var != null && array_var.is_internal_symbol ()
                            && ((array_var is LocalVariable && !array_local.captured) || array_var is Field)) {
-                               ccomma.append_expression (new CCodeAssignment (get_array_size_cexpression (ma.inner), temp_ref));
+                               ccomma.append_expression (new CCodeAssignment (get_array_size_cvalue (ma.inner.target_value), temp_ref));
                        }
 
                        set_cvalue (expr, ccomma);