[vala] codegen: Drop destroy_variable in favor of destroy_value
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] codegen: Drop destroy_variable in favor of destroy_value
- Date: Wed, 4 May 2011 09:08:46 +0000 (UTC)
commit 0b51a3713ac452236e240a094cb8f1f16e4da990
Author: Luca Bruno <lucabru src gnome org>
Date: Wed May 4 11:02:28 2011 +0200
codegen: Drop destroy_variable in favor of destroy_value
codegen/valaccodearraymodule.vala | 18 ----
codegen/valaccodebasemodule.vala | 187 +++++--------------------------------
2 files changed, 25 insertions(+), 180 deletions(-)
---
diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala
index 99cf8c3..216d2f6 100644
--- a/codegen/valaccodearraymodule.vala
+++ b/codegen/valaccodearraymodule.vala
@@ -452,24 +452,6 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
}
}
- public override CCodeExpression destroy_variable (Variable variable, TargetValue value) {
- var array_type = variable.variable_type as ArrayType;
- if (array_type != null && array_type.fixed_length) {
- requires_array_free = true;
-
- var ccall = new CCodeFunctionCall (get_destroy_func_expression (variable.variable_type));
-
- ccall = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_destroy"));
- ccall.add_argument (get_cvalue_ (value));
- ccall.add_argument (new CCodeConstant ("%d".printf (array_type.length)));
- ccall.add_argument (new CCodeCastExpression (get_destroy_func_expression (array_type.element_type), "GDestroyNotify"));
-
- return ccall;
- }
-
- return base.destroy_variable (variable, value);
- }
-
public override CCodeExpression destroy_value (TargetValue value, bool is_macro_definition = false) {
var type = value.value_type;
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index bcf748b..d4e481d 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -2795,165 +2795,16 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
return null;
}
- // logic in this method is temporarily duplicated in destroy_value
- // apply changes to both methods
- public virtual CCodeExpression destroy_variable (Variable variable, TargetValue target_lvalue) {
- var type = target_lvalue.value_type;
- var cvar = get_cvalue_ (target_lvalue);
-
- if (type is DelegateType) {
- var delegate_target = get_delegate_target_cvalue (target_lvalue);
- var delegate_target_destroy_notify = get_delegate_target_destroy_notify_cvalue (target_lvalue);
-
- var ccall = new CCodeFunctionCall (delegate_target_destroy_notify);
- ccall.add_argument (delegate_target);
-
- var destroy_call = new CCodeCommaExpression ();
- destroy_call.append_expression (ccall);
- destroy_call.append_expression (new CCodeConstant ("NULL"));
-
- var cisnull = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, delegate_target_destroy_notify, new CCodeConstant ("NULL"));
-
- var ccomma = new CCodeCommaExpression ();
- ccomma.append_expression (new CCodeConditionalExpression (cisnull, new CCodeConstant ("NULL"), destroy_call));
- ccomma.append_expression (new CCodeAssignment (cvar, new CCodeConstant ("NULL")));
- ccomma.append_expression (new CCodeAssignment (delegate_target, new CCodeConstant ("NULL")));
- ccomma.append_expression (new CCodeAssignment (delegate_target_destroy_notify, new CCodeConstant ("NULL")));
-
- return ccomma;
- }
-
- var ccall = new CCodeFunctionCall (get_destroy_func_expression (type));
-
- if (type is ValueType && !type.nullable) {
- // normal value type, no null check
- var st = type.data_type as Struct;
- if (st != null && st.is_simple_type ()) {
- // used for va_list
- ccall.add_argument (cvar);
- } else {
- ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cvar));
- }
-
- if (gvalue_type != null && type.data_type == gvalue_type) {
- // g_value_unset must not be called for already unset values
- var cisvalid = new CCodeFunctionCall (new CCodeIdentifier ("G_IS_VALUE"));
- cisvalid.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cvar));
-
- var ccomma = new CCodeCommaExpression ();
- ccomma.append_expression (ccall);
- ccomma.append_expression (new CCodeConstant ("NULL"));
-
- return new CCodeConditionalExpression (cisvalid, ccomma, new CCodeConstant ("NULL"));
- } else {
- return ccall;
- }
- }
-
- if (ccall.call is CCodeIdentifier && !(type is ArrayType)) {
- // generate and use NULL-aware free macro to simplify code
-
- var freeid = (CCodeIdentifier) ccall.call;
- string free0_func = "_%s0".printf (freeid.name);
-
- if (add_wrapper (free0_func)) {
- var macro = destroy_value (new GLibValue (type, new CCodeIdentifier ("var")), true);
- cfile.add_type_declaration (new CCodeMacroReplacement.with_expression ("%s(var)".printf (free0_func), macro));
- }
-
- ccall = new CCodeFunctionCall (new CCodeIdentifier (free0_func));
- ccall.add_argument (cvar);
- return ccall;
- }
-
- /* (foo == NULL ? NULL : foo = (unref (foo), NULL)) */
-
- /* can be simplified to
- * foo = (unref (foo), NULL)
- * if foo is of static type non-null
- */
-
- var cisnull = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, cvar, new CCodeConstant ("NULL"));
- if (type.type_parameter != null) {
- if (!(current_type_symbol is Class) || current_class.is_compact) {
- return new CCodeConstant ("NULL");
- }
-
- // unref functions are optional for type parameters
- var cunrefisnull = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, get_destroy_func_expression (type), new CCodeConstant ("NULL"));
- cisnull = new CCodeBinaryExpression (CCodeBinaryOperator.OR, cisnull, cunrefisnull);
- }
-
- ccall.add_argument (cvar);
-
- /* set freed references to NULL to prevent further use */
- var ccomma = new CCodeCommaExpression ();
-
- if (context.profile == Profile.GOBJECT) {
- if (type.data_type != null && !type.data_type.is_reference_counting () &&
- (type.data_type == gstringbuilder_type
- || type.data_type == garray_type
- || type.data_type == gbytearray_type
- || type.data_type == gptrarray_type)) {
- ccall.add_argument (new CCodeConstant ("TRUE"));
- } else if (type.data_type == gthreadpool_type) {
- ccall.add_argument (new CCodeConstant ("FALSE"));
- ccall.add_argument (new CCodeConstant ("TRUE"));
- } else if (type is ArrayType) {
- var array_type = (ArrayType) type;
- if (requires_destroy (array_type.element_type)) {
- CCodeExpression csizeexpr = null;
- if (variable.array_null_terminated) {
- var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
- len_call.add_argument (cvar);
- csizeexpr = len_call;
- } else if (variable.has_array_length_cexpr) {
- csizeexpr = new CCodeConstant (variable.get_array_length_cexpr ());
- } else if (!variable.no_array_length) {
- csizeexpr = get_array_length_cvalue (target_lvalue);
- }
-
- if (csizeexpr != null) {
- var st = array_type.element_type.data_type as Struct;
- if (st != null && !array_type.element_type.nullable) {
- ccall.call = new CCodeIdentifier (append_struct_array_free (st));
- ccall.add_argument (csizeexpr);
- } else {
- requires_array_free = true;
- ccall.call = new CCodeIdentifier ("_vala_array_free");
- ccall.add_argument (csizeexpr);
- ccall.add_argument (new CCodeCastExpression (get_destroy_func_expression (array_type.element_type), "GDestroyNotify"));
- }
- }
- }
- }
- }
-
- ccomma.append_expression (ccall);
- ccomma.append_expression (new CCodeConstant ("NULL"));
-
- var cassign = new CCodeAssignment (cvar, ccomma);
-
- // g_free (NULL) is allowed
- bool uses_gfree = (type.data_type != null && !type.data_type.is_reference_counting () && type.data_type.get_free_function () == "g_free");
- uses_gfree = uses_gfree || type is ArrayType;
- if (uses_gfree) {
- return cassign;
- }
-
- return new CCodeConditionalExpression (cisnull, new CCodeConstant ("NULL"), cassign);
- }
-
public CCodeExpression destroy_local (LocalVariable local) {
- return destroy_variable (local, get_local_cvalue (local));
+ return destroy_value (get_local_cvalue (local));
}
public CCodeExpression destroy_parameter (Parameter param) {
- return destroy_variable (param, get_parameter_cvalue (param));
+ return destroy_value (get_parameter_cvalue (param));
}
public CCodeExpression destroy_field (Field field, TargetValue? instance) {
- return destroy_variable (field, get_field_cvalue (field, instance));
+ return destroy_value (get_field_cvalue (field, instance));
}
public CCodeExpression get_unref_expression (CCodeExpression cvar, DataType type, Expression? expr, bool is_macro_definition = false) {
@@ -3082,17 +2933,29 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
} else if (type is ArrayType) {
var array_type = (ArrayType) type;
if (requires_destroy (array_type.element_type)) {
- CCodeExpression csizeexpr = get_array_length_cvalue (value);
-
- var st = array_type.element_type.data_type as Struct;
- if (st != null && !array_type.element_type.nullable) {
- ccall.call = new CCodeIdentifier (append_struct_array_free (st));
- ccall.add_argument (csizeexpr);
+ CCodeExpression csizeexpr = null;
+ if (((GLibValue) value).array_length_cvalues != null) {
+ csizeexpr = get_array_length_cvalue (value);
+ } else if (get_array_null_terminated (value)) {
+ requires_array_length = true;
+ var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
+ len_call.add_argument (cvar);
+ csizeexpr = len_call;
} else {
- requires_array_free = true;
- ccall.call = new CCodeIdentifier ("_vala_array_free");
- ccall.add_argument (csizeexpr);
- ccall.add_argument (new CCodeCastExpression (get_destroy_func_expression (array_type.element_type), "GDestroyNotify"));
+ csizeexpr = get_array_length_cexpr (value);
+ }
+
+ if (csizeexpr != null) {
+ var st = array_type.element_type.data_type as Struct;
+ if (st != null && !array_type.element_type.nullable) {
+ ccall.call = new CCodeIdentifier (append_struct_array_free (st));
+ ccall.add_argument (csizeexpr);
+ } else {
+ requires_array_free = true;
+ ccall.call = new CCodeIdentifier ("_vala_array_free");
+ ccall.add_argument (csizeexpr);
+ ccall.add_argument (new CCodeCastExpression (get_destroy_func_expression (array_type.element_type), "GDestroyNotify"));
+ }
}
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]