Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package gjs for openSUSE:Factory checked in 
at 2023-06-14 16:28:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gjs (Old)
 and      /work/SRC/openSUSE:Factory/.gjs.new.15902 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gjs"

Wed Jun 14 16:28:58 2023 rev:109 rq:1092726 version:1.76.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/gjs/gjs.changes  2023-03-24 15:17:33.953992323 
+0100
+++ /work/SRC/openSUSE:Factory/.gjs.new.15902/gjs.changes       2023-06-14 
16:29:26.846508071 +0200
@@ -1,0 +2,21 @@
+Sun Jun 11 20:38:30 UTC 2023 - Bjørn Lie <bjorn....@gmail.com>
+
+- Update to version 1.76.1:
+  + Various fixes ported from the development branch.
+  + Closed bugs and merge requests:
+    - gnome-shell crashes on exit in js::gc::Cell::storeBuffer
+    - Memory leak with GError
+    - GVariant return values leaked
+    - GBytes's are leaked when passed as-is to a function
+    - Transformated GValues are leaking temporary instances
+    - GHash value infos are leaked
+    - "flat" arrays of GObject's are leaked
+    - Gjs console leaks invalid option errors
+    - gjs can't print null
+
+-------------------------------------------------------------------
+Thu May 18 20:22:30 UTC 2023 - Bjørn Lie <bjorn....@gmail.com>
+
+- Enable tests during build again.
+
+-------------------------------------------------------------------

Old:
----
  gjs-1.76.0.tar.xz

New:
----
  gjs-1.76.1.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gjs.spec ++++++
--- /var/tmp/diff_new_pack.fnV0IY/_old  2023-06-14 16:29:31.070534037 +0200
+++ /var/tmp/diff_new_pack.fnV0IY/_new  2023-06-14 16:29:31.074534061 +0200
@@ -17,8 +17,7 @@
 
 
 Name:           gjs
-Version:        1.76.0
-# FIXME # Disable tests for unstable 1.71.1 - Try tests again on next 
versionbump
+Version:        1.76.1
 Release:        0
 Summary:        JavaScript bindings based on gobject-introspection and Mozilla
 License:        LGPL-2.0-or-later AND MIT
@@ -107,12 +106,11 @@
 %install
 %meson_install
 
-# FIXME # Disable tests for unstable 1.71.1
-#%%check
-#export DISPLAY=:98
-#Xvfb :98 >& Xvfb.log & trap "kill $! || true" EXIT
-#sleep 10
-#%%meson_test
+%check
+export DISPLAY=:98
+Xvfb :98 >& Xvfb.log & trap "kill $! || true" EXIT
+sleep 10
+%meson_test
 
 %ldconfig_scriptlets -n libgjs0
 

