]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Do not initialize temporary variables where not necessary
authorJürg Billeter <j@bitron.ch>
Thu, 17 Sep 2009 11:14:32 +0000 (13:14 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 17 Sep 2009 11:14:32 +0000 (13:14 +0200)
codegen/valaccodeassignmentmodule.vala
codegen/valaccodebasemodule.vala
codegen/valaccodecontrolflowmodule.vala
codegen/valaccodememberaccessmodule.vala
codegen/valaccodemethodcallmodule.vala
vala/valalocalvariable.vala

index ab079ea0aa601c84a935a8b137efdb4b76707907..371e8c1682b75ac3631d73c4b52a1bb1c6a91f89 100644 (file)
@@ -140,7 +140,7 @@ internal class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
                                lhs = new CCodeParenthesizedExpression (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, get_variable_cexpression (lhs_temp_name)));
                        }
 
-                       var temp_decl = get_temp_variable (assignment.left.value_type);
+                       var temp_decl = get_temp_variable (assignment.left.value_type, true, null, false);
                        temp_vars.insert (0, temp_decl);
                        ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_decl.name), rhs));
                        if (unref_old) {
index 4a12029a555f00a8ad6606f030558d07f3135ffc..f0c40d8b86b508854c8e16a02483a6c009b6a7be 100644 (file)
@@ -1874,7 +1874,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                } else {
                                        var ccomma = new CCodeCommaExpression ();
 
-                                       var temp_var = get_temp_variable (local.variable_type, true, local);
+                                       var temp_var = get_temp_variable (local.variable_type, true, local, false);
                                        temp_vars.insert (0, temp_var);
                                        ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), rhs));
 
@@ -1899,7 +1899,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                if (d.has_target) {
                                        var ccomma = new CCodeCommaExpression ();
 
-                                       var temp_var = get_temp_variable (local.variable_type, true, local);
+                                       var temp_var = get_temp_variable (local.variable_type, true, local, false);
                                        temp_vars.insert (0, temp_var);
                                        ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), rhs));
 
@@ -2040,10 +2040,11 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                }
        }
 
-       public LocalVariable get_temp_variable (DataType type, bool value_owned = true, CodeNode? node_reference = null) {
+       public LocalVariable get_temp_variable (DataType type, bool value_owned = true, CodeNode? node_reference = null, bool init = true) {
                var var_type = type.copy ();
                var_type.value_owned = value_owned;
                var local = new LocalVariable (var_type, "_tmp%d_".printf (next_temp_var_id));
+               local.no_init = !init;
 
                if (node_reference != null) {
                        local.source_reference = node_reference.source_reference;
@@ -2492,7 +2493,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                        expr_type = expr.target_type;
                }
 
-               var full_expr_var = get_temp_variable (expr_type, true, expr);
+               var full_expr_var = get_temp_variable (expr_type, true, expr, false);
                expr.temp_vars.add (full_expr_var);
                
                var expr_list = new CCodeCommaExpression ();
@@ -2533,6 +2534,8 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                        // initialization is not needed for these special
                                        // pointer temp variables
                                        // used to avoid side-effects in assignments
+                               } else if (local.no_init) {
+                                       // no initialization necessary for this temp var
                                } else if (!local.variable_type.nullable &&
                                           (st != null && !st.is_simple_type ()) ||
                                           (array_type != null && array_type.fixed_length)) {
@@ -2766,7 +2769,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 
                        // return array length if appropriate
                        if (((current_method != null && !current_method.no_array_length) || current_property_accessor != null) && current_return_type is ArrayType) {
-                               var return_expr_decl = get_temp_variable (stmt.return_expression.value_type, true, stmt);
+                               var return_expr_decl = get_temp_variable (stmt.return_expression.value_type, true, stmt, false);
 
                                var ccomma = new CCodeCommaExpression ();
                                ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (return_expr_decl.name), (CCodeExpression) stmt.return_expression.ccodenode));
@@ -2789,7 +2792,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                        } 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) {
-                                       var return_expr_decl = get_temp_variable (stmt.return_expression.value_type, true, stmt);
+                                       var return_expr_decl = get_temp_variable (stmt.return_expression.value_type, true, stmt, false);
 
                                        var ccomma = new CCodeCommaExpression ();
                                        ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (return_expr_decl.name), (CCodeExpression) stmt.return_expression.ccodenode));
