tags 631031 + patch thanks Hi,
I backported the patch from the upstream bug, removing all changes in the build system that just adds noise, and thus removing the relevant #ifdefs. It builds, but I have no idea if it actually works. Could someone test it? Mike
diff -u couchdb-1.1.0/debian/changelog couchdb-1.1.0/debian/changelog --- couchdb-1.1.0/debian/changelog +++ couchdb-1.1.0/debian/changelog @@ -1,3 +1,11 @@ +couchdb (1.1.0-1.1) unstable; urgency=low + + * Non-maintainer upload. + * debian/patches/mozjs.patch: Backported changes to allow to build against + newer libmozjs (closes: #631031). + + -- Mike Hommey <gland...@debian.org> Fri, 05 Aug 2011 09:49:29 +0200 + couchdb (1.1.0-1) unstable; urgency=low * New upstream release (closes: #590334). only in patch2: unchanged: --- couchdb-1.1.0.orig/debian/patches/mozjs.patch +++ couchdb-1.1.0/debian/patches/mozjs.patch @@ -0,0 +1,575 @@ +diff -ruN couchdb-1.1.0.orig//src/couchdb/priv/couch_js/http.c couchdb-1.1.0/src/couchdb/priv/couch_js/http.c +--- couchdb-1.1.0.orig//src/couchdb/priv/couch_js/http.c 2010-06-15 18:27:22.000000000 +0200 ++++ couchdb-1.1.0/src/couchdb/priv/couch_js/http.c 2011-08-05 09:35:45.611035725 +0200 +@@ -15,8 +15,10 @@ + #include <string.h> + #include <jsapi.h> + #include <curl/curl.h> ++#include "config.h" + + #include "utf8.h" ++#include "jscompat.h" + + #ifdef XP_WIN + // Map some of the string function names to things which exist on Windows +@@ -49,11 +51,12 @@ + static JSString* + str_from_binary(JSContext* cx, char* data, size_t length); + +-static JSBool +-constructor(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) ++COUCHJS_CONSTRUCTOR_DECLARE(constructor) + { ++ COUCHJS_CONSTRUCTOR_INIT_VARS + HTTPData* http = NULL; +- JSBool ret = JS_FALSE; ++ ++ COUCHJS_CONSTRUCTOR_CONSTRUCT + + http = (HTTPData*) malloc(sizeof(HTTPData)); + if(!http) +@@ -73,14 +76,12 @@ + goto error; + } + +- ret = JS_TRUE; +- goto success; ++ COUCHJS_CONSTRUCTOR_FINISH ++ return JS_TRUE; + + error: + if(http) free(http); +- +-success: +- return ret; ++ return JS_FALSE; + } + + static void +@@ -100,12 +101,14 @@ + } + + static JSBool +-open(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) +-{ ++open(JSContext* cx, uintN argc, jsval* vp) ++{ ++ COUCHJS_NATIVE_INIT_VARS(argv, obj) ++ JSBool ret = JS_FALSE; ++ + HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj); + char* method = NULL; + char* url = NULL; +- JSBool ret = JS_FALSE; + int methid; + + if(!http) +@@ -174,6 +177,7 @@ + // Disable Expect: 100-continue + http->req_headers = curl_slist_append(http->req_headers, "Expect:"); + ++ JS_SET_RVAL(cx, vp, JSVAL_VOID); + ret = JS_TRUE; + + done: +@@ -182,14 +186,16 @@ + } + + static JSBool +-setheader(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) +-{ ++setheader(JSContext* cx, uintN argc, jsval* vp) ++{ ++ COUCHJS_NATIVE_INIT_VARS(argv, obj) ++ JSBool ret = JS_FALSE; ++ + HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj); + char* keystr = NULL; + char* valstr = NULL; + char* hdrbuf = NULL; + size_t hdrlen = -1; +- JSBool ret = JS_FALSE; + + if(!http) + { +@@ -234,6 +240,7 @@ + snprintf(hdrbuf, hdrlen, "%s: %s", keystr, valstr); + http->req_headers = curl_slist_append(http->req_headers, hdrbuf); + ++ JS_SET_RVAL(cx, vp, JSVAL_VOID); + ret = JS_TRUE; + + done: +@@ -245,12 +252,14 @@ + } + + static JSBool +-sendreq(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) ++sendreq(JSContext* cx, uintN argc, jsval* vp) + { ++ COUCHJS_NATIVE_INIT_VARS(argv, obj) ++ JSBool ret = JS_FALSE; ++ + HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj); + char* body = NULL; + size_t bodylen = 0; +- JSBool ret = JS_FALSE; + + if(!http) + { +@@ -270,13 +279,15 @@ + + ret = go(cx, obj, http, body, bodylen); + ++ if (ret == JS_TRUE) ++ JS_SET_RVAL(cx, vp, JSVAL_VOID); ++ + done: + if(body) free(body); + return ret; + } + +-static JSBool +-status(JSContext* cx, JSObject* obj, jsval idval, jsval* vp) ++COUCHJS_GETTER_DECLARE(status) + { + HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj); + +@@ -285,7 +296,12 @@ + JS_ReportError(cx, "Invalid CouchHTTP instance."); + return JS_FALSE; + } +- ++#ifndef INT_FITS_IN_JSVAL ++ // jsval's are 64-bits wide in mozjs >= 2.0, so a jsint ++ // can use the full 32-bits now no bits are reserved for tagging ++ *vp = INT_TO_JSVAL(http->last_status); ++ return JS_TRUE; ++#else + if(INT_FITS_IN_JSVAL(http->last_status)) + { + *vp = INT_TO_JSVAL(http->last_status); +@@ -296,6 +312,7 @@ + JS_ReportError(cx, "INTERNAL: Invalid last_status"); + return JS_FALSE; + } ++#endif + } + + JSClass CouchHTTPClass = { +@@ -306,7 +323,7 @@ + JS_PropertyStub, + JS_PropertyStub, + JS_PropertyStub, +- JS_PropertyStub, ++ JS_SETPROPERTY_PROPERTY_STUB, + JS_EnumerateStub, + JS_ResolveStub, + JS_ConvertStub, +@@ -320,10 +337,10 @@ + }; + + JSFunctionSpec CouchHTTPFunctions[] = { +- {"_open", open, 3, 0, 0}, +- {"_setRequestHeader", setheader, 2, 0, 0}, +- {"_send", sendreq, 1, 0, 0}, +- {0, 0, 0, 0, 0} ++ JS_FS("_open", COUCHJS_NATIVE_FUNC(open), 3, JSFUN_FAST_NATIVE), ++ JS_FS("_setRequestHeader", COUCHJS_NATIVE_FUNC(setheader), 2, JSFUN_FAST_NATIVE), ++ JS_FS("_send", COUCHJS_NATIVE_FUNC(sendreq), 1, JSFUN_FAST_NATIVE), ++ JS_FS_END + }; + + JSObject* +diff -ruN couchdb-1.1.0.orig//src/couchdb/priv/couch_js/jscompat.h couchdb-1.1.0/src/couchdb/priv/couch_js/jscompat.h +--- couchdb-1.1.0.orig//src/couchdb/priv/couch_js/jscompat.h 1970-01-01 01:00:00.000000000 +0100 ++++ couchdb-1.1.0/src/couchdb/priv/couch_js/jscompat.h 2011-08-05 09:47:05.446087029 +0200 +@@ -0,0 +1,53 @@ ++// Licensed under the Apache License, Version 2.0 (the "License"); you may not ++// use this file except in compliance with the License. You may obtain a copy of ++// the License at ++// ++// http://www.apache.org/licenses/LICENSE-2.0 ++// ++// Unless required by applicable law or agreed to in writing, software ++// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ++// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ++// License for the specific language governing permissions and limitations under ++// the License. ++ ++#ifndef COUCH_JS_JS_COMPAT_H ++#define COUCH_JS_JS_COMPAT_H ++ ++# define JSFUN_FAST_NATIVE 0 ++# define COUCHJS_CONSTRUCTOR_DECLARE(name) \ ++ static JSBool \ ++ name(JSContext* cx, uintN argc, jsval* vp) ++# define COUCHJS_CONSTRUCTOR_INIT_VARS \ ++ JSObject *obj = NULL; \ ++ jsval *argv = JS_ARGV(cx, vp); ++# define COUCHJS_CONSTRUCTOR_CONSTRUCT \ ++ obj = JS_NewObjectForConstructor(cx, vp); \ ++ if(!obj) { \ ++ JS_ReportError(cx, "Failed to create 'this' object"); \ ++ return JS_FALSE; \ ++ } ++# define COUCHJS_CONSTRUCTOR_FINISH \ ++ JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj)); ++# define COUCHJS_NATIVE_FUNC(func) func ++ ++# define JS_SETPROPERTY_PROPERTY_STUB JS_StrictPropertyStub ++ ++# define COUCHJS_SCRIPT JSObject ++# define COUCHJS_DESTROY_SCRIPT(cx, script) ++ ++# define COUCHJS_SEAL_OBJECT(res, cx, target, deep) \ ++ res = deep ? JS_DeepFreezeObject(cx, target) : JS_FreezeObject(cx, target); ++ ++#define COUCHJS_NATIVE_INIT_VARS(argv, obj) \ ++ jsval* argv = JS_ARGV(cx, vp); \ ++ JSObject* obj = JS_THIS_OBJECT(cx, vp); \ ++ if (!obj) { \ ++ JS_ReportError(cx, "No 'this' object"); \ ++ return JS_FALSE; \ ++ } ++ ++# define COUCHJS_GETTER_DECLARE(name) \ ++ static JSBool \ ++ status(JSContext* cx, JSObject* obj, jsid id, jsval* vp) ++ ++#endif +diff -ruN couchdb-1.1.0.orig//src/couchdb/priv/couch_js/main.c couchdb-1.1.0/src/couchdb/priv/couch_js/main.c +--- couchdb-1.1.0.orig//src/couchdb/priv/couch_js/main.c 2009-11-27 23:43:59.000000000 +0100 ++++ couchdb-1.1.0/src/couchdb/priv/couch_js/main.c 2011-08-05 09:47:33.294098535 +0200 +@@ -18,6 +18,7 @@ + + #include "utf8.h" + #include "http.h" ++#include "jscompat.h" + + int gExitCode = 0; + +@@ -26,16 +27,30 @@ + JS_SetContextThread(cx); \ + JS_BeginRequest(cx); + #define FINISH_REQUEST(cx) \ +- JS_EndRequest(cx); \ +- JS_ClearContextThread(cx); ++ JS_EndRequest(cx); + #else + #define SETUP_REQUEST(cx) + #define FINISH_REQUEST(cx) + #endif + ++static JSClass global_class = { ++ "GlobalClass", ++ JSCLASS_GLOBAL_FLAGS, ++ JS_PropertyStub, ++ JS_PropertyStub, ++ JS_PropertyStub, ++ JS_SETPROPERTY_PROPERTY_STUB, ++ JS_EnumerateStub, ++ JS_ResolveStub, ++ JS_ConvertStub, ++ JS_FinalizeStub, ++ JSCLASS_NO_OPTIONAL_MEMBERS ++}; ++ + static JSBool +-evalcx(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ++evalcx(JSContext* cx, uintN argc, jsval* vp) + { ++ jsval* argv = JS_ARGV(cx, vp); + JSString *str; + JSObject *sandbox; + JSContext *subcx; +@@ -43,6 +58,7 @@ + size_t srclen; + JSBool ret = JS_FALSE; + jsval v; ++ JSCrossCompartmentCall *call = NULL; + + sandbox = NULL; + if(!JS_ConvertArguments(cx, argc, argv, "S / o", &str, &sandbox)) +@@ -59,42 +75,55 @@ + + SETUP_REQUEST(subcx); + +- src = JS_GetStringChars(str); +- srclen = JS_GetStringLength(str); ++ src = JS_GetStringCharsAndLength(cx, str, &srclen); + ++ /* Re-use the compartment associated with the main context, ++ * rather than creating a new compartment */ ++ JSObject *global = JS_GetGlobalObject(cx); ++ if(!global) ++ { ++ goto done; ++ } ++ call = JS_EnterCrossCompartmentCall(subcx, global); + if(!sandbox) + { +- sandbox = JS_NewObject(subcx, NULL, NULL, NULL); ++ sandbox = JS_NewGlobalObject(subcx, &global_class); + if(!sandbox || !JS_InitStandardClasses(subcx, sandbox)) goto done; + } + + if(srclen == 0) + { +- *rval = OBJECT_TO_JSVAL(sandbox); ++ JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(sandbox)); + } + else + { +- JS_EvaluateUCScript(subcx, sandbox, src, srclen, NULL, 0, rval); ++ JS_EvaluateUCScript(subcx, sandbox, src, srclen, NULL, 0, &JS_RVAL(cx, vp)); + } +- ++ + ret = JS_TRUE; + + done: ++ if(call) ++ { ++ JS_LeaveCrossCompartmentCall(call); ++ } + FINISH_REQUEST(subcx); + JS_DestroyContext(subcx); + return ret; + } + + static JSBool +-gc(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ++gc(JSContext* cx, uintN argc, jsval* vp) + { + JS_GC(cx); ++ JS_SET_RVAL(cx, vp, JSVAL_VOID); + return JS_TRUE; + } + + static JSBool +-print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ++print(JSContext* cx, uintN argc, jsval* vp) + { ++ jsval* argv = JS_ARGV(cx, vp); + uintN i; + char *bytes; + +@@ -109,16 +138,46 @@ + + fputc('\n', stdout); + fflush(stdout); ++ JS_SET_RVAL(cx, vp, JSVAL_VOID); + return JS_TRUE; + } + + static JSBool +-quit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ++quit(JSContext* cx, uintN argc, jsval* vp) + { ++ jsval* argv = JS_ARGV(cx, vp); + JS_ConvertArguments(cx, argc, argv, "/ i", &gExitCode); + return JS_FALSE; + } + ++static int ++couchjs_fgets(char *buf, int size, FILE *file) ++{ ++ int n, i, c; ++ JSBool crflag; ++ ++ n = size - 1; ++ if (n < 0) ++ return -1; ++ ++ crflag = JS_FALSE; ++ for (i = 0; i < n && (c = getc(file)) != EOF; i++) { ++ buf[i] = c; ++ if (c == '\n') { /* any \n ends a line */ ++ i++; /* keep the \n; we know there is room for \0 */ ++ break; ++ } ++ if (crflag) { /* \r not followed by \n ends line at the \r */ ++ ungetc(c, file); ++ break; /* and overwrite c in buf with \0 */ ++ } ++ crflag = (c == '\r'); ++ } ++ ++ buf[i] = '\0'; ++ return i; ++} ++ + static char* + readfp(JSContext* cx, FILE* fp, size_t* buflen) + { +@@ -130,8 +189,7 @@ + + bytes = JS_malloc(cx, byteslen); + if(bytes == NULL) return NULL; +- +- while((readlen = js_fgets(bytes+used, byteslen-used, stdin)) > 0) ++ while((readlen = couchjs_fgets(bytes+used, byteslen-used, stdin)) > 0) + { + used += readlen; + +@@ -157,7 +215,7 @@ + } + + static JSBool +-readline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { ++readline(JSContext* cx, uintN argc, jsval* vp) { + jschar *chars; + JSString *str; + char* bytes; +@@ -173,7 +231,7 @@ + /* Treat the empty string specially */ + if(byteslen == 0) + { +- *rval = JS_GetEmptyStringValue(cx); ++ JS_SET_RVAL(cx, vp, JS_GetEmptyStringValue(cx)); + JS_free(cx, bytes); + return JS_TRUE; + } +@@ -191,28 +249,35 @@ + JS_free(cx, bytes); + + if(!str) return JS_FALSE; +- +- *rval = STRING_TO_JSVAL(str); ++ JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(str)); + + return JS_TRUE; + } + + static JSBool +-seal(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { ++seal(JSContext* cx, uintN argc, jsval* vp) { ++ jsval* argv = JS_ARGV(cx, vp); + JSObject *target; + JSBool deep = JS_FALSE; + + if (!JS_ConvertArguments(cx, argc, argv, "o/b", &target, &deep)) + return JS_FALSE; +- if (!target) ++ if (!target) { ++ JS_SET_RVAL(cx, vp, JSVAL_VOID); + return JS_TRUE; +- return JS_SealObject(cx, target, deep); ++ } ++ JSBool res; ++ COUCHJS_SEAL_OBJECT(res, cx, target, deep) ++ if (res == JS_TRUE) ++ JS_SET_RVAL(cx, vp, JSVAL_VOID); ++ ++ return res; + } + + static void + execute_script(JSContext *cx, JSObject *obj, const char *filename) { + FILE *file; +- JSScript *script; ++ COUCHJS_SCRIPT *script; + jsval result; + + if(!filename || strcmp(filename, "-") == 0) +@@ -234,7 +299,7 @@ + if(script) + { + JS_ExecuteScript(cx, obj, script, &result); +- JS_DestroyScript(cx, script); ++ COUCHJS_DESTROY_SCRIPT(cx, script); + } + } + +@@ -248,27 +313,13 @@ + } + + static JSFunctionSpec global_functions[] = { +- {"evalcx", evalcx, 0, 0, 0}, +- {"gc", gc, 0, 0, 0}, +- {"print", print, 0, 0, 0}, +- {"quit", quit, 0, 0, 0}, +- {"readline", readline, 0, 0, 0}, +- {"seal", seal, 0, 0, 0}, +- {0, 0, 0, 0, 0} +-}; +- +-static JSClass global_class = { +- "GlobalClass", +- JSCLASS_GLOBAL_FLAGS, +- JS_PropertyStub, +- JS_PropertyStub, +- JS_PropertyStub, +- JS_PropertyStub, +- JS_EnumerateStub, +- JS_ResolveStub, +- JS_ConvertStub, +- JS_FinalizeStub, +- JSCLASS_NO_OPTIONAL_MEMBERS ++ JS_FS("evalcx", COUCHJS_NATIVE_FUNC(evalcx), 0, JSFUN_FAST_NATIVE), ++ JS_FS("gc", COUCHJS_NATIVE_FUNC(gc), 0, JSFUN_FAST_NATIVE), ++ JS_FS("print", COUCHJS_NATIVE_FUNC(print), 0, JSFUN_FAST_NATIVE), ++ JS_FS("quit", COUCHJS_NATIVE_FUNC(quit), 0, JSFUN_FAST_NATIVE), ++ JS_FS("readline", COUCHJS_NATIVE_FUNC(readline), 0, JSFUN_FAST_NATIVE), ++ JS_FS("seal", COUCHJS_NATIVE_FUNC(seal), 0, JSFUN_FAST_NATIVE), ++ JS_FS_END + }; + + int +@@ -290,9 +341,9 @@ + JS_ToggleOptions(cx, JSOPTION_XML); + + SETUP_REQUEST(cx); +- +- global = JS_NewObject(cx, &global_class, NULL, NULL); ++ global = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL); + if (!global) return 1; ++ JSCrossCompartmentCall *call = JS_EnterCrossCompartmentCall(cx, global); + if (!JS_InitStandardClasses(cx, global)) return 1; + + for(sp = global_functions; sp->name != NULL; sp++) +@@ -309,8 +360,6 @@ + { + return 1; + } +- +- JS_SetGlobalObject(cx, global); + + if(argc > 2) + { +@@ -328,9 +377,11 @@ + execute_script(cx, global, argv[1]); + } + +- FINISH_REQUEST(cx); ++ JS_LeaveCrossCompartmentCall(call); + ++ FINISH_REQUEST(cx); + JS_DestroyContext(cx); ++ + JS_DestroyRuntime(rt); + JS_ShutDown(); + +diff -ruN couchdb-1.1.0.orig//src/couchdb/priv/couch_js/utf8.c couchdb-1.1.0/src/couchdb/priv/couch_js/utf8.c +--- couchdb-1.1.0.orig//src/couchdb/priv/couch_js/utf8.c 2009-11-27 07:41:39.000000000 +0100 ++++ couchdb-1.1.0/src/couchdb/priv/couch_js/utf8.c 2011-08-05 09:47:33.294098535 +0200 +@@ -12,6 +12,8 @@ + + #include <jsapi.h> + ++#include "config.h" ++ + static int + enc_char(uint8 *utf8Buffer, uint32 ucs4Char) + { +@@ -129,8 +131,7 @@ + str = JS_ValueToString(cx, arg); + if(!str) goto error; + +- src = JS_GetStringChars(str); +- srclen = JS_GetStringLength(str); ++ src = JS_GetStringCharsAndLength(cx, str, &srclen); + + if(!enc_charbuf(src, srclen, NULL, &byteslen)) goto error; +