++++++ gjs-1.76.0.tar.xz -> gjs-1.76.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/NEWS new/gjs-1.76.1/NEWS
--- old/gjs-1.76.0/NEWS 2023-03-18 22:04:55.000000000 +0100
+++ new/gjs-1.76.1/NEWS 2023-06-10 16:52:39.000000000 +0200
@@ -1,3 +1,22 @@
+Version 1.76.1
+--------------
+
+- Various fixes ported from the development branch.
+
+- Closed bugs and merge requests:
+  * gnome-shell crashes on exit in js::gc::Cell::storeBuffer [#472, !834, 
Daniel
+    van Vugt]
+  * Memory leak with GError [#36, !837, Marco Trevisan]
+  * GVariant return values leaked [#499, !837, Marco Trevisan]
+  * GBytes's are leaked when passed as-is to a function [#539, !837, Marco
+    Trevisan]
+  * Transformated GValues are leaking temporary instances [#540, !837, Marco
+    Trevisan]
+  * GHash value infos are leaked [#541, !837, Marco Trevisan]
+  * "flat" arrays of GObject's are leaked [#542, !837, Marco Trevisan]
+  * Gjs console leaks invalid option errors [#544, !837, Marco Trevisan]
+  * gjs can't print null [#545, !841, Angelo Verlain]
+
 Version 1.76.0
 --------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/gi/arg-cache.cpp 
new/gjs-1.76.1/gi/arg-cache.cpp
--- old/gjs-1.76.0/gi/arg-cache.cpp     2023-03-18 22:04:55.000000000 +0100
+++ new/gjs-1.76.1/gi/arg-cache.cpp     2023-06-10 16:52:39.000000000 +0200
@@ -574,6 +574,8 @@
     using BoxedIn::BoxedIn;
     bool in(JSContext*, GjsFunctionCallState*, GIArgument*,
             JS::HandleValue) override;
+    bool release(JSContext* cx, GjsFunctionCallState* state, GIArgument* 
in_arg,
+                 GIArgument* out_arg) override;
 };
 
 struct GBytesInTransferNone : GBytesIn {
@@ -1200,6 +1202,7 @@
 
     JS::RootedObject object(cx, &value.toObject());
     if (JS_IsUint8Array(object)) {
+        state->ignore_release.insert(arg);
         gjs_arg_set(arg, gjs_byte_array_get_bytes(object));
         return true;
     }
@@ -1211,6 +1214,15 @@
 }
 
 GJS_JSAPI_RETURN_CONVENTION
+bool GBytesIn::release(JSContext* cx, GjsFunctionCallState* state,
+                       GIArgument* in_arg, GIArgument* out_arg) {
+    if (state->ignore_release.erase(in_arg))
+        return BoxedIn::release(cx, state, in_arg, out_arg);
+
+    return BoxedInTransferNone::release(cx, state, in_arg, out_arg);
+}
+
+GJS_JSAPI_RETURN_CONVENTION
 bool InterfaceIn::in(JSContext* cx, GjsFunctionCallState* state,
                      GIArgument* arg, JS::HandleValue value) {
     if (value.isNull())
@@ -1330,7 +1342,8 @@
     GIArgument* length_arg = &(state->out_cvalue(m_length_pos));
     size_t length = gjs_g_argument_get_array_length(m_tag, length_arg);
 
-    return gjs_value_from_explicit_array(cx, value, &m_type_info, arg, length);
+    return gjs_value_from_explicit_array(cx, value, &m_type_info, m_transfer,
+                                         arg, length);
 }
 
 GJS_JSAPI_RETURN_CONVENTION
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/gi/arg-inl.h new/gjs-1.76.1/gi/arg-inl.h
--- old/gjs-1.76.0/gi/arg-inl.h 2023-03-18 22:04:55.000000000 +0100
+++ new/gjs-1.76.1/gi/arg-inl.h 2023-06-10 16:52:39.000000000 +0200
@@ -199,7 +199,7 @@
     if constexpr (Gjs::type_has_js_getter<T>())
         return Gjs::js_value_to_c(cx, value, &gjs_arg_member<T>(arg));
 
-    Gjs::JsValueHolder::Relaxed<T> val;
+    Gjs::JsValueHolder::Relaxed<T> val{};
 
     if (!Gjs::js_value_to_c_checked<T>(cx, value, &val, out_of_range))
         return false;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/gi/arg.cpp new/gjs-1.76.1/gi/arg.cpp
--- old/gjs-1.76.0/gi/arg.cpp   2023-03-18 22:04:55.000000000 +0100
+++ new/gjs-1.76.1/gi/arg.cpp   2023-06-10 16:52:39.000000000 +0200
@@ -58,8 +58,8 @@
 #include "util/misc.h"
 
 GJS_JSAPI_RETURN_CONVENTION static bool gjs_g_arg_release_internal(
-    JSContext*, GITransfer, GITypeInfo*, GITypeTag, GjsArgumentFlags,
-    GIArgument*);
+    JSContext*, GITransfer, GITypeInfo*, GITypeTag, GjsArgumentType,
+    GjsArgumentFlags, GIArgument*);
 static void throw_invalid_argument(JSContext* cx, JS::HandleValue value,
                                    GITypeInfo* arginfo, const char* arg_name,
                                    GjsArgumentType arg_type);
@@ -243,6 +243,9 @@
                 case GI_INFO_TYPE_UNION:
                     return g_type_info_is_pointer(type_info);
 
+                case GI_INFO_TYPE_OBJECT:
+                    return true;
+
                 default:
                     return false;
             }
@@ -510,8 +513,8 @@
 
     g_assert(props && "Property bag cannot be null");
 
-    GITypeInfo* key_param_info = g_type_info_get_param_type(type_info, 0);
-    GITypeInfo* val_param_info = g_type_info_get_param_type(type_info, 1);
+    GjsAutoBaseInfo key_param_info = g_type_info_get_param_type(type_info, 0);
+    GjsAutoBaseInfo val_param_info = g_type_info_get_param_type(type_info, 1);
 
     if (transfer == GI_TRANSFER_CONTAINER) {
         if (type_needs_release (key_param_info, 
g_type_info_get_tag(key_param_info)) ||
@@ -1890,7 +1893,7 @@
 template <typename T>
 GJS_JSAPI_RETURN_CONVENTION static bool gjs_array_from_g_list(
     JSContext* cx, JS::MutableHandleValue value_p, GITypeInfo* type_info,
-    T* list) {
+    GITransfer transfer, T* list) {
     static_assert(std::is_same_v<T, GList> || std::is_same_v<T, GSList>);
     GArgument arg;
     JS::RootedValueVector elems(cx);
@@ -1906,7 +1909,9 @@
             return false;
         }
 
-        if (!gjs_value_from_g_argument(cx, elems[i], param_info, &arg, true))
+        if (!gjs_value_from_g_argument(cx, elems[i], param_info,
+                                       GJS_ARGUMENT_LIST_ELEMENT, transfer,
+                                       &arg))
             return false;
     }
 
@@ -1938,7 +1943,8 @@
         gjs_arg_set(&elem, l->data);
 
         if (!gjs_g_arg_release_internal(cx, transfer, param_info, type_tag,
-                                        flags, &elem)) {
+                                        GJS_ARGUMENT_LIST_ELEMENT, flags,
+                                        &elem)) {
             return false;
         }
     }
@@ -1949,11 +1955,14 @@
 template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID>
 GJS_JSAPI_RETURN_CONVENTION static bool fill_vector_from_carray(
     JSContext* cx, JS::RootedValueVector& elems,  // NOLINT(runtime/references)
-    GITypeInfo* param_info, GIArgument* arg, void* array, size_t length) {
+    GITypeInfo* param_info, GIArgument* arg, void* array, size_t length,
+    GITransfer transfer = GI_TRANSFER_EVERYTHING) {
     for (size_t i = 0; i < length; i++) {
         gjs_arg_set<T, TAG>(arg, *(static_cast<T*>(array) + i));
 
-        if (!gjs_value_from_g_argument(cx, elems[i], param_info, arg, true))
+        if (!gjs_value_from_g_argument(cx, elems[i], param_info,
+                                       GJS_ARGUMENT_ARRAY_ELEMENT,
+                                       transfer, arg))
             return false;
     }
 
@@ -1961,14 +1970,9 @@
 }
 
 GJS_JSAPI_RETURN_CONVENTION
-static bool
-gjs_array_from_carray_internal (JSContext             *context,
-                                JS::MutableHandleValue value_p,
-                                GIArrayType            array_type,
-                                GITypeInfo            *param_info,
-                                guint                  length,
-                                gpointer               array)
-{
+static bool gjs_array_from_carray_internal(
+    JSContext* context, JS::MutableHandleValue value_p, GIArrayType array_type,
+    GITypeInfo* param_info, GITransfer transfer, guint length, void* array) {
     GArgument arg;
     GITypeTag element_type;
     guint i;
@@ -2081,8 +2085,9 @@
                     gjs_arg_set(&arg,
                                 static_cast<char*>(array) + (struct_size * i));
 
-                    if (!gjs_value_from_g_argument(context, elems[i], 
param_info,
-                                                   &arg, true))
+                    if (!gjs_value_from_g_argument(
+                            context, elems[i], param_info,
+                            GJS_ARGUMENT_ARRAY_ELEMENT, transfer, &arg))
                         return false;
                 }
 
@@ -2099,7 +2104,7 @@
         case GI_TYPE_TAG_GHASH:
         case GI_TYPE_TAG_ERROR:
             if (!fill_vector_from_carray<void*>(context, elems, param_info,
-                                                &arg, array, length))
+                                                &arg, array, length, transfer))
                 return false;
             break;
         case GI_TYPE_TAG_VOID:
@@ -2118,12 +2123,10 @@
 }
 
 GJS_JSAPI_RETURN_CONVENTION
-static bool
-gjs_array_from_fixed_size_array (JSContext             *context,
-                                 JS::MutableHandleValue value_p,
-                                 GITypeInfo            *type_info,
-                                 gpointer               array)
-{
+static bool gjs_array_from_fixed_size_array(JSContext* context,
+                                            JS::MutableHandleValue value_p,
+                                            GITypeInfo* type_info,
+                                            GITransfer transfer, void* array) {
     gint length;
 
     length = g_type_info_get_array_fixed_size(type_info);
@@ -2134,31 +2137,26 @@
 
     return gjs_array_from_carray_internal(context, value_p,
                                           
g_type_info_get_array_type(type_info),
-                                          param_info, length, array);
+                                          param_info, transfer, length, array);
 }
 
-bool
-gjs_value_from_explicit_array(JSContext             *context,
-                              JS::MutableHandleValue value_p,
-                              GITypeInfo            *type_info,
-                              GIArgument            *arg,
-                              int                    length)
-{
+bool gjs_value_from_explicit_array(JSContext* context,
+                                   JS::MutableHandleValue value_p,
+                                   GITypeInfo* type_info, GITransfer transfer,
+                                   GIArgument* arg, int length) {
     GjsAutoTypeInfo param_info = g_type_info_get_param_type(type_info, 0);
 
     return gjs_array_from_carray_internal(
         context, value_p, g_type_info_get_array_type(type_info), param_info,
-        length, gjs_arg_get<void*>(arg));
+        transfer, length, gjs_arg_get<void*>(arg));
 }
 
 GJS_JSAPI_RETURN_CONVENTION
-static bool
-gjs_array_from_boxed_array (JSContext             *context,
-                            JS::MutableHandleValue value_p,
-                            GIArrayType            array_type,
-                            GITypeInfo            *param_info,
-                            GArgument             *arg)
-{
+static bool gjs_array_from_boxed_array(JSContext* context,
+                                       JS::MutableHandleValue value_p,
+                                       GIArrayType array_type,
+                                       GITypeInfo* param_info,
+                                       GITransfer transfer, GArgument* arg) {
     GArray *array;
     GPtrArray *ptr_array;
     gpointer data = NULL;
@@ -2188,12 +2186,12 @@
     }
 
     return gjs_array_from_carray_internal(context, value_p, array_type,
-                                          param_info, length, data);
+                                          param_info, transfer, length, data);
 }
 
 GJS_JSAPI_RETURN_CONVENTION
 bool gjs_array_from_g_value_array(JSContext* cx, JS::MutableHandleValue 
value_p,
-                                  GITypeInfo* param_info,
+                                  GITypeInfo* param_info, GITransfer transfer,
                                   const GValue* gvalue) {
     void* data = nullptr;
     size_t length = 0;
@@ -2220,13 +2218,14 @@
     }
 
     return gjs_array_from_carray_internal(cx, value_p, array_type, param_info,
-                                          length, data);
+                                          transfer, length, data);
 }
 
 template <typename T>
 GJS_JSAPI_RETURN_CONVENTION static bool 
fill_vector_from_zero_terminated_carray(
     JSContext* cx, JS::RootedValueVector& elems,  // NOLINT(runtime/references)
-    GITypeInfo* param_info, GIArgument* arg, void* c_array) {
+    GITypeInfo* param_info, GIArgument* arg, void* c_array,
+    GITransfer transfer = GI_TRANSFER_EVERYTHING) {
     T* array = static_cast<T*>(c_array);
 
     for (size_t i = 0; array[i]; i++) {
@@ -2237,7 +2236,9 @@
             return false;
         }
 
-        if (!gjs_value_from_g_argument(cx, elems[i], param_info, arg, true))
+        if (!gjs_value_from_g_argument(cx, elems[i], param_info,
+                                       GJS_ARGUMENT_ARRAY_ELEMENT, transfer,
+                                       arg))
             return false;
     }
 