@@ -2999,7 +3002,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                        var ccomma = new CCodeCommaExpression ();
                        
                        // assign current value to temp variable
-                       var temp_decl = get_temp_variable (prop.property_type, true, expr);
+                       var temp_decl = get_temp_variable (prop.property_type, true, expr, false);
                        temp_vars.insert (0, temp_decl);
                        ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_decl.name), (CCodeExpression) expr.inner.ccodenode));
                        
@@ -3202,7 +3205,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                        
                        return ccall;
                } else {
-                       var decl = get_temp_variable (expression_type, false, node);
+                       var decl = get_temp_variable (expression_type, false, node, false);
                        temp_vars.insert (0, decl);
 
                        var ctemp = get_variable_cexpression (decl.name);
@@ -3661,7 +3664,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                        // (tmp = expr, &tmp)
                                        var ccomma = new CCodeCommaExpression ();
 
-                                       var temp_var = get_temp_variable (param.parameter_type);
+                                       var temp_var = get_temp_variable (param.parameter_type, true, null, false);
                                        temp_vars.insert (0, temp_var);
                                        ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), cexpr));
                                        ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (temp_var.name)));
@@ -3732,7 +3735,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                        // checked cast for strict subtypes of GTypeInstance
                        if (expr.is_silent_cast) {
                                var ccomma = new CCodeCommaExpression ();
-                               var temp_decl = get_temp_variable (expr.inner.value_type, true, expr);
+                               var temp_decl = get_temp_variable (expr.inner.value_type, true, expr, false);
 
                                temp_vars.add (temp_decl);
 
@@ -3781,7 +3784,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 
                /* (tmp = var, var = null, tmp) */
                var ccomma = new CCodeCommaExpression ();
-               var temp_decl = get_temp_variable (expr.value_type, true, expr);
+               var temp_decl = get_temp_variable (expr.value_type, true, expr, false);
                temp_vars.insert (0, temp_decl);
                var cvar = get_variable_cexpression (temp_decl.name);
 
@@ -4060,7 +4063,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                // manual memory management for non-void pointers
                                // treat void* special to not leak memory with void* method parameters
                        } else if (requires_destroy (expression_type)) {
-                               var decl = get_temp_variable (expression_type, true, expression_type);
+                               var decl = get_temp_variable (expression_type, true, expression_type, false);
                                temp_vars.insert (0, decl);
                                temp_ref_vars.insert (0, decl);
                                cexpr = new CCodeAssignment (get_variable_cexpression (decl.name), cexpr);
@@ -4134,7 +4137,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                        } else if (cexpr is CCodeIdentifier || cexpr is CCodeMemberAccess) {
                                cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr);
                        } else {
-                               var decl = get_temp_variable (expression_type, expression_type.value_owned, expression_type);
+                               var decl = get_temp_variable (expression_type, expression_type.value_owned, expression_type, false);
                                temp_vars.insert (0, decl);
 
                                var ccomma = new CCodeCommaExpression ();
@@ -4256,7 +4259,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                        // (tmp = expr, &tmp)
                                        var ccomma = new CCodeCommaExpression ();
 
-                                       var temp_var = get_temp_variable (ma.inner.target_type);
+                                       var temp_var = get_temp_variable (ma.inner.target_type, true, null, false);
                                        temp_vars.insert (0, temp_var);
                                        ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), instance));
                                        ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (temp_var.name)));
@@ -4327,7 +4330,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                }
 
                var ccomma = new CCodeCommaExpression ();
-               var temp_decl = get_temp_variable (e.value_type);
+               var temp_decl = get_temp_variable (e.value_type, true, null, false);
                var ctemp = get_variable_cexpression (temp_decl.name);
                temp_vars.add (temp_decl);
                ccomma.append_expression (new CCodeAssignment (ctemp, ce));
index 0a7d2742dc20cc800731346c6d8a7d2f2e2f5c1b..f29298eda3732a5ffcdfa89875d2e2857a664c95 100644 (file)
@@ -44,7 +44,7 @@ internal 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);
+               var temp_var = get_temp_variable (stmt.expression.value_type, stmt.expression.value_type.value_owned, stmt, false);
                stmt.expression.temp_vars.insert (0, temp_var);
 
                var ctemp = get_variable_cexpression (temp_var.name);
