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;
+     

Reply via email to