@@ -2245,12 +2246,9 @@
 }
 
 GJS_JSAPI_RETURN_CONVENTION
-static bool
-gjs_array_from_zero_terminated_c_array (JSContext             *context,
-                                        JS::MutableHandleValue value_p,
-                                        GITypeInfo            *param_info,
-                                        gpointer               c_array)
-{
+static bool gjs_array_from_zero_terminated_c_array(
+    JSContext* context, JS::MutableHandleValue value_p, GITypeInfo* param_info,
+    GITransfer transfer, void* c_array) {
     GArgument arg;
     GITypeTag element_type;
 
@@ -2332,7 +2330,7 @@
         case GI_TYPE_TAG_GHASH:
         case GI_TYPE_TAG_ERROR:
             if (!fill_vector_from_zero_terminated_carray<void*>(
-                    context, elems, param_info, &arg, c_array))
+                    context, elems, param_info, &arg, c_array, transfer))
                 return false;
             break;
         /* Boolean zero-terminated array makes no sense, because FALSE is also
@@ -2356,13 +2354,11 @@
 }
 
 GJS_JSAPI_RETURN_CONVENTION
-static bool
-gjs_object_from_g_hash (JSContext             *context,
-                        JS::MutableHandleValue value_p,
-                        GITypeInfo            *key_param_info,
-                        GITypeInfo            *val_param_info,
-                        GHashTable            *hash)
-{
+static bool gjs_object_from_g_hash(JSContext* context,
+                                   JS::MutableHandleValue value_p,
+                                   GITypeInfo* key_param_info,
+                                   GITypeInfo* val_param_info,
+                                   GITransfer transfer, GHashTable* hash) {
     GHashTableIter iter;
     GArgument keyarg, valarg;
 
@@ -2387,10 +2383,10 @@
     while (g_hash_table_iter_next(&iter, &key_pointer, &val_pointer)) {
         g_type_info_argument_from_hash_pointer(key_param_info, key_pointer,
                                                &keyarg);
-        if (!gjs_value_from_g_argument(context, &keyjs,
-                                       key_param_info, &keyarg,
-                                       true))
-            return false;
+        if (!gjs_value_from_g_argument(context, &keyjs, key_param_info,
+                                       GJS_ARGUMENT_HASH_ELEMENT,
+                                       transfer, &keyarg))
+          return false;
 
         keystr = JS::ToString(context, keyjs);
         if (!keystr)
@@ -2402,9 +2398,9 @@
 
         g_type_info_argument_from_hash_pointer(val_param_info, val_pointer,
                                                &valarg);
-        if (!gjs_value_from_g_argument(context, &valjs,
-                                       val_param_info, &valarg,
-                                       true))
+        if (!gjs_value_from_g_argument(context, &valjs, val_param_info,
+                                       GJS_ARGUMENT_HASH_ELEMENT,
+                                       transfer, &valarg))
             return false;
 
         if (!JS_DefineProperty(context, obj, keyutf8.get(), valjs,
@@ -2415,13 +2411,11 @@
     return true;
 }
 
-bool
-gjs_value_from_g_argument (JSContext             *context,
-                           JS::MutableHandleValue value_p,
-                           GITypeInfo            *type_info,
-                           GArgument             *arg,
-                           bool                   copy_structs)
-{
+bool gjs_value_from_g_argument(JSContext* context,
+                               JS::MutableHandleValue value_p,
+                               GITypeInfo* type_info,
+                               GjsArgumentType argument_type,
+                               GITransfer transfer, GArgument* arg) {
     GITypeTag type_tag;
 
     type_tag = g_type_info_get_tag( (GITypeInfo*) type_info);
@@ -2665,9 +2659,22 @@
 
                 JSObject *obj;
 
-                if (copy_structs || g_type_is_a(gtype, G_TYPE_VARIANT))
+                if (gtype == G_TYPE_VARIANT) {
+                    transfer = GI_TRANSFER_EVERYTHING;
+                } else if (transfer == GI_TRANSFER_CONTAINER) {
+                    switch (argument_type) {
+                        case GJS_ARGUMENT_ARRAY_ELEMENT:
+                        case GJS_ARGUMENT_LIST_ELEMENT:
+                        case GJS_ARGUMENT_HASH_ELEMENT:
+                            transfer = GI_TRANSFER_EVERYTHING;
+                        default:
+                            break;
+                    }
+                }
+
+                if (transfer == GI_TRANSFER_EVERYTHING)
                     obj = BoxedInstance::new_for_c_struct(
-                        context, interface_info, gjs_arg_get<GVariant*>(arg));
+                        context, interface_info, gjs_arg_get<void*>(arg));
                 else
                     obj = BoxedInstance::new_for_c_struct(
                         context, interface_info, gjs_arg_get<void*>(arg),
@@ -2748,14 +2755,16 @@
                 g_assert(param_info != nullptr);
 
                 return gjs_array_from_zero_terminated_c_array(
-                    context, value_p, param_info, gjs_arg_get<void*>(arg));
+                    context, value_p, param_info, transfer,
+                    gjs_arg_get<void*>(arg));
             } else {
                 /* arrays with length are handled outside of this function */
                 g_assert(((void) "Use gjs_value_from_explicit_array() for "
                           "arrays with length param",
                           g_type_info_get_array_length(type_info) == -1));