index fae83bea030f4cb7d2c36a6ba7638d35b5e791bd..70e3cc94b101a111994a95accf0f526662450767 100644 (file)
@@ -81,7 +81,7 @@ internal class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                        if (expr.inner != null && !expr.inner.is_pure ()) {
                                                // instance expression has side-effects
                                                // store in temp. variable
-                                               var temp_var = get_temp_variable (expr.inner.value_type);
+                                               var temp_var = get_temp_variable (expr.inner.value_type, true, null, false);
                                                temp_vars.insert (0, temp_var);
                                                var ctemp = get_variable_cexpression (temp_var.name);
                                                inst = new CCodeAssignment (ctemp, pub_inst);
@@ -257,7 +257,7 @@ internal class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                                        // (tmp = expr, &tmp)
                                                        var ccomma = new CCodeCommaExpression ();
 
-                                                       var temp_var = get_temp_variable (expr.inner.target_type);
+                                                       var temp_var = get_temp_variable (expr.inner.target_type, true, null, false);
                                                        temp_vars.insert (0, temp_var);
                                                        ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), pub_inst));
                                                        ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (temp_var.name)));
index 2235152428563cbe9296595beddf2dca2ff0d410..f0e118d4a08c890a36c429de1aca7150143b0563 100644 (file)
@@ -150,7 +150,7 @@ internal class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                        // (tmp = expr, &tmp)
                                        var ccomma = new CCodeCommaExpression ();
 
-                                       var temp_var = get_temp_variable (ma.inner.target_type);
+                                       var temp_var = get_temp_variable (ma.inner.target_type, true, null, false);
                                        temp_vars.insert (0, temp_var);
                                        ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), instance));
                                        ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (temp_var.name)));
@@ -346,7 +346,7 @@ internal class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                                                var ccomma = new CCodeCommaExpression ();
 
-                                               var temp_decl = get_temp_variable (arg.value_type);
+                                               var temp_decl = get_temp_variable (arg.value_type, true, null, false);
                                                temp_vars.insert (0, temp_decl);
                                                ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_decl.name), cexpr));
 
@@ -383,14 +383,14 @@ internal class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                                if (itype.get_return_type () is VoidType) {
                                                        ccomma.append_expression (ccall_expr);
                                                } else {
-                                                       ret_temp_var = get_temp_variable (itype.get_return_type ());
+                                                       ret_temp_var = get_temp_variable (itype.get_return_type (), true, null, false);
                                                        temp_vars.insert (0, ret_temp_var);
                                                        ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (ret_temp_var.name), ccall_expr));
                                                }
 
                                                var cassign_comma = new CCodeCommaExpression ();
 
-                                               var assign_temp_var = get_temp_variable (unary.inner.value_type, unary.inner.value_type.value_owned);
+                                               var assign_temp_var = get_temp_variable (unary.inner.value_type, unary.inner.value_type.value_owned, null, false);
                                                temp_vars.insert (0, assign_temp_var);
 
                                                cassign_comma.append_expression (new CCodeAssignment (get_variable_cexpression (assign_temp_var.name), transform_expression (get_variable_cexpression (temp_var.name), param.parameter_type, unary.inner.value_type, arg)));
@@ -442,7 +442,7 @@ internal class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        for (int dim = 1; dim <= array_type.rank; dim++) {
                                if (m.array_null_terminated) {
                                        // handle calls to methods returning null-terminated arrays
-                                       var temp_var = get_temp_variable (itype.get_return_type ());
+                                       var temp_var = get_temp_variable (itype.get_return_type (), true, null, false);
                                        var temp_ref = get_variable_cexpression (temp_var.name);
 
                                        temp_vars.insert (0, temp_var);
@@ -495,7 +495,7 @@ internal class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        for (int dim = 1; dim <= array_type.rank; dim++) {
                                if (deleg.array_null_terminated) {
                                        // handle calls to methods returning null-terminated arrays
-                                       var temp_var = get_temp_variable (itype.get_return_type ());
+                                       var temp_var = get_temp_variable (itype.get_return_type (), true, null, false);
                                        var temp_ref = get_variable_cexpression (temp_var.name);
 
                                        temp_vars.insert (0, temp_var);
index 8d600cb9b03d23af25bb9bfcf7cd967db950ddee..917e4b76bc669d6ea6e8d39a332fc2ab49664522 100644 (file)
@@ -63,6 +63,8 @@ public class Vala.LocalVariable : Symbol {
 
        public bool captured { get; set; }
 
+       public bool no_init { get; set; }
+
        private Expression? _initializer;
        private DataType? _variable_type;