]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Do not create array lists where not necessary
authorJürg Billeter <j@bitron.ch>
Wed, 11 Aug 2010 22:32:50 +0000 (00:32 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 12 Aug 2010 12:40:15 +0000 (14:40 +0200)
codegen/valaccodearraymodule.vala
codegen/valaccodebasemodule.vala
codegen/valaccodecontrolflowmodule.vala
codegen/valadovabasemodule.vala
vala/valaexpression.vala
vala/valasymbol.vala

index 96558f5a552e53538223e775ac9097c4305dfb97..9d67ff3aa0252dd933ac6853b1d0c2ec3909bdb3 100644 (file)
@@ -173,7 +173,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        return (CCodeExpression) get_ccodenode (length_expr);
                } else if (array_expr is MethodCall || array_expr is CastExpression || array_expr is SliceExpression) {
                        List<CCodeExpression> size = array_expr.get_array_sizes ();
-                       if (size.size >= dim) {
+                       if (size != null && size.size >= dim) {
                                return size[dim - 1];
                        }
                } else if (array_expr.symbol_reference != null) {
@@ -325,7 +325,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                                var prop = (Property) array_expr.symbol_reference;
                                if (!prop.no_array_length) {
                                        List<CCodeExpression> size = array_expr.get_array_sizes ();
-                                       if (size.size >= dim) {
+                                       if (size != null && size.size >= dim) {
                                                return size[dim - 1];
                                        }
                                }
index b2871c5d76a46f0ffa97c9c337fdf085eeabd8bf..09055078d0f53de6c972dbd65e929a66a9f64a56 100644 (file)
@@ -3070,11 +3070,17 @@ public class Vala.CCodeBaseModule : CCodeModule {
                 * expr.temp_vars = temp_vars;
                 * when deep list copying works
                 */
-               expr.temp_vars.clear ();
-               foreach (LocalVariable local in temp_vars) {
-                       expr.temp_vars.add (local);
+               if (temp_vars.size > 0) {
+                       if (expr.temp_vars == null) {
+                               expr.temp_vars = new ArrayList<LocalVariable> ();
+                       } else {
+                               expr.temp_vars.clear ();
+                       }
+                       foreach (LocalVariable local in temp_vars) {
+                               expr.add_temp_var (local);
+                       }
+                       temp_vars.clear ();
                }
-               temp_vars.clear ();
 
                if (((List<LocalVariable>) temp_ref_vars).size == 0) {
                        /* nothing to do without temporary variables */
@@ -3095,7 +3101,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
                        }
 
                        full_expr_var = get_temp_variable (expr_type, true, expr, false);
-                       expr.temp_vars.add (full_expr_var);
+                       expr.add_temp_var (full_expr_var);
                
                        expr_list.append_expression (new CCodeAssignment (get_variable_cexpression (full_expr_var.name), (CCodeExpression) expr.ccodenode));
                }
@@ -3116,7 +3122,10 @@ public class Vala.CCodeBaseModule : CCodeModule {
                temp_ref_vars.clear ();
        }
        
-       public void append_temp_decl (CCodeFragment cfrag, List<LocalVariable> temp_vars) {
+       public void append_temp_decl (CCodeFragment cfrag, List<LocalVariable>? temp_vars) {
+               if (temp_vars == null) {
+                       return;
+               }
                foreach (LocalVariable local in temp_vars) {
                        var cdecl = new CCodeDeclaration (local.variable_type.get_cname ());
 
@@ -3220,10 +3229,10 @@ public class Vala.CCodeBaseModule : CCodeModule {
                temp_ref_vars.clear ();
        }
        
-       public void create_temp_decl (Statement stmt, List<LocalVariable> temp_vars) {
+       public void create_temp_decl (Statement stmt, List<LocalVariable>? temp_vars) {
                /* declare temporary variables */
                
-               if (temp_vars.size == 0) {
+               if (temp_vars == null || temp_vars.size == 0) {
                        /* nothing to do without temporary variables */
                        return;
                }
@@ -3385,7 +3394,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
                        ccomma.append_expression (get_variable_cexpression (return_expr_decl.name));
 
                        stmt.return_expression.ccodenode = ccomma;
-                       stmt.return_expression.temp_vars.add (return_expr_decl);
+                       stmt.return_expression.add_temp_var (return_expr_decl);
                } else if ((current_method != null || current_property_accessor != null) && current_return_type is DelegateType) {
                        var delegate_type = (DelegateType) current_return_type;
                        if (delegate_type.delegate_symbol.has_target) {
@@ -3412,7 +3421,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
                                ccomma.append_expression (get_variable_cexpression (return_expr_decl.name));
 
                                stmt.return_expression.ccodenode = ccomma;
-                               stmt.return_expression.temp_vars.add (return_expr_decl);
+                               stmt.return_expression.add_temp_var (return_expr_decl);
                        }
                }
 
@@ -3626,7 +3635,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
                }
 
                var regex_var = get_temp_variable (regex_type, true, expr, false);
-               expr.temp_vars.add (regex_var);
+               expr.add_temp_var (regex_var);
 
                var cdecl = new CCodeDeclaration ("GRegex*");
 
index 9daa5286c6c8902300557a64886fc7dd463c6bfd..7b938f8f5d6820e6f3ad5d4682314b2025b07d18 100644 (file)
@@ -47,7 +47,7 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule {
        void visit_string_switch_statement (SwitchStatement stmt) {
                // we need a temporary variable to save the property value
                var temp_var = get_temp_variable (stmt.expression.value_type, stmt.expression.value_type.value_owned, stmt, false);
-               stmt.expression.temp_vars.add (temp_var);
+               stmt.expression.add_temp_var (temp_var);
 
                var ctemp = get_variable_cexpression (temp_var.name);
                var cinit = new CCodeAssignment (ctemp, (CCodeExpression) stmt.expression.ccodenode);
@@ -66,7 +66,7 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule {
                var ccond = new CCodeConditionalExpression (cisnull, new CCodeConstant ("0"), cquark);
 
                temp_var = get_temp_variable (gquark_type);
-               stmt.expression.temp_vars.add (temp_var);
+               stmt.expression.add_temp_var (temp_var);
 
                int label_count = 0;
 
index d1b9a6b3193d74159ae7858bdf05ccf044d9c347..248c51e1072d6073b3f4198541e0f8176140a1bd 100644 (file)
@@ -1228,11 +1228,17 @@ internal class Vala.DovaBaseModule : CCodeModule {
                 * expr.temp_vars = temp_vars;
                 * when deep list copying works
                 */
-               expr.temp_vars.clear ();
-               foreach (LocalVariable local in temp_vars) {
-                       expr.temp_vars.add (local);
+               if (temp_vars.size > 0) {
+                       if (expr.temp_vars == null) {
+                               expr.temp_vars = new ArrayList<LocalVariable> ();
+                       } else {
+                               expr.temp_vars.clear ();
+                       }
+                       foreach (LocalVariable local in temp_vars) {
+                               expr.temp_vars.add (local);
+                       }
+                       temp_vars.clear ();
                }
-               temp_vars.clear ();
 
                if (((List<LocalVariable>) temp_ref_vars).size == 0) {
                        /* nothing to do without temporary variables */
@@ -1245,7 +1251,7 @@ internal class Vala.DovaBaseModule : CCodeModule {
                }
 
                var full_expr_var = get_temp_variable (expr_type, true, expr);
-               expr.temp_vars.add (full_expr_var);
+               expr.add_temp_var (full_expr_var);
 
                var expr_list = new CCodeCommaExpression ();
                expr_list.append_expression (new CCodeAssignment (get_variable_cexpression (full_expr_var.name), (CCodeExpression) expr.ccodenode));
@@ -1263,7 +1269,10 @@ internal class Vala.DovaBaseModule : CCodeModule {
                temp_ref_vars.clear ();
        }
 
-       public void append_temp_decl (CCodeFragment cfrag, List<LocalVariable> temp_vars) {
+       public void append_temp_decl (CCodeFragment cfrag, List<LocalVariable>? temp_vars) {
+               if (temp_vars == null) {
+                       return;
+               }
                foreach (LocalVariable local in temp_vars) {
                        var cdecl = new CCodeDeclaration (local.variable_type.get_cname ());
 
@@ -1364,10 +1373,10 @@ internal class Vala.DovaBaseModule : CCodeModule {
                temp_ref_vars.clear ();
        }
 
-       public void create_temp_decl (Statement stmt, List<LocalVariable> temp_vars) {
+       public void create_temp_decl (Statement stmt, List<LocalVariable>? temp_vars) {
                /* declare temporary variables */
 
-               if (temp_vars.size == 0) {
+               if (temp_vars == null || temp_vars.size == 0) {
                        /* nothing to do without temporary variables */
                        return;
                }
index afd54aa0c1791c15b43e19d2e272ce4bb91ab255..23c01e2910a4b0de0bb3795d104af4684951dde8 100644 (file)
@@ -61,9 +61,9 @@ public abstract class Vala.Expression : CodeNode {
         *
         * The code generator sets and uses them for memory management.
         */
-       public ArrayList<LocalVariable> temp_vars = new ArrayList<LocalVariable> ();
+       public ArrayList<LocalVariable> temp_vars;
 
-       private List<CCodeExpression> array_sizes = new ArrayList<CCodeExpression> ();
+       private List<CCodeExpression> array_sizes;
 
        public CCodeExpression? delegate_target { get; set; }
        public CCodeExpression? delegate_target_destroy_notify { get; set; }
@@ -89,10 +89,20 @@ public abstract class Vala.Expression : CodeNode {
                return false;
        }
 
+       public void add_temp_var (LocalVariable local) {
+               if (temp_vars == null) {
+                       temp_vars = new ArrayList<LocalVariable> ();
+               }
+               temp_vars.add (local);
+       }
+
        /**
         * Add an array size C code expression.
         */
        public void append_array_size (CCodeExpression size) {
+               if (array_sizes == null) {
+                       array_sizes = new ArrayList<CCodeExpression> ();
+               }
                array_sizes.add (size);
        }
 
@@ -100,7 +110,7 @@ public abstract class Vala.Expression : CodeNode {
         * Get the C code expression for array sizes for all dimensions
         * ascending from left to right.
         */
-       public List<CCodeExpression> get_array_sizes () {
+       public List<CCodeExpression>? get_array_sizes () {
                return array_sizes;
        }
 
index 2fb6c3a9bb93771a04ef3cea2d8ff925a77482fa..1aa5ed7c6f1d9ad0b0ff9c320b5dc2d64dc13630 100644 (file)
@@ -97,7 +97,7 @@ public abstract class Vala.Symbol : CodeNode {
 
        public Comment? comment { get; set; }
 
-       private List<string> cheader_filenames = new ArrayList<string> ();
+       private List<string> cheader_filenames;
 
        /**
         * Specifies whether this method explicitly hides a member of a base
@@ -233,6 +233,8 @@ public abstract class Vala.Symbol : CodeNode {
                return "";
        }
 
+       static List<string> _empty_string_list;
+
        /**
         * Returns a list of C header filenames users of this symbol must
         * include.
@@ -240,16 +242,24 @@ public abstract class Vala.Symbol : CodeNode {
         * @return list of C header filenames for this symbol
         */
        public virtual List<string> get_cheader_filenames () {
-               // parent_symbol can be null on incremental parsing
-               if (cheader_filenames.size == 0 && parent_symbol != null) {
-                       /* default to header filenames of the namespace */
-                       foreach (string filename in parent_symbol.get_cheader_filenames ()) {
-                               add_cheader_filename (filename);
-                       }
+               if (cheader_filenames == null || cheader_filenames.size == 0) {
+                       // parent_symbol can be null on incremental parsing
+                       if (parent_symbol != null) {
+                               /* default to header filenames of the namespace */
+                               var parent_header_filenames = parent_symbol.get_cheader_filenames ();
+                               if (parent_header_filenames.size > 0) {
+                                       return parent_header_filenames;
+                               }
 
-                       if (cheader_filenames.size == 0 && source_reference != null && !external_package) {
-                               // don't add default include directives for VAPI files
-                               cheader_filenames.add (source_reference.file.get_cinclude_filename ());
+                               if (source_reference != null && !external_package) {
+                                       // don't add default include directives for VAPI files
+                                       add_cheader_filename (source_reference.file.get_cinclude_filename ());
+                               }
+                       } else {
+                               if (_empty_string_list == null) {
+                                       _empty_string_list = new ArrayList<string> ();
+                               }
+                               return _empty_string_list;
                        }
                }
                return cheader_filenames;
@@ -455,6 +465,9 @@ public abstract class Vala.Symbol : CodeNode {
         * @param filename a C header filename
         */
        public void add_cheader_filename (string filename) {
+               if (cheader_filenames == null) {
+                       cheader_filenames = new ArrayList<string> ();
+               }
                cheader_filenames.add (filename);
        }