Hello community, here is the log from the commit of package gjs for openSUSE:Factory checked in at 2018-02-03 15:38:41 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gjs (Old) and /work/SRC/openSUSE:Factory/.gjs.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gjs" Sat Feb 3 15:38:41 2018 rev:70 rq:572081 version:1.50.4 Changes: -------- --- /work/SRC/openSUSE:Factory/gjs/gjs.changes 2017-11-03 19:07:10.565741783 +0100 +++ /work/SRC/openSUSE:Factory/.gjs.new/gjs.changes 2018-02-03 15:38:42.671996133 +0100 @@ -1,0 +2,20 @@ +Tue Jan 30 21:25:23 UTC 2018 - [email protected] + +- Update to version 1.50.4: + + Gnome Shell crash with places-status extension when you plug an + USB device (glgo#gjs#33 and glgo#gjs#38). +- Changes from version 1.50.3: + + GJS will now log a warning when a GObject is accessed in + Javascript code after the underlying object has been freed in + C. (This used to work most of the time, but crash + unpredictably.) We now prevent this situation which, is usually + by caused a memory management bug in the underlying C library. + + Closed bugs and merge requests: + - Add checks for GObjects that have been finalized + (glgo#gjs#21, glgo#gjs#23, glgo#gjs#25, glgo#gjs#28, + glgo#gjs#33). + - Test "Cairo context has methods when created from a C + function" fails (glgo#gjs#27, glgo#gjs#35). + - Various fixes from the master branch for rare crashes. + +------------------------------------------------------------------- @@ -6,2 +26,2 @@ - * tweener: Fix a couple of warnings. - * legacy: Allow ES6 classes to inherit from abstract Lang.Class + - tweener: Fix a couple of warnings. + - legacy: Allow ES6 classes to inherit from abstract Lang.Class Old: ---- gjs-1.50.2.tar.xz New: ---- gjs-1.50.4.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gjs.spec ++++++ --- /var/tmp/diff_new_pack.NFt5fx/_old 2018-02-03 15:38:43.363963812 +0100 +++ /var/tmp/diff_new_pack.NFt5fx/_new 2018-02-03 15:38:43.367963626 +0100 @@ -1,7 +1,7 @@ # # spec file for package gjs # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: gjs -Version: 1.50.2 +Version: 1.50.4 Release: 0 # FIXME: find out if tapsets should really be in devel package or in main package Summary: JavaScript bindings based on gobject-introspection and Mozilla ++++++ gjs-1.50.2.tar.xz -> gjs-1.50.4.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/Makefile-test.am new/gjs-1.50.4/Makefile-test.am --- old/gjs-1.50.2/Makefile-test.am 2017-10-31 16:57:13.000000000 +0100 +++ new/gjs-1.50.4/Makefile-test.am 2018-01-27 23:32:25.000000000 +0100 @@ -228,6 +228,7 @@ installed-tests/js/testGIMarshalling.js \ installed-tests/js/testGLib.js \ installed-tests/js/testGObjectClass.js \ + installed-tests/js/testGObjectDestructionAccess.js \ installed-tests/js/testGObjectInterface.js \ installed-tests/js/testGTypeClass.js \ installed-tests/js/testGio.js \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/Makefile.in new/gjs-1.50.4/Makefile.in --- old/gjs-1.50.2/Makefile.in 2017-10-31 17:02:13.000000000 +0100 +++ new/gjs-1.50.4/Makefile.in 2018-01-27 23:49:42.000000000 +0100 @@ -91,8 +91,8 @@ $(srcdir)/gjs-1.0.pc.in $(top_srcdir)/win32/config.h.win32.in \ depcomp $(dist_gjsjs_DATA) \ $(nobase_gjs_public_include_HEADERS) $(noinst_HEADERS) COPYING \ - compile config.guess config.sub install-sh missing ltmain.sh \ - tap-driver.sh + compile config.guess config.rpath config.sub install-sh \ + missing ltmain.sh tap-driver.sh @ENABLE_GTK_TRUE@am__append_1 = $(GJS_GTK_CFLAGS) @ENABLE_GTK_TRUE@am__append_2 = $(GJS_GTK_LIBS) @ENABLE_GTK_TRUE@am__append_3 = $(gjs_gtk_private_srcs) @@ -620,6 +620,7 @@ installed-tests/js/testGIMarshalling.js \ installed-tests/js/testGLib.js \ installed-tests/js/testGObjectClass.js \ + installed-tests/js/testGObjectDestructionAccess.js \ installed-tests/js/testGObjectInterface.js \ installed-tests/js/testGTypeClass.js \ installed-tests/js/testGio.js \ @@ -1300,6 +1301,7 @@ installed-tests/js/testGIMarshalling.js \ installed-tests/js/testGLib.js \ installed-tests/js/testGObjectClass.js \ + installed-tests/js/testGObjectDestructionAccess.js \ installed-tests/js/testGObjectInterface.js \ installed-tests/js/testGTypeClass.js \ installed-tests/js/testGio.js \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/NEWS new/gjs-1.50.4/NEWS --- old/gjs-1.50.2/NEWS 2017-10-31 17:00:41.000000000 +0100 +++ new/gjs-1.50.4/NEWS 2018-01-27 23:49:15.000000000 +0100 @@ -1,3 +1,27 @@ +Version 1.50.4 +-------------- + +- Closed bugs and merge requests: + + * Gnome Shell crash with places-status extension when you plug an USB device + [#33, !38, Philip Chimento] + +Version 1.50.3 +-------------- + +- GJS will now log a warning when a GObject is accessed in Javascript code + after the underlying object has been freed in C. (This used to work most of + the time, but crash unpredictably.) We now prevent this situation which, is + usually caused by a memory management bug in the underlying C library. + +- Closed bugs and merge requests: + + * Add checks for GObjects that have been finalized [#21, #23, !25, !28, !33, + Marco Trevisan] + * Test "Cairo context has methods when created from a C function" fails [#27, + !35, ValentÃn Barros] + * Various fixes from the master branch for rare crashes [Philip Chimento] + Version 1.50.2 -------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/configure new/gjs-1.50.4/configure --- old/gjs-1.50.2/configure 2017-10-31 17:02:11.000000000 +0100 +++ new/gjs-1.50.4/configure 2018-01-27 23:49:40.000000000 +0100 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for gjs 1.50.2. +# Generated by GNU Autoconf 2.69 for gjs 1.50.4. # # Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=gjs>. # @@ -591,8 +591,8 @@ # Identity of this package. PACKAGE_NAME='gjs' PACKAGE_TARNAME='gjs' -PACKAGE_VERSION='1.50.2' -PACKAGE_STRING='gjs 1.50.2' +PACKAGE_VERSION='1.50.4' +PACKAGE_STRING='gjs 1.50.4' PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=gjs' PACKAGE_URL='https://wiki.gnome.org/Projects/Gjs' @@ -1446,7 +1446,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures gjs 1.50.2 to adapt to many kinds of systems. +\`configure' configures gjs 1.50.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1516,7 +1516,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of gjs 1.50.2:";; + short | recursive ) echo "Configuration of gjs 1.50.4:";; esac cat <<\_ACEOF @@ -1690,7 +1690,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -gjs configure 1.50.2 +gjs configure 1.50.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2180,7 +2180,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by gjs $as_me 1.50.2, which was +It was created by gjs $as_me 1.50.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3043,7 +3043,7 @@ # Define the identity of the package. PACKAGE='gjs' - VERSION='1.50.2' + VERSION='1.50.4' cat >>confdefs.h <<_ACEOF @@ -3269,10 +3269,10 @@ -GJS_VERSION=15002 +GJS_VERSION=15004 -$as_echo "#define GJS_VERSION (1 * 100 + 50) * 100 + 2" >>confdefs.h +$as_echo "#define GJS_VERSION (1 * 100 + 50) * 100 + 4" >>confdefs.h GETTEXT_PACKAGE=gjs @@ -21206,7 +21206,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by gjs $as_me 1.50.2, which was +This file was extended by gjs $as_me 1.50.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -21277,7 +21277,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -gjs config.status 1.50.2 +gjs config.status 1.50.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/configure.ac new/gjs-1.50.4/configure.ac --- old/gjs-1.50.2/configure.ac 2017-10-31 16:55:51.000000000 +0100 +++ new/gjs-1.50.4/configure.ac 2018-01-27 23:49:15.000000000 +0100 @@ -3,7 +3,7 @@ m4_define(pkg_major_version, 1) m4_define(pkg_minor_version, 50) -m4_define(pkg_micro_version, 2) +m4_define(pkg_micro_version, 4) m4_define(pkg_version, pkg_major_version.pkg_minor_version.pkg_micro_version) m4_define(pkg_int_version, (pkg_major_version * 100 + pkg_minor_version) * 100 + pkg_micro_version) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/gi/object.cpp new/gjs-1.50.4/gi/object.cpp --- old/gjs-1.50.2/gi/object.cpp 2017-10-31 16:55:51.000000000 +0100 +++ new/gjs-1.50.4/gi/object.cpp 2018-01-27 23:38:36.000000000 +0100 @@ -72,6 +72,7 @@ std::deque<GjsCallbackTrampoline *> vfuncs; unsigned js_object_finalized : 1; + unsigned g_object_finalized : 1; }; static std::stack<JS::PersistentRootedObject> object_init_list; @@ -408,6 +409,16 @@ if (priv->gobj == NULL) /* prototype, not an instance. */ return true; + if (priv->g_object_finalized) { + g_critical("Object %s.%s (%p), has been already finalized. " + "Impossible to get any property from it.", + priv->info ? g_base_info_get_namespace( (GIBaseInfo*) priv->info) : "", + priv->info ? g_base_info_get_name( (GIBaseInfo*) priv->info) : g_type_name(priv->gtype), + priv->gobj); + gjs_dumpstack(); + return true; + } + if (!get_prop_from_g_param(context, obj, priv, name, value_p)) return false; @@ -518,6 +529,16 @@ if (priv->gobj == NULL) /* prototype, not an instance. */ return result.succeed(); + if (priv->g_object_finalized) { + g_critical("Object %s.%s (%p), has been already finalized. " + "Impossible to set any property to it.", + priv->info ? g_base_info_get_namespace( (GIBaseInfo*) priv->info) : "", + priv->info ? g_base_info_get_name( (GIBaseInfo*) priv->info) : g_type_name(priv->gtype), + priv->gobj); + gjs_dumpstack(); + return result.succeed(); + } + ret = set_g_param_from_prop(context, priv, name, g_param_was_set, value_p, result); if (g_param_was_set || !ret) return ret; @@ -755,6 +776,18 @@ return true; } + if (priv->g_object_finalized) { + g_critical("Object %s.%s (%p), has been already finalized. " + "Impossible to resolve it.", + priv->info ? g_base_info_get_namespace( (GIBaseInfo*) priv->info) : "", + priv->info ? g_base_info_get_name( (GIBaseInfo*) priv->info) : g_type_name(priv->gtype), + priv->gobj); + gjs_dumpstack(); + + *resolved = false; + return true; + } + /* If we have no GIRepository information (we're a JS GObject subclass), * we need to look at exposing interfaces. Look up our interfaces through * GType data, and then hope that *those* are introspectable. */ @@ -938,7 +971,10 @@ wrapped_gobj_dispose_notify(gpointer data, GObject *where_the_object_was) { - weak_pointer_list.erase(static_cast<ObjectInstance *>(data)); + auto *priv = static_cast<ObjectInstance *>(data); + + priv->g_object_finalized = true; + weak_pointer_list.erase(priv); #if DEBUG_DISPOSE gjs_debug(GJS_DEBUG_GOBJECT, "Wrapped GObject %p disposed", where_the_object_was); #endif @@ -1434,6 +1470,15 @@ if (priv == NULL) return; + if (priv->g_object_finalized) { + g_debug("Object %s.%s (%p), has been already finalized. " + "Impossible to trace it.", + priv->info ? g_base_info_get_namespace( (GIBaseInfo*) priv->info) : "", + priv->info ? g_base_info_get_name( (GIBaseInfo*) priv->info) : g_type_name(priv->gtype), + priv->gobj); + return; + } + for (GClosure *closure : priv->signals) gjs_closure_trace(closure, tracer); @@ -1634,6 +1679,16 @@ priv->info ? g_base_info_get_name( (GIBaseInfo*) priv->info) : g_type_name(priv->gtype)); return false; } + if (priv->g_object_finalized) { + g_critical("Object %s.%s (%p), has been already deallocated - impossible to connect to signal. " + "This might be caused by the fact that the object has been destroyed from C " + "code using something such as destroy(), dispose(), or remove() vfuncs", + priv->info ? g_base_info_get_namespace( (GIBaseInfo*) priv->info) : "", + priv->info ? g_base_info_get_name( (GIBaseInfo*) priv->info) : g_type_name(priv->gtype), + priv->gobj); + gjs_dumpstack(); + return true; + } if (argc != 2 || !argv[0].isString() || !JS::IsCallable(&argv[1].toObject())) { gjs_throw(context, "connect() takes two args, the signal name and the callback"); @@ -1721,6 +1776,17 @@ return false; } + if (priv->g_object_finalized) { + g_critical("Object %s.%s (%p), has been already deallocated - impossible to emit signal. " + "This might be caused by the fact that the object has been destroyed from C " + "code using something such as destroy(), dispose(), or remove() vfuncs", + priv->info ? g_base_info_get_namespace( (GIBaseInfo*) priv->info) : "", + priv->info ? g_base_info_get_name( (GIBaseInfo*) priv->info) : g_type_name(priv->gtype), + priv->gobj); + gjs_dumpstack(); + return true; + } + if (argc < 1 || !argv[0].isString()) { gjs_throw(context, "emit() first arg is the signal name"); return false; @@ -1809,7 +1875,9 @@ return false; /* wrong class passed in */ } - return _gjs_proxy_to_string_func(context, obj, "object", + return _gjs_proxy_to_string_func(context, obj, + (priv->g_object_finalized) ? + "object (FINALIZED)" : "object", (GIBaseInfo*)priv->info, priv->gtype, priv->gobj, rec.rval()); } @@ -2128,6 +2196,18 @@ return false; } + if (priv->g_object_finalized) { + g_critical("Object %s.%s (%p), has been already deallocated - impossible to access to it. " + "This might be caused by the fact that the object has been destroyed from C " + "code using something such as destroy(), dispose(), or remove() vfuncs", + priv->info ? g_base_info_get_namespace( (GIBaseInfo*) priv->info) : "", + priv->info ? g_base_info_get_name( (GIBaseInfo*) priv->info) : g_type_name(priv->gtype), + priv->gobj); + gjs_dumpstack(); + + return true; + } + g_assert(priv->gtype == G_OBJECT_TYPE(priv->gobj)); if (expected_type != G_TYPE_NONE) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/gi/param.cpp new/gjs-1.50.4/gi/param.cpp --- old/gjs-1.50.2/gi/param.cpp 2017-10-31 16:55:51.000000000 +0100 +++ new/gjs-1.50.4/gi/param.cpp 2018-01-27 23:32:25.000000000 +0100 @@ -61,8 +61,10 @@ GjsAutoJSChar name(context); bool ret = false; - if (!gjs_get_string_id(context, id, &name)) + if (!gjs_get_string_id(context, id, &name)) { + *resolved = false; return true; /* not resolved, but no error */ + } priv = priv_from_js(context, obj); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/gjs/importer.cpp new/gjs-1.50.4/gjs/importer.cpp --- old/gjs-1.50.2/gjs/importer.cpp 2017-10-31 16:55:51.000000000 +0100 +++ new/gjs-1.50.4/gjs/importer.cpp 2018-01-27 23:32:25.000000000 +0100 @@ -490,9 +490,10 @@ JS::RootedValue elem(context); /* First try importing an internal module like byteArray */ - if (priv->is_root && - gjs_is_registered_native_module(context, obj, name) && - import_native_file(context, obj, name)) { + if (priv->is_root && gjs_is_registered_native_module(context, obj, name)) { + if (!import_native_file(context, obj, name)) + goto out; + gjs_debug(GJS_DEBUG_IMPORTER, "successfully imported module '%s'", name); result = true; @@ -761,8 +762,10 @@ return true; } - if (!gjs_get_string_id(context, id, &name)) - return false; + if (!gjs_get_string_id(context, id, &name)) { + *resolved = false; + return true; + } /* let Object.prototype resolve these */ if (strcmp(name, "valueOf") == 0 || diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/gjs/jsapi-util-string.cpp new/gjs-1.50.4/gjs/jsapi-util-string.cpp --- old/gjs-1.50.2/gjs/jsapi-util-string.cpp 2017-10-02 20:18:48.000000000 +0200 +++ new/gjs-1.50.4/gjs/jsapi-util-string.cpp 2018-01-27 23:37:59.000000000 +0100 @@ -30,25 +30,20 @@ #include "jsapi-wrapper.h" bool -gjs_string_to_utf8 (JSContext *context, - const JS::Value value, - GjsAutoJSChar *utf8_string_p) +gjs_string_to_utf8(JSContext *cx, + const JS::Value value, + GjsAutoJSChar *utf8_string_p) { - JS_BeginRequest(context); + JSAutoRequest ar(cx); if (!value.isString()) { - gjs_throw(context, - "Value is not a string, cannot convert to UTF-8"); - JS_EndRequest(context); + gjs_throw(cx, "Value is not a string, cannot convert to UTF-8"); return false; } - JS::RootedString str(context, value.toString()); - utf8_string_p->reset(context, JS_EncodeStringToUTF8(context, str)); - - JS_EndRequest(context); - - return true; + JS::RootedString str(cx, value.toString()); + utf8_string_p->reset(cx, JS_EncodeStringToUTF8(cx, str)); + return !!*utf8_string_p; } bool diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/installed-tests/js/testCairo.js new/gjs-1.50.4/installed-tests/js/testCairo.js --- old/gjs-1.50.2/installed-tests/js/testCairo.js 2017-09-08 05:55:00.000000000 +0200 +++ new/gjs-1.50.4/installed-tests/js/testCairo.js 2018-01-10 06:55:16.000000000 +0100 @@ -181,7 +181,7 @@ cr = Gdk.cairo_create(da.window); expect(cr.save).toBeDefined(); - expect(_ts(cr.getTarget())).toEqual('Surface'); + expect(cr.getTarget()).toBeDefined(); }); }); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/installed-tests/js/testGObjectDestructionAccess.js new/gjs-1.50.4/installed-tests/js/testGObjectDestructionAccess.js --- old/gjs-1.50.2/installed-tests/js/testGObjectDestructionAccess.js 1970-01-01 01:00:00.000000000 +0100 +++ new/gjs-1.50.4/installed-tests/js/testGObjectDestructionAccess.js 2018-01-27 23:32:25.000000000 +0100 @@ -0,0 +1,92 @@ +// -*- mode: js; indent-tabs-mode: nil -*- +imports.gi.versions.Gtk = '3.0'; + +const GLib = imports.gi.GLib; +const Gtk = imports.gi.Gtk; + +describe('Access to destroyed GObject', () => { + let destroyedWindow; + + beforeAll(() => { + Gtk.init(null); + }); + + beforeEach(() => { + destroyedWindow = new Gtk.Window({type: Gtk.WindowType.TOPLEVEL}); + destroyedWindow.destroy(); + }); + + it('Get property', () => { + GLib.test_expect_message('Gjs', GLib.LogLevelFlags.LEVEL_CRITICAL, + 'Object Gtk.Window (0x*'); + + let title = destroyedWindow.title; + + GLib.test_assert_expected_messages_internal('Gjs', 'testGObjectDestructionAccess.js', 0, + 'testExceptionInDestroyedObjectPropertyGet'); + }); + + it('Set property', () => { + GLib.test_expect_message('Gjs', GLib.LogLevelFlags.LEVEL_CRITICAL, + 'Object Gtk.Window (0x*'); + + destroyedWindow.title = 'I am dead'; + + GLib.test_assert_expected_messages_internal('Gjs', 'testGObjectDestructionAccess.js', 0, + 'testExceptionInDestroyedObjectPropertySet'); + }); + + it('Access to getter method', () => { + GLib.test_expect_message('Gjs', GLib.LogLevelFlags.LEVEL_CRITICAL, + 'Object Gtk.Window (0x*'); + + let title = destroyedWindow.get_title(); + + GLib.test_assert_expected_messages_internal('Gjs', 'testGObjectDestructionAccess.js', 0, + 'testExceptionInDestroyedObjectMethodGet'); + }); + + it('Access to setter method', () => { + GLib.test_expect_message('Gjs', GLib.LogLevelFlags.LEVEL_CRITICAL, + 'Object Gtk.Window (0x*'); + + destroyedWindow.set_title('I am dead'); + + GLib.test_assert_expected_messages_internal('Gjs', 'testGObjectDestructionAccess.js', 0, + 'testExceptionInDestroyedObjectMethodSet'); + }); + + it('Proto function connect', () => { + GLib.test_expect_message('Gjs', GLib.LogLevelFlags.LEVEL_CRITICAL, + 'Object Gtk.Window (0x*'); + + destroyedWindow.connect('foo-signal', () => {}); + + GLib.test_assert_expected_messages_internal('Gjs', 'testGObjectDestructionAccess.js', 0, + 'testExceptionInDestroyedObjectConnect'); + }); + + it('Proto function connect_after', () => { + GLib.test_expect_message('Gjs', GLib.LogLevelFlags.LEVEL_CRITICAL, + 'Object Gtk.Window (0x*'); + + destroyedWindow.connect_after('foo-signal', () => {}); + + GLib.test_assert_expected_messages_internal('Gjs', 'testGObjectDestructionAccess.js', 0, + 'testExceptionInDestroyedObjectConnectAfter'); + }); + + it('Proto function emit', () => { + GLib.test_expect_message('Gjs', GLib.LogLevelFlags.LEVEL_CRITICAL, + 'Object Gtk.Window (0x*'); + + destroyedWindow.emit('foo-signal'); + + GLib.test_assert_expected_messages_internal('Gjs', 'testGObjectDestructionAccess.js', 0, + 'testExceptionInDestroyedObjectEmit'); + }); + + it('Proto function toString', () => { + expect(destroyedWindow.toString()).toMatch(/\[object \(FINALIZED\) instance proxy GIName:Gtk.Window jsobj@0x[a-f0-9]+ native@0x[a-f0-9]+\]/); + }); +}); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/installed-tests/js/testImporter.js new/gjs-1.50.4/installed-tests/js/testImporter.js --- old/gjs-1.50.2/installed-tests/js/testImporter.js 2017-09-08 05:55:00.000000000 +0200 +++ new/gjs-1.50.4/installed-tests/js/testImporter.js 2018-01-10 06:53:47.000000000 +0100 @@ -221,4 +221,9 @@ expect(keys).not.toContain('searchPath'); }); }); + + it("doesn't crash when resolving a non-string property", function () { + expect(imports[0]).not.toBeDefined(); + expect(imports.foobar[0]).not.toBeDefined(); + }); }); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/installed-tests/js/testParamSpec.js new/gjs-1.50.4/installed-tests/js/testParamSpec.js --- old/gjs-1.50.2/installed-tests/js/testParamSpec.js 2017-04-24 21:46:06.000000000 +0200 +++ new/gjs-1.50.4/installed-tests/js/testParamSpec.js 2018-01-10 06:53:47.000000000 +0100 @@ -40,3 +40,10 @@ testParamSpec('flags', [Regress.TestFlags, Regress.TestFlags.FLAG2], Regress.TestFlags.FLAG2); testParamSpec('object', [GObject.Object], null); + +describe('GObject.ParamSpec object', function () { + it("doesn't crash when resolving a non-string property", function () { + let paramSpec = GObject.ParamSpec.string(name, nick, blurb, flags, ''); + expect(paramSpec[0]).not.toBeDefined(); + }); +}); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gjs-1.50.2/win32/config.h.win32 new/gjs-1.50.4/win32/config.h.win32 --- old/gjs-1.50.2/win32/config.h.win32 2017-10-31 17:02:37.000000000 +0100 +++ new/gjs-1.50.4/win32/config.h.win32 2018-01-27 23:49:57.000000000 +0100 @@ -13,7 +13,7 @@ #define GETTEXT_PACKAGE "gjs" /* The gjs version as an integer */ -#define GJS_VERSION 15002 +#define GJS_VERSION 15004 /* define if the compiler supports basic C++11 syntax */ #define HAVE_CXX11 1 @@ -74,7 +74,7 @@ #define PACKAGE_NAME "gjs" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "gjs 1.50.2" +#define PACKAGE_STRING "gjs 1.50.4" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "gjs" @@ -83,10 +83,10 @@ #define PACKAGE_URL "" /* Define to the version of this package. */ -#define PACKAGE_VERSION "1.50.2" +#define PACKAGE_VERSION "1.50.4" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Version number of package */ -#define VERSION "1.50.2" +#define VERSION "1.50.4"