-                return gjs_array_from_fixed_size_array(
-                    context, value_p, type_info, gjs_arg_get<void*>(arg));
+                return gjs_array_from_fixed_size_array(context, value_p,
+                                                       type_info, transfer,
+                                                       
gjs_arg_get<void*>(arg));
             }
         } else if (g_type_info_get_array_type(type_info) ==
                    GI_ARRAY_TYPE_BYTE_ARRAY) {
@@ -2776,15 +2785,15 @@
 
             return gjs_array_from_boxed_array(
                 context, value_p, g_type_info_get_array_type(type_info),
-                param_info, arg);
+                param_info, transfer, arg);
         }
         break;
 
     case GI_TYPE_TAG_GLIST:
-        return gjs_array_from_g_list(context, value_p, type_info,
+        return gjs_array_from_g_list(context, value_p, type_info, transfer,
                                      gjs_arg_get<GList*>(arg));
     case GI_TYPE_TAG_GSLIST:
-        return gjs_array_from_g_list(context, value_p, type_info,
+        return gjs_array_from_g_list(context, value_p, type_info, transfer,
                                      gjs_arg_get<GSList*>(arg));
 
     case GI_TYPE_TAG_GHASH:
@@ -2797,7 +2806,7 @@
         g_assert(val_param_info != nullptr);
 
         return gjs_object_from_g_hash(context, value_p, key_param_info,
-                                      val_param_info,
+                                      val_param_info, transfer,
                                       gjs_arg_get<GHashTable*>(arg));
         }
         break;
@@ -2827,8 +2836,9 @@
     gjs_arg_set(&val_arg, val);
     if (!gjs_g_arg_release_internal(c->context, c->transfer, c->key_param_info,
                                     g_type_info_get_tag(c->key_param_info),
-                                    c->flags, &key_arg))
-        c->failed = true;
+                                    GJS_ARGUMENT_HASH_ELEMENT, c->flags,
+                                    &key_arg))
+    c->failed = true;
 
     GITypeTag val_type = g_type_info_get_tag(c->val_param_info);
 
@@ -2841,10 +2851,10 @@
             break;
 
         default:
-            if (!gjs_g_arg_release_internal(c->context, c->transfer,
-                                            c->val_param_info, val_type,
-                                            c->flags, &val_arg))
-                c->failed = true;
+            if (!gjs_g_arg_release_internal(
+                    c->context, c->transfer, c->val_param_info, val_type,
+                    GJS_ARGUMENT_HASH_ELEMENT, c->flags, &val_arg))
+            c->failed = true;
     }
 
     return true;
@@ -2860,13 +2870,13 @@
 }
 
 GJS_JSAPI_RETURN_CONVENTION
-static bool gjs_g_arg_release_internal(JSContext* context, GITransfer transfer,
-                                       GITypeInfo* type_info,
-                                       GITypeTag type_tag,
-                                       GjsArgumentFlags flags,
-                                       GIArgument* arg) {
+static bool gjs_g_arg_release_internal(
+    JSContext* context, GITransfer transfer, GITypeInfo* type_info,
+    GITypeTag type_tag, [[maybe_unused]] GjsArgumentType argument_type,
+    GjsArgumentFlags flags, GIArgument* arg) {
     g_assert(transfer != GI_TRANSFER_NOTHING ||
-             flags != GjsArgumentFlags::NONE);
+             flags != GjsArgumentFlags::NONE ||
+             argument_type != GJS_ARGUMENT_ARGUMENT);
 
     switch (type_tag) {
     case GI_TYPE_TAG_VOID:
@@ -3065,8 +3075,8 @@
                         for (array = arg_array; *array; array++) {
                             gjs_arg_set(&elem, *array);
                             if (!gjs_g_arg_release_internal(
-                                    context, GI_TRANSFER_EVERYTHING, 
param_info,
-                                    element_type, flags, &elem)) {
+                                    context, transfer, param_info, 
element_type,
+                                    GJS_ARGUMENT_ARRAY_ELEMENT, flags, &elem)) 
{
                                 return false;
                             }
                         }
@@ -3080,8 +3090,8 @@
                         for (i = 0; i < len; i++) {
                             gjs_arg_set(&elem, arg_array[i]);
                             if (!gjs_g_arg_release_internal(
-                                    context, GI_TRANSFER_EVERYTHING, 
param_info,
-                                    element_type, flags, &elem)) {
+                                    context, transfer, param_info, 
element_type,
+                                    GJS_ARGUMENT_ARRAY_ELEMENT, flags, &elem)) 
{
                                 return false;
                             }
                         }
@@ -3143,7 +3153,7 @@
                                     g_array_index(array, gpointer, i));
                         if (!gjs_g_arg_release_internal(
                                 context, transfer, param_info, element_type,
-                                flags, &arg_iter))
+                                GJS_ARGUMENT_ARRAY_ELEMENT, flags, &arg_iter))
                             return false;
                     }
                 }
@@ -3241,8 +3251,8 @@
                       "Releasing GArgument %s out param or return value",
                       g_type_tag_to_string(type_tag));
 
