From 0113cfd42976c5d132aa732e9aae3e50e9e83004 Mon Sep 17 00:00:00 2001 From: "dominique.leuenberger@gmail.com" Date: Tue, 15 Feb 2011 20:32:22 +0000 Subject: issue 155: fix build against xulrunner 2.0 (tested up to 2.0b11) git-svn-id: http://libproxy.googlecode.com/svn/trunk@786 c587cffe-e639-0410-9787-d7902ae8ed56 --- libproxy/cmake/modules/pacrunner_mozjs.cmk | 4 ++++ libproxy/modules/pacrunner_mozjs.cpp | 35 ++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/libproxy/cmake/modules/pacrunner_mozjs.cmk b/libproxy/cmake/modules/pacrunner_mozjs.cmk index d42fb40..27c0a11 100644 --- a/libproxy/cmake/modules/pacrunner_mozjs.cmk +++ b/libproxy/cmake/modules/pacrunner_mozjs.cmk @@ -14,6 +14,10 @@ elseif(NOT APPLE) if(MOZJS_FOUND) include_directories(${MOZJS_INCLUDE_DIRS}) link_directories(${MOZJS_LIBRARY_DIRS}) + pkg_search_module(MOZJS2 mozilla-js>=2.0b10) + if(MOZJS2_FOUND) + add_definitions(-DHAVE_MOZJS_2) + endif(MOZJS2_FOUND) else() set(MOZJS_FOUND 0) endif() diff --git a/libproxy/modules/pacrunner_mozjs.cpp b/libproxy/modules/pacrunner_mozjs.cpp index 5fd12ed..eae2a99 100644 --- a/libproxy/modules/pacrunner_mozjs.cpp +++ b/libproxy/modules/pacrunner_mozjs.cpp @@ -42,12 +42,12 @@ using namespace libproxy; #define INET6_ADDRSTRLEN 46 #endif -static JSBool dnsResolve(JSContext *cx, JSObject * /*obj*/, uintN /*argc*/, jsval *argv, jsval *rval) { +static JSBool dnsResolve_(JSContext *cx, jsval hostname, jsval *vp) { // Get hostname argument - char *tmp = JS_strdup(cx, JS_GetStringBytes(JS_ValueToString(cx, argv[0]))); + char *tmp = JS_EncodeString(cx, JS_ValueToString(cx, hostname)); // Set the default return value - *rval = JSVAL_NULL; + JS_SET_RVAL(cx, vp, JSVAL_NULL); // Look it up struct addrinfo *info = NULL; @@ -66,7 +66,7 @@ static JSBool dnsResolve(JSContext *cx, JSObject * /*obj*/, uintN /*argc*/, jsva NI_NUMERICHOST)) goto out; // We succeeded - *rval = STRING_TO_JSVAL(JS_NewString(cx, tmp, strlen(tmp))); + JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyN(cx, tmp, strlen(tmp)))); tmp = NULL; out: @@ -75,15 +75,20 @@ static JSBool dnsResolve(JSContext *cx, JSObject * /*obj*/, uintN /*argc*/, jsva return true; } -static JSBool myIpAddress(JSContext *cx, JSObject *obj, uintN /*argc*/, jsval * /*argv*/, jsval *rval) { +static JSBool dnsResolve(JSContext *cx, uintN /*argc*/, jsval *vp) { + jsval *argv = JS_ARGV(cx, vp); + return dnsResolve_(cx, argv[0], vp); +} + +static JSBool myIpAddress(JSContext *cx, uintN /*argc*/, jsval *vp) { char *hostname = (char *) JS_malloc(cx, 1024); if (!gethostname(hostname, 1023)) { - JSString *myhost = JS_NewString(cx, hostname, strlen(hostname)); + JSString *myhost = JS_NewStringCopyN(cx, hostname, strlen(hostname)); jsval arg = STRING_TO_JSVAL(myhost); - return dnsResolve(cx, obj, 1, &arg, rval); + return dnsResolve_(cx, 1, &arg); } JS_free(cx, hostname); - *rval = JSVAL_NULL; + JS_SET_RVAL(cx, vp, JSVAL_NULL); return true; } @@ -111,7 +116,11 @@ public: //JS_SetOptions(this->jsctx, JSOPTION_VAROBJFIX); //JS_SetVersion(this->jsctx, JSVERSION_LATEST); //JS_SetErrorReporter(cx, reportError); + #ifdef HAVE_MOZJS_2 + if (!(this->jsglb = JS_NewCompartmentAndGlobalObject(this->jsctx, &cls, NULL))) goto error; + #else if (!(this->jsglb = JS_NewObject(this->jsctx, &cls, NULL, NULL))) goto error; + #endif if (!JS_InitStandardClasses(this->jsctx, this->jsglb)) goto error; // Define Javascript functions @@ -147,15 +156,19 @@ public: throw bad_alloc(); } jsval args[2] = { - STRING_TO_JSVAL(JS_NewString(this->jsctx, tmpurl, strlen(tmpurl))), - STRING_TO_JSVAL(JS_NewString(this->jsctx, tmphost, strlen(tmphost))) + STRING_TO_JSVAL(JS_NewStringCopyN(this->jsctx, tmpurl, strlen(tmpurl))), + STRING_TO_JSVAL(JS_NewStringCopyN(this->jsctx, tmphost, strlen(tmphost))) }; // Find the proxy (call FindProxyForURL()) jsval rval; JSBool result = JS_CallFunctionName(this->jsctx, this->jsglb, "FindProxyForURL", 2, args, &rval); if (!result) return ""; - string answer = string(JS_GetStringBytes(JS_ValueToString(this->jsctx, rval))); + + char * tmpanswer = JS_EncodeString(this->jsctx, JS_ValueToString(this->jsctx, rval)); + string answer = string(tmpanswer); + JS_free(this->jsctx, tmpanswer); + if (answer == "undefined") return ""; return answer; } -- cgit v1.2.1