Author: juergbi Date: Fri Jan 18 16:51:06 2008 New Revision: 851 URL: http://svn.gnome.org/viewvc/vala?rev=851&view=rev
Log: 2008-01-18 Juerg Billeter <[EMAIL PROTECTED]> * vala/valanulltype.vala, vala/valasemanticanalyzer.vala: simplify conditional expression type analysis, fixes crash Modified: trunk/ChangeLog trunk/vala/valanulltype.vala trunk/vala/valasemanticanalyzer.vala Modified: trunk/vala/valanulltype.vala ============================================================================== --- trunk/vala/valanulltype.vala (original) +++ trunk/vala/valanulltype.vala Fri Jan 18 16:51:06 2008 @@ -52,4 +52,8 @@ /* null is not compatible with any other type (i.e. value types) */ return false; } + + public override DataType! copy () { + return new NullType (); + } } Modified: trunk/vala/valasemanticanalyzer.vala ============================================================================== --- trunk/vala/valasemanticanalyzer.vala (original) +++ trunk/vala/valasemanticanalyzer.vala Fri Jan 18 16:51:06 2008 @@ -2359,114 +2359,6 @@ expr.static_type = bool_type; } - private DataType compute_common_base_type (Collection<DataType> types, SourceReference source_reference) { - bool null_found = false; - bool class_or_iface_found = false; - bool type_param_found = false; - bool ref_struct_found = false; - bool val_struct_found = false; - bool enum_found = false; - bool callback_found = false; - DataType base_type = null; - DataType last_type = null; - foreach (DataType type in types) { - last_type = type; - if (type.error) { - return new InvalidType (); - } - if (type.data_type == null && type.type_parameter == null) { - if (!null_found) { - null_found = true; - if (val_struct_found || enum_found) { - base_type.error = true; - break; - } - } - } else if (type.data_type is Class || type.data_type is Interface) { - if (!class_or_iface_found) { - class_or_iface_found = true; - if (type_param_found || ref_struct_found || val_struct_found || enum_found || callback_found) { - base_type.error = true; - break; - } - } - } else if (type.type_parameter != null) { - if (!type_param_found) { - type_param_found = true; - if (class_or_iface_found || ref_struct_found || val_struct_found || enum_found || callback_found) { - base_type.error = true; - break; - } - } - } else if (type.data_type is Struct) { - var st = (Struct) type.data_type; - if (st.is_reference_type ()) { - if (!ref_struct_found) { - ref_struct_found = true; - if (class_or_iface_found || type_param_found || val_struct_found || enum_found || callback_found) { - base_type.error = true; - break; - } - } - } else { - if (!val_struct_found) { - val_struct_found = true; - if (class_or_iface_found || type_param_found || ref_struct_found || enum_found || callback_found) { - base_type.error = true; - break; - } - } - } - } else if (type.data_type is Enum) { - if (!enum_found) { - enum_found = true; - if (class_or_iface_found || type_param_found || ref_struct_found || val_struct_found) { - base_type.error = true; - break; - } - } - } else if (type.data_type is Delegate) { - if (!callback_found) { - callback_found = true; - if (class_or_iface_found || type_param_found || ref_struct_found || val_struct_found || enum_found) { - base_type.error = true; - break; - } - } - } else { - Report.error (type.source_reference, "internal error: unsupported type `%s'".printf (type.to_string ())); - return new InvalidType (); - } - if (base_type == null) { - base_type = new DataType (); - base_type.data_type = type.data_type; - base_type.type_parameter = type.type_parameter; - base_type.nullable = type.nullable; - base_type.is_null = type.is_null; - base_type.transfers_ownership = type.transfers_ownership; - } else { - if (base_type.data_type != type.data_type) { - if (type.compatible (base_type)) { - } else if (base_type.compatible (type)) { - base_type.data_type = type.data_type; - } else { - base_type.error = true; - break; - } - } - base_type.nullable = base_type.nullable || type.nullable; - base_type.is_null = base_type.is_null && type.is_null; - // if one subexpression transfers ownership, all subexpressions must transfer ownership - // FIXME add ref calls to subexpressions that don't transfer ownership - base_type.transfers_ownership = base_type.transfers_ownership || type.transfers_ownership; - } - } - if (base_type != null && base_type.error) { - Report.error (source_reference, "`%s' is incompatible with `%s'".printf (last_type.to_string (), base_type.to_string ())); - } - return base_type; - } - public override void visit_conditional_expression (ConditionalExpression! expr) { if (!expr.condition.static_type.compatible (bool_type)) { expr.error = true; @@ -2475,10 +2367,15 @@ } /* FIXME: support memory management */ - Gee.List<DataType> types = new ArrayList<DataType> (); - types.add (expr.true_expression.static_type); - types.add (expr.false_expression.static_type); - expr.static_type = compute_common_base_type (types, expr.source_reference); + if (expr.false_expression.static_type.compatible (expr.true_expression.static_type)) { + expr.static_type = expr.true_expression.static_type.copy (); + } else if (expr.true_expression.static_type.compatible (expr.false_expression.static_type)) { + expr.static_type = expr.false_expression.static_type.copy (); + } else { + expr.error = true; + Report.error (expr.condition.source_reference, "Incompatible expressions"); + return; + } } private string get_lambda_name () { _______________________________________________ SVN-commits-list mailing list (read only) http://mail.gnome.org/mailman/listinfo/svn-commits-list Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want. Module maintainer? It is possible to set the reply-to to your development mailing list. Email [EMAIL PROTECTED] if interested.