diff options
author | Vincent Sanders <vince@netsurf-browser.org> | 2012-01-01 21:42:38 +0000 |
---|---|---|
committer | Vincent Sanders <vince@netsurf-browser.org> | 2012-01-01 21:42:38 +0000 |
commit | 6ebaecccafbca464ee366d45fd15a0df13509849 (patch) | |
tree | c5aa49a34ab8412a04a1099b7b2740166225806b /desktop/js.c | |
parent | a195728c51a34e68b4361cb685d3e20acbbecbe0 (diff) | |
download | netsurf-6ebaecccafbca464ee366d45fd15a0df13509849.tar.gz netsurf-6ebaecccafbca464ee366d45fd15a0df13509849.tar.bz2 |
Totaly prefunctry binding to spidermonkey
svn path=/trunk/netsurf/; revision=13360
Diffstat (limited to 'desktop/js.c')
-rw-r--r-- | desktop/js.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/desktop/js.c b/desktop/js.c new file mode 100644 index 000000000..540ff82a5 --- /dev/null +++ b/desktop/js.c @@ -0,0 +1,104 @@ +#include "mozjs/jsapi.h" + +#include "desktop/js.h" +#include "utils/log.h" + +static JSRuntime *rt; /* global runtime */ + +void js_initialise(void) +{ + /* Create a JS runtime. */ + rt = JS_NewRuntime(8L * 1024L * 1024L); + LOG(("New runtime handle %p", rt)); +} + +void js_finalise(void) +{ + if (rt != NULL) { + LOG(("destroying runtime handle %p", rt)); + JS_DestroyRuntime(rt); + } + JS_ShutDown(); +} + +/* The error reporter callback. */ +static void js_reportError(JSContext *cx, const char *message, JSErrorReport *report) +{ + LOG(("%s:%u:%s\n", + report->filename ? report->filename : "<no filename>", + (unsigned int) report->lineno, + message)); +} + +jscontext *js_newcontext(void) +{ + JSContext *cx; + + if (rt == NULL) { + return NULL; + } + + cx = JS_NewContext(rt, 8192); + if (cx == NULL) { + return NULL; + } + JS_SetOptions(cx, JSOPTION_VAROBJFIX | JSOPTION_JIT ); + JS_SetVersion(cx, JSVERSION_LATEST); + JS_SetErrorReporter(cx, js_reportError); + + LOG(("New Context %p", cx)); + + return (jscontext *)cx; +} + +void js_destroycontext(jscontext *ctx) +{ + JSContext *cx = (JSContext *)ctx; + if (cx != NULL) { + LOG(("Destroying Context %p", cx)); + JS_DestroyContext(cx); + } +} + + + +/* The class of the global object. */ +static JSClass global_class = { + "global", JSCLASS_GLOBAL_FLAGS, + JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, + JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, + JSCLASS_NO_OPTIONAL_MEMBERS +}; + + +jsobject *js_newcompartment(jscontext *ctx) +{ + JSContext *cx = (JSContext *)ctx; + JSObject *global; + + if (cx == NULL) { + return NULL; + } +#ifdef HAVE_JS_NEWCOMPARTMENTANDGLOBALOBJECT + global = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL); + if (global == NULL) { + return NULL; + } +#else + global = JS_NewObject(cx, &global_class, NULL, NULL); + if (global == NULL) { + return NULL; + } + JS_SetGlobalObject(cx, global); +#endif + + /* Populate the global object with the standard globals, + like Object and Array. */ + if (!JS_InitStandardClasses(cx, global)) { + return NULL; + } + + LOG(("Creating new global object %p", global)); + + return (jsobject *)global; +} |