From: Raffaele Sandrini Date: Sun, 24 Feb 2008 14:34:41 +0000 (+0000) Subject: fix gerror_type handling pull in get_lower_case_cname from Symbol X-Git-Tag: VALA_0_1_7~43 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4dbdb2ebbfefd809aa52fb72f69f34db3a1cdcb7;p=platform%2Fupstream%2Fvala.git fix gerror_type handling pull in get_lower_case_cname from Symbol 2008-02-24 Raffaele Sandrini * gobject/valaccodegenerator.vala: fix gerror_type handling * vala/valadatatype.vala: pull in get_lower_case_cname from Symbol * vala/valaerrortype.vala: implement get_lower_case_cname and equals * vala/valasemanticanalyzer.vala: use ErrorType (null) for generic catch clauses svn path=/trunk/; revision=1048 --- diff --git a/ChangeLog b/ChangeLog index 09e7214..12bf7db 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2008-02-24 Raffaele Sandrini + * gobject/valaccodegenerator.vala: fix gerror_type handling + * vala/valadatatype.vala: pull in get_lower_case_cname from Symbol + * vala/valaerrortype.vala: implement get_lower_case_cname and equals + * vala/valasemanticanalyzer.vala: use ErrorType (null) for generic + catch clauses + +2008-02-24 Raffaele Sandrini + * vapi/bzlib.vapi: add bzip2 binding, patch by Maciej Piechotka * vapi/Makefile.am: add bzip2 diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index 6a3aa0f..298bd4c 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -97,7 +97,7 @@ public class Vala.CCodeGenerator : CodeGenerator { public Typesymbol gtype_type; public Typesymbol gtypeinstance_type; public Typesymbol gobject_type; - public Typesymbol gerror_type; + public ErrorType gerror_type; public Typesymbol glist_type; public Typesymbol gslist_type; public Typesymbol gstring_type; @@ -223,7 +223,7 @@ public class Vala.CCodeGenerator : CodeGenerator { gtype_type = (Typesymbol) glib_ns.scope.lookup ("Type"); gtypeinstance_type = (Typesymbol) glib_ns.scope.lookup ("TypeInstance"); gobject_type = (Typesymbol) glib_ns.scope.lookup ("Object"); - gerror_type = (Typesymbol) glib_ns.scope.lookup ("Error"); + gerror_type = new ErrorType (null); glist_type = (Typesymbol) glib_ns.scope.lookup ("List"); gslist_type = (Typesymbol) glib_ns.scope.lookup ("SList"); gstring_type = (Typesymbol) glib_ns.scope.lookup ("StringBuilder"); @@ -1301,9 +1301,9 @@ public class Vala.CCodeGenerator : CodeGenerator { var cerror_block = new CCodeBlock (); foreach (CatchClause clause in current_try.get_catch_clauses ()) { // go to catch clause if error domain matches - var cgoto_stmt = new CCodeGotoStatement ("__catch%d_%s".printf (current_try_id, clause.type_reference.data_type.get_lower_case_cname ())); + var cgoto_stmt = new CCodeGotoStatement ("__catch%d_%s".printf (current_try_id, clause.type_reference.get_lower_case_cname ())); - if (clause.type_reference.data_type == gerror_type) { + if (clause.type_reference.equals (gerror_type)) { // general catch clause cerror_block.add_statement (cgoto_stmt); } else { @@ -2141,7 +2141,7 @@ public class Vala.CCodeGenerator : CodeGenerator { clause.accept_children (this); var cfrag = new CCodeFragment (); - cfrag.append (new CCodeLabel ("__catch%d_%s".printf (current_try_id, clause.type_reference.data_type.get_lower_case_cname ()))); + cfrag.append (new CCodeLabel ("__catch%d_%s".printf (current_try_id, clause.type_reference.get_lower_case_cname ()))); var cblock = new CCodeBlock (); diff --git a/vala/valadatatype.vala b/vala/valadatatype.vala index 8286c35..db3551b 100644 --- a/vala/valadatatype.vala +++ b/vala/valadatatype.vala @@ -178,6 +178,18 @@ public class Vala.DataType : CodeNode { return "const %s%s".printf (t.get_cname (), ptr); } + /** + * Returns the C name of this data type in lower case. Words are + * separated by underscores. + * + * @param infix a string to be placed between namespace and data type + * name or null + * @return the lower case name to be used in C code + */ + public virtual string get_lower_case_cname (string infix = null) { + return data_type.get_lower_case_cname (infix); + } + public override string! to_string () { string s; @@ -250,7 +262,7 @@ public class Vala.DataType : CodeNode { * @return true if this type reference is equal to type2, false * otherwise */ - public bool equals (DataType! type2) { + public virtual bool equals (DataType! type2) { if (type2.transfers_ownership != transfers_ownership) { return false; } diff --git a/vala/valaerrortype.vala b/vala/valaerrortype.vala index 02b99b5..f12cb33 100644 --- a/vala/valaerrortype.vala +++ b/vala/valaerrortype.vala @@ -69,4 +69,26 @@ public class Vala.ErrorType : ReferenceType { public override string get_cname (bool var_type = false, bool const_type = false) { return "GError*"; } + + public override string get_lower_case_cname (string infix = null) { + if (error_domain == null) { + if (infix == null) { + return "g_error"; + } else { + return "g_%s_error".printf (infix); + } + } else { + return error_domain.get_lower_case_cname (infix); + } + } + + public override bool equals (DataType! type2) { + var et = type2 as ErrorType; + + if (et == null) { + return false; + } + + return error_domain == et.error_domain; + } } diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index 6f8201f..b8d4dee 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -1082,6 +1082,8 @@ public class Vala.SemanticAnalyzer : CodeVisitor { clause.variable_declarator.type_reference = new ClassType (gerror_type); clause.body.scope.add (clause.variable_name, clause.variable_declarator); + } else { + clause.type_reference = new ErrorType (null); } clause.accept_children (this);