Commit 4ba9ffaa authored by Simon McVittie's avatar Simon McVittie

New upstream version 1.53.1

parents 2d55379d 3d25722b
......@@ -279,6 +279,7 @@ AM_TESTS_ENVIRONMENT = \
export G_FILENAME_ENCODING=latin1; \
export LSAN_OPTIONS="suppressions=$(abs_top_srcdir)/installed-tests/extra/lsan.supp"; \
export NO_AT_BRIDGE=1; \
export LC_ALL=C.UTF-8; \
$(COVERAGE_TESTS_ENVIRONMENT) \
$(XVFB_START) \
$(DBUS_SESSION_COMMAND) \
......
......@@ -1431,6 +1431,7 @@ AM_TESTS_ENVIRONMENT = \
export G_FILENAME_ENCODING=latin1; \
export LSAN_OPTIONS="suppressions=$(abs_top_srcdir)/installed-tests/extra/lsan.supp"; \
export NO_AT_BRIDGE=1; \
export LC_ALL=C.UTF-8; \
$(COVERAGE_TESTS_ENVIRONMENT) \
$(XVFB_START) \
$(DBUS_SESSION_COMMAND) \
......
Version 1.53.1
--------------
- Improvements to garbage collection performance. Read for more information:
https://feaneron.com/2018/04/20/the-infamous-gnome-shell-memory-leak/
- Now, when building a class from a UI template file (using the `Template`
parameter passed to `GObject.registerClass()`, for example) signals defined in
the UI template file will be automatically connected.
- As an experimental feature, we now offer a flatpak built with each GJS commit,
including branches. You can use this to test your apps with a particular GJS
branch before it is merged. Look for it in the "Artifacts" section of the CI
pipeline.
- Closed bugs and merge requests:
* Tweener: Add min/max properties [!67, Jason Hicks]
* `ARGV` encoding issues [#22, !108, Evan Welsh]
* Make GC much more aggressive [#62, !50, Giovanni Campagna, Georges Basile
Stavracas Neto, Philip Chimento]
* Queue GC when a GObject reference is toggled down [#140, !114, !127, Georges
Basile Stavracas Neto]
* overrides: support Gtk template callbacks [!124, Andy Holmes]
* Ensure not to miss the force_gc flag [#150, !132, Carlos Garnacho]
* Create a flatpak on CI [#153, !135, Claudio André]
* Readme update [!138, Claudio André]
Version 1.52.3
--------------
......
......@@ -14,3 +14,22 @@ GNOME Documents, and many other apps.
Wiki: https://wiki.gnome.org/action/show/Projects/Gjs
How to build and run if you want to contribute to GJS: see doc/Hacking.md
#### Testing
Our CI (continuous integration) testing scheme stresses the source code using:
- Fedora 27, Ubuntu 18.04, Fedora 29 (devel), and Ubuntu 18.10 (devel);
- gcc 7.3 and gcc 8.0;
- clang 6.0;
- C/C++ and Javascript Linters;
- Code Climate (https://codeclimate.com/);
- ASAN (address sanitizer) and UBSAN (undefined behavior sanitizer);
- Valgrind (https://en.wikipedia.org/wiki/Valgrind);
- Code Coverage (https://en.wikipedia.org/wiki/Code_coverage);
- Text only and graphics builds;
- Profiler enabled and disabled builds;
- And DevOps with Flatpak.
## License
Dual licensed under LGPL 2.0+ and MIT.
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for gjs 1.52.3.
# Generated by GNU Autoconf 2.69 for gjs 1.53.1.
#
# Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=gjs>.
#
......@@ -591,8 +591,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='gjs'
PACKAGE_TARNAME='gjs'
PACKAGE_VERSION='1.52.3'
PACKAGE_STRING='gjs 1.52.3'
PACKAGE_VERSION='1.53.1'
PACKAGE_STRING='gjs 1.53.1'
PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=gjs'
PACKAGE_URL='https://wiki.gnome.org/Projects/Gjs'
......@@ -1451,7 +1451,7 @@ if test "$ac_init_help" = "long"; then
# 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.52.3 to adapt to many kinds of systems.
\`configure' configures gjs 1.53.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
......@@ -1521,7 +1521,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of gjs 1.52.3:";;
short | recursive ) echo "Configuration of gjs 1.53.1:";;
esac
cat <<\_ACEOF
......@@ -1700,7 +1700,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
gjs configure 1.52.3
gjs configure 1.53.1
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
......@@ -2251,7 +2251,7 @@ cat >config.log <<_ACEOF
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.52.3, which was
It was created by gjs $as_me 1.53.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
......@@ -3114,7 +3114,7 @@ fi
# Define the identity of the package.
PACKAGE='gjs'
VERSION='1.52.3'
VERSION='1.53.1'
cat >>confdefs.h <<_ACEOF
......@@ -3341,10 +3341,10 @@ ac_config_headers="$ac_config_headers config.h"
GJS_VERSION=15203
GJS_VERSION=15301
$as_echo "#define GJS_VERSION (1 * 100 + 52) * 100 + 3" >>confdefs.h
$as_echo "#define GJS_VERSION (1 * 100 + 53) * 100 + 1" >>confdefs.h
GETTEXT_PACKAGE=gjs
......@@ -23346,7 +23346,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# 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.52.3, which was
This file was extended by gjs $as_me 1.53.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
......@@ -23417,7 +23417,7 @@ _ACEOF
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.52.3
gjs config.status 1.53.1
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
......
......@@ -2,8 +2,8 @@
# Process this file with autoconf to produce a configure script.
m4_define(pkg_major_version, 1)
m4_define(pkg_minor_version, 52)
m4_define(pkg_micro_version, 3)
m4_define(pkg_minor_version, 53)
m4_define(pkg_micro_version, 1)
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)
......
......@@ -131,6 +131,11 @@ struct ObjectInstance {
unsigned js_object_finalized : 1;
unsigned g_object_finalized : 1;
/* True if this object has visible JS state, and thus its lifecycle is
* managed using toggle references. False if this object just keeps a
* hard ref on the underlying GObject, and may be finalized at will. */
bool uses_toggle_ref : 1;
};
static std::stack<JS::PersistentRootedObject> object_init_list;
......@@ -146,6 +151,7 @@ extern struct JSClass gjs_object_instance_class;
GJS_DEFINE_PRIV_FROM_JS(ObjectInstance, gjs_object_instance_class)
static void disassociate_js_gobject (GObject *gobj);
static void ensure_uses_toggle_ref(JSContext *cx, ObjectInstance *priv);
typedef enum {
SOME_ERROR_OCCURRED = false,
......@@ -213,7 +219,7 @@ get_object_qdata(GObject *gobj)
auto priv = static_cast<ObjectInstance *>(g_object_get_qdata(gobj,
gjs_object_priv_quark()));
if (priv && G_UNLIKELY(priv->js_object_finalized)) {
if (priv && priv->uses_toggle_ref && G_UNLIKELY(priv->js_object_finalized)) {
g_critical("Object %p (a %s) resurfaced after the JS wrapper was finalized. "
"This is some library doing dubious memory management inside dispose()",
gobj, g_type_name(G_TYPE_FROM_INSTANCE(gobj)));
......@@ -491,6 +497,9 @@ set_g_param_from_prop(JSContext *context,
case SOME_ERROR_OCCURRED:
return false;
case NO_SUCH_G_PROPERTY:
/* We need to keep the wrapper alive in order not to lose custom
* "expando" properties */
ensure_uses_toggle_ref(context, priv);
return result.succeed();
case VALUE_WAS_SET:
default:
......@@ -557,14 +566,7 @@ object_instance_set_prop(JSContext *context,
bool ret = true;
bool g_param_was_set = false;
if (!gjs_get_string_id(context, id, &name))
return result.succeed(); /* not resolved, but no error */
priv = priv_from_js(context, obj);
gjs_debug_jsprop(GJS_DEBUG_GOBJECT,
"Set prop '%s' hook obj %p priv %p",
name.get(), obj.get(), priv);
if (priv == nullptr)
/* see the comment in object_instance_get_prop() on this */
return result.succeed();
......@@ -582,6 +584,18 @@ object_instance_set_prop(JSContext *context,
return result.succeed();
}
if (!gjs_get_string_id(context, id, &name)) {
/* We need to keep the wrapper alive in order not to lose custom
* "expando" properties. In this case if gjs_get_string_id() is false
* then a number or symbol property was probably set. */
ensure_uses_toggle_ref(context, priv);
return result.succeed(); /* not resolved, but no error */
}
gjs_debug_jsprop(GJS_DEBUG_GOBJECT,
"Set prop '%s' hook obj %p priv %p",
name.get(), obj.get(), priv);
ret = set_g_param_from_prop(context, priv, name, g_param_was_set, value_p, result);
if (g_param_was_set || !ret)
return ret;
......@@ -1070,8 +1084,30 @@ handle_toggle_down(GObject *gobj)
* collected by the GC
*/
if (priv->keep_alive.rooted()) {
GjsContext *context;
gjs_debug_lifecycle(GJS_DEBUG_GOBJECT, "Unrooting object");
priv->keep_alive.switch_to_unrooted();
/* During a GC, the collector asks each object which other
* objects that it wants to hold on to so if there's an entire
* section of the heap graph that's not connected to anything
* else, and not reachable from the root set, then it can be
* trashed all at once.
*
* GObjects, however, don't work like that, there's only a
* reference count but no notion of who owns the reference so,
* a JS object that's proxying a GObject is unconditionally held
* alive as long as the GObject has >1 references.
*
* Since we cannot know how many more wrapped GObjects are going
* be marked for garbage collection after the owner is destroyed,
* always queue a garbage collection when a toggle reference goes
* down.
*/
context = gjs_context_get_current();
if (!_gjs_context_destroying(context))
_gjs_context_schedule_gc(context);
}
}
......@@ -1209,7 +1245,10 @@ static void
release_native_object (ObjectInstance *priv)
{
priv->keep_alive.reset();
g_object_remove_toggle_ref(priv->gobj, wrapped_gobj_toggle_notify, NULL);
if (priv->uses_toggle_ref)
g_object_remove_toggle_ref(priv->gobj, wrapped_gobj_toggle_notify, nullptr);
else
g_object_unref(priv->gobj);
priv->gobj = NULL;
}
......@@ -1343,16 +1382,28 @@ associate_js_gobject (JSContext *context,
ObjectInstance *priv;
priv = priv_from_js(context, object);
priv->uses_toggle_ref = false;
priv->gobj = gobj;
g_assert(!priv->keep_alive.rooted());
set_object_qdata(gobj, priv);
priv->keep_alive = object;
ensure_weak_pointer_callback(context);
object_instance_link(priv);
g_object_weak_ref(gobj, wrapped_gobj_dispose_notify, priv);
}
static void
ensure_uses_toggle_ref(JSContext *cx,
ObjectInstance *priv)
{
if (priv->uses_toggle_ref)
return;
g_assert(!priv->keep_alive.rooted());
/* OK, here is where things get complicated. We want the
* wrapped gobj to keep the JSObject* wrapper alive, because
......@@ -1365,8 +1416,14 @@ associate_js_gobject (JSContext *context,
* the wrapper to be garbage collected (and thus unref the
* wrappee).
*/
priv->keep_alive.root(context, object, gobj_no_longer_kept_alive_func, priv);
g_object_add_toggle_ref(gobj, wrapped_gobj_toggle_notify, NULL);
priv->uses_toggle_ref = true;
priv->keep_alive.switch_to_rooted(cx, gobj_no_longer_kept_alive_func, priv);
g_object_add_toggle_ref(priv->gobj, wrapped_gobj_toggle_notify, nullptr);
/* We now have both a ref and a toggle ref, we only want the toggle ref.
* This may immediately remove the GC root we just added, since refcount
* may drop to 1. */
g_object_unref(priv->gobj);
}
static void
......@@ -1390,7 +1447,8 @@ disassociate_js_gobject(GObject *gobj)
ObjectInstance *priv = get_object_qdata(gobj);
bool had_toggle_down, had_toggle_up;
g_object_weak_unref(priv->gobj, wrapped_gobj_dispose_notify, priv);
if (!priv->g_object_finalized)
g_object_weak_unref(gobj, wrapped_gobj_dispose_notify, priv);
/* FIXME: this check fails when JS code runs after the main loop ends,
* because the idle functions are not dispatched without a main loop.
......@@ -1409,11 +1467,16 @@ disassociate_js_gobject(GObject *gobj)
gobj, G_OBJECT_TYPE_NAME(gobj));
}
/* Fist, remove the wrapper pointer from the wrapped GObject */
set_object_qdata(gobj, nullptr);
/* Now release all the resources the current wrapper has */
invalidate_all_closures(priv);
release_native_object(priv);
/* Mark that a JS object once existed, but it doesn't any more */
priv->js_object_finalized = true;
priv->keep_alive = nullptr;
}
static void
......@@ -1470,6 +1533,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS
* we're not actually using it, so just let it get collected. Avoiding
* this would require a non-trivial amount of work.
* */
ensure_uses_toggle_ref(context, other_priv);
object.set(other_priv->keep_alive);
g_object_unref(gobj); /* We already own a reference */
gobj = NULL;
......@@ -1497,11 +1561,6 @@ G_GNUC_END_IGNORE_DEPRECATIONS
if (priv->gobj == NULL)
associate_js_gobject(context, object, gobj);
/* We now have both a ref and a toggle ref, we only want the
* toggle ref. This may immediately remove the GC root
* we just added, since refcount may drop to 1.
*/
g_object_unref(gobj);
gjs_debug_lifecycle(GJS_DEBUG_GOBJECT, "JSObject created with GObject %p (%s)",
priv->gobj, G_OBJECT_TYPE_NAME(priv->gobj));
......@@ -1643,6 +1702,9 @@ object_instance_finalize(JSFreeOp *fop,
GJS_DEC_COUNTER(object);
priv->~ObjectInstance();
g_slice_free(ObjectInstance, priv);
/* Remove the ObjectInstance pointer from the JSObject */
JS_SetPrivate(obj, nullptr);
}
static JSObject *
......@@ -1770,6 +1832,8 @@ real_connect_func(JSContext *context,
return true;
}
ensure_uses_toggle_ref(context, priv);
if (argc != 2 || !argv[0].isString() || !JS::IsCallable(&argv[1].toObject())) {
gjs_throw(context, "connect() takes two args, the signal name and the callback");
return false;
......@@ -2210,9 +2274,6 @@ gjs_object_from_g_object(JSContext *context,
g_object_ref_sink(gobj);
associate_js_gobject(context, obj, gobj);
/* see the comment in init_object_instance() for this */
g_object_unref(gobj);
g_assert(priv->keep_alive == obj.get());
}
......@@ -2744,6 +2805,10 @@ gjs_object_custom_init(GTypeInstance *instance,
associate_js_gobject(context, object, G_OBJECT (instance));
/* Custom JS objects will most likely have visible state, so
* just do this from the start */
ensure_uses_toggle_ref(context, priv);
JS::RootedValue v(context);
if (!gjs_object_get_property(context, object,
GJS_STRING_INSTANCE_INIT, &v)) {
......@@ -3196,6 +3261,9 @@ gjs_object_associate_closure(JSContext *cx,
if (!priv)
return false;
if (priv->gobj)
ensure_uses_toggle_ref(cx, priv);
do_associate_closure(priv, closure);
return true;
}
......@@ -36,6 +36,8 @@ bool _gjs_context_destroying (GjsContext *js_context);
void _gjs_context_schedule_gc_if_needed (GjsContext *js_context);
void _gjs_context_schedule_gc(GjsContext *js_context);
void _gjs_context_exit(GjsContext *js_context,
uint8_t exit_code);
......
......@@ -90,6 +90,7 @@ struct _GjsContext {
uint8_t exit_code;
guint auto_gc_id;
bool force_gc;
std::array<JS::PersistentRootedId*, GJS_STRING_LAST> const_strings;
......@@ -592,13 +593,24 @@ trigger_gc_if_needed (gpointer user_data)
{
GjsContext *js_context = GJS_CONTEXT(user_data);
js_context->auto_gc_id = 0;
gjs_gc_if_needed(js_context->context);
if (js_context->force_gc)
JS_GC(js_context->context);
else
gjs_gc_if_needed(js_context->context);
js_context->force_gc = false;
return G_SOURCE_REMOVE;
}
void
_gjs_context_schedule_gc_if_needed (GjsContext *js_context)
static void
_gjs_context_schedule_gc_internal(GjsContext *js_context,
bool force_gc)
{
js_context->force_gc |= force_gc;
if (js_context->auto_gc_id > 0)
return;
......@@ -607,6 +619,18 @@ _gjs_context_schedule_gc_if_needed (GjsContext *js_context)
js_context, NULL);
}
void
_gjs_context_schedule_gc(GjsContext *js_context)
{
_gjs_context_schedule_gc_internal(js_context, true);
}
void
_gjs_context_schedule_gc_if_needed(GjsContext *js_context)
{
_gjs_context_schedule_gc_internal(js_context, false);
}
void
_gjs_context_exit(GjsContext *js_context,
uint8_t exit_code)
......
......@@ -313,8 +313,9 @@ gjs_build_string_array(JSContext *context,
g_error("Unable to reserve memory for vector");
for (i = 0; i < array_length; ++i) {
JS::ConstUTF8CharsZ chars(array_values[i], strlen(array_values[i]));
JS::RootedValue element(context,
JS::StringValue(JS_NewStringCopyZ(context, array_values[i])));
JS::StringValue(JS_NewStringCopyUTF8Z(context, chars)));
if (!elems.append(element))
g_error("Unable to append to vector");
}
......
......@@ -10,6 +10,7 @@
<object class="GtkLabel" id="label-child">
<property name="label">Complex!</property>
<property name="visible">True</property>
<signal name="grab-focus" handler="templateCallback" swapped="no"/>
</object>
</child>
<child>
......
......@@ -17,6 +17,7 @@ const template = ' \
<object class="GtkLabel" id="label-child"> \
<property name="label">Complex!</property> \
<property name="visible">True</property> \
<signal name="grab-focus" handler="templateCallback" swapped="no"/> \
</object> \
</child> \
<child> \
......@@ -39,7 +40,11 @@ const MyComplexGtkSubclass = GObject.registerClass({
Children: ['label-child', 'label-child2'],
InternalChildren: ['internal-label-child'],
CssName: 'complex-subclass',
}, class MyComplexGtkSubclass extends Gtk.Grid {});
}, class MyComplexGtkSubclass extends Gtk.Grid {
templateCallback(widget) {
this.callbackEmittedBy = widget;
}
});
// Sadly, putting this in the body of the class will prevent calling
// get_template_child, since MyComplexGtkSubclass will be bound to the ES6
......@@ -62,6 +67,10 @@ const MyComplexGtkSubclassFromResource = GObject.registerClass({
expect(this.label_child2).toEqual(jasmine.anything());
expect(this._internal_label_child).toEqual(jasmine.anything());
}
templateCallback(widget) {
this.callbackEmittedBy = widget;
}
});
const SubclassSubclass = GObject.registerClass(
......@@ -74,6 +83,7 @@ function validateTemplate(description, ClassName, pending=false) {
beforeEach(function () {
win = new Gtk.Window({ type: Gtk.WindowType.TOPLEVEL });
content = new ClassName();
content.label_child.emit('grab-focus');
win.add(content);
});
......@@ -91,6 +101,10 @@ function validateTemplate(description, ClassName, pending=false) {
.toEqual('Complex and internal!');
});
it('connects template callbacks to the correct handler', function () {
expect(content.callbackEmittedBy).toBe(content.label_child);
});
afterEach(function () {
win.destroy();
});
......
......@@ -406,4 +406,26 @@ describe('Tweener', function () {
expect(overwrite).toHaveBeenCalledTimes(1);
expect(complete).toHaveBeenCalledTimes(1);
});
it('stays within min and max values', function () {
var objectA = {
x: 0,
y: 0
};
var objectB = {
x: 0,
y: 0
};
Tweener.addTween(objectA, { x: 300, y: 300, time: 1, max: 255, transition: "linear" });
Tweener.addTween(objectB, { x: -200, y: -200, time: 1, delay: 0.5, min: 0, transition: "linear" });
jasmine.clock().tick(1001);
expect(objectA.x).toEqual(255);
expect(objectA.y).toEqual(255);
expect(objectB.x).toEqual(0);
expect(objectB.y).toEqual(0);
});
});
......@@ -99,6 +99,12 @@ else
skip "System.exit() should still exit across an FFI boundary" "running under valgrind"
fi
# ensure the encoding of argv is being properly handled
$gjs -c 'imports.system.exit((ARGV[0] !== "Valentín") ? 1 : 0)' "Valentín"
report "Basic unicode encoding (accents, etc) should be functioning properly for ARGV and imports."
$gjs -c 'imports.system.exit((ARGV[0] !== "☭") ? 1 : 0)' "☭"
report "Unicode encoding for symbols should be functioning properly for ARGV and imports."
# gjs --help prints GJS help
$gjs --help >/dev/null
report "--help should succeed"
......
This diff is collapsed.
......@@ -45,6 +45,20 @@ function _init() {
}
Gtk.Widget.prototype._init = function(params) {
if (this.constructor[Gtk.template]) {
Gtk.Widget.set_connect_func.call(this.constructor, (builder, obj, signalName, handlerName, connectObj, flags) => {
if (connectObj !== null) {
throw new Error('Unsupported template signal attribute "object"');
} else if (flags & GObject.ConnectFlags.SWAPPED) {
throw new Error('Unsupported template signal flag "swapped"');
} else if (flags & GObject.ConnectFlags.AFTER) {
obj.connect_after(signalName, this[handlerName].bind(this));
} else {
obj.connect(signalName, this[handlerName].bind(this));
}
});
}
GObject.Object.prototype._init.call(this, params);
if (this.constructor[Gtk.template]) {
......
......@@ -88,6 +88,8 @@ TweenList.prototype = {
tween.onErrorScope = this.onErrorScope;
}
tween.rounded = this.rounded;
tween.min = this.min;
tween.max = this.max;
tween.isPaused = this.isPaused;
tween.timePaused = this.timePaused;
tween.isCaller = this.isCaller;
......
......@@ -314,6 +314,11 @@ function _updateTweenByIndex(i) {
if (tweening.rounded)
nv = Math.round(nv);
if (tweening.min !== undefined && nv < tweening.min)
nv = tweening.min;
if (tweening.max !== undefined && nv > tweening.max)
nv = tweening.max;
if (property.isSpecialProperty) {
// It's a special property, tunnel via the special property method
_specialPropertyList[name].setValue(scope, nv, _specialPropertyList[name].parameters, tweening.properties[name].extra);
......@@ -381,6 +386,8 @@ var restrictedWords = {
onOverwrite: true,
onError: true,
rounded: true,
min: true,
max: true,
onStartParams: true,
onUpdateParams: true,
onCompleteParams: true,
......@@ -571,6 +578,8 @@ function _addTweenOrCaller(target, tweeningParameters, isCaller) {
tween.onOverwriteScope = obj.onOverwriteScope;
tween.onErrorScope = obj.onErrorScope;
tween.rounded = obj.rounded;
tween.min = obj.min;
tween.max = obj.max;
tween.skipUpdates = obj.skipUpdates;
tween.isCaller = isCaller;
......
......@@ -13,7 +13,7 @@
#define GETTEXT_PACKAGE "gjs"
/* The gjs version as an integer */
#define GJS_VERSION 15203
#define GJS_VERSION 15301
/* 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.52.3"
#define PACKAGE_STRING "gjs 1.53.1"
/* 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.52.3"
#define PACKAGE_VERSION "1.53.1"
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Version number of package */
#define VERSION "1.52.3"
#define VERSION "1.53.1"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment