[vala/wip/effectfree: 42/44] codegen: Add lvalue field to GLibValue
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/wip/effectfree: 42/44] codegen: Add lvalue field to GLibValue
- Date: Wed, 6 Jul 2011 21:14:35 +0000 (UTC)
commit 3f7e03ce6a259719b5748818d90a4feb35e34e23
Author: Luca Bruno <lucabru src gnome org>
Date: Sun Jun 19 08:55:10 2011 +0200
codegen: Add lvalue field to GLibValue
codegen/valaccodearraymodule.vala | 4 ++--
codegen/valaccodebasemodule.vala | 20 ++++++++++++--------
codegen/valaccodecontrolflowmodule.vala | 2 +-
codegen/valaccodememberaccessmodule.vala | 9 +++++++++
codegen/valaccodemethodmodule.vala | 2 +-
codegen/valaccodestructmodule.vala | 2 +-
codegen/valagasyncmodule.vala | 6 +++---
codegen/valagerrormodule.vala | 2 +-
codegen/valagobjectmodule.vala | 10 +++++-----
9 files changed, 35 insertions(+), 22 deletions(-)
---
diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala
index d143b20..5946f58 100644
--- a/codegen/valaccodearraymodule.vala
+++ b/codegen/valaccodearraymodule.vala
@@ -505,7 +505,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, new CCodeIdentifier ("i"), new CCodeIdentifier ("length")),
new CCodeUnaryExpression (CCodeUnaryOperator.POSTFIX_INCREMENT, new CCodeIdentifier ("i")));
- ccode.add_assignment (new CCodeElementAccess (new CCodeIdentifier ("result"), new CCodeIdentifier ("i")), get_cvalue_ (copy_value (new GLibValue (array_type.element_type, new CCodeElementAccess (new CCodeIdentifier ("self"), new CCodeIdentifier ("i"))), array_type)));
+ ccode.add_assignment (new CCodeElementAccess (new CCodeIdentifier ("result"), new CCodeIdentifier ("i")), get_cvalue_ (copy_value (new GLibValue (array_type.element_type, new CCodeElementAccess (new CCodeIdentifier ("self"), new CCodeIdentifier ("i")), true), array_type)));
ccode.close ();
ccode.add_return (new CCodeIdentifier ("result"));
@@ -559,7 +559,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
new CCodeUnaryExpression (CCodeUnaryOperator.POSTFIX_INCREMENT, new CCodeIdentifier ("i")));
- ccode.add_assignment (new CCodeElementAccess (new CCodeIdentifier ("dest"), new CCodeIdentifier ("i")), get_cvalue_ (copy_value (new GLibValue (array_type.element_type, new CCodeElementAccess (new CCodeIdentifier ("self"), new CCodeIdentifier ("i"))), array_type)));
+ ccode.add_assignment (new CCodeElementAccess (new CCodeIdentifier ("dest"), new CCodeIdentifier ("i")), get_cvalue_ (copy_value (new GLibValue (array_type.element_type, new CCodeElementAccess (new CCodeIdentifier ("self"), new CCodeIdentifier ("i")), true), array_type)));
} else {
cfile.add_include ("string.h");
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 5ac3f18..9c7ea1d 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -1596,7 +1596,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
if (is_virtual) {
ccode.add_declaration (this_type.get_cname (), new CCodeVariableDeclarator ("self"));
- ccode.add_assignment (new CCodeIdentifier ("self"), get_cvalue_ (transform_value (new GLibValue (base_type, new CCodeIdentifier ("base")), this_type, acc)));
+ ccode.add_assignment (new CCodeIdentifier ("self"), get_cvalue_ (transform_value (new GLibValue (base_type, new CCodeIdentifier ("base"), true), this_type, acc)));
}
acc.body.emit (this);
@@ -1858,7 +1858,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
} else {
if (in_constructor || (current_method != null && current_method.binding == MemberBinding.INSTANCE) ||
(current_property_accessor != null && current_property_accessor.prop.binding == MemberBinding.INSTANCE)) {
- var this_value = new GLibValue (get_data_type_for_symbol (current_type_symbol), new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data%d_".printf (block_id)), "self"));
+ var this_value = new GLibValue (get_data_type_for_symbol (current_type_symbol), new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data%d_".printf (block_id)), "self"), true);
ccode.add_expression (destroy_value (this_value));
}
}
@@ -2155,8 +2155,10 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
if (deleg_type != null) {
if (!deleg_type.delegate_symbol.has_target) {
value.delegate_target_cvalue = new CCodeConstant ("NULL");
+ ((GLibValue) value).lvalue = false;
} else if (!deleg_type.value_owned) {
value.delegate_target_destroy_notify_cvalue = new CCodeConstant ("NULL");
+ ((GLibValue) value).lvalue = false;
}
}
return value;
@@ -2699,7 +2701,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
push_function (function);
- ccode.add_expression (destroy_value (new GLibValue (type, new CCodeIdentifier ("var")), true));
+ ccode.add_expression (destroy_value (new GLibValue (type, new CCodeIdentifier ("var"), true), true));
pop_function ();
@@ -2946,7 +2948,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
string free0_func = "_%s0".printf (freeid.name);
if (add_wrapper (free0_func)) {
- var macro = destroy_value (new GLibValue (type, new CCodeIdentifier ("var")), true);
+ var macro = destroy_value (new GLibValue (type, new CCodeIdentifier ("var"), true), true);
cfile.add_type_declaration (new CCodeMacroReplacement.with_expression ("%s(var)".printf (free0_func), macro));
}
@@ -4294,7 +4296,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
if (init.symbol_reference is Field) {
var f = (Field) init.symbol_reference;
var instance_target_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
- var typed_inst = transform_value (new GLibValue (expr.type_reference, instance), instance_target_type, init);
+ var typed_inst = transform_value (new GLibValue (expr.type_reference, instance, true), instance_target_type, init);
store_field (f, typed_inst, init.initializer.target_value);
var cl = f.parent_symbol as Class;
@@ -5540,7 +5542,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
push_context (new EmitContext ());
push_function (function);
- var dest_struct = new GLibValue (get_data_type_for_symbol (st), new CCodeIdentifier ("(*dest)"));
+ var dest_struct = new GLibValue (get_data_type_for_symbol (st), new CCodeIdentifier ("(*dest)"), true);
foreach (Field f in st.get_fields ()) {
if (f.binding == MemberBinding.INSTANCE) {
var value = load_field (f, load_this_parameter ((TypeSymbol) st));
@@ -5749,6 +5751,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
public class Vala.GLibValue : TargetValue {
public CCodeExpression cvalue;
+ public bool lvalue;
public bool non_null;
public string? ctype;
@@ -5760,9 +5763,10 @@ public class Vala.GLibValue : TargetValue {
public CCodeExpression? delegate_target_cvalue;
public CCodeExpression? delegate_target_destroy_notify_cvalue;
- public GLibValue (DataType? value_type = null, CCodeExpression? cvalue = null) {
+ public GLibValue (DataType? value_type = null, CCodeExpression? cvalue = null, bool lvalue = false) {
base (value_type);
this.cvalue = cvalue;
+ this.lvalue = lvalue;
}
public void append_array_length_cvalue (CCodeExpression length_cvalue) {
@@ -5773,7 +5777,7 @@ public class Vala.GLibValue : TargetValue {
}
public GLibValue copy () {
- var result = new GLibValue (value_type.copy (), cvalue);
+ var result = new GLibValue (value_type.copy (), cvalue, lvalue);
result.actual_value_type = actual_value_type;
result.non_null = non_null;
result.ctype = ctype;
diff --git a/codegen/valaccodecontrolflowmodule.vala b/codegen/valaccodecontrolflowmodule.vala
index 17ded58..d467398 100644
--- a/codegen/valaccodecontrolflowmodule.vala
+++ b/codegen/valaccodecontrolflowmodule.vala
@@ -261,7 +261,7 @@ public abstract class Vala.CCodeControlFlowModule : CCodeMethodModule {
var element_type = array_type.element_type.copy ();
element_type.value_owned = false;
- element_expr = get_cvalue_ (transform_value (new GLibValue (element_type, element_expr), stmt.type_reference, stmt));
+ element_expr = get_cvalue_ (transform_value (new GLibValue (element_type, element_expr, true), stmt.type_reference, stmt));
visit_local_variable (stmt.element_variable);
ccode.add_assignment (get_variable_cexpression (stmt.variable_name), element_expr);
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala
index 2f92b0f..b34290f 100644
--- a/codegen/valaccodememberaccessmodule.vala
+++ b/codegen/valaccodememberaccessmodule.vala
@@ -329,6 +329,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
/* Returns lvalue access to the given local variable */
public override TargetValue get_local_cvalue (LocalVariable local) {
var result = new GLibValue (local.variable_type.copy ());
+ result.lvalue = true;
var array_type = local.variable_type as ArrayType;
var delegate_type = local.variable_type as DelegateType;
@@ -387,6 +388,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
/* Returns access values to the given parameter */
public override TargetValue get_parameter_cvalue (Parameter param) {
var result = new GLibValue (param.variable_type.copy ());
+ result.lvalue = true;
result.array_null_terminated = param.array_null_terminated;
if (param.has_array_length_cexpr) {
result.array_length_cexpr = new CCodeConstant (param.get_array_length_cexpr ());
@@ -507,6 +509,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
if (instance != null) {
result.actual_value_type = field.variable_type.get_actual_type (instance.value_type, null, field);
}
+ result.lvalue = true;
result.array_null_terminated = field.array_null_terminated;
if (field.has_array_length_cexpr) {
result.array_length_cexpr = new CCodeConstant (field.get_array_length_cexpr ());
@@ -655,6 +658,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
if (array_type.fixed_length) {
result.array_length_cvalues = null;
result.append_array_length_cvalue (new CCodeConstant (array_type.length.to_string ()));
+ result.lvalue = false;
} else if (variable.array_null_terminated) {
requires_array_length = true;
var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
@@ -662,21 +666,25 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
result.array_length_cvalues = null;
result.append_array_length_cvalue (len_call);
+ result.lvalue = false;
} else if (variable.has_array_length_cexpr) {
var length_expr = new CCodeConstant (variable.get_array_length_cexpr ());
result.array_length_cvalues = null;
result.append_array_length_cvalue (length_expr);
+ result.lvalue = false;
} else if (variable.no_array_length) {
result.array_length_cvalues = null;
for (int dim = 1; dim <= array_type.rank; dim++) {
result.append_array_length_cvalue (new CCodeConstant ("-1"));
}
+ result.lvalue = false;
} else if (variable.array_length_type != null) {
for (int dim = 1; dim <= array_type.rank; dim++) {
// cast if variable does not use int for array length
result.array_length_cvalues[dim - 1] = new CCodeCastExpression (result.array_length_cvalues[dim - 1], "gint");
}
+ result.lvalue = false;
}
result.array_size_cvalue = null;
} else if (delegate_type != null) {
@@ -685,6 +693,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
}
result.delegate_target_destroy_notify_cvalue = new CCodeConstant ("NULL");
+ result.lvalue = false;
}
result.value_type.value_owned = false;
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala
index edda88d..607d5f6 100644
--- a/codegen/valaccodemethodmodule.vala
+++ b/codegen/valaccodemethodmodule.vala
@@ -429,7 +429,7 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
base_expression_type = new ObjectType ((Interface) base_method.parent_symbol);
}
var self_target_type = new ObjectType (cl);
- CCodeExpression cself = get_cvalue_ (transform_value (new GLibValue (base_expression_type, new CCodeIdentifier ("base")), self_target_type, m));
+ CCodeExpression cself = get_cvalue_ (transform_value (new GLibValue (base_expression_type, new CCodeIdentifier ("base"), true), self_target_type, m));
ccode.add_declaration ("%s *".printf (cl.get_cname ()), new CCodeVariableDeclarator ("self"));
ccode.add_assignment (new CCodeIdentifier ("self"), cself);
diff --git a/codegen/valaccodestructmodule.vala b/codegen/valaccodestructmodule.vala
index a1abbbf..39aa95a 100644
--- a/codegen/valaccodestructmodule.vala
+++ b/codegen/valaccodestructmodule.vala
@@ -261,7 +261,7 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
push_function (function);
- var dest_struct = new GLibValue (get_data_type_for_symbol (st), new CCodeIdentifier ("(*dest)"));
+ var dest_struct = new GLibValue (get_data_type_for_symbol (st), new CCodeIdentifier ("(*dest)"), true);
foreach (var f in st.get_fields ()) {
if (f.binding == MemberBinding.INSTANCE) {
var value = load_field (f, load_this_parameter ((TypeSymbol) st));
diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala
index 5b33603..b6c486b 100644
--- a/codegen/valagasyncmodule.vala
+++ b/codegen/valagasyncmodule.vala
@@ -183,7 +183,7 @@ public class Vala.GAsyncModule : GSignalModule {
var type_symbol = m.parent_symbol as ObjectTypeSymbol;
var self_target_type = new ObjectType (type_symbol);
- var cself = get_cvalue_ (transform_value (new GLibValue (base_expression_type, new CCodeIdentifier ("base")), self_target_type, m));
+ var cself = get_cvalue_ (transform_value (new GLibValue (base_expression_type, new CCodeIdentifier ("base"), true), self_target_type, m));
ccode.add_declaration ("%s *".printf (type_symbol.get_cname ()), new CCodeVariableDeclarator ("self"));
ccode.add_assignment (new CCodeIdentifier ("self"), cself);
}
@@ -240,7 +240,7 @@ public class Vala.GAsyncModule : GSignalModule {
cself = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, cself);
}
if (requires_copy (this_type)) {
- cself = get_cvalue_ (copy_value (new GLibValue (m.this_parameter.variable_type, cself), m.this_parameter));
+ cself = get_cvalue_ (copy_value (new GLibValue (m.this_parameter.variable_type, cself, true), m.this_parameter));
}
ccode.add_assignment (new CCodeMemberAccess.pointer (data_var, "self"), cself);
@@ -433,7 +433,7 @@ public class Vala.GAsyncModule : GSignalModule {
// structs are returned via out parameter
CCodeExpression cexpr = new CCodeMemberAccess.pointer (data_var, "result");
if (requires_copy (return_type)) {
- cexpr = get_cvalue_ (copy_value (new GLibValue (return_type, cexpr), return_type));
+ cexpr = get_cvalue_ (copy_value (new GLibValue (return_type, cexpr, true), return_type));
}
ccode.add_assignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("result")), cexpr);
} else if (!(return_type is VoidType)) {
diff --git a/codegen/valagerrormodule.vala b/codegen/valagerrormodule.vala
index 7331280..e8ba641 100644
--- a/codegen/valagerrormodule.vala
+++ b/codegen/valagerrormodule.vala
@@ -104,7 +104,7 @@ public class Vala.GErrorModule : CCodeDelegateModule {
if (current_method is CreationMethod && current_method.parent_symbol is Class) {
var cl = (Class) current_method.parent_symbol;
- ccode.add_expression (destroy_value (new GLibValue (new ObjectType (cl), new CCodeIdentifier ("self"))));
+ ccode.add_expression (destroy_value (new GLibValue (new ObjectType (cl), new CCodeIdentifier ("self"), true)));
ccode.add_return (new CCodeConstant ("NULL"));
} else if (is_in_coroutine ()) {
ccode.add_return (new CCodeConstant ("FALSE"));
diff --git a/codegen/valagobjectmodule.vala b/codegen/valagobjectmodule.vala
index 63419b1..7979aa7 100644
--- a/codegen/valagobjectmodule.vala
+++ b/codegen/valagobjectmodule.vala
@@ -202,13 +202,13 @@ public class Vala.GObjectModule : GTypeModule {
if (prop.base_property != null) {
var base_type = (Class) prop.base_property.parent_symbol;
base_prop = prop.base_property;
- cself = get_cvalue_ (transform_value (new GLibValue (new ObjectType (cl), cself), new ObjectType (base_type), prop));
+ cself = get_cvalue_ (transform_value (new GLibValue (new ObjectType (cl), cself, true), new ObjectType (base_type), prop));
generate_property_accessor_declaration (prop.base_property.get_accessor, cfile);
} else if (prop.base_interface_property != null) {
var base_type = (Interface) prop.base_interface_property.parent_symbol;
base_prop = prop.base_interface_property;
- cself = get_cvalue_ (transform_value (new GLibValue (new ObjectType (cl), cself), new ObjectType (base_type), prop));
+ cself = get_cvalue_ (transform_value (new GLibValue (new ObjectType (cl), cself, true), new ObjectType (base_type), prop));
generate_property_accessor_declaration (prop.base_interface_property.get_accessor, cfile);
}
@@ -233,7 +233,7 @@ public class Vala.GObjectModule : GTypeModule {
ccode.add_expression (csetcall);
if (requires_destroy (prop.get_accessor.value_type)) {
- ccode.add_expression (destroy_value (new GLibValue (prop.get_accessor.value_type, new CCodeIdentifier ("boxed"))));
+ ccode.add_expression (destroy_value (new GLibValue (prop.get_accessor.value_type, new CCodeIdentifier ("boxed"), true)));
}
ccode.close ();
} else {
@@ -301,13 +301,13 @@ public class Vala.GObjectModule : GTypeModule {
if (prop.base_property != null) {
var base_type = (Class) prop.base_property.parent_symbol;
base_prop = prop.base_property;
- cself = get_cvalue_ (transform_value (new GLibValue (new ObjectType (cl), cself), new ObjectType (base_type), prop));
+ cself = get_cvalue_ (transform_value (new GLibValue (new ObjectType (cl), cself, true), new ObjectType (base_type), prop));
generate_property_accessor_declaration (prop.base_property.set_accessor, cfile);
} else if (prop.base_interface_property != null) {
var base_type = (Interface) prop.base_interface_property.parent_symbol;
base_prop = prop.base_interface_property;
- cself = get_cvalue_ (transform_value (new GLibValue (new ObjectType (cl), cself), new ObjectType (base_type), prop));
+ cself = get_cvalue_ (transform_value (new GLibValue (new ObjectType (cl), cself, true), new ObjectType (base_type), prop));
generate_property_accessor_declaration (prop.base_interface_property.set_accessor, cfile);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]