[gxine/f15/master] Added a fix for js 1.8.5
Martin Stransky
stransky at fedoraproject.org
Tue Apr 19 08:57:14 UTC 2011
commit 36507afa5e93dc82f55734695c7af10c008a4163
Author: Martin Stransky <stransky at redhat.com>
Date: Tue Apr 19 10:57:09 2011 +0200
Added a fix for js 1.8.5
gxine-0.5.905-js.patch | 477 ++++++++++++++++++++++++++++++++++++++++++++++++
gxine.spec | 7 +-
2 files changed, 483 insertions(+), 1 deletions(-)
---
diff --git a/gxine-0.5.905-js.patch b/gxine-0.5.905-js.patch
new file mode 100644
index 0000000..355256d
--- /dev/null
+++ b/gxine-0.5.905-js.patch
@@ -0,0 +1,477 @@
+diff -up gxine-0.5.905/src/engine.c.js gxine-0.5.905/src/engine.c
+--- gxine-0.5.905/src/engine.c.js 2009-12-19 17:18:41.000000000 +0100
++++ gxine-0.5.905/src/engine.c 2011-04-18 17:03:35.694078468 +0200
+@@ -154,6 +154,7 @@ int engine_exec_obj (const char *cmd, se
+ JSBool b;
+ } num;
+ char *str;
++ char *str_tmp;
+
+ #ifdef LOG
+ /* this is probably harmless */
+@@ -181,12 +182,13 @@ int engine_exec_obj (const char *cmd, se
+
+ se_eval_ext (gse, cmd, obj, cb, cb_data, ecb, src);
+
+- if ((str = se_result_str (gse)))
++ if ((str_tmp = se_result_str (gse)))
+ {
+ /* JS output. Could end up in a terminal or the JS console. */
+- str = g_strdup_printf (_("result: %s"), str);
++ str = g_strdup_printf (_("result: %s"), str_tmp);
+ cb (cb_data, "%s", str);
+ free (str);
++ free (str_tmp);
+ }
+ else if (se_result_double (gse, &num.d))
+ {
+diff -up gxine-0.5.905/src/key_events.c.js gxine-0.5.905/src/key_events.c
+--- gxine-0.5.905/src/key_events.c.js 2009-12-19 17:18:41.000000000 +0100
++++ gxine-0.5.905/src/key_events.c 2011-04-18 17:03:35.694078468 +0200
+@@ -1294,7 +1294,7 @@ JSBool js_event_generic (JSContext *cx,
+ }
+
+ str = JS_ValueToString (cx, argv[0]);
+- evstr = JS_GetStringBytes (str);
++ evstr = JS_EncodeString (cx, str);
+ event.type = 0;
+
+ va_start (ap, prefix);
+@@ -1305,9 +1305,7 @@ JSBool js_event_generic (JSContext *cx,
+ if (!event.type)
+ event.type = kb_xine_event_lookup (NULL, evstr);
+
+- if (!event.type)
+- return JS_TRUE;
+-
++ if (event.type) {
+ if (event.type != -1)
+ {
+ event.data = NULL;
+@@ -1315,8 +1313,9 @@ JSBool js_event_generic (JSContext *cx,
+ logprintf ("js_%s: sending event %d\n", func, event.type);
+ xine_event_send (stream, &event);
+ }
+-
+ *rval = JSVAL_TRUE;
++ }
++ JS_free(cx, evstr);
+ return JS_TRUE;
+ }
+
+diff -up gxine-0.5.905/src/player.c.js gxine-0.5.905/src/player.c
+--- gxine-0.5.905/src/player.c.js 2009-12-21 15:49:37.000000000 +0100
++++ gxine-0.5.905/src/player.c 2011-04-18 17:03:35.789089589 +0200
+@@ -408,11 +408,13 @@ static JSBool set_postproc_chain (const
+ JSContext *cx, JSObject *obj,
+ uintN argc, jsval *argv, jsval *rval)
+ {
++ char *tmp;
+ se_log_fncall (func);
+ se_argc_check (1, func);
+ se_arg_is_string (0, func);
+ update_postproc_chain (pref,
+- JS_GetStringBytes (JS_ValueToString (cx, argv[0])));
++ tmp = JS_EncodeString (cx, JS_ValueToString (cx, argv[0])));
++ JS_free(cx, tmp);
+ return JS_TRUE;
+ }
+
+@@ -462,8 +464,8 @@ static JSBool get_pos (JSContext *cx, JS
+ se_log_fncall ("get_pos");
+ xine_get_pos_length (stream, &pos, &pos_time, &len);
+
+- jsdouble *pos_percent = JS_NewDouble (cx, pos / 655.35);
+- *rval = DOUBLE_TO_JSVAL (pos_percent);
++ jsdouble *pos_percent = DOUBLE_TO_JSVAL (pos / 655.35);
++ *rval = DOUBLE_TO_JSVAL (*pos_percent);
+ return JS_TRUE;
+ }
+
+@@ -895,11 +897,14 @@ static JSBool js_snapshot (JSContext *cx
+ case 1:
+ se_arg_is_string (0, "snapshot");
+ str = JS_ValueToString (cx, argv[0]);
+- fname = JS_GetStringBytes (str);
++ fname = JS_EncodeString (cx, str);
+ }
+
+ make_snapshot (fname, scale, blend);
+
++ if(fname)
++ JS_free(cx, fname);
++
+ return JS_TRUE;
+ }
+
+@@ -925,8 +930,9 @@ static JSBool controls_play (JSContext *
+
+ str = JS_ValueToString (cx, argv[0]);
+
+- mrl = JS_GetStringBytes (str);
++ mrl = JS_EncodeString (cx, str);
+ se_log ("playing '%s' from start\n", mrl);
++ JS_free (cx, mrl);
+ }
+ break;
+
+@@ -935,7 +941,7 @@ static JSBool controls_play (JSContext *
+ se_arg_is_number (0, "play");
+ se_arg_is_int (1, "play");
+
+- jsdouble *posv = JS_NewDouble (cx, 0); /* when is this freed? */
++ jsdouble *posv = DOUBLE_TO_JSVAL (0); /* when is this freed? */
+ JS_ValueToNumber (cx, argv[0], posv);
+ pos = (*posv >= 0 && *posv < 100) ? *posv * 655.35 : -1;
+ JS_ValueToInt32 (cx, argv[1], &pos_time);
+@@ -951,12 +957,13 @@ static JSBool controls_play (JSContext *
+ se_arg_is_int (2, "play");
+
+ JSString *str = JS_ValueToString (cx, argv[0]);
+- jsdouble *posv = JS_NewDouble (cx, 0); /* when is this freed? */
++ jsdouble *posv = DOUBLE_TO_JSVAL (0); /* when is this freed? */
+ JS_ValueToNumber (cx, argv[1], posv);
+ pos = (*posv >= 0 && *posv < 100) ? *posv * 655.35 : -1;
+ JS_ValueToInt32 (cx, argv[2], &pos_time);
+- mrl = JS_GetStringBytes (str);
++ mrl = JS_EncodeString (cx, str);
+ se_log ("playing '%s' from %d, %d\n", mrl, pos, pos_time);
++ JS_free(cx, str);
+ }
+ break;
+ }
+diff -up gxine-0.5.905/src/playlist.c.js gxine-0.5.905/src/playlist.c
+--- gxine-0.5.905/src/playlist.c.js 2009-12-19 17:18:41.000000000 +0100
++++ gxine-0.5.905/src/playlist.c 2011-04-18 17:03:35.822093396 +0200
+@@ -2158,11 +2158,13 @@ static JSBool js_playlist_load (JSContex
+ se_argc_check (1, "playlist_load");
+ se_arg_is_string_or_null (0, "playlist_load");
+
+- char *mrl = JS_GetStringBytes (JS_ValueToString (cx, argv[0]));
++ char *mrl = JS_EncodeString (cx, JS_ValueToString (cx, argv[0]));
+
+ logprintf ("playlist_load: file=%s\n", mrl);
+ playlist_load_any (mrl);
+
++ JS_free(cx, mrl);
++
+ *rval = JSVAL_VOID;
+ return JS_TRUE;
+ }
+@@ -2176,18 +2178,20 @@ static JSBool js_playlist_add (JSContext
+ se_argc_check_range (1, 2, "playlist_add");
+ se_arg_is_string (0, "playlist_add");
+
+- char *mrl = JS_GetStringBytes (JS_ValueToString (cx, argv[0]));
++ char *mrl = JS_EncodeString (cx, JS_ValueToString (cx, argv[0]));
+ int item;
+
+ if (argc > 1)
+ {
+ se_arg_is_string_or_null (1, "playlist_add");
+- char *title = JSVAL_IS_STRING (argv[1])
+- ? JS_GetStringBytes (JS_ValueToString (cx, argv[1]))
++ char *tmp = NULL, *title = JSVAL_IS_STRING (argv[1])
++ ? tmp = JS_EncodeString (cx, JS_ValueToString (cx, argv[1]))
+ : NULL;
+ logprintf ("playlist_add: MRL=%s title=%s\n", mrl, title);
+ play_item_t *play_item = play_item_new (title, mrl, 0, 0);
+ item = playlist_add (play_item, -1);
++ if(tmp)
++ JS_free(cx, tmp);
+ }
+ else
+ {
+@@ -2197,6 +2201,8 @@ static JSBool js_playlist_add (JSContext
+
+ *rval = INT_TO_JSVAL (item);
+
++ JS_free(cx, mrl);
++
+ return JS_TRUE;
+ }
+
+diff -up gxine-0.5.905/src/script_engine.c.js gxine-0.5.905/src/script_engine.c
+--- gxine-0.5.905/src/script_engine.c.js 2009-12-19 17:18:41.000000000 +0100
++++ gxine-0.5.905/src/script_engine.c 2011-04-19 10:51:52.109514263 +0200
+@@ -34,7 +34,9 @@
+ #include <stdarg.h>
+
+ #include <gdk/gdkkeysyms.h>
+-#include <jsstr.h>
++#include <jsapi.h>
++#include <jsval.h>
++//#include <jsstr.h>
+
+ #include "script_engine.h"
+ #include "ui.h"
+@@ -190,11 +192,14 @@ int se_eval (se_t *se, const gchar *scri
+
+ gchar *se_result_str (se_t *se)
+ {
++ char *tmp;
+ if (!JSVAL_IS_STRING (se->rval))
+ return NULL;
+
+- se->str = JS_ValueToString (se->cx, se->rval);
+- return JS_GetStringBytes (se->str);
++ se->str = JS_ValueToString (se->cx, se->rval);
++ char *ret = g_strdup((tmp = JS_EncodeString (se->cx, se->str)));
++ JS_free(se->cx, tmp);
++ return ret;
+ }
+
+ int se_result_int (se_t *se, JSInt32 *num)
+@@ -325,10 +330,12 @@ js_callback (JSContext *cx, JSObject *ob
+ se_arg_is_string (0, "callback");
+ if (argc > 1)
+ se_arg_is_object (1, "callback");
+- engine_queue_push (JS_GetStringBytes (JS_ValueToString (cx, argv[0])),
++ char *tmp = JS_EncodeString(cx, JS_ValueToString (cx, argv[0]));
++ engine_queue_push (tmp,
+ JS_GetPrivate (cx, argc > 1 ? JSVAL_TO_OBJECT (argv[1])
+ : se->global),
+ NULL, NULL, NULL, _("JS callback"));
++ JS_free(cx, tmp);
+ *rval = JSVAL_VOID;
+ return JS_TRUE;
+ }
+@@ -342,8 +349,10 @@ js_xine_cfg_get (JSContext *cx, JSObject
+ se_arg_is_string (0, "xine_cfg_get");
+
+ xine_cfg_entry_t entry;
+- char *cfg = JS_GetStringBytes (JS_ValueToString (cx, argv[0]));
+- if (!xine_config_lookup_entry (xine, cfg, &entry))
++ char *cfg = JS_EncodeString (cx, JS_ValueToString (cx, argv[0]));
++ int ret = xine_config_lookup_entry (xine, cfg, &entry);
++ JS_free(cx, cfg);
++ if (!ret)
+ {
+ *rval = JSVAL_NULL;
+ return JS_TRUE;
+@@ -383,8 +392,12 @@ js_xine_cfg_set (JSContext *cx, JSObject
+ se_arg_is_string (0, "xine_cfg_set");
+
+ xine_cfg_entry_t entry;
+- char *cfg = JS_GetStringBytes (JS_ValueToString (cx, argv[0]));
+- if (!xine_config_lookup_entry (xine, cfg, &entry))
++ entry.str_value = NULL;
++
++ char *cfg = JS_EncodeString (cx, JS_ValueToString (cx, argv[0]));
++ int ret = xine_config_lookup_entry (xine, cfg, &entry);
++ JS_free(cx, cfg);
++ if (!ret)
+ {
+ *rval = JSVAL_VOID;
+ return JS_TRUE;
+@@ -413,18 +426,19 @@ js_xine_cfg_set (JSContext *cx, JSObject
+
+ case XINE_CONFIG_TYPE_STRING:
+ se_arg_is_string (1, "xine_cfg_set");
+- entry.str_value = JS_GetStringBytes (JS_ValueToString (cx, argv[1]));
++ entry.str_value = JS_EncodeString (cx, JS_ValueToString (cx, argv[1]));
+ break;
+
+ case XINE_CONFIG_TYPE_ENUM:
+ se_arg_is_string (1, "xine_cfg_set");
+- char *v = JS_GetStringBytes (JS_ValueToString (cx, argv[1]));
++ char *v = JS_EncodeString (cx, JS_ValueToString (cx, argv[1]));
+ int i;
+ for (i = 0; entry.enum_values[i]; ++i)
+ if (!strcmp (v, entry.enum_values[i]))
+- break;
++ break;
+ if (entry.enum_values[i])
+ entry.num_value = i;
++ JS_free(cx, v);
+ break;
+
+ default:
+@@ -434,6 +448,9 @@ js_xine_cfg_set (JSContext *cx, JSObject
+
+ preferences_update_entry (&entry);
+
++ if(entry.str_value)
++ JS_free(cx, entry.str_value);
++
+ *rval = JSVAL_VOID;
+ return JS_TRUE;
+ }
+@@ -652,8 +669,8 @@ static jsval get_prop_jsval (se_t *se, s
+
+ case SE_TYPE_DOUBLE:
+ {
+- jsdouble *d = JS_NewDouble (se->cx, get_prop_double (se, o, p));
+- return DOUBLE_TO_JSVAL (d);
++ jsdouble *d = DOUBLE_TO_JSVAL (get_prop_double (se, o, p));
++ return DOUBLE_TO_JSVAL (*d);
+ }
+
+ case SE_TYPE_BOOL:
+@@ -692,7 +709,7 @@ static void set_prop_jsval (se_t *se, se
+
+ case SE_TYPE_DOUBLE:
+ if (JSVAL_IS_NUMBER(*v))
+- se_prop_set_double (se, o, p->id, *JSVAL_TO_DOUBLE(*v));
++ se_prop_set_double (se, o, p->id, JSVAL_TO_DOUBLE(*v));
+ else
+ se->print_cb (se->print_cb_data, _("\n%s.%s: value must be numeric\n"),
+ o->id, p->id);
+@@ -709,8 +726,9 @@ static void set_prop_jsval (se_t *se, se
+ case SE_TYPE_STRING:
+ {
+ JSString *str = JSVAL_TO_STRING(*v);
+- char *string = JS_GetStringBytes (str);
++ char *string = JS_EncodeString (se->cx, str);
+ se_prop_set (se, o, p->id, string);
++ JS_free(se->cx, string);
+ }
+ return;
+
+@@ -726,7 +744,7 @@ static void set_prop_jsval (se_t *se, se
+ */
+
+ static JSBool
+-generic_JSGetProperty (JSContext *cx, JSObject *obj, jsval id, jsval *vp)
++generic_JSGetProperty (JSContext *cx, JSObject *obj, jsid id, jsval *vp)
+ {
+ se_t *se = (se_t *) JS_GetContextPrivate(cx);
+ se_log_fncall ("generic get property");
+@@ -735,7 +753,8 @@ generic_JSGetProperty (JSContext *cx, JS
+ if (JSVAL_IS_STRING (id))
+ {
+ JSString *str = JS_ValueToString (cx, id);
+- char *prop = str ? JS_GetStringBytes (str) : "";
++ char *encoded = NULL;
++ char *prop = str ? (encoded = JS_EncodeString (cx, str)) : "";
+ GList *n;
+
+ logprintf ("script_engine: looking for generic property '%s' in '%s'\n",
+@@ -749,6 +768,8 @@ generic_JSGetProperty (JSContext *cx, JS
+ if (!strcasecmp (p->id, prop))
+ {
+ *vp = get_prop_jsval (se, o, p);
++ if(encoded)
++ JS_free(cx,encoded);
+ return JS_TRUE;
+ }
+ }
+@@ -765,14 +786,19 @@ generic_JSGetProperty (JSContext *cx, JS
+ prop = se_js_string_val (cx, ".");
+ if (!generic_JSGetProperty (cx, p->obj, prop, vp))
+ *vp = OBJECT_TO_JSVAL (p->obj);
++ if(encoded)
++ JS_free(cx,encoded);
+ return JS_TRUE;
+ }
+ }
+
+- if (*prop && o->parent)
+- return generic_JSGetProperty (cx, o->parent->obj, id, vp);
++ int ret = (*prop && o->parent) ?
++ generic_JSGetProperty (cx, o->parent->obj, id, vp) : JS_TRUE;
+
+- return JS_TRUE;
++ if(encoded)
++ JS_free(cx,encoded);
++
++ return ret;
+ }
+
+ *vp = JSVAL_VOID;
+@@ -781,7 +807,7 @@ generic_JSGetProperty (JSContext *cx, JS
+ }
+
+ static JSBool
+-generic_JSSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
++generic_JSSetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
+ {
+ se_t *se = (se_t *) JS_GetContextPrivate(cx);
+ se_o_t *o;
+@@ -790,10 +816,10 @@ generic_JSSetProperty(JSContext *cx, JSO
+
+ o = JS_GetPrivate (cx, obj);
+
+- if (JSVAL_IS_STRING (id))
++ if (JSID_IS_STRING (id))
+ {
+ JSString *str = JS_ValueToString (cx, id);
+- char *prop = JS_GetStringBytes (str);
++ char *prop = JS_EncodeString (cx, str);
+ GList *n;
+
+ logprintf ("script_engine: looking for generic property '%s' in '%s'\n",
+@@ -808,6 +834,7 @@ generic_JSSetProperty(JSContext *cx, JSO
+ {
+ if (!p->constant)
+ set_prop_jsval (se, o, p, vp);
++ JS_free(cx, prop);
+ return JS_TRUE;
+ }
+ }
+@@ -819,16 +846,22 @@ generic_JSSetProperty(JSContext *cx, JSO
+ se_o_t *p = (se_o_t *) n->data;
+ if (!strcasecmp (p->id, prop))
+ {
+- if (!generic_JSSetProperty (cx, p->obj, STRING_TO_JSVAL("."), vp))
+- *vp = OBJECT_TO_JSVAL (p->obj);
+- return JS_TRUE;
++ jsid id;
++ if(JS_ValueToId(cx, STRING_TO_JSVAL("."), &id)) {
++ if (!generic_JSSetProperty (cx, p->obj, id, vp))
++ *vp = OBJECT_TO_JSVAL (p->obj);
++ }
++ JS_free(cx, prop);
++ return JS_TRUE;
+ }
+ }
+
+- if (*prop && o->parent)
+- return generic_JSSetProperty (cx, o->parent->obj, id, vp);
+
+- return JS_TRUE;
++ int ret = (*prop && o->parent) ?
++ generic_JSSetProperty (cx, o->parent->obj, id, vp) : JS_TRUE;
++ JS_free(cx, prop);
++
++ return ret;
+ }
+
+ *vp = JSVAL_VOID;
+@@ -1542,7 +1575,7 @@ se_t *se_new (void)
+ {
+ se_t *se;
+ static JSClass global_class = {
+- "global", JSCLASS_HAS_PRIVATE,
++ "global", JSCLASS_HAS_PRIVATE|JSCLASS_GLOBAL_FLAGS,
+ JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,
+ JS_EnumerateStub,JS_ResolveStub,JS_ConvertStub,JS_FinalizeStub
+ };
+@@ -1564,7 +1597,7 @@ se_t *se_new (void)
+ se = malloc (sizeof (se_t));
+
+ se->cx = JS_NewContext (rt, 0x1000);
+- se->global = JS_NewObject (se->cx, &global_class, NULL, NULL);
++ se->global = JS_NewCompartmentAndGlobalObject (se->cx, &global_class, NULL);
+
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init (&attr);
+diff -up gxine-0.5.905/src/vis.c.js gxine-0.5.905/src/vis.c
+--- gxine-0.5.905/src/vis.c.js 2009-12-19 17:18:41.000000000 +0100
++++ gxine-0.5.905/src/vis.c 2011-04-18 17:03:35.868098835 +0200
+@@ -69,12 +69,14 @@ void vis_set (const char *str)
+ static JSBool js_set_vis (JSContext *cx, JSObject *obj, uintN argc,
+ jsval *argv, jsval *rval)
+ {
++ char *tmp;
+ se_log_fncall ("js_set_vis");
+ se_argc_check (1, "set_vis");
+ se_arg_is_string (0, "set_vis");
+
+ JSString *str = JS_ValueToString (cx, argv[0]);
+- vis_set (JS_GetStringBytes (str));
++ vis_set ((tmp = JS_EncodeString (cx, str)));
++ JS_free(cx, tmp);
+
+ return JS_TRUE;
+ }
diff --git a/gxine.spec b/gxine.spec
index e41984f..c20f089 100644
--- a/gxine.spec
+++ b/gxine.spec
@@ -1,6 +1,6 @@
Name: gxine
Version: 0.5.905
-Release: 5%{?dist}
+Release: 6%{?dist}
Summary: GTK frontend for the xine multimedia library
Group: Applications/Multimedia
@@ -14,6 +14,7 @@ Patch2: gxine-0.5.905-desktop.patch
# some multilib issues
Patch3: gxine-0.5.905-lirc.patch
Patch4: gxine-0.5.905-dso.patch
+Patch5: gxine-0.5.905-js.patch
BuildRequires: js-devel
BuildRequires: desktop-file-utils
@@ -55,6 +56,7 @@ This plugin allows gxine to be embedded in a web browser.
%patch2 -p1 -b .desktop
%patch3 -p1 -b .lirc
%patch4 -p1 -b .dso
+%patch5 -p1 -b .js
%{__sed} -i 's/Name=gxine/Name=GXine Video Player/' gxine.desktop.in
%{__sed} -i 's/Exec=gxine/Exec=gxine %U/' gxine.desktop.in
@@ -127,6 +129,9 @@ touch --no-create %{_datadir}/icons/hicolor || :
%{_libdir}/mozilla/plugins/gxineplugin.so
%changelog
+* Tue Apr 19 2011 Martin Stransky <stransky at redhat.com> - 0.5.905-6
+- Added a fix for js 1.8.5
+
* Wed Feb 09 2011 Martin Sourada <mso at fedoraproject.org> - 0.5.905-5
- Use libjs instead of libmozjs -- gxine does not build against xulrunner-2
- Use gudev instead of HAL for device detection
More information about the scm-commits
mailing list