-    return gjs_g_arg_release_internal(cx, transfer, type_info, type_tag, flags,
-                                      arg);
+    return gjs_g_arg_release_internal(cx, transfer, type_info, type_tag,
+                                      GJS_ARGUMENT_ARGUMENT, flags, arg);
 }
 
 bool gjs_g_argument_release_in_arg(JSContext* cx, GITransfer transfer,
@@ -3267,7 +3277,7 @@
 
     if (type_needs_release (type_info, type_tag))
         return gjs_g_arg_release_internal(cx, transfer, type_info, type_tag,
-                                          flags, arg);
+                                          GJS_ARGUMENT_ARGUMENT, flags, arg);
 
     return true;
 }
@@ -3301,8 +3311,9 @@
             gjs_arg_set(&elem, array[i]);
             if (!gjs_g_arg_release_internal(context, GI_TRANSFER_NOTHING,
                                             param_type, type_tag,
+                                            GJS_ARGUMENT_ARRAY_ELEMENT,
                                             GjsArgumentFlags::ARG_IN, &elem)) {
-                return false;
+            return false;
             }
         }
     }
@@ -3332,10 +3343,11 @@
         for (i = 0; i < length; i++) {
             gjs_arg_set(&elem, array[i]);
             JS::AutoSaveExceptionState saved_exc(context);
-            if (!gjs_g_arg_release_internal(context, GI_TRANSFER_EVERYTHING,
-                                            param_type, type_tag,
+            if (!gjs_g_arg_release_internal(context, transfer, param_type,
+                                            type_tag,
+                                            GJS_ARGUMENT_ARRAY_ELEMENT,
                                             GjsArgumentFlags::ARG_OUT, &elem)) 
{
-                return false;
+            return false;
             }
         }
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/gi/arg.h new/gjs-1.76.1/gi/arg.h
--- old/gjs-1.76.0/gi/arg.h     2023-03-18 22:04:55.000000000 +0100
+++ new/gjs-1.76.1/gi/arg.h     2023-06-10 16:52:39.000000000 +0200
@@ -76,18 +76,36 @@
 }
 
 GJS_JSAPI_RETURN_CONVENTION
-bool gjs_value_from_g_argument(JSContext             *context,
+bool gjs_value_from_g_argument(JSContext* context,
                                JS::MutableHandleValue value_p,
-                               GITypeInfo            *type_info,
-                               GIArgument            *arg,
-                               bool                   copy_structs);
+                               GITypeInfo* type_info,
+                               GjsArgumentType argument_type,
+                               GITransfer transfer, GIArgument* arg);
 
 GJS_JSAPI_RETURN_CONVENTION
-bool gjs_value_from_explicit_array(JSContext             *context,
+inline bool gjs_value_from_g_argument(JSContext* cx,
+                                      JS::MutableHandleValue value_p,
+                                      GITypeInfo* type_info, GIArgument* arg,
+                                      bool copy_structs) {
+    return gjs_value_from_g_argument(
+        cx, value_p, type_info, GJS_ARGUMENT_ARGUMENT,
+        copy_structs ? GI_TRANSFER_EVERYTHING : GI_TRANSFER_NOTHING, arg);
+}
+
+GJS_JSAPI_RETURN_CONVENTION
+bool gjs_value_from_explicit_array(JSContext* context,
                                    JS::MutableHandleValue value_p,
-                                   GITypeInfo            *type_info,
-                                   GIArgument            *arg,
-                                   int                    length);
+                                   GITypeInfo* type_info, GITransfer transfer,
+                                   GIArgument* arg, int length);
+
+GJS_JSAPI_RETURN_CONVENTION
+inline bool gjs_value_from_explicit_array(JSContext* context,
+                                          JS::MutableHandleValue value_p,
+                                          GITypeInfo* type_info,
+                                          GIArgument* arg, int length) {
+    return gjs_value_from_explicit_array(context, value_p, type_info,
+                                         GI_TRANSFER_EVERYTHING, arg, length);
+}
 
 GJS_JSAPI_RETURN_CONVENTION
 bool gjs_g_argument_release(JSContext*, GITransfer, GITypeInfo*,
@@ -135,6 +153,7 @@
 
 GJS_JSAPI_RETURN_CONVENTION
 bool gjs_array_from_g_value_array(JSContext* cx, JS::MutableHandleValue 
value_p,
-                                  GITypeInfo* param_info, const GValue* 
gvalue);
+                                  GITypeInfo* param_info, GITransfer,
+                                  const GValue* gvalue);
 
 #endif  // GI_ARG_H_
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/gi/boxed.cpp new/gjs-1.76.1/gi/boxed.cpp
--- old/gjs-1.76.0/gi/boxed.cpp 2023-03-18 22:04:55.000000000 +0100
+++ new/gjs-1.76.1/gi/boxed.cpp 2023-06-10 16:52:39.000000000 +0200
@@ -586,7 +586,8 @@
         return gjs_value_from_explicit_array(cx, rval, type_info, &arg, 
length);
     }
 
