vala r1919 - in trunk: . gobject vala vapigen



Author: juergbi
Date: Sat Oct 25 14:46:49 2008
New Revision: 1919
URL: http://svn.gnome.org/viewvc/vala?rev=1919&view=rev

Log:
2008-10-25  JÃrg Billeter  <j bitron ch>

	* vala/valaerrorcode.vala:
	* vala/valaerrordomain.vala:
	* vala/valaerrortype.vala:
	* vala/valasemanticanalyzer.vala:
	* vala/valasymbolresolver.vala:
	* gobject/valaccodegenerator.vala:
	* vapigen/valagirparser.vala:

	Support type checks for error domains and error codes


Modified:
   trunk/ChangeLog
   trunk/gobject/valaccodegenerator.vala
   trunk/vala/valaerrorcode.vala
   trunk/vala/valaerrordomain.vala
   trunk/vala/valaerrortype.vala
   trunk/vala/valasemanticanalyzer.vala
   trunk/vala/valasymbolresolver.vala
   trunk/vapigen/valagirparser.vala

Modified: trunk/gobject/valaccodegenerator.vala
==============================================================================
--- trunk/gobject/valaccodegenerator.vala	(original)
+++ trunk/gobject/valaccodegenerator.vala	Sat Oct 25 14:46:49 2008
@@ -3450,7 +3450,7 @@
 
 				var ctemp = new CCodeIdentifier (temp_decl.name);
 				var cinit = new CCodeAssignment (ctemp, (CCodeExpression) expr.inner.ccodenode);
-				var ccheck = create_type_check (ctemp, expr.type_reference.data_type);
+				var ccheck = create_type_check (ctemp, expr.type_reference);
 				var ccast = new CCodeCastExpression (ctemp, expr.type_reference.get_cname ());
 				var cnull = new CCodeConstant ("NULL");
 
@@ -3644,14 +3644,27 @@
 		}
 	}
 
