[vala] Do not initialize temporary variables where not necessary
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vala] Do not initialize temporary variables where not necessary
- Date: Thu, 17 Sep 2009 11:23:56 +0000 (UTC)
commit c1d4d5d314a7b68b360e67d2dc455400131c3f51
Author: Jürg Billeter <j bitron ch>
Date: Thu Sep 17 13:14:32 2009 +0200
Do not initialize temporary variables where not necessary
codegen/valaccodeassignmentmodule.vala | 2 +-
codegen/valaccodebasemodule.vala | 33 ++++++++++++++++-------------
codegen/valaccodecontrolflowmodule.vala | 2 +-
codegen/valaccodememberaccessmodule.vala | 4 +-
codegen/valaccodemethodcallmodule.vala | 12 +++++-----
vala/valalocalvariable.vala | 2 +
6 files changed, 30 insertions(+), 25 deletions(-)
---
diff --git a/codegen/valaccodeassignmentmodule.vala b/codegen/valaccodeassignmentmodule.vala
index ab079ea..371e8c1 100644
--- a/codegen/valaccodeassignmentmodule.vala
+++ b/codegen/valaccodeassignmentmodule.vala
@@ -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) {
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 4a12029..f0c40d8 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -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));
diff --git a/codegen/valaccodecontrolflowmodule.vala b/codegen/valaccodecontrolflowmodule.vala
index 0a7d274..f29298e 100644
--- a/codegen/valaccodecontrolflowmodule.vala
+++ b/codegen/valaccodecontrolflowmodule.vala
@@ -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);
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala
index fae83be..70e3cc9 100644
--- a/codegen/valaccodememberaccessmodule.vala
+++ b/codegen/valaccodememberaccessmodule.vala
@@ -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)));
diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala
index 2235152..f0e118d 100644
--- a/codegen/valaccodemethodcallmodule.vala
+++ b/codegen/valaccodemethodcallmodule.vala
@@ -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);
diff --git a/vala/valalocalvariable.vala b/vala/valalocalvariable.vala
index 8d600cb..917e4b7 100644
--- a/vala/valalocalvariable.vala
+++ b/vala/valalocalvariable.vala
@@ -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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]