vala r1919 - in trunk: . gobject vala vapigen
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1919 - in trunk: . gobject vala vapigen
- Date: Sat, 25 Oct 2008 14:46:50 +0000 (UTC)
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]