mirror of
https://github.com/rkd77/elinks.git
synced 2024-11-04 08:17:17 -05:00
[js] Small progress.
It segfaults less often, but still, especially on non utf-8 pages. And sometimes it did not work.
This commit is contained in:
parent
aeeb5c69a2
commit
8ad7d68b28
@ -54,6 +54,7 @@ struct ecmascript_interpreter {
|
||||
* to redraw. */
|
||||
unsigned int onload_snippets_cache_id;
|
||||
void *ac;
|
||||
void *ar;
|
||||
};
|
||||
|
||||
/* Why is the interpreter bound to {struct view_state} instead of {struct
|
||||
|
@ -15,7 +15,8 @@
|
||||
- * object, so scripts cannot be evaluated in it.
|
||||
- */
|
||||
|
||||
JSContext *spidermonkey_empty_context;
|
||||
JSContext *main_ctx;
|
||||
|
||||
/** 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;
|
||||
@ -34,8 +35,15 @@ spidermonkey_runtime_addref(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
spidermonkey_empty_context = JS_NewContext(0);
|
||||
if (!spidermonkey_empty_context) {
|
||||
main_ctx = JS_NewContext(16 * 1024 * 1024);
|
||||
|
||||
if (!main_ctx) {
|
||||
JS_ShutDown();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!JS::InitSelfHostedCode(main_ctx)) {
|
||||
JS_DestroyContext(main_ctx);
|
||||
JS_ShutDown();
|
||||
return 0;
|
||||
}
|
||||
@ -57,7 +65,7 @@ spidermonkey_runtime_release(void)
|
||||
|
||||
--spidermonkey_runtime_refcount;
|
||||
if (spidermonkey_runtime_refcount == 0) {
|
||||
JS_DestroyContext(spidermonkey_empty_context);
|
||||
JS_DestroyContext(main_ctx);
|
||||
JS_ShutDown();
|
||||
}
|
||||
}
|
||||
|
@ -24,7 +24,7 @@
|
||||
#include "util/string.h"
|
||||
|
||||
extern JSRuntime *spidermonkey_runtime;
|
||||
extern JSContext *spidermonkey_empty_context;
|
||||
extern JSContext *main_ctx;
|
||||
int spidermonkey_runtime_addref(void);
|
||||
void spidermonkey_runtime_release(void);
|
||||
|
||||
|
@ -141,7 +141,14 @@ PrintError(JSContext* cx, FILE* file, JS::ConstUTF8CharsZ toStringResult,
|
||||
static void
|
||||
error_reporter(JSContext *ctx, JSErrorReport *report)
|
||||
{
|
||||
struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
JSCompartment *comp = js::GetContextCompartment(ctx);
|
||||
|
||||
if (!comp) {
|
||||
return;
|
||||
}
|
||||
|
||||
struct ecmascript_interpreter *interpreter = JS_GetCompartmentPrivate(comp);
|
||||
// struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
struct session *ses = interpreter->vs->doc_view->session;
|
||||
struct terminal *term;
|
||||
unsigned char *strict, *exception, *warning, *error;
|
||||
@ -229,25 +236,28 @@ spidermonkey_get_interpreter(struct ecmascript_interpreter *interpreter)
|
||||
JSObject *document_obj, *forms_obj, *history_obj, *location_obj,
|
||||
*statusbar_obj, *menubar_obj, *navigator_obj;
|
||||
|
||||
static int initialized = 0;
|
||||
|
||||
assert(interpreter);
|
||||
if (!js_module_init_ok) return NULL;
|
||||
|
||||
// ctx = JS_NewContext(JS::DefaultHeapMaxBytes, JS::DefaultNurseryBytes);
|
||||
ctx = JS_NewContext(8L * 1024 * 1024);
|
||||
if (!ctx)
|
||||
return NULL;
|
||||
ctx = main_ctx;
|
||||
|
||||
if (!ctx) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
interpreter->backend_data = ctx;
|
||||
JSAutoRequest ar(ctx);
|
||||
JS_SetContextPrivate(ctx, interpreter);
|
||||
//JS_SetOptions(ctx, JSOPTION_VAROBJFIX | JS_METHODJIT);
|
||||
interpreter->ar = new JSAutoRequest(ctx);
|
||||
//JSAutoRequest ar(ctx);
|
||||
|
||||
// JS_SetContextPrivate(ctx, interpreter);
|
||||
|
||||
//JS_SetOptions(main_ctx, JSOPTION_VAROBJFIX | JS_METHODJIT);
|
||||
JS::SetWarningReporter(ctx, error_reporter);
|
||||
JS_AddInterruptCallback(ctx, heartbeat_callback);
|
||||
JS::CompartmentOptions options;
|
||||
|
||||
if (!JS::InitSelfHostedCode(ctx)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
JS::RootedObject window_obj(ctx, JS_NewGlobalObject(ctx, &window_class, NULL, JS::FireOnNewGlobalHook, options));
|
||||
|
||||
if (window_obj) {
|
||||
@ -338,6 +348,8 @@ spidermonkey_get_interpreter(struct ecmascript_interpreter *interpreter)
|
||||
}
|
||||
// JS_SetPrivate(navigator_obj, interpreter->vs);
|
||||
|
||||
JS_SetCompartmentPrivate(js::GetContextCompartment(ctx), interpreter);
|
||||
|
||||
return ctx;
|
||||
|
||||
release_and_fail:
|
||||
@ -352,13 +364,18 @@ spidermonkey_put_interpreter(struct ecmascript_interpreter *interpreter)
|
||||
|
||||
assert(interpreter);
|
||||
if (!js_module_init_ok) return;
|
||||
|
||||
ctx = interpreter->backend_data;
|
||||
if (interpreter->ac) {
|
||||
delete (JSAutoCompartment *)interpreter->ac;
|
||||
}
|
||||
JS_DestroyContext(ctx);
|
||||
if (interpreter->ar) {
|
||||
delete (JSAutoRequest *)interpreter->ar;
|
||||
}
|
||||
// JS_DestroyContext(ctx);
|
||||
interpreter->backend_data = NULL;
|
||||
interpreter->ac = nullptr;
|
||||
interpreter->ar = nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
@ -267,7 +267,7 @@ document_set_property_title(JSContext *ctx, int argc, JS::Value *vp)
|
||||
|
||||
vs = JS_GetInstancePrivate(ctx, hobj,
|
||||
&document_class, NULL);
|
||||
if (!vs) {
|
||||
if (!vs || !vs->doc_view) {
|
||||
return false;
|
||||
}
|
||||
doc_view = vs->doc_view;
|
||||
@ -401,8 +401,15 @@ const spidermonkeyFunctionSpec document_funcs[] = {
|
||||
static bool
|
||||
document_write_do(JSContext *ctx, unsigned int argc, JS::Value *rval, int newline)
|
||||
{
|
||||
JSCompartment *comp = js::GetContextCompartment(ctx);
|
||||
|
||||
if (!comp) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct ecmascript_interpreter *interpreter = JS_GetCompartmentPrivate(comp);
|
||||
JS::Value val;
|
||||
struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
// struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
struct string *ret = interpreter->ret;
|
||||
JS::CallArgs args = JS::CallArgsFromVp(argc, rval);
|
||||
|
||||
|
@ -36,7 +36,14 @@ static struct itimerval heartbeat_timer = { { 1, 0 }, { 1, 0 } };
|
||||
bool
|
||||
heartbeat_callback(JSContext *ctx)
|
||||
{
|
||||
struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
JSCompartment *comp = js::GetContextCompartment(ctx);
|
||||
|
||||
if (!comp) {
|
||||
return true;
|
||||
}
|
||||
|
||||
struct ecmascript_interpreter *interpreter = JS_GetCompartmentPrivate(comp);
|
||||
// struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
|
||||
if (!interpreter->heartbeat || interpreter->heartbeat->ttl > 0) {
|
||||
return true;
|
||||
|
@ -73,7 +73,13 @@ const spidermonkeyFunctionSpec history_funcs[] = {
|
||||
static bool
|
||||
history_back(JSContext *ctx, unsigned int argc, JS::Value *rval)
|
||||
{
|
||||
struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
JSCompartment *comp = js::GetContextCompartment(ctx);
|
||||
|
||||
if (!comp) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct ecmascript_interpreter *interpreter = JS_GetCompartmentPrivate(comp);
|
||||
struct document_view *doc_view = interpreter->vs->doc_view;
|
||||
struct session *ses = doc_view->session;
|
||||
JS::CallArgs args = JS::CallArgsFromVp(argc, rval);
|
||||
@ -92,7 +98,14 @@ history_back(JSContext *ctx, unsigned int argc, JS::Value *rval)
|
||||
static bool
|
||||
history_forward(JSContext *ctx, unsigned int argc, JS::Value *rval)
|
||||
{
|
||||
struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
JSCompartment *comp = js::GetContextCompartment(ctx);
|
||||
|
||||
if (!comp) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct ecmascript_interpreter *interpreter = JS_GetCompartmentPrivate(comp);
|
||||
// struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
struct document_view *doc_view = interpreter->vs->doc_view;
|
||||
struct session *ses = doc_view->session;
|
||||
JS::CallArgs args = JS::CallArgsFromVp(argc, rval);
|
||||
@ -107,7 +120,14 @@ history_forward(JSContext *ctx, unsigned int argc, JS::Value *rval)
|
||||
static bool
|
||||
history_go(JSContext *ctx, unsigned int argc, JS::Value *rval)
|
||||
{
|
||||
struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
JSCompartment *comp = js::GetContextCompartment(ctx);
|
||||
|
||||
if (!comp) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct ecmascript_interpreter *interpreter = JS_GetCompartmentPrivate(comp);
|
||||
// struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
struct document_view *doc_view = interpreter->vs->doc_view;
|
||||
struct session *ses = doc_view->session;
|
||||
JS::CallArgs args = JS::CallArgsFromVp(argc, rval);
|
||||
|
@ -427,9 +427,16 @@ end:
|
||||
static bool
|
||||
window_setTimeout(JSContext *ctx, unsigned int argc, JS::Value *rval)
|
||||
{
|
||||
JSCompartment *comp = js::GetContextCompartment(ctx);
|
||||
|
||||
if (!comp) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct ecmascript_interpreter *interpreter = JS_GetCompartmentPrivate(comp);
|
||||
|
||||
JS::CallArgs args = JS::CallArgsFromVp(argc, rval);
|
||||
// JS::Value *argv = JS_ARGV(ctx, rval);
|
||||
struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
// struct ecmascript_interpreter *interpreter = JS_GetContextPrivate(ctx);
|
||||
unsigned char *code;
|
||||
int timeout;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user