[gjs] Complete implementation of GError marshalling



commit 3b5ba3210a6d0e9316f85702f410d19c8aa928c1
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Sat Jun 16 15:37:31 2012 +0200

    Complete implementation of GError marshalling
    
    GErrors that are not used for "throws" are not reported as regular
    boxed types but with special ERROR type tag, so we need to special
    case it everywhere. This was already done for out arguments and
    return values, but not for in arguments, array elements and argument
    releasing.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=669350

 gi/arg.c |   29 +++++++++++++++++++++++++++++
 1 files changed, 29 insertions(+), 0 deletions(-)
---
diff --git a/gi/arg.c b/gi/arg.c
index 8250eb8..06618e0 100644
--- a/gi/arg.c
+++ b/gi/arg.c
@@ -166,6 +166,7 @@ type_needs_release (GITypeInfo *type_info,
     case GI_TYPE_TAG_GLIST:
     case GI_TYPE_TAG_GSLIST:
     case GI_TYPE_TAG_GHASH:
+    case GI_TYPE_TAG_ERROR:
         return TRUE;
     case GI_TYPE_TAG_INTERFACE: {
         GIBaseInfo* interface_info;
@@ -234,6 +235,7 @@ type_needs_out_release(GITypeInfo *type_info,
     case GI_TYPE_TAG_GLIST:
     case GI_TYPE_TAG_GSLIST:
     case GI_TYPE_TAG_GHASH:
+    case GI_TYPE_TAG_ERROR:
         return TRUE;
     case GI_TYPE_TAG_INTERFACE: {
         GIBaseInfo* interface_info;
@@ -921,6 +923,7 @@ gjs_array_to_array(JSContext   *context,
     case GI_TYPE_TAG_GLIST:
     case GI_TYPE_TAG_GSLIST:
     case GI_TYPE_TAG_GHASH:
+    case GI_TYPE_TAG_ERROR:
     case GI_TYPE_TAG_FILENAME:
         return gjs_array_to_ptrarray(context,
                                      array_value,
@@ -1273,6 +1276,22 @@ gjs_value_to_g_argument(JSContext      *context,
         }
         break;
 
+    case GI_TYPE_TAG_ERROR:
+        nullable_type = TRUE;
+        if (JSVAL_IS_NULL(value)) {
+            arg->v_pointer = NULL;
+        } else if (JSVAL_IS_OBJECT(value)) {
+            arg->v_pointer = gjs_gerror_from_error(context,
+                                                   JSVAL_TO_OBJECT(value));
+
+            if (transfer != GI_TRANSFER_NOTHING)
+                arg->v_pointer = g_error_copy (arg->v_pointer);
+        } else {
+            wrong = TRUE;
+            report_type_mismatch = TRUE;
+        }
+        break;
+
     case GI_TYPE_TAG_INTERFACE:
         nullable_type = TRUE;
         {
@@ -1742,6 +1761,7 @@ gjs_g_argument_init_default(JSContext      *context,
     case GI_TYPE_TAG_UTF8:
     case GI_TYPE_TAG_GLIST:
     case GI_TYPE_TAG_GSLIST:
+    case GI_TYPE_TAG_ERROR:
         arg->v_pointer = NULL;
         break;
 
@@ -1991,6 +2011,7 @@ gjs_array_from_carray_internal (JSContext  *context,
         case GI_TYPE_TAG_GLIST:
         case GI_TYPE_TAG_GSLIST:
         case GI_TYPE_TAG_GHASH:
+        case GI_TYPE_TAG_ERROR:
           ITERATE(pointer);
           break;
         default:
@@ -2177,6 +2198,7 @@ gjs_array_from_zero_terminated_c_array (JSContext  *context,
         case GI_TYPE_TAG_GLIST:
         case GI_TYPE_TAG_GSLIST:
         case GI_TYPE_TAG_GHASH:
+        case GI_TYPE_TAG_ERROR:
           ITERATE(pointer);
           break;
         default:
@@ -2717,6 +2739,11 @@ gjs_g_arg_release_internal(JSContext  *context,
         g_free(arg->v_pointer);
         break;
 
+    case GI_TYPE_TAG_ERROR:
+        if (transfer != TRANSFER_IN_NOTHING)
+            g_error_free (arg->v_pointer);
+        break;
+
     case GI_TYPE_TAG_INTERFACE:
         {
             GIBaseInfo* interface_info;
@@ -2852,6 +2879,7 @@ gjs_g_arg_release_internal(JSContext  *context,
             case GI_TYPE_TAG_GSLIST:
             case GI_TYPE_TAG_ARRAY:
             case GI_TYPE_TAG_GHASH:
+            case GI_TYPE_TAG_ERROR:
                 if (transfer != GI_TRANSFER_CONTAINER
                     && type_needs_out_release(param_info, element_type)) {
                     if (g_type_info_is_zero_terminated (type_info)) {
@@ -2925,6 +2953,7 @@ gjs_g_arg_release_internal(JSContext  *context,
             case GI_TYPE_TAG_GLIST:
             case GI_TYPE_TAG_GSLIST:
             case GI_TYPE_TAG_GHASH:
+            case GI_TYPE_TAG_ERROR:
                 if (transfer == GI_TRANSFER_CONTAINER) {
                     g_array_free((GArray*) arg->v_pointer, TRUE);
                 } else if (type_needs_out_release (param_info, element_type)) {



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