1 From b513bbd1f13cf06aba9abb5e0e84df8c7b493b58 Mon Sep 17 00:00:00 2001
2 From: Jan Horak <jhorak@redhat.com>
3 Date: Thu, 5 May 2011 16:24:08 +0200
4 Subject: [PATCH 11/13] Spidermonkey 1.8.5 patch
7 src/couchdb/priv/couch_js/http.c | 66 ++++++++++++--------
8 src/couchdb/priv/couch_js/main.c | 132 +++++++++++++++++--------------------
9 src/couchdb/priv/couch_js/utf8.c | 4 +-
10 3 files changed, 103 insertions(+), 99 deletions(-)
12 diff --git a/src/couchdb/priv/couch_js/http.c b/src/couchdb/priv/couch_js/http.c
13 index a672b66..8bd3cb6 100644
14 --- a/src/couchdb/priv/couch_js/http.c
15 +++ b/src/couchdb/priv/couch_js/http.c
16 @@ -49,12 +49,25 @@ go(JSContext* cx, JSObject* obj, HTTPData* http, char* body, size_t blen);
18 str_from_binary(JSContext* cx, char* data, size_t length);
20 +JSClass CouchHTTPClass;
23 -constructor(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
24 +constructor(JSContext* cx, uintN argc, jsval* vp)
26 HTTPData* http = NULL;
27 JSBool ret = JS_FALSE;
29 + jsval* argv = JS_ARGV(cx, vp);
30 + JSObject *obj = NULL;
31 + //if (JS_IsConstructing(cx, vp)) {
32 + obj = JS_NewObject(cx, &CouchHTTPClass, NULL, NULL);
36 + // obj = JS_THIS_OBJECT(cx, vp);
38 + //printf("con %x\n", obj);
40 + JSBool *con = JS_IsConstructing(cx, vp);
41 http = (HTTPData*) malloc(sizeof(HTTPData));
44 @@ -67,6 +80,7 @@ constructor(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
45 http->req_headers = NULL;
46 http->last_status = -1;
48 + JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
49 if(!JS_SetPrivate(cx, obj, http))
51 JS_ReportError(cx, "Failed to set private CouchHTTP data.");
52 @@ -90,6 +104,7 @@ destructor(JSContext* cx, JSObject* obj)
55 fprintf(stderr, "Unable to destroy invalid CouchHTTP instance.\n");
56 + //printf("Unable to destroy invalid CouchHTTP instance.\n");
60 @@ -100,12 +115,15 @@ destructor(JSContext* cx, JSObject* obj)
64 -open(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
66 - HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj);
67 +open(JSContext* cx, uintN argc, jsval* vp)
69 + JSObject *obj = JS_THIS_OBJECT(cx, vp);
70 + //printf("open %x\n", obj);
71 + HTTPData* http = (HTTPData*) JS_GetPrivate(cx, JS_THIS_OBJECT(cx, vp));
74 JSBool ret = JS_FALSE;
75 + jsval* argv = JS_ARGV(cx, vp);
79 @@ -182,14 +200,16 @@ done:
83 -setheader(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
84 +setheader(JSContext* cx, uintN argc, jsval* vp)
86 - HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj);
87 + //printf("setheader %x\n", JS_THIS_OBJECT(cx, vp));
88 + HTTPData* http = (HTTPData*) JS_GetPrivate(cx, JS_THIS_OBJECT(cx, vp));
93 JSBool ret = JS_FALSE;
94 + jsval* argv = JS_ARGV(cx, vp);
98 @@ -245,12 +265,14 @@ done:
102 -sendreq(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
103 +sendreq(JSContext* cx, uintN argc, jsval* vp)
105 - HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj);
106 + HTTPData* http = (HTTPData*) JS_GetPrivate(cx, JS_THIS_OBJECT(cx, vp));
107 + //printf("sendreq %x\n", JS_THIS_OBJECT(cx, vp));
110 JSBool ret = JS_FALSE;
111 + jsval* argv = JS_ARGV(cx, vp);
115 @@ -268,7 +290,7 @@ sendreq(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
119 - ret = go(cx, obj, http, body, bodylen);
120 + ret = go(cx, JS_THIS_OBJECT(cx, argv), http, body, bodylen);
124 @@ -276,7 +298,7 @@ done:
128 -status(JSContext* cx, JSObject* obj, jsval idval, jsval* vp)
129 +status(JSContext* cx, JSObject* obj, jsid idval, jsval* vp)
131 HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj);
133 @@ -286,16 +308,8 @@ status(JSContext* cx, JSObject* obj, jsval idval, jsval* vp)
137 - if(INT_FITS_IN_JSVAL(http->last_status))
139 - *vp = INT_TO_JSVAL(http->last_status);
144 - JS_ReportError(cx, "INTERNAL: Invalid last_status");
147 + *vp = INT_TO_JSVAL(http->last_status);
151 JSClass CouchHTTPClass = {
152 @@ -306,7 +320,7 @@ JSClass CouchHTTPClass = {
157 + JS_StrictPropertyStub,
161 @@ -320,10 +334,10 @@ JSPropertySpec CouchHTTPProperties[] = {
164 JSFunctionSpec CouchHTTPFunctions[] = {
165 - {"_open", open, 3, 0, 0},
166 - {"_setRequestHeader", setheader, 2, 0, 0},
167 - {"_send", sendreq, 1, 0, 0},
169 + {"_open", open, 3, 0},
170 + {"_setRequestHeader", setheader, 2, 0},
171 + {"_send", sendreq, 1, 0},
176 diff --git a/src/couchdb/priv/couch_js/main.c b/src/couchdb/priv/couch_js/main.c
177 index 376aa15..2919448 100644
178 --- a/src/couchdb/priv/couch_js/main.c
179 +++ b/src/couchdb/priv/couch_js/main.c
181 // License for the specific language governing permissions and limitations under
188 @@ -33,8 +34,25 @@ int gExitCode = 0;
189 #define FINISH_REQUEST(cx)
192 +static JSClass global_class = {
194 + JSCLASS_GLOBAL_FLAGS | JSCLASS_HAS_PRIVATE,
198 + JS_StrictPropertyStub,
203 + JSCLASS_NO_OPTIONAL_MEMBERS
207 +printerror(JSContext *cx, const char *mesg, JSErrorReport *report);
210 -evalcx(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
211 +evalcx(JSContext *cx, uintN argc, jsval *vp)
215 @@ -45,7 +63,7 @@ evalcx(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
219 - if(!JS_ConvertArguments(cx, argc, argv, "S / o", &str, &sandbox))
220 + if(!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S / o", &str, &sandbox))
224 @@ -59,22 +77,29 @@ evalcx(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
226 SETUP_REQUEST(subcx);
228 - src = JS_GetStringChars(str);
229 - srclen = JS_GetStringLength(str);
233 - sandbox = JS_NewObject(subcx, NULL, NULL, NULL);
234 + sandbox = JS_NewCompartmentAndGlobalObject(subcx, &global_class, NULL);
235 if(!sandbox || !JS_InitStandardClasses(subcx, sandbox)) goto done;
237 + JS_SetGlobalObject(subcx, sandbox);
239 + src = JS_GetStringCharsZ(subcx, str);
240 + srclen = JS_GetStringLength(str);
244 - *rval = OBJECT_TO_JSVAL(sandbox);
245 + JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(sandbox));
249 - JS_EvaluateUCScript(subcx, sandbox, src, srclen, NULL, 0, rval);
250 + JSObject *script = JS_CompileUCScript(subcx, sandbox, src, srclen, NULL, 0);
254 + JS_ExecuteScript(subcx, sandbox, script, &rval);
255 + JS_SET_RVAL(cx, vp, rval);
260 @@ -86,21 +111,20 @@ done:
264 -gc(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
265 +gc(JSContext *cx, uintN argc, jsval *argv)
272 -print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
273 +print(JSContext *cx, uintN argc, jsval *argv)
278 for(i = 0; i < argc; i++)
280 - bytes = enc_string(cx, argv[i], NULL);
281 + bytes = enc_string(cx, JS_ARGV(cx, argv)[i], NULL);
282 if(!bytes) return JS_FALSE;
284 fprintf(stdout, "%s%s", i ? " " : "", bytes);
285 @@ -113,9 +137,9 @@ print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
289 -quit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
290 +quit(JSContext *cx, uintN argc, jsval *argv)
292 - JS_ConvertArguments(cx, argc, argv, "/ i", &gExitCode);
293 + JS_ConvertArguments(cx, argc, JS_ARGV(cx, argv), "/ i", &gExitCode);
297 @@ -123,41 +147,23 @@ static char*
298 readfp(JSContext* cx, FILE* fp, size_t* buflen)
303 size_t byteslen = 256;
304 - size_t readlen = 0;
307 bytes = JS_malloc(cx, byteslen);
308 - if(bytes == NULL) return NULL;
310 - while((readlen = js_fgets(bytes+used, byteslen-used, stdin)) > 0)
314 - if(bytes[used-1] == '\n')
316 - bytes[used-1] = '\0';
320 - // Double our buffer and read more.
322 - tmp = JS_realloc(cx, bytes, byteslen);
325 - JS_free(cx, bytes);
329 + readlen = getline(&bytes, &byteslen, fp);
330 + if (readlen <= 0) {
336 + if (bytes[readlen-1] == '\n')
337 + bytes[readlen-1] = '\0';
343 -readline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
344 +readline(JSContext *cx, uintN argc, jsval *argv) {
348 @@ -173,7 +179,7 @@ readline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
349 /* Treat the empty string specially */
352 - *rval = JS_GetEmptyStringValue(cx);
353 + JS_SET_RVAL(cx, argv, JS_GetEmptyStringValue(cx));
357 @@ -191,28 +197,27 @@ readline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
360 if(!str) return JS_FALSE;
362 - *rval = STRING_TO_JSVAL(str);
363 + JS_SET_RVAL(cx, argv, STRING_TO_JSVAL(str));
369 -seal(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
370 +seal(JSContext *cx, uintN argc, jsval *argv) {
372 JSBool deep = JS_FALSE;
374 - if (!JS_ConvertArguments(cx, argc, argv, "o/b", &target, &deep))
375 + if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, argv), "o/b", &target, &deep))
379 - return JS_SealObject(cx, target, deep);
380 + return JS_FreezeObject(cx, target);
384 execute_script(JSContext *cx, JSObject *obj, const char *filename) {
390 if(!filename || strcmp(filename, "-") == 0)
391 @@ -234,7 +239,6 @@ execute_script(JSContext *cx, JSObject *obj, const char *filename) {
394 JS_ExecuteScript(cx, obj, script, &result);
395 - JS_DestroyScript(cx, script);
399 @@ -248,27 +252,13 @@ printerror(JSContext *cx, const char *mesg, JSErrorReport *report)
402 static JSFunctionSpec global_functions[] = {
403 - {"evalcx", evalcx, 0, 0, 0},
404 - {"gc", gc, 0, 0, 0},
405 - {"print", print, 0, 0, 0},
406 - {"quit", quit, 0, 0, 0},
407 - {"readline", readline, 0, 0, 0},
408 - {"seal", seal, 0, 0, 0},
412 -static JSClass global_class = {
414 - JSCLASS_GLOBAL_FLAGS,
423 - JSCLASS_NO_OPTIONAL_MEMBERS
424 + {"evalcx", evalcx, 0, 0},
426 + {"print", print, 0, 0},
427 + {"quit", quit, 0, 0},
428 + {"readline", readline, 0, 0},
429 + {"seal", seal, 0, 0},
434 @@ -291,7 +281,7 @@ main(int argc, const char * argv[])
438 - global = JS_NewObject(cx, &global_class, NULL, NULL);
439 + global = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL);
440 if (!global) return 1;
441 if (!JS_InitStandardClasses(cx, global)) return 1;
443 diff --git a/src/couchdb/priv/couch_js/utf8.c b/src/couchdb/priv/couch_js/utf8.c
444 index 699a6fe..9ccc256 100644
445 --- a/src/couchdb/priv/couch_js/utf8.c
446 +++ b/src/couchdb/priv/couch_js/utf8.c
447 @@ -129,7 +129,7 @@ enc_string(JSContext* cx, jsval arg, size_t* buflen)
448 str = JS_ValueToString(cx, arg);
451 - src = JS_GetStringChars(str);
452 + src = JS_GetStringCharsZ(cx, str);
453 srclen = JS_GetStringLength(str);
455 if(!enc_charbuf(src, srclen, NULL, &byteslen)) goto error;
456 @@ -283,4 +283,4 @@ error:
461 \ No newline at end of file