[gjs] arg: Support 64-bit int C arrays



commit ce2b82ee941baccc382b5e6ec606be930a9a621b
Author: Philip Chimento <philip chimento gmail com>
Date:   Mon Oct 10 17:12:23 2016 -0700

    arg: Support 64-bit int C arrays
    
    Support for this was previously missing, as revealed by compiling with
    -Wswitch. Supporting it is fairly trivial, though we do have to modify
    gjs_array_to_intarray() since it previously handled only up to 32-bit
    arguments.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=772790

 gi/arg.cpp                              |   16 +++++++++++++---
 installed-tests/js/testGIMarshalling.js |    2 ++
 2 files changed, 15 insertions(+), 3 deletions(-)
---
diff --git a/gi/arg.cpp b/gi/arg.cpp
index 88955eb..4ec4cb5 100644
--- a/gi/arg.cpp
+++ b/gi/arg.cpp
@@ -558,7 +558,7 @@ gjs_array_to_intarray(JSContext   *context,
                       bool         is_signed)
 {
     /* nasty union types in an attempt to unify the various int types */
-    union { guint32 u; gint32 i; } intval;
+    union { uint64_t u; int64_t i; } intval;
     void *result;
     unsigned i;
 
@@ -580,8 +580,8 @@ gjs_array_to_intarray(JSContext   *context,
 
         /* do whatever sign extension is appropriate */
         success = (is_signed) ?
-            JS::ToInt32(context, elem, &(intval.i)) :
-            JS::ToUint32(context, elem, &(intval.u));
+            JS::ToInt64(context, elem, &(intval.i)) :
+            JS::ToUint64(context, elem, &(intval.u));
 
         if (!success) {
             g_free(result);
@@ -597,6 +597,8 @@ gjs_array_to_intarray(JSContext   *context,
             ((guint16*)result)[i] = (gint16) intval.u; break;
         case 4:
             ((guint32*)result)[i] = (gint32) intval.u; break;
+        case 8:
+            ((uint64_t *)result)[i] = (int64_t) intval.u; break;
         default:
             g_assert_not_reached();
         }
@@ -914,6 +916,12 @@ 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_INT64:
+        return gjs_array_to_intarray(context, array_value, length, arr_p, 8,
+            SIGNED);
+    case GI_TYPE_TAG_UINT64:
+        return gjs_array_to_intarray(context, array_value, length, arr_p, 8,
+            UNSIGNED);
     case GI_TYPE_TAG_FLOAT:
         return gjs_array_to_floatarray
             (context, array_value, length, arr_p, false);
@@ -3106,9 +3114,11 @@ gjs_g_arg_release_internal(JSContext  *context,
             case GI_TYPE_TAG_UINT8:
             case GI_TYPE_TAG_UINT16:
             case GI_TYPE_TAG_UINT32:
+            case GI_TYPE_TAG_UINT64:
             case GI_TYPE_TAG_INT8:
             case GI_TYPE_TAG_INT16:
             case GI_TYPE_TAG_INT32:
+            case GI_TYPE_TAG_INT64:
             case GI_TYPE_TAG_FLOAT:
             case GI_TYPE_TAG_DOUBLE:
             case GI_TYPE_TAG_GTYPE:
diff --git a/installed-tests/js/testGIMarshalling.js b/installed-tests/js/testGIMarshalling.js
index d322ee2..c96f630 100644
--- a/installed-tests/js/testGIMarshalling.js
+++ b/installed-tests/js/testGIMarshalling.js
@@ -111,6 +111,8 @@ function testCArray() {
     GIMarshallingTests.array_in_len_zero_terminated(array);
     GIMarshallingTests.array_in_guint64_len(array);
     GIMarshallingTests.array_in_guint8_len(array);
+    GIMarshallingTests.array_int64_in(array);
+    GIMarshallingTests.array_uint64_in(array);
 }
 
 function testGArray() {


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