From 8f2f9e7265787305060e59a6c971c99f85300d4b Mon Sep 17 00:00:00 2001 From: Kalle Olavi Niemitalo Date: Mon, 7 Jul 2008 15:57:47 +0300 Subject: [PATCH] 952, 954: Add spidermonkey_empty_context --- src/ecmascript/spidermonkey-shared.c | 47 ++++++++++++++++++++++++------------ src/ecmascript/spidermonkey-shared.h | 1 + 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/ecmascript/spidermonkey-shared.c b/src/ecmascript/spidermonkey-shared.c index 6d887551..c4cc60c2 100644 --- a/src/ecmascript/spidermonkey-shared.c +++ b/src/ecmascript/spidermonkey-shared.c @@ -17,36 +17,50 @@ * perhaps others. */ JSRuntime *spidermonkey_runtime; +/** A JSContext that can be used in JS_SetPrivate and JS_GetPrivate + * when no better one is available. This context has no global + * object, so scripts cannot be evaluated in it. + * + * XXX: This also works around a crash on exit. SMJS will crash on + * JS_DestroyRuntime if the given runtime has never had any context + * created, which will be the case if one closes ELinks without having + * loaded any documents. */ +JSContext *spidermonkey_empty_context; + /** A reference count for ::spidermonkey_runtime so that modules using * it can be initialized and shut down in arbitrary order. */ static int spidermonkey_runtime_refcount; -/** Add a reference to ::spidermonkey_runtime, and initialize it if - * that is the first reference. +/** Initialize ::spidermonkey_runtime and ::spidermonkey_empty_context. + * If already initialized, just increment the reference count. + * * @return 1 if successful or 0 on error. If this succeeds, the * caller must eventually call spidermonkey_runtime_release(). */ int spidermonkey_runtime_addref(void) { - if (!spidermonkey_runtime) { - JSContext *dummy; - - assert(spidermonkey_runtime_refcount == 0); + if (spidermonkey_runtime_refcount == 0) { + assert(spidermonkey_runtime == NULL); + assert(spidermonkey_empty_context == NULL); if_assert_failed return 0; spidermonkey_runtime = JS_NewRuntime(4L * 1024L * 1024L); if (!spidermonkey_runtime) return 0; - - /* XXX: This is a hack to avoid a crash on exit. - * SMJS will crash on JS_DestroyRuntime if the given - * runtime has never had any context created, which - * will be the case if one closes ELinks without - * having loaded any documents. */ - dummy = JS_NewContext(spidermonkey_runtime, 0); - if (dummy) JS_DestroyContext(dummy); - /* Else hope it works anyway. */ + + spidermonkey_empty_context = JS_NewContext(spidermonkey_runtime, + 0); + if (!spidermonkey_empty_context) { + /* Perhaps JS_DestroyRuntime will now crash + * because no context was created, but there's + * not much else to do. */ + JS_DestroyRuntime(spidermonkey_runtime); + spidermonkey_runtime = NULL; + JS_ShutDown(); + } } + assert(spidermonkey_runtime); + assert(spidermonkey_empty_context); spidermonkey_runtime_refcount++; assert(spidermonkey_runtime_refcount > 0); if_assert_failed { spidermonkey_runtime_refcount--; return 0; } @@ -61,10 +75,13 @@ spidermonkey_runtime_release(void) { assert(spidermonkey_runtime_refcount > 0); assert(spidermonkey_runtime); + assert(spidermonkey_empty_context); if_assert_failed return; --spidermonkey_runtime_refcount; if (spidermonkey_runtime_refcount == 0) { + JS_DestroyContext(spidermonkey_empty_context); + spidermonkey_empty_context = NULL; JS_DestroyRuntime(spidermonkey_runtime); spidermonkey_runtime = NULL; JS_ShutDown(); diff --git a/src/ecmascript/spidermonkey-shared.h b/src/ecmascript/spidermonkey-shared.h index a35f00ec..4cc0eebc 100644 --- a/src/ecmascript/spidermonkey-shared.h +++ b/src/ecmascript/spidermonkey-shared.h @@ -19,6 +19,7 @@ #include "util/string.h" extern JSRuntime *spidermonkey_runtime; +extern JSContext *spidermonkey_empty_context; int spidermonkey_runtime_addref(void); void spidermonkey_runtime_release(void); -- 2.11.4.GIT