[gjs] Revert "Support in arrays of any type"



commit 84352b3fca610de687346ecc8aaf983cf7431271
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Thu May 19 19:39:36 2011 +0200

    Revert "Support in arrays of any type"
    
    This reverts commit dde2278f4ff2876be91e1c06989166aa83a66d16.
    
    Definitely not my day... Sorry, people!

 gi/arg.c                     |  182 +-----------------------------------------
 gi/arg.h                     |    8 +--
 gi/function.c                |   25 +-----
 test/js/testGIMarshalling.js |   14 ---
 4 files changed, 9 insertions(+), 220 deletions(-)
---
diff --git a/gi/arg.c b/gi/arg.c
index d44e4d7..ebebbf7 100644
--- a/gi/arg.c
+++ b/gi/arg.c
@@ -576,112 +576,9 @@ gjs_array_to_intarray(JSContext   *context,
 }
 
 static JSBool
-gjs_array_to_floatarray(JSContext   *context,
-                        jsval        array_value,
-                        unsigned int length,
-                        void       **arr_p,
-                        gboolean     is_double)
-{
-    unsigned int i;
-    void *result = g_malloc0(length * (is_double ? sizeof(double) : sizeof(float)));
-
-    for (i = 0; i < length; ++i) {
-        jsval elem;
-        jsdouble val;
-        JSBool success;
-
-        elem = JSVAL_VOID;
-        if (!JS_GetElement(context, JSVAL_TO_OBJECT(array_value),
-                           i, &elem)) {
-            g_free(result);
-            gjs_throw(context,
-                      "Missing array element %u",
-                      i);
-            return JS_FALSE;
-        }
-
-        /* do whatever sign extension is appropriate */
-        success = JS_ValueToNumber(context, elem, &val);
-
-        if (!success) {
-            g_free(result);
-            gjs_throw(context,
-                      "Invalid element in array");
-            return JS_FALSE;
-        }
-
-        /* Note that this is truncating assignment. */
-        if (is_double) {
-            double *darray = (double*)result;
-            darray[i] = val;
-        } else {
-            float *farray = (float*)result;
-            farray[i] = val;
-        }
-    }
-
-    *arr_p = result;
-
-    return JS_TRUE;
-}
-
-static JSBool
-gjs_array_to_ptrarray(JSContext   *context,
-                      jsval        array_value,
-                      unsigned int length,
-                      GITransfer   transfer,
-                      GITypeInfo  *param_info,
-                      void       **arr_p)
-{
-    unsigned int i;
-
-    void **array = g_malloc0(length * sizeof(gpointer));
-
-    for (i = 0; i < length; i++) {
-        jsval elem;
-        GIArgument arg;
-        arg.v_pointer = NULL;
-
-        JSBool success;
-
-        elem = JSVAL_VOID;
-        if (!JS_GetElement(context, JSVAL_TO_OBJECT(array_value),
-                           i, &elem)) {
-            g_free(array);
-            gjs_throw(context,
-                      "Missing array element %u",
-                      i);
-            return JS_FALSE;
-        }
-
-        success = gjs_value_to_g_argument (context,
-                                           elem,
-                                           param_info,
-                                           NULL, /* arg name */
-                                           GJS_ARGUMENT_ARRAY_ELEMENT,
-                                           transfer,
-                                           FALSE, /* absent better information, FALSE for now */
-                                           &arg);
-
-        if (!success) {
-            g_free(array);
-            gjs_throw(context,
-                      "Invalid element in array");
-            return JS_FALSE;
-        }
-
-        array[i] = arg.v_pointer;
-    }
-
-    *arr_p = array;
-    return JS_TRUE;
-} 
-
-static JSBool
 gjs_array_to_array(JSContext   *context,
                    jsval        array_value,
                    unsigned int length,
-                   GITransfer   transfer,
                    GITypeInfo  *param_info,
                    void       **arr_p)
 {
@@ -691,14 +588,6 @@ gjs_array_to_array(JSContext   *context,
     element_type = g_type_info_get_tag(param_info);
     element_type = replace_gtype(element_type);
 
-    if (element_type == GI_TYPE_TAG_INTERFACE) {
-        GIBaseInfo *interface_info = g_type_info_get_interface (param_info);
-        GIInfoType info_type = g_base_info_get_type (interface_info);
-        if (info_type == GI_INFO_TYPE_ENUM || info_type == GI_INFO_TYPE_FLAGS)
-            element_type = g_enum_info_get_storage_type ((GIEnumInfo*) interface_info);
-        g_base_info_unref (interface_info);
-    }
-
     switch (element_type) {
     case GI_TYPE_TAG_UTF8:
         return gjs_array_to_strv (context, array_value, length, arr_p);
@@ -720,25 +609,6 @@ gjs_array_to_array(JSContext   *context,
     case GI_TYPE_TAG_INT32:
         return gjs_array_to_intarray
             (context, array_value, length, arr_p, 4, SIGNED);
-    case GI_TYPE_TAG_FLOAT:
-        return gjs_array_to_floatarray
-            (context, array_value, length, arr_p, FALSE);
-    case GI_TYPE_TAG_DOUBLE:
-        return gjs_array_to_floatarray
-            (context, array_value, length, arr_p, TRUE);
-
-    /* Everything else is a pointer type */
-    case GI_TYPE_TAG_INTERFACE:
-    case GI_TYPE_TAG_ARRAY:
-    case GI_TYPE_TAG_GLIST:
-    case GI_TYPE_TAG_GSLIST:
-    case GI_TYPE_TAG_GHASH:
-        return gjs_array_to_ptrarray(context,
-                                     array_value,
-                                     length,
-                                     transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer,
-                                     param_info,
-                                     arr_p);
     default:
         gjs_throw(context,
                   "Unhandled array element type %d", element_type);
@@ -788,7 +658,6 @@ gjs_array_to_g_array(JSContext   *context,
     if (!gjs_array_to_array (context,
                              array_value,
                              length,
-                             GI_TRANSFER_NOTHING, /* always good for the types we handle */
                              param_info,
                              &contents))
       return JS_FALSE;
@@ -834,8 +703,6 @@ get_argument_display_name(const char     *arg_name,
         return g_strdup("List element");
     case GJS_ARGUMENT_HASH_ELEMENT:
         return g_strdup("Hash element");
-    case GJS_ARGUMENT_ARRAY_ELEMENT:
-        return g_strdup("Array element");
     }
 
     g_assert_not_reached ();
@@ -1336,7 +1203,6 @@ gjs_value_to_g_argument(JSContext      *context,
                     if (!gjs_array_to_array (context,
                                              value,
                                              length,
-                                             transfer,
                                              param_info,
                                              &arg->v_pointer))
                       wrong = TRUE;
@@ -2503,7 +2369,7 @@ gjs_g_arg_release_internal(JSContext  *context,
             case GI_TYPE_TAG_FILENAME:
                 if (transfer == GI_TRANSFER_CONTAINER)
                     g_free(arg->v_pointer);
-                else if (transfer != TRANSFER_IN_NOTHING)
+                else if (transfer == GI_TRANSFER_EVERYTHING)
                     g_strfreev (arg->v_pointer);
                 break;
 
@@ -2541,10 +2407,7 @@ gjs_g_arg_release_internal(JSContext  *context,
                 break;
 
             default:
-                gjs_throw (context,
-                           "Releasing a C array with explicit length, that was nested"
-                           "inside another container. This is not supported (and will leak)");
-                failed = JS_TRUE;
+                g_assert_not_reached ();
             }
 
             g_base_info_unref((GIBaseInfo*) param_info);
@@ -2577,7 +2440,7 @@ gjs_g_arg_release_internal(JSContext  *context,
             case GI_TYPE_TAG_GHASH:
                 if (transfer == GI_TRANSFER_CONTAINER) {
                     g_array_free((GArray*) arg->v_pointer, TRUE);
-                } else if (transfer != TRANSFER_IN_NOTHING) {
+                } else if (transfer == GI_TRANSFER_EVERYTHING) {
                     GArray *array = arg->v_pointer;
                     guint i;
 
@@ -2586,7 +2449,7 @@ gjs_g_arg_release_internal(JSContext  *context,
 
                         arg.v_pointer = g_array_index (array, gpointer, i);
                         gjs_g_argument_release(context,
-                                               transfer,
+                                               GI_TRANSFER_EVERYTHING,
                                                param_info,
                                                &arg);
                     }
@@ -2734,42 +2597,5 @@ gjs_g_argument_release_in_arg(JSContext  *context,
     return JS_TRUE;
 }
 
-JSBool
-gjs_g_argument_release_in_array (JSContext  *context,
-                                 GITransfer  transfer,
-                                 GITypeInfo *type_info,
-                                 guint       length,
-                                 GArgument  *arg)
-{
-    GITypeInfo *param_type;
-    gpointer *array;
-    GArgument elem;
-    guint i;
-    JSBool ret = JS_TRUE;
-    GITypeTag type_tag;
-
-    if (transfer != GI_TRANSFER_NOTHING)
-        return JS_TRUE;
-
-    gjs_debug_marshal(GJS_DEBUG_GFUNCTION,
-                      "Releasing GArgument array in param");
-
-    array = arg->v_pointer;
 
-    param_type = g_type_info_get_param_type (type_info, 0);
-    type_tag = g_type_info_get_tag (param_type);
 
-    if (type_needs_release (param_type, type_tag)) {
-        for (i = 0; i < length; i++) {
-            elem.v_pointer = array[i];
-            if (!gjs_g_arg_release_internal (context, TRANSFER_IN_NOTHING,
-                                             param_type, type_tag, &elem)) {
-                ret = JS_FALSE;
-                break;
-            }
-        }
-    }
-
-    g_free (array);
-    return ret;
-}
diff --git a/gi/arg.h b/gi/arg.h
index 47e7f64..df473e2 100644
--- a/gi/arg.h
+++ b/gi/arg.h
@@ -38,8 +38,7 @@ typedef enum {
     GJS_ARGUMENT_RETURN_VALUE,
     GJS_ARGUMENT_FIELD,
     GJS_ARGUMENT_LIST_ELEMENT,
-    GJS_ARGUMENT_HASH_ELEMENT,
-    GJS_ARGUMENT_ARRAY_ELEMENT
+    GJS_ARGUMENT_HASH_ELEMENT
 } GjsArgumentType;
 
 JSBool gjs_value_to_arg   (JSContext  *context,
@@ -68,11 +67,6 @@ JSBool gjs_g_argument_release    (JSContext  *context,
                                   GITransfer  transfer,
                                   GITypeInfo *type_info,
                                   GArgument  *arg);
-JSBool gjs_g_argument_release_in_array (JSContext  *context,
-                                        GITransfer  transfer,
-                                        GITypeInfo *type_info,
-                                        guint       length,
-                                        GArgument  *arg);
 JSBool gjs_g_argument_release_in_arg (JSContext  *context,
                                       GITransfer  transfer,
                                       GITypeInfo *type_info,
diff --git a/gi/function.c b/gi/function.c
index 133a9fa..436a458 100644
--- a/gi/function.c
+++ b/gi/function.c
@@ -707,7 +707,6 @@ release:
         if (direction == GI_DIRECTION_IN || direction == GI_DIRECTION_INOUT) {
             GArgument *arg;
             GITransfer transfer;
-            gint array_length_pos;
 
             if (direction == GI_DIRECTION_IN) {
                 g_assert_cmpuint(in_args_pos, <, in_args_len);
@@ -723,26 +722,10 @@ release:
                  */
                 transfer = GI_TRANSFER_EVERYTHING;
             }
-            if (g_type_info_get_tag (&arg_type_info) == GI_TYPE_TAG_ARRAY &&
-                (array_length_pos = g_type_info_get_array_length (&arg_type_info)) != -1) {
-                /* Assume that the length passed as an argument was the length of the Array
-                   (not necessarily true) */
-
-                if (is_method) /* get_array_length does not consider the instance argument */
-                    array_length_pos++;
-
-                guint length = in_arg_cvalues[array_length_pos].v_uint;
-                if (!gjs_g_argument_release_in_array (context,
-                                                      transfer,
-                                                      &arg_type_info,
-                                                      length,
-                                                      arg)) {
-                    postinvoke_release_failed = TRUE;
-                }
-            } else if (!gjs_g_argument_release_in_arg(context,
-                                                      transfer,
-                                                      &arg_type_info,
-                                                      arg)) {
+            if (!gjs_g_argument_release_in_arg(context,
+                                               transfer,
+                                               &arg_type_info,
+                                               arg)) {
                 postinvoke_release_failed = TRUE;
             }
         }
diff --git a/test/js/testGIMarshalling.js b/test/js/testGIMarshalling.js
index 112f1d5..467b105 100644
--- a/test/js/testGIMarshalling.js
+++ b/test/js/testGIMarshalling.js
@@ -18,20 +18,6 @@ function testCArray() {
     assertEquals(42, array[0].long_);
     assertEquals(43, array[1].long_);
     assertEquals(44, array[2].long_);
-
-    GIMarshallingTests.array_string_in(["foo", "bar"], 2);
-
-    array = [];
-    for (var i = 0; i < 3; i++) {
-	array[i] = new GIMarshallingTests.BoxedStruct();
-	array[i].long_ = i + 1;
-    }
-
-    GIMarshallingTests.array_struct_in(array, array.length);
-
-    // Run twice to ensure that copies are correctly made for (transfer full)
-    GIMarshallingTests.array_struct_take_in(array, array.length);
-    GIMarshallingTests.array_struct_take_in(array, array.length);
 }
 
 function testGArray() {



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