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(); }