[vala/wip/transform: 62/93] Fix passing BusName and manage unhandled GErrors



commit 69c3e5713be5131613671886113e5a2a925bcc5c
Author: Luca Bruno <lucabru src gnome org>
Date:   Sat May 4 15:35:04 2013 +0200

    Fix passing BusName and manage unhandled GErrors

 codegen/valagdbusclienttransformer.vala |  5 +++++
 codegen/valagdbusservertransformer.vala | 16 ++++++++++++----
 vala/valacodebuilder.vala               | 33 +++++++++++++++++++++++++++++++++
 vala/valacodetransformer.vala           | 16 ++++------------
 vala/valaerrortype.vala                 |  2 +-
 5 files changed, 55 insertions(+), 17 deletions(-)
---
diff --git a/codegen/valagdbusclienttransformer.vala b/codegen/valagdbusclienttransformer.vala
index 92db25858..180e80e95 100644
--- a/codegen/valagdbusclienttransformer.vala
+++ b/codegen/valagdbusclienttransformer.vala
@@ -267,7 +267,12 @@ public class Vala.GDBusClientTransformer : GVariantTransformer {
                        // first try cached value
                        var result = b.add_temp_declaration (null, expression (@"get_cached_property 
(\"$dbus_name\")"));
                        b.open_if (expression (@"$result == null"));
+
+                       b.open_try ();
                        b.add_expression (expression (@"$result = call_sync 
(\"org.freedesktop.DBus.Properties.Get\", new Variant (\"(ss)\", \"$dbus_iface_name\", \"$dbus_name\"), 
GLib.DBusCallFlags.NONE, $timeout, null)"));
+                       b.add_catch_uncaught_error ();
+                       b.close ();
+
                        b.add_expression (expression (@"$result.get (\"(v)\", out $result)"));
                        b.close ();
 
diff --git a/codegen/valagdbusservertransformer.vala b/codegen/valagdbusservertransformer.vala
index 418f955e0..223663eb5 100644
--- a/codegen/valagdbusservertransformer.vala
+++ b/codegen/valagdbusservertransformer.vala
@@ -47,11 +47,12 @@ public class Vala.GDBusServerTransformer : GDBusClientTransformer {
 
                var iter = b.add_temp_declaration (null, expression ("arguments.iterator ()"));
 
-               var call = (MethodCall) expression (@"object.$(m.name) ()");
-               var finish_call = call;
+               MethodCall call;
+               MethodCall finish_call;
                Method ready = null;
                CodeBuilder ready_builder = null;
                if (m.coroutine) {
+                       call = (MethodCall) expression (@"object.$(m.name).begin ()");
                        wrapper_method (new VoidType (), "gdbus_server_async_ready " + m.get_full_name (), 
out ready);
                        ready.add_parameter (new Parameter ("source_object", data_type ("GLib.Object", 
false)));
                        ready.add_parameter (new Parameter ("res", data_type ("GLib.AsyncResult", false)));
@@ -59,6 +60,8 @@ public class Vala.GDBusServerTransformer : GDBusClientTransformer {
                        ready_builder = new CodeBuilder.for_subroutine (ready);
 
                        finish_call = (MethodCall) expression (@"(($object_type) source_object).$(m.name).end 
(res)");
+               } else {
+                       call = finish_call = (MethodCall) expression (@"object.$(m.name) ()");
                }
 
                var out_args = new string[0];
@@ -70,11 +73,13 @@ public class Vala.GDBusServerTransformer : GDBusClientTransformer {
                        if (param.variable_type is ObjectType) {
                                type_name = param.variable_type.data_type.get_full_name ();
                        }
+
                        if (type_name == "GLib.Cancellable") {
                                call.add_argument (expression ("null"));
                                continue;
                        }
                        if (type_name == "GLib.BusName") {
+                               call.add_argument (expression ("(GLib.BusName) invocation.get_sender ()"));
                                continue;
                        }
 
@@ -111,8 +116,8 @@ public class Vala.GDBusServerTransformer : GDBusClientTransformer {
                } else {
                        b.add_expression (finish_call);
                }
-               b.add_catch (data_type ("GLib.Error"), "e");
-               b.add_expression (expression ("invocation.return_gerror (e)"));
+               b.add_catch_all ("_invocation_gerror_");
+               b.add_expression (expression ("invocation.return_gerror (_invocation_gerror_)"));
                b.add_return ();
                b.close ();
 
@@ -129,7 +134,10 @@ public class Vala.GDBusServerTransformer : GDBusClientTransformer {
                if (fd_list != null) {
                        b.add_expression (expression (@"$reply.set_unix_fd_list ($fd_list)"));
                }
+               b.open_try ();
                b.add_expression (expression (@"invocation.get_connection ().send_message ($reply, 
GLib.DBusSendMessageFlags.NONE, null)"));
+               b.add_catch_uncaught_error ();
+               b.close ();
 
                if (m.coroutine) {
                        pop_builder ();
diff --git a/vala/valacodebuilder.vala b/vala/valacodebuilder.vala
index 6ad69047a..93a72fcb0 100644
--- a/vala/valacodebuilder.vala
+++ b/vala/valacodebuilder.vala
@@ -203,6 +203,16 @@ public class Vala.CodeBuilder {
                stmt.add_catch_clause (new CatchClause (error_type, variable_name, current_block, 
source_reference));
        }
 
+       public void add_catch_all (string? variable_name) {
+               add_catch (data_type ("GLib.Error"), variable_name);
+       }
+
+       public void add_catch_uncaught_error () {
+               add_catch_all ("_uncaught_error_");
+               add_expression (expression ("GLib.critical (_uncaught_error_.message)"));
+               add_expression (expression ("GLib.critical (\"file %s: line %d: uncaught error: %s (%s, 
%d)\", GLib.Log.FILE, GLib.Log.LINE, _uncaught_error_.message, _uncaught_error_.domain.to_string(), 
_uncaught_error_.code)"));
+       }
+
        public void add_statement (Statement statement) {
                current_block.add_statement (statement);
        }
@@ -247,4 +257,27 @@ public class Vala.CodeBuilder {
                        current_block = top as Block;
                } while (current_block == null);
        }
+
+       /* Utilities for building the code */
+
+       public Expression expression (string str) {
+               return new Parser().parse_expression_string (str, source_reference);
+       }
+
+       // only qualified types, will slightly simplify the work of SymbolResolver
+       public static Symbol symbol_from_string (string symbol_string) {
+               Symbol sym = CodeContext.get().root;
+               foreach (unowned string s in symbol_string.split (".")) {
+                       sym = sym.scope.lookup (s);
+               }
+               return sym;
+       }
+
+       // only qualified types, will slightly simplify the work of SymbolResolver
+       public static DataType data_type (string s, bool value_owned = true, bool nullable = false) {
+               DataType type = SemanticAnalyzer.get_data_type_for_symbol ((TypeSymbol) symbol_from_string 
(s));
+               type.value_owned = value_owned;
+               type.nullable = nullable;
+               return type;
+       }
 }
diff --git a/vala/valacodetransformer.vala b/vala/valacodetransformer.vala
index 8773d5151..5e22e75b4 100644
--- a/vala/valacodetransformer.vala
+++ b/vala/valacodetransformer.vala
@@ -96,24 +96,16 @@ public class Vala.CodeTransformer : CodeVisitor {
                return false;
        }
 
-       public Symbol symbol_from_string (string symbol_string) {
-               Symbol sym = context.root;
-               foreach (unowned string s in symbol_string.split (".")) {
-                       sym = sym.scope.lookup (s);
-               }
-               return sym;
+       public Symbol symbol_from_string (string s) {
+               return CodeBuilder.symbol_from_string (s);
        }
 
-       // only qualified types, will slightly simplify the work of SymbolResolver
        public DataType data_type (string s, bool value_owned = true, bool nullable = false) {
-               DataType type = SemanticAnalyzer.get_data_type_for_symbol ((TypeSymbol) symbol_from_string 
(s));
-               type.value_owned = value_owned;
-               type.nullable = nullable;
-               return type;
+               return CodeBuilder.data_type (s, value_owned, nullable);
        }
 
        public Expression expression (string str) {
-               return new Parser ().parse_expression_string (str, b.source_reference);
+               return b.expression (str);
        }
 
        public void check (CodeNode node) {
diff --git a/vala/valaerrortype.vala b/vala/valaerrortype.vala
index 7a7946643..92dbcf64e 100644
--- a/vala/valaerrortype.vala
+++ b/vala/valaerrortype.vala
@@ -112,7 +112,7 @@ public class Vala.ErrorType : ReferenceType {
        }
 
        public override Symbol? get_member (string member_name) {
-               var root_symbol = source_reference.file.context.root;
+               var root_symbol = CodeContext.get().root;
                var gerror_symbol = root_symbol.scope.lookup ("GLib").scope.lookup ("Error");
                return gerror_symbol.scope.lookup (member_name);
        }


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