-	CCodeFunctionCall create_type_check (CCodeNode ccodenode, TypeSymbol type) {
-		var ccheck = new CCodeFunctionCall (new CCodeIdentifier (get_type_check_function (type)));
-		ccheck.add_argument ((CCodeExpression) ccodenode);
-		return ccheck;
+	CCodeExpression create_type_check (CCodeNode ccodenode, DataType type) {
+		var et = type as ErrorType;
+		if (et != null && et.error_code != null) {
+			var matches_call = new CCodeFunctionCall (new CCodeIdentifier ("g_error_matches"));
+			matches_call.add_argument ((CCodeExpression) ccodenode);
+			matches_call.add_argument (new CCodeIdentifier (et.error_domain.get_upper_case_cname ()));
+			matches_call.add_argument (new CCodeIdentifier (et.error_code.get_cname ()));
+			return matches_call;
+		} else if (et != null && et.error_domain != null) {
+			var instance_domain = new CCodeMemberAccess.pointer ((CCodeExpression) ccodenode, "domain");
+			var type_domain = new CCodeIdentifier (et.error_domain.get_upper_case_cname ());
+			return new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, instance_domain, type_domain);
+		} else {
+			var ccheck = new CCodeFunctionCall (new CCodeIdentifier (get_type_check_function (type.data_type)));
+			ccheck.add_argument ((CCodeExpression) ccodenode);
+			return ccheck;
+		}
 	}
 
 	public override void visit_type_check (TypeCheck expr) {
-		expr.ccodenode = create_type_check (expr.expression.ccodenode, expr.type_reference.data_type);
+		expr.ccodenode = create_type_check (expr.expression.ccodenode, expr.type_reference);
 	}
 
 	public override void visit_conditional_expression (ConditionalExpression expr) {
@@ -4135,7 +4148,9 @@
 		} else if (sym is Enum) {
 			type = new ValueType ((Enum) sym);
 		} else if (sym is ErrorDomain) {
-			type = new ErrorType ((ErrorDomain) sym);
+			type = new ErrorType ((ErrorDomain) sym, null);
+		} else if (sym is ErrorCode) {
+			type = new ErrorType ((ErrorDomain) sym.parent_symbol, (ErrorCode) sym);
 		} else {
 			Report.error (null, "internal error: `%s' is not a supported type".printf (sym.get_full_name ()));
 			return new InvalidType ();

Modified: trunk/vala/valaerrorcode.vala
==============================================================================
--- trunk/vala/valaerrorcode.vala	(original)
+++ trunk/vala/valaerrorcode.vala	Sat Oct 25 14:46:49 2008
@@ -25,7 +25,7 @@
 /**
  * Represents an enum member in the source code.
  */
-public class Vala.ErrorCode : Symbol {
+public class Vala.ErrorCode : TypeSymbol {
 	/**
 	 * Specifies the numerical representation of this enum value.
 	 */
@@ -69,12 +69,7 @@
 		}
 	}
 
-	/**
-	 * Returns the name of this error code as it is used in C code.
-	 *
-	 * @return the name to be used in C code
-	 */
-	public string get_cname () {
+	public override string get_cname (bool const_type = false) {
 		if (cname == null) {
 			var edomain = (ErrorDomain) parent_symbol;
 			cname = "%s%s".printf (edomain.get_cprefix (), name);

Modified: trunk/vala/valaerrordomain.vala
==============================================================================
--- trunk/vala/valaerrordomain.vala	(original)
+++ trunk/vala/valaerrordomain.vala	Sat Oct 25 14:46:49 2008
@@ -139,7 +139,7 @@
 	}
 
 	public override string? get_upper_case_cname (string? infix) {
-		return get_lower_case_cname (null).up ();
+		return get_lower_case_cname (infix).up ();
 	}
 
 	public override bool is_reference_type () {

Modified: trunk/vala/valaerrortype.vala
==============================================================================
--- trunk/vala/valaerrortype.vala	(original)
+++ trunk/vala/valaerrortype.vala	Sat Oct 25 14:46:49 2008
@@ -32,9 +32,15 @@
 	 */
 	public weak ErrorDomain? error_domain { get; set; }
 
-	public ErrorType (ErrorDomain? error_domain, SourceReference? source_reference = null) {
+	/**
+	 * The error code or null for generic error.
+	 */
+	public weak ErrorCode? error_code { get; set; }
+
+	public ErrorType (ErrorDomain? error_domain, ErrorCode? error_code, SourceReference? source_reference = null) {
 		this.error_domain = error_domain;
 		this.data_type = error_domain;
+		this.error_code = error_code;
 		this.source_reference = source_reference;
 	}
 
@@ -57,7 +63,15 @@
 		}
 
 		/* otherwhise the error_domain has to be equal */
-		return et.error_domain == error_domain;
+		if (et.error_domain != error_domain) {
+			return false;
+		}
+
+		if (et.error_code == null) {
+			return true;
+		}
+
+		return et.error_code == error_code;
 	}
 
 	public override string to_qualified_string (Scope? scope) {
@@ -69,8 +83,7 @@
 	}
 
 	public override DataType copy () {
-		var result = new ErrorType (error_domain, source_reference);
-		result.source_reference = source_reference;
+		var result = new ErrorType (error_domain, error_code, source_reference);
 		result.value_owned = value_owned;
 		result.nullable = nullable;
 

Modified: trunk/vala/valasemanticanalyzer.vala
==============================================================================
--- trunk/vala/valasemanticanalyzer.vala	(original)
+++ trunk/vala/valasemanticanalyzer.vala	Sat Oct 25 14:46:49 2008
@@ -1241,7 +1241,7 @@
 	}
 
 	public override void visit_throw_statement (ThrowStatement stmt) {
-		stmt.error_expression.target_type = new ErrorType (null, stmt.source_reference);
+		stmt.error_expression.target_type = new ErrorType (null, null, stmt.source_reference);
 		stmt.error_expression.target_type.value_owned = true;
 
 		stmt.accept_children (this);
@@ -1265,7 +1265,7 @@
 			clause.body.scope.add (clause.variable_name, clause.error_variable);
 			clause.body.add_local_variable (clause.error_variable);
 		} else {
-			clause.error_type = new ErrorType (null, clause.source_reference);
+			clause.error_type = new ErrorType (null, null, clause.source_reference);
 		}
 
 		clause.accept_children (this);
@@ -1700,7 +1700,7 @@
 						}
 						var m = new DynamicMethod (expr.inner.value_type, expr.member_name, ret_type, expr.source_reference);
 						m.invocation = invoc;
-						m.add_error_type (new ErrorType (null));
+						m.add_error_type (new ErrorType (null, null));
 						m.access = SymbolAccessibility.PUBLIC;
 						m.add_parameter (new FormalParameter.with_ellipsis ());
 						dynamic_object_type.type_symbol.scope.add (null, m);
@@ -1911,7 +1911,9 @@
 		} else if (sym is Enum) {
 			type = new ValueType ((Enum) sym);
 		} else if (sym is ErrorDomain) {
-			type = new ErrorType ((ErrorDomain) sym);
+			type = new ErrorType ((ErrorDomain) sym, null);
+		} else if (sym is ErrorCode) {
+			type = new ErrorType ((ErrorDomain) sym.parent_symbol, (ErrorCode) sym);
 		} else {
 			Report.error (null, "internal error: `%s' is not a supported type".printf (sym.get_full_name ()));
 			return new InvalidType ();
@@ -2708,10 +2710,6 @@
 				if (ma != null) {
 					type_args = ma.get_type_arguments ();
 				}
-			} else if (constructor_sym is ErrorCode) {
-				type_sym = constructor_sym.parent_symbol;
-
-				expr.symbol_reference = constructor_sym;
 			}
 
 			if (type_sym is Class) {
@@ -2720,11 +2718,12 @@
 			} else if (type_sym is Struct) {
 				type = (TypeSymbol) type_sym;
 				expr.type_reference = new ValueType (type);
-			} else if (type_sym is ErrorDomain) {
-				expr.type_reference = new ErrorType ((ErrorDomain) type_sym, expr.source_reference);
+			} else if (type_sym is ErrorCode) {
+				expr.type_reference = new ErrorType ((ErrorDomain) type_sym.parent_symbol, (ErrorCode) type_sym, expr.source_reference);
+				expr.symbol_reference = type_sym;
 			} else {
 				expr.error = true;
-				Report.error (expr.source_reference, "`%s' is not a class, struct, or error domain".printf (type_sym.get_full_name ()));
+				Report.error (expr.source_reference, "`%s' is not a class, struct, or error code".printf (type_sym.get_full_name ()));
 				return;
 			}
 

Modified: trunk/vala/valasymbolresolver.vala
==============================================================================
--- trunk/vala/valasymbolresolver.vala	(original)
+++ trunk/vala/valasymbolresolver.vala	Sat Oct 25 14:46:49 2008
@@ -269,7 +269,7 @@
 			} else if (sym is Class) {
 				var cl = (Class) sym;
 				if (cl.is_error_base) {
-					type = new ErrorType (null, unresolved_type.source_reference);
+					type = new ErrorType (null, null, unresolved_type.source_reference);
 				} else {
 					type = new ObjectType (cl);
 				}
@@ -280,7 +280,9 @@
 			} else if (sym is Enum) {
 				type = new ValueType ((Enum) sym);
 			} else if (sym is ErrorDomain) {
-				type = new ErrorType ((ErrorDomain) sym, unresolved_type.source_reference);
+				type = new ErrorType ((ErrorDomain) sym, null, unresolved_type.source_reference);
+			} else if (sym is ErrorCode) {
+				type = new ErrorType ((ErrorDomain) sym.parent_symbol, (ErrorCode) sym, unresolved_type.source_reference);
 			} else {
 				Report.error (unresolved_type.source_reference, "internal error: `%s' is not a supported type".printf (sym.get_full_name ()));
 				return new InvalidType ();

Modified: trunk/vapigen/valagirparser.vala
==============================================================================
--- trunk/vapigen/valagirparser.vala	(original)
+++ trunk/vapigen/valagirparser.vala	Sat Oct 25 14:46:49 2008
@@ -709,7 +709,7 @@
 			end_element ("parameters");
 		}
 		if (throws_string == "1") {
-			m.add_error_type (new ErrorType (null));
+			m.add_error_type (new ErrorType (null, null));
 		}
 		end_element ("method");
 		return m;
@@ -745,7 +745,7 @@
 			end_element ("parameters");
 		}
 		if (throws_string == "1") {
-			m.add_error_type (new ErrorType (null));
+			m.add_error_type (new ErrorType (null, null));
 		}
 		end_element ("callback");
 		return m;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]