commit aa8e8aa60a172f13757d5f0e374c009ffdb9ccfa Author: Marc-Antoine Perennou Date: Tue Dec 14 18:23:29 2010 +0100 xulrunner2: Conditionnaly adapt to JS_GetFunctionName removal Upstream removed JS_GetFunctionName in commit: http://hg.mozilla.org/mozilla-central/changeset/e35b70ffed69 We now have to use JS_GetFunctionId which returns a JSString* instead of a const char* https://bugzilla.gnome.org/show_bug.cgi?id=637246 diff --git a/configure.ac b/configure.ac index 9d3f829..13db4f5 100644 --- a/configure.ac +++ b/configure.ac @@ -147,6 +147,7 @@ else fi AC_CHECK_LIB([mozjs], [JS_GetStringBytes], AC_DEFINE([HAVE_JS_GETSTRINGBYTES], [1], [Define if we still have JS_GetStringBytes]),, [$JS_LIBS]) +AC_CHECK_LIB([mozjs], [JS_GetFunctionName], AC_DEFINE([HAVE_JS_GETFUNCTIONNAME], [1], [Define if we still have JS_GetFunctionName]),, [$JS_LIBS]) AC_MSG_CHECKING([for mozilla-js >= 2 ]) if `$PKG_CONFIG --exists $JS_PACKAGE '>=' 2`; then diff --git a/gjs/profiler.c b/gjs/profiler.c index c579400..327a33a 100644 --- a/gjs/profiler.c +++ b/gjs/profiler.c @@ -26,6 +26,7 @@ #include "profiler.h" #include #include "compat.h" +#include "jsapi-util.h" #include #include @@ -109,7 +110,8 @@ gjs_profile_function_new(GjsProfileFunctionKey *key) self = g_slice_new0(GjsProfileFunction); self->key.filename = g_strdup(key->filename); self->key.lineno = key->lineno; - self->key.function_name = g_strdup(key->function_name); + // Pass ownership of function_name from key to the new function + self->key.function_name = key->function_name; g_assert(self->key.filename != NULL); g_assert(self->key.function_name != NULL); @@ -132,6 +134,7 @@ gjs_profile_function_key_from_js(JSContext *cx, { JSScript *script; JSFunction *function; + JSString *function_name = NULL; /* We're not using the JSScript or JSFunction as the key since the script * could be unloaded and addresses reused. @@ -151,8 +154,15 @@ gjs_profile_function_key_from_js(JSContext *cx, * (or other object with a 'call' method) and would be good to somehow * figure out the name of the called function. */ - key->function_name = (char*)(function != NULL ? JS_GetFunctionName(function) : "(unknown)"); - +#ifdef HAVE_JS_GETFUNCTIONNAME + key->function_name = g_strdup(function != NULL ? JS_GetFunctionName(function) : "(unknown)"); +#else + function_name = JS_GetFunctionId(function); + if (function_name) + key->function_name = gjs_string_get_ascii(cx, STRING_TO_JSVAL(function_name)); + else + key->function_name = g_strdup("(unknown)"); +#endif g_assert(key->filename != NULL); g_assert(key->function_name != NULL); @@ -171,16 +181,23 @@ gjs_profiler_lookup_function(GjsProfiler *self, function = g_hash_table_lookup(self->by_file, &key); if (function) - return function; + goto error; if (!create_if_missing) - return NULL; + goto error; function = gjs_profile_function_new(&key); g_hash_table_insert(self->by_file, &function->key, function); + /* Don't free key.function_name if we get here since we passed its + * ownership to the new function. + */ return function; + + error: + g_free(key.function_name); + return NULL; } static void diff --git a/gjs/stack.c b/gjs/stack.c index 6e2b987..6c852c1 100644 --- a/gjs/stack.c +++ b/gjs/stack.c @@ -83,7 +83,8 @@ format_frame(JSContext* cx, JSStackFrame* fp, JSPropertyDescArray call_props = { 0, NULL }; JSObject* this_obj = NULL; JSObject* call_obj = NULL; - const char* funname = NULL; + JSString* funname = NULL; + char* funname_str = NULL; const char* filename = NULL; guint32 lineno = 0; guint32 named_arg_count = 0; @@ -115,7 +116,11 @@ format_frame(JSContext* cx, JSStackFrame* fp, lineno = (guint32) JS_PCToLineNumber(cx, script, pc); fun = JS_GetFrameFunction(cx, fp); if (fun) - funname = JS_GetFunctionName(fun); +#ifdef HAVE_JS_GETFUNCTIONNAME + funname_str = JS_GetFunctionName(fun); +#else + funname = JS_GetFunctionId(fun); +#endif call_obj = JS_GetFrameCallObject(cx, fp); if (call_obj) { @@ -140,8 +145,18 @@ format_frame(JSContext* cx, JSStackFrame* fp, /* print the frame number and function name */ - if (funname) - g_string_append_printf(buf, "%d %s(", num, funname); +#ifndef HAVE_JS_GETFUNCTIONNAME + if (funname) { + funname_str = gjs_string_get_ascii(cx, STRING_TO_JSVAL(funname)); + g_string_append_printf(buf, "%d %s(", num, funname_str); + } +#endif + if (funname_str) { + g_string_append_printf(buf, "%d %s(", num, funname_str); +#ifndef HAVE_JS_GETFUNCTIONNAME + g_free(funname_str); +#endif + } else if (fun) g_string_append_printf(buf, "%d anonymous(", num); else