-    return gjs_value_from_g_argument(cx, rval, type_info, &arg, true);
+    return gjs_value_from_g_argument(cx, rval, type_info, GJS_ARGUMENT_FIELD,
+                                     GI_TRANSFER_EVERYTHING, &arg);
 }
 
 /*
@@ -1100,12 +1101,8 @@
         copy_boxed(gboxed);
         return true;
     } else if (gtype() == G_TYPE_VARIANT) {
-        // Sink the reference if it is floating
-        GVariant* temp = g_variant_take_ref(static_cast<GVariant*>(gboxed));
-        // Add an additional reference which will be unref-ed
-        // in the marshaller
-        own_ptr(g_variant_ref(temp));
-        debug_lifecycle("Boxed pointer created by taking GVariant ref");
+        own_ptr(g_variant_ref_sink(static_cast<GVariant*>(gboxed)));
+        debug_lifecycle("Boxed pointer created by sinking GVariant ref");
         return true;
     } else if (get_prototype()->can_allocate_directly()) {
         copy_memory(gboxed);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/gi/function.cpp 
new/gjs-1.76.1/gi/function.cpp
--- old/gjs-1.76.0/gi/function.cpp      2023-03-18 22:04:55.000000000 +0100
+++ new/gjs-1.76.1/gi/function.cpp      2023-06-10 16:52:39.000000000 +0200
@@ -435,6 +435,7 @@
 
     GITypeTag ret_tag = g_type_info_get_tag(ret_type);
     bool ret_type_is_void = ret_tag == GI_TYPE_TAG_VOID;
+    bool in_args_to_cleanup = false;
 
     for (int i = 0, n_jsargs = 0; i < n_args; i++) {
         GIArgInfo arg_info;
@@ -456,6 +457,9 @@
         if (g_arg_info_get_direction(&arg_info) == GI_DIRECTION_INOUT)
             n_outargs++;
 
+        if (g_arg_info_get_ownership_transfer(&arg_info) != 
GI_TRANSFER_NOTHING)
+            in_args_to_cleanup = m_scope != GI_SCOPE_TYPE_FOREVER;
+
         param_type = m_param_types[i];
 
         switch (param_type) {
@@ -478,6 +482,7 @@
 
                 if (!gjs_value_from_explicit_array(
                         context, jsargs[n_jsargs++], &type_info,
+                        g_arg_info_get_ownership_transfer(&arg_info),
                         args[i + c_args_offset], length))
                     return false;
                 break;
@@ -616,6 +621,56 @@
         }
     }
 
+    if (!in_args_to_cleanup)
+        return true;
+
+    for (int i = 0; i < n_args; i++) {
+        GIArgInfo arg_info;
+        g_callable_info_load_arg(m_info, i, &arg_info);
+        GITransfer transfer = g_arg_info_get_ownership_transfer(&arg_info);
+
+        if (transfer == GI_TRANSFER_NOTHING)
+            continue;
+
+        if (g_arg_info_get_direction(&arg_info) != GI_DIRECTION_IN)
+            continue;
+
+        GIArgument* arg = args[i + c_args_offset];
+        if (m_scope == GI_SCOPE_TYPE_CALL) {
+            GITypeInfo type_info;
+            g_arg_info_load_type(&arg_info, &type_info);
+
+            if (!gjs_g_argument_release(context, transfer, &type_info, arg))
+                return false;
+
+            continue;
+        }
+
+        struct InvalidateData {
+            GIArgInfo arg_info;
+            GIArgument arg;
+        };
+
+        auto* data = new InvalidateData({arg_info, *arg});
+        g_closure_add_invalidate_notifier(
+            this, data, [](void* invalidate_data, GClosure* c) {
+                auto* self = static_cast<GjsCallbackTrampoline*>(c);
+                std::unique_ptr<InvalidateData> data(
+                    static_cast<InvalidateData*>(invalidate_data));
+                GITransfer transfer =
+                    g_arg_info_get_ownership_transfer(&data->arg_info);
+
+                GITypeInfo type_info;
+                g_arg_info_load_type(&data->arg_info, &type_info);
+                if (!gjs_g_argument_release(self->context(), transfer,
+                                            &type_info, &data->arg)) {
+                    gjs_throw(self->context(),
+                              "Impossible to release closure argument '%s'",
+                              g_base_info_get_name(&data->arg_info));
+                }
+            });
+    }
+
     return true;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/gi/fundamental.cpp 
new/gjs-1.76.1/gi/fundamental.cpp
--- old/gjs-1.76.0/gi/fundamental.cpp   2023-03-18 22:04:55.000000000 +0100
+++ new/gjs-1.76.1/gi/fundamental.cpp   2023-06-10 16:52:39.000000000 +0200
@@ -26,6 +26,7 @@
 #include "gi/function.h"
 #include "gi/fundamental.h"
 #include "gi/repo.h"
+#include "gi/value.h"
 #include "gi/wrapperutils.h"
 #include "gjs/atoms.h"
 #include "gjs/context-private.h"
@@ -483,11 +484,11 @@
             return true;
         } else if (g_value_type_transformable(instance->gtype(),
                                               G_VALUE_TYPE(gvalue))) {
-            GValue instance_value = {0};
+            Gjs::AutoGValue instance_value;
             g_value_init(&instance_value, instance->gtype());
             g_value_set_instance(&instance_value, instance->m_ptr);
-            g_value_transform(&instance_value, gvalue);
-            return true;
+            if (g_value_transform(&instance_value, gvalue))
+                return true;
         }
 
         gjs_throw(cx,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/gi/object.cpp new/gjs-1.76.1/gi/object.cpp
--- old/gjs-1.76.0/gi/object.cpp        2023-03-18 22:04:55.000000000 +0100
+++ new/gjs-1.76.1/gi/object.cpp        2023-06-10 16:52:39.000000000 +0200
@@ -438,8 +438,9 @@
         return false;
     }
 
-    return gjs_value_from_g_argument(cx, rval, type, &arg, true);
-    /* copy_structs is irrelevant because g_field_info_get_field() doesn't
+    return gjs_value_from_g_argument(cx, rval, type, GJS_ARGUMENT_FIELD,
+                                     GI_TRANSFER_EVERYTHING, &arg);
+    /* transfer is irrelevant because g_field_info_get_field() doesn't
      * handle boxed types */
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/gi/value.cpp new/gjs-1.76.1/gi/value.cpp
--- old/gjs-1.76.0/gi/value.cpp 2023-03-18 22:04:55.000000000 +0100
+++ new/gjs-1.76.1/gi/value.cpp 2023-06-10 16:52:39.000000000 +0200
@@ -118,8 +118,10 @@
 
     gjs_arg_set(&array_arg, g_value_get_pointer(array_value));
 
-    return gjs_value_from_explicit_array(context, value_p, array_type_info,
-                                         &array_arg, array_length.toInt32());
+    return gjs_value_from_explicit_array(
+        context, value_p, array_type_info,
+        no_copy ? GI_TRANSFER_NOTHING : GI_TRANSFER_EVERYTHING, &array_arg,
+        array_length.toInt32());
 }
 
 // FIXME(3v1n0): Move into closure.cpp one day...
@@ -632,7 +634,8 @@
                 /* special case GByteArray */
                 JS::RootedObject obj(context, &value.toObject());
                 if (JS_IsUint8Array(obj)) {
-                    g_value_set_boxed(gvalue, 
gjs_byte_array_get_byte_array(obj));
+                    g_value_take_boxed(gvalue,
+                                       gjs_byte_array_get_byte_array(obj));
                     return true;
                 }
             } else {
@@ -953,8 +956,9 @@
         g_arg_info_load_type(arg_info, &type_info);
         GITypeInfo* element_info = g_type_info_get_param_type(&type_info, 0);
 
-        if (!gjs_array_from_g_value_array(context, value_p, element_info,
-                                          gvalue)) {
+        if (!gjs_array_from_g_value_array(
+                context, value_p, element_info,
+                g_arg_info_get_ownership_transfer(arg_info), gvalue)) {
             gjs_throw(context, "Failed to convert array");
             return false;
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/gjs/context.cpp 
new/gjs-1.76.1/gjs/context.cpp
--- old/gjs-1.76.0/gjs/context.cpp      2023-03-18 22:04:55.000000000 +0100
+++ new/gjs-1.76.1/gjs/context.cpp      2023-06-10 16:52:39.000000000 +0200
@@ -471,6 +471,9 @@
         delete m_gtype_table;
         delete m_atoms;
 
+        m_job_queue.clear();
+        m_object_init_list.clear();
+
         /* Tear down JS */
         JS_DestroyContext(m_cx);
         m_cx = nullptr;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/installed-tests/js/testGIMarshalling.js 
new/gjs-1.76.1/installed-tests/js/testGIMarshalling.js
--- old/gjs-1.76.0/installed-tests/js/testGIMarshalling.js      2023-03-18 
22:04:55.000000000 +0100
+++ new/gjs-1.76.1/installed-tests/js/testGIMarshalling.js      2023-06-10 
16:52:39.000000000 +0200
@@ -559,6 +559,9 @@
 
         ['none', 'container', 'full'].forEach(transfer => {
             it(`marshals as a transfer-${transfer} in and out parameter`, 
function () {
+                if (transfer === 'full')
+                    
pending('https://gitlab.gnome.org/GNOME/gobject-introspection/-/merge_requests/399');
+
                 const returnedArray =
                     
GIMarshallingTests[`array_gvariant_${transfer}_in`](variantArray);
                 expect(returnedArray.map(v => v.deepUnpack())).toEqual([27, 
'Hello']);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/meson.build new/gjs-1.76.1/meson.build
--- old/gjs-1.76.0/meson.build  2023-03-18 22:04:55.000000000 +0100
+++ new/gjs-1.76.1/meson.build  2023-06-10 16:52:39.000000000 +0200
@@ -2,7 +2,7 @@
 # SPDX-FileCopyrightText: 2019 Philip Chimento <philip.chime...@gmail.com>
 # SPDX-FileCopyrightText: 2019 Chun-wei Fan <fanchun...@src.gnome.org>
 
-project('gjs', 'cpp', 'c', version: '1.76.0', license: ['MIT', 'LGPL2+'],
+project('gjs', 'cpp', 'c', version: '1.76.1', license: ['MIT', 'LGPL2+'],
     meson_version: '>= 0.54.0',
     default_options: ['cpp_std=c++17', 'cpp_rtti=false', 'c_std=c99',
         'warning_level=2', 'b_pch=true' ])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gjs-1.76.0/modules/script/_bootstrap/default.js 
new/gjs-1.76.1/modules/script/_bootstrap/default.js
--- old/gjs-1.76.0/modules/script/_bootstrap/default.js 2023-03-18 
22:04:55.000000000 +0100
+++ new/gjs-1.76.1/modules/script/_bootstrap/default.js 2023-06-10 
16:52:39.000000000 +0200
@@ -26,6 +26,9 @@
     function prettyPrint(value) {
         switch (typeof value) {
         case 'object':
+            if (value === null)
+                return 'null';
+
             if (value.toString === Object.prototype.toString ||
                 value.toString === Array.prototype.toString ||
                 value.toString === Date.prototype.toString) {
@@ -42,6 +45,8 @@
             return JSON.stringify(value);
         case 'symbol':
             return formatSymbol(value);
+        case 'undefined':
+            return 'undefined';
         default:
             return value.toString();
         }

Reply via email to