diff options
-rw-r--r-- | Makefile.am | 15 | ||||
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | plugins/mozjs.cc (renamed from plugins/mozjs.c) | 109 |
3 files changed, 68 insertions, 60 deletions
diff --git a/Makefile.am b/Makefile.am index ee84b75..65cc8c9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -31,9 +31,10 @@ endif if MOZJS js_sources = src/js_funcs.c builtin_modules += mozjs -builtin_sources += plugins/mozjs.c -builtin_cflags += @MOZJS_CFLAGS@ -builtin_libadd += @MOZJS_LIBS@ +builtin_libadd += plugins/libmozjsplugin.a @MOZJS_LIBS@ -lstdc++ +noinst_LIBRARIES += plugins/libmozjsplugin.a +plugins_libmozjsplugin_a_SOURCES = plugins/mozjs.cc +plugins_libmozjsplugin_a_CXXFLAGS = $(AM_CFLAGS) @MOZJS_CFLAGS@ @DBUS_CFLAGS@ @GLIB_CFLAGS@ endif if V8 @@ -137,16 +138,16 @@ unit_test_pacrunner_LDADD += @CURL_LIBS@ endif if MOZJS -unit_test_pacrunner_SOURCES += plugins/mozjs.c - +unit_test_pacrunner_SOURCES += plugins/mozjs.cc +unit_test_pacrunner_CXXFLAGS = $(AM_CFLAGS) @MOZJS_CFLAGS@ unit_test_pacrunner_LDADD += @MOZJS_LIBS@ @PTHREAD_LIBS@ noinst_PROGRAMS += unit/test-mozjs unit_test_mozjs_SOURCES = unit/test-mozjs.c src/pacrunner.h \ src/proxy.c src/manual.c src/download.c \ - src/js.c plugins/mozjs.c $(js_sources) - + src/js.c plugins/mozjs.cc $(js_sources) +unit_test_mozjs_CXXFLAGS = $(AM_CFLAGS) @MOZJS_CFLAGS@ unit_test_mozjs_LDADD = @MOZJS_LIBS@ @GLIB_LIBS@ @PTHREAD_LIBS@ endif diff --git a/configure.ac b/configure.ac index 888c873..bf76fbb 100644 --- a/configure.ac +++ b/configure.ac @@ -76,8 +76,8 @@ AM_CONDITIONAL(DUKTAPE, test "${enable_duktape}" = "yes") AC_ARG_ENABLE(mozjs, AC_HELP_STRING([--enable-mozjs], [enable Mozilla Javascript plugin support])) if (test "${enable_mozjs}" = "yes"); then - PKG_CHECK_MODULES(MOZJS, mozjs185, dummy=yes, - AC_MSG_ERROR(Mozilla Javascript >= 1.8 is required)) + PKG_CHECK_MODULES(MOZJS, mozjs-38, dummy=yes, + AC_MSG_ERROR(Mozilla Javascript version 38 is required)) AC_SUBST(MOZJS_CFLAGS) AC_SUBST(MOZJS_LIBS) fi diff --git a/plugins/mozjs.c b/plugins/mozjs.cc index a923203..e10b297 100644 --- a/plugins/mozjs.c +++ b/plugins/mozjs.cc @@ -31,11 +31,15 @@ #include <netdb.h> #pragma GCC diagnostic ignored "-Wredundant-decls" +#pragma GCC diagnostic ignored "-Winvalid-offsetof" #include <jsapi.h> #pragma GCC diagnostic error "-Wredundant-decls" +#pragma GCC diagnostic error "-Winvalid-offsetof" +extern "C" { #include "pacrunner.h" #include "js.h" +} static pthread_mutex_t mozjs_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -43,42 +47,42 @@ struct pacrunner_mozjs { struct pacrunner_proxy *proxy; JSContext *jsctx; JSObject *jsobj; + JSAutoCompartment *jsac; }; -static JSBool myipaddress(JSContext *jsctx, uintN argc, jsval *vp) +static bool myipaddress(JSContext *jsctx, unsigned argc, jsval *vp) { - struct pacrunner_mozjs *ctx = JS_GetContextPrivate(jsctx); + struct pacrunner_mozjs *ctx = (pacrunner_mozjs *)JS_GetContextPrivate(jsctx); char address[NI_MAXHOST]; DBG(""); - JS_SET_RVAL(jsctx, vp, JSVAL_NULL); + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + + args.rval().setNull(); if (!ctx) - return JS_TRUE; + return true; if (__pacrunner_js_getipaddr(ctx->proxy, address, sizeof(address)) < 0) - return JS_TRUE; + return true; DBG("address %s", address); - JS_SET_RVAL(jsctx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(jsctx, - address))); + args.rval().setString(JS_NewStringCopyZ(jsctx,address)); - return JS_TRUE; + return true; } -static JSBool dnsresolve(JSContext *jsctx, uintN argc, jsval *vp) +static bool dnsresolve(JSContext *jsctx, unsigned argc, jsval *vp) { - struct pacrunner_mozjs *ctx = JS_GetContextPrivate(jsctx); + struct pacrunner_mozjs *ctx = (pacrunner_mozjs *)JS_GetContextPrivate(jsctx); char address[NI_MAXHOST]; - jsval *argv = JS_ARGV(jsctx, vp); - char *host = JS_EncodeString(jsctx, JS_ValueToString(jsctx, argv[0])); + JS::CallArgs args = JS::CallArgsFromVp(argc,vp); + char * host = JS_EncodeString(jsctx, args[0].toString()); DBG("host %s", host); - JS_SET_RVAL(jsctx, vp, JSVAL_NULL); - if (!ctx) goto out; @@ -87,20 +91,16 @@ static JSBool dnsresolve(JSContext *jsctx, uintN argc, jsval *vp) DBG("address %s", address); - JS_SET_RVAL(jsctx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(jsctx, address))); + args.rval().setString(JS_NewStringCopyZ(jsctx,address)); out: JS_free(jsctx, host); - return JS_TRUE; + return true; } static JSClass jscls = { "global", JSCLASS_GLOBAL_FLAGS, - JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, - JS_StrictPropertyStub, - JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static JSRuntime *jsrun; @@ -109,13 +109,12 @@ static int create_object(struct pacrunner_proxy *proxy) { struct pacrunner_mozjs *ctx; const char *script; - jsval rval; script = pacrunner_proxy_get_script(proxy); if (!script) return 0; - ctx = g_malloc0(sizeof(struct pacrunner_mozjs)); + ctx = (pacrunner_mozjs *)g_malloc0(sizeof(struct pacrunner_mozjs)); ctx->proxy = proxy; ctx->jsctx = JS_NewContext(jsrun, 8 * 1024); @@ -126,41 +125,48 @@ static int create_object(struct pacrunner_proxy *proxy) JS_SetContextPrivate(ctx->jsctx, ctx); __pacrunner_proxy_set_jsctx(proxy, ctx); -#if JS_VERSION >= 185 - ctx->jsobj = JS_NewCompartmentAndGlobalObject(ctx->jsctx, &jscls, - NULL); -#else - ctx->jsobj = JS_NewObject(ctx->jsctx, &jscls, NULL, NULL); -#endif + JS::CompartmentOptions compart_opts; + compart_opts.setVersion(JSVERSION_LATEST); + ctx->jsobj = JS_NewGlobalObject(ctx->jsctx, &jscls, nullptr, + JS::DontFireOnNewGlobalHook, compart_opts); + JS::RootedObject jsobj(ctx->jsctx,ctx->jsobj); + + ctx->jsac = new JSAutoCompartment(ctx->jsctx, jsobj); - if (!JS_InitStandardClasses(ctx->jsctx, ctx->jsobj)) + if (!JS_InitStandardClasses(ctx->jsctx, jsobj)) pacrunner_error("Failed to init JS standard classes"); - JS_DefineFunction(ctx->jsctx, ctx->jsobj, "myIpAddress", - myipaddress, 0, 0); - JS_DefineFunction(ctx->jsctx, ctx->jsobj, - "dnsResolve", dnsresolve, 1, 0); + JS_DefineFunction(ctx->jsctx, jsobj, "myIpAddress", myipaddress, 0, 0); + JS_DefineFunction(ctx->jsctx, jsobj, "dnsResolve", dnsresolve, 1, 0); + + JS::RootedValue rval(ctx->jsctx); + JS::CompileOptions opts(ctx->jsctx); + opts.setIntroductionType("pacrunner") + .setUTF8(true) + .setCompileAndGo(true); - JS_EvaluateScript(ctx->jsctx, ctx->jsobj, __pacrunner_js_routines, - strlen(__pacrunner_js_routines), NULL, 0, &rval); + JS::Evaluate(ctx->jsctx, JS::HandleObject(jsobj), opts, + __pacrunner_js_routines, strlen(__pacrunner_js_routines) + , &rval); - JS_EvaluateScript(ctx->jsctx, ctx->jsobj, script, strlen(script), - "wpad.dat", 0, &rval); + JS::Evaluate(ctx->jsctx, jsobj, opts, script, strlen(script), &rval); return 0; } static int mozjs_clear_proxy(struct pacrunner_proxy *proxy) { - struct pacrunner_mozjs *ctx = __pacrunner_proxy_get_jsctx(proxy); + struct pacrunner_mozjs *ctx = (pacrunner_mozjs *)__pacrunner_proxy_get_jsctx(proxy); DBG("proxy %p ctx %p", proxy, ctx); if (!ctx) return -EINVAL; + delete ctx->jsac; JS_DestroyContext(ctx->jsctx); __pacrunner_proxy_set_jsctx(proxy, NULL); + g_free(ctx); return 0; } @@ -168,7 +174,6 @@ static int mozjs_clear_proxy(struct pacrunner_proxy *proxy) static int mozjs_set_proxy(struct pacrunner_proxy *proxy) { DBG("proxy %p", proxy); - if (!proxy) return 0; @@ -180,11 +185,9 @@ static int mozjs_set_proxy(struct pacrunner_proxy *proxy) static char * mozjs_execute(struct pacrunner_proxy *proxy, const char *url, const char *host) { - struct pacrunner_mozjs *ctx = __pacrunner_proxy_get_jsctx(proxy); - JSBool result; - jsval rval, args[2]; + struct pacrunner_mozjs *ctx = (pacrunner_mozjs *)__pacrunner_proxy_get_jsctx(proxy); + bool result; char *answer, *g_answer; - DBG("proxy %p ctx %p url %s host %s", proxy, ctx, url, host); if (!ctx) @@ -193,12 +196,16 @@ static char * mozjs_execute(struct pacrunner_proxy *proxy, const char *url, pthread_mutex_lock(&mozjs_mutex); JS_BeginRequest(ctx->jsctx); + JS::RootedValue rval(ctx->jsctx); + JS::AutoValueArray<2> args(ctx->jsctx); + + args[0].setString(JS_NewStringCopyZ(ctx->jsctx, url)); + args[1].setString(JS_NewStringCopyZ(ctx->jsctx, host)); - args[0] = STRING_TO_JSVAL(JS_NewStringCopyZ(ctx->jsctx, url)); - args[1] = STRING_TO_JSVAL(JS_NewStringCopyZ(ctx->jsctx, host)); - result = JS_CallFunctionName(ctx->jsctx, ctx->jsobj, - "FindProxyForURL", 2, args, &rval); + JS::RootedObject jsobj(ctx->jsctx,ctx->jsobj); + + result = JS_CallFunctionName(ctx->jsctx, jsobj, "FindProxyForURL", args , &rval); JS_EndRequest(ctx->jsctx); @@ -207,8 +214,7 @@ static char * mozjs_execute(struct pacrunner_proxy *proxy, const char *url, pthread_mutex_unlock(&mozjs_mutex); if (result) { - answer = JS_EncodeString(ctx->jsctx, - JS_ValueToString(ctx->jsctx, rval)); + answer = JS_EncodeString(ctx->jsctx, rval.toString()); g_answer = g_strdup(answer); JS_free(ctx->jsctx, answer); return g_answer; @@ -228,8 +234,8 @@ static struct pacrunner_js_driver mozjs_driver = { static int mozjs_init(void) { DBG(""); - - jsrun = JS_NewRuntime(8 * 1024 * 1024); + JS_Init(); + jsrun = JS_NewRuntime(JS::DefaultHeapMaxBytes, 8 * 1024 * 1024 ); return pacrunner_js_driver_register(&mozjs_driver); } @@ -241,6 +247,7 @@ static void mozjs_exit(void) pacrunner_js_driver_unregister(&mozjs_driver); JS_DestroyRuntime(jsrun); + JS_ShutDown(); } PACRUNNER_PLUGIN_DEFINE(mozjs, mozjs_init, mozjs_exit) |