summaryrefslogtreecommitdiffstats
path: root/generator
diff options
context:
space:
mode:
authorMatthew Booth <mbooth@redhat.com>2012-01-25 13:17:39 +0000
committerMatthew Booth <mbooth@redhat.com>2012-01-26 11:35:13 +0000
commit6568dd85f4aef705e7cf5c4301bc3b8f7119efd2 (patch)
tree7ba21f94988fcd9b3bad3c591898cae917c371a8 /generator
parent501561742b43edb044072ec85048bb35b0b8201a (diff)
downloadlibguestfs-6568dd85f4aef705e7cf5c4301bc3b8f7119efd2.tar.gz
libguestfs-6568dd85f4aef705e7cf5c4301bc3b8f7119efd2.tar.xz
libguestfs-6568dd85f4aef705e7cf5c4301bc3b8f7119efd2.zip
gobject: Allow RConstOptString to return an error
RConstOptString cannot return an error in the C api. This makes it a special case for the GObject api, as all other return types have a corresponding GError **err argument to return an error. This change removes this special case, and includes the possibility of an error return in the API. An error is indicated by setting *err to a non-NULL value. This change is in preparation for adding a close api. An attempt to call any api, even RConstOptString, on a closed handle must return an error.
Diffstat (limited to 'generator')
-rw-r--r--generator/generator_gobject.ml29
1 files changed, 11 insertions, 18 deletions
diff --git a/generator/generator_gobject.ml b/generator/generator_gobject.ml
index 4779f233..abc90625 100644
--- a/generator/generator_gobject.ml
+++ b/generator/generator_gobject.ml
@@ -37,10 +37,6 @@ let camel_of_name flags name =
a ^ String.uppercase (Str.first_chars b 1) ^ Str.string_after b 1
) "" (Str.split (regexp "_") name)
-let returns_error = function
- | RConstOptString _ -> false
- | _ -> true
-
let generate_gobject_proto name ?(single_line = true)
(ret, args, optargs) flags =
let spacer = if single_line then " " else "\n" in
@@ -109,7 +105,7 @@ let generate_gobject_proto name ?(single_line = true)
| _ -> ());
if List.exists (function Cancellable -> true | _ -> false) flags then
pr ", GCancellable *cancellable";
- if returns_error ret then pr ", GError **err";
+ pr ", GError **err";
pr ")"
let generate_gobject_header_static () =
@@ -602,7 +598,7 @@ let generate_gobject_c_methods () =
let doc = String.concat "\n * " doc in
let camel_name = camel_of_name flags name in
let is_RBufferOut = match ret with RBufferOut _ -> true | _ -> false in
- let error_return = match ret with
+ let gobject_error_return = match ret with
| RErr ->
"FALSE"
| RInt _ | RInt64 _ | RBool _ ->
@@ -688,7 +684,7 @@ let generate_gobject_c_methods () =
if cancellable then (
pr " /* Check we haven't already been cancelled */\n";
pr " if (g_cancellable_set_error_if_cancelled (cancellable, err))\n";
- pr " return %s;\n\n" error_return;
+ pr " return %s;\n\n" gobject_error_return;
);
pr " guestfs_h *g = session->priv->g;\n";
@@ -780,19 +776,16 @@ let generate_gobject_c_methods () =
(* Check return, throw error if necessary, marshall return value *)
- if returns_error ret then (
+ (match errcode_of_ret ret with
+ | `CannotReturnError -> ()
+ | _ ->
pr " if (ret == %s) {\n"
- (match ret with
- | RErr | RInt _ | RInt64 _ | RBool _ ->
- "-1"
- | RConstString _ | RString _ | RStringList _ | RHashtable _
- | RBufferOut _ | RStruct _ | RStructList _ ->
- "NULL"
- | RConstOptString _ ->
- assert false;
- );
+ (match errcode_of_ret ret with
+ | `CannotReturnError -> assert false
+ | `ErrorIsMinusOne -> "-1"
+ | `ErrorIsNULL -> "NULL");
pr " g_set_error_literal(err, GUESTFS_ERROR, 0, guestfs_last_error(g));\n";
- pr " return %s;\n" error_return;
+ pr " return %s;\n" gobject_error_return;
pr " }\n";
);
pr "\n";