mirror of
https://github.com/rkd77/elinks.git
synced 2024-11-04 08:17:17 -05:00
952, 954: Add spidermonkey_empty_context
This commit is contained in:
parent
5ad675e244
commit
8f2f9e7265
@ -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();
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user