]>
Commit | Line | Data |
---|---|---|
83691a6c ER |
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 | |
5 | ||
6 | --- | |
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(-) | |
11 | ||
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); | |
17 | static JSString* | |
18 | str_from_binary(JSContext* cx, char* data, size_t length); | |
19 | ||
20 | +JSClass CouchHTTPClass; | |
21 | + | |
22 | static JSBool | |
23 | -constructor(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) | |
24 | +constructor(JSContext* cx, uintN argc, jsval* vp) | |
25 | { | |
26 | HTTPData* http = NULL; | |
27 | JSBool ret = JS_FALSE; | |
28 | - | |
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); | |
33 | + if (!obj) | |
34 | + return JS_FALSE; | |
35 | + //} else { | |
36 | + // obj = JS_THIS_OBJECT(cx, vp); | |
37 | + //} | |
38 | + //printf("con %x\n", obj); | |
39 | + | |
40 | + JSBool *con = JS_IsConstructing(cx, vp); | |
41 | http = (HTTPData*) malloc(sizeof(HTTPData)); | |
42 | if(!http) | |
43 | { | |
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; | |
47 | ||
48 | + JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj)); | |
49 | if(!JS_SetPrivate(cx, obj, http)) | |
50 | { | |
51 | JS_ReportError(cx, "Failed to set private CouchHTTP data."); | |
52 | @@ -90,6 +104,7 @@ destructor(JSContext* cx, JSObject* obj) | |
53 | if(!http) | |
54 | { | |
55 | fprintf(stderr, "Unable to destroy invalid CouchHTTP instance.\n"); | |
56 | + //printf("Unable to destroy invalid CouchHTTP instance.\n"); | |
57 | } | |
58 | else | |
59 | { | |
60 | @@ -100,12 +115,15 @@ destructor(JSContext* cx, JSObject* obj) | |
61 | } | |
62 | ||
63 | static JSBool | |
64 | -open(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) | |
65 | -{ | |
66 | - HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj); | |
67 | +open(JSContext* cx, uintN argc, jsval* vp) | |
68 | +{ | |
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)); | |
72 | char* method = NULL; | |
73 | char* url = NULL; | |
74 | JSBool ret = JS_FALSE; | |
75 | + jsval* argv = JS_ARGV(cx, vp); | |
76 | int methid; | |
77 | ||
78 | if(!http) | |
79 | @@ -182,14 +200,16 @@ done: | |
80 | } | |
81 | ||
82 | static JSBool | |
83 | -setheader(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) | |
84 | +setheader(JSContext* cx, uintN argc, jsval* vp) | |
85 | { | |
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)); | |
89 | char* keystr = NULL; | |
90 | char* valstr = NULL; | |
91 | char* hdrbuf = NULL; | |
92 | size_t hdrlen = -1; | |
93 | JSBool ret = JS_FALSE; | |
94 | + jsval* argv = JS_ARGV(cx, vp); | |
95 | ||
96 | if(!http) | |
97 | { | |
98 | @@ -245,12 +265,14 @@ done: | |
99 | } | |
100 | ||
101 | static JSBool | |
102 | -sendreq(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) | |
103 | +sendreq(JSContext* cx, uintN argc, jsval* vp) | |
104 | { | |
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)); | |
108 | char* body = NULL; | |
109 | size_t bodylen = 0; | |
110 | JSBool ret = JS_FALSE; | |
111 | + jsval* argv = JS_ARGV(cx, vp); | |
112 | ||
113 | if(!http) | |
114 | { | |
115 | @@ -268,7 +290,7 @@ sendreq(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) | |
116 | } | |
117 | } | |
118 | ||
119 | - ret = go(cx, obj, http, body, bodylen); | |
120 | + ret = go(cx, JS_THIS_OBJECT(cx, argv), http, body, bodylen); | |
121 | ||
122 | done: | |
123 | if(body) free(body); | |
124 | @@ -276,7 +298,7 @@ done: | |
125 | } | |
126 | ||
127 | static JSBool | |
128 | -status(JSContext* cx, JSObject* obj, jsval idval, jsval* vp) | |
129 | +status(JSContext* cx, JSObject* obj, jsid idval, jsval* vp) | |
130 | { | |
131 | HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj); | |
132 | ||
133 | @@ -286,16 +308,8 @@ status(JSContext* cx, JSObject* obj, jsval idval, jsval* vp) | |
134 | return JS_FALSE; | |
135 | } | |
136 | ||
137 | - if(INT_FITS_IN_JSVAL(http->last_status)) | |
138 | - { | |
139 | - *vp = INT_TO_JSVAL(http->last_status); | |
140 | - return JS_TRUE; | |
141 | - } | |
142 | - else | |
143 | - { | |
144 | - JS_ReportError(cx, "INTERNAL: Invalid last_status"); | |
145 | - return JS_FALSE; | |
146 | - } | |
147 | + *vp = INT_TO_JSVAL(http->last_status); | |
148 | + return JS_TRUE; | |
149 | } | |
150 | ||
151 | JSClass CouchHTTPClass = { | |
152 | @@ -306,7 +320,7 @@ JSClass CouchHTTPClass = { | |
153 | JS_PropertyStub, | |
154 | JS_PropertyStub, | |
155 | JS_PropertyStub, | |
156 | - JS_PropertyStub, | |
157 | + JS_StrictPropertyStub, | |
158 | JS_EnumerateStub, | |
159 | JS_ResolveStub, | |
160 | JS_ConvertStub, | |
161 | @@ -320,10 +334,10 @@ JSPropertySpec CouchHTTPProperties[] = { | |
162 | }; | |
163 | ||
164 | JSFunctionSpec CouchHTTPFunctions[] = { | |
165 | - {"_open", open, 3, 0, 0}, | |
166 | - {"_setRequestHeader", setheader, 2, 0, 0}, | |
167 | - {"_send", sendreq, 1, 0, 0}, | |
168 | - {0, 0, 0, 0, 0} | |
169 | + {"_open", open, 3, 0}, | |
170 | + {"_setRequestHeader", setheader, 2, 0}, | |
171 | + {"_send", sendreq, 1, 0}, | |
172 | + {0, 0, 0, 0} | |
173 | }; | |
174 | ||
175 | JSObject* | |
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 | |
180 | @@ -10,6 +10,7 @@ | |
181 | // License for the specific language governing permissions and limitations under | |
182 | // the License. | |
183 | ||
184 | +#include <assert.h> | |
185 | #include <stdlib.h> | |
186 | #include <stdio.h> | |
187 | #include <string.h> | |
188 | @@ -33,8 +34,25 @@ int gExitCode = 0; | |
189 | #define FINISH_REQUEST(cx) | |
190 | #endif | |
191 | ||
192 | +static JSClass global_class = { | |
193 | + "GlobalClass", | |
194 | + JSCLASS_GLOBAL_FLAGS | JSCLASS_HAS_PRIVATE, | |
195 | + JS_PropertyStub, | |
196 | + JS_PropertyStub, | |
197 | + JS_PropertyStub, | |
198 | + JS_StrictPropertyStub, | |
199 | + JS_EnumerateStub, | |
200 | + JS_ResolveStub, | |
201 | + JS_ConvertStub, | |
202 | + JS_FinalizeStub, | |
203 | + JSCLASS_NO_OPTIONAL_MEMBERS | |
204 | +}; | |
205 | + | |
206 | +static void | |
207 | +printerror(JSContext *cx, const char *mesg, JSErrorReport *report); | |
208 | + | |
209 | static JSBool | |
210 | -evalcx(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) | |
211 | +evalcx(JSContext *cx, uintN argc, jsval *vp) | |
212 | { | |
213 | JSString *str; | |
214 | JSObject *sandbox; | |
215 | @@ -45,7 +63,7 @@ evalcx(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) | |
216 | jsval v; | |
217 | ||
218 | sandbox = NULL; | |
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)) | |
221 | { | |
222 | return JS_FALSE; | |
223 | } | |
224 | @@ -59,22 +77,29 @@ evalcx(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) | |
225 | ||
226 | SETUP_REQUEST(subcx); | |
227 | ||
228 | - src = JS_GetStringChars(str); | |
229 | - srclen = JS_GetStringLength(str); | |
230 | - | |
231 | if(!sandbox) | |
232 | { | |
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; | |
236 | } | |
237 | + JS_SetGlobalObject(subcx, sandbox); | |
238 | + | |
239 | + src = JS_GetStringCharsZ(subcx, str); | |
240 | + srclen = JS_GetStringLength(str); | |
241 | ||
242 | if(srclen == 0) | |
243 | { | |
244 | - *rval = OBJECT_TO_JSVAL(sandbox); | |
245 | + JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(sandbox)); | |
246 | } | |
247 | else | |
248 | { | |
249 | - JS_EvaluateUCScript(subcx, sandbox, src, srclen, NULL, 0, rval); | |
250 | + JSObject *script = JS_CompileUCScript(subcx, sandbox, src, srclen, NULL, 0); | |
251 | + jsval rval; | |
252 | + if(script) | |
253 | + { | |
254 | + JS_ExecuteScript(subcx, sandbox, script, &rval); | |
255 | + JS_SET_RVAL(cx, vp, rval); | |
256 | + } | |
257 | } | |
258 | ||
259 | ret = JS_TRUE; | |
260 | @@ -86,21 +111,20 @@ done: | |
261 | } | |
262 | ||
263 | static JSBool | |
264 | -gc(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) | |
265 | +gc(JSContext *cx, uintN argc, jsval *argv) | |
266 | { | |
267 | JS_GC(cx); | |
268 | return JS_TRUE; | |
269 | } | |
270 | ||
271 | static JSBool | |
272 | -print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) | |
273 | +print(JSContext *cx, uintN argc, jsval *argv) | |
274 | { | |
275 | uintN i; | |
276 | char *bytes; | |
277 | - | |
278 | for(i = 0; i < argc; i++) | |
279 | { | |
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; | |
283 | ||
284 | fprintf(stdout, "%s%s", i ? " " : "", bytes); | |
285 | @@ -113,9 +137,9 @@ print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) | |
286 | } | |
287 | ||
288 | static JSBool | |
289 | -quit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) | |
290 | +quit(JSContext *cx, uintN argc, jsval *argv) | |
291 | { | |
292 | - JS_ConvertArguments(cx, argc, argv, "/ i", &gExitCode); | |
293 | + JS_ConvertArguments(cx, argc, JS_ARGV(cx, argv), "/ i", &gExitCode); | |
294 | return JS_FALSE; | |
295 | } | |
296 | ||
297 | @@ -123,41 +147,23 @@ static char* | |
298 | readfp(JSContext* cx, FILE* fp, size_t* buflen) | |
299 | { | |
300 | char* bytes = NULL; | |
301 | - char* tmp = NULL; | |
302 | - size_t used = 0; | |
303 | size_t byteslen = 256; | |
304 | - size_t readlen = 0; | |
305 | + ssize_t readlen; | |
306 | ||
307 | bytes = JS_malloc(cx, byteslen); | |
308 | - if(bytes == NULL) return NULL; | |
309 | - | |
310 | - while((readlen = js_fgets(bytes+used, byteslen-used, stdin)) > 0) | |
311 | - { | |
312 | - used += readlen; | |
313 | - | |
314 | - if(bytes[used-1] == '\n') | |
315 | - { | |
316 | - bytes[used-1] = '\0'; | |
317 | - break; | |
318 | - } | |
319 | - | |
320 | - // Double our buffer and read more. | |
321 | - byteslen *= 2; | |
322 | - tmp = JS_realloc(cx, bytes, byteslen); | |
323 | - if(!tmp) | |
324 | - { | |
325 | - JS_free(cx, bytes); | |
326 | - return NULL; | |
327 | - } | |
328 | - bytes = tmp; | |
329 | + readlen = getline(&bytes, &byteslen, fp); | |
330 | + if (readlen <= 0) { | |
331 | + *buflen = 0; | |
332 | + return bytes; | |
333 | } | |
334 | - | |
335 | - *buflen = used; | |
336 | + if (bytes[readlen-1] == '\n') | |
337 | + bytes[readlen-1] = '\0'; | |
338 | + *buflen = readlen; | |
339 | return bytes; | |
340 | } | |
341 | ||
342 | static JSBool | |
343 | -readline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { | |
344 | +readline(JSContext *cx, uintN argc, jsval *argv) { | |
345 | jschar *chars; | |
346 | JSString *str; | |
347 | char* bytes; | |
348 | @@ -173,7 +179,7 @@ readline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { | |
349 | /* Treat the empty string specially */ | |
350 | if(byteslen == 0) | |
351 | { | |
352 | - *rval = JS_GetEmptyStringValue(cx); | |
353 | + JS_SET_RVAL(cx, argv, JS_GetEmptyStringValue(cx)); | |
354 | JS_free(cx, bytes); | |
355 | return JS_TRUE; | |
356 | } | |
357 | @@ -191,28 +197,27 @@ readline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { | |
358 | JS_free(cx, bytes); | |
359 | ||
360 | if(!str) return JS_FALSE; | |
361 | - | |
362 | - *rval = STRING_TO_JSVAL(str); | |
363 | + JS_SET_RVAL(cx, argv, STRING_TO_JSVAL(str)); | |
364 | ||
365 | return JS_TRUE; | |
366 | } | |
367 | ||
368 | static JSBool | |
369 | -seal(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { | |
370 | +seal(JSContext *cx, uintN argc, jsval *argv) { | |
371 | JSObject *target; | |
372 | JSBool deep = JS_FALSE; | |
373 | ||
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)) | |
376 | return JS_FALSE; | |
377 | if (!target) | |
378 | return JS_TRUE; | |
379 | - return JS_SealObject(cx, target, deep); | |
380 | + return JS_FreezeObject(cx, target); | |
381 | } | |
382 | ||
383 | static void | |
384 | execute_script(JSContext *cx, JSObject *obj, const char *filename) { | |
385 | FILE *file; | |
386 | - JSScript *script; | |
387 | + JSObject *script; | |
388 | jsval result; | |
389 | ||
390 | if(!filename || strcmp(filename, "-") == 0) | |
391 | @@ -234,7 +239,6 @@ execute_script(JSContext *cx, JSObject *obj, const char *filename) { | |
392 | if(script) | |
393 | { | |
394 | JS_ExecuteScript(cx, obj, script, &result); | |
395 | - JS_DestroyScript(cx, script); | |
396 | } | |
397 | } | |
398 | ||
399 | @@ -248,27 +252,13 @@ printerror(JSContext *cx, const char *mesg, JSErrorReport *report) | |
400 | } | |
401 | ||
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}, | |
409 | - {0, 0, 0, 0, 0} | |
410 | -}; | |
411 | - | |
412 | -static JSClass global_class = { | |
413 | - "GlobalClass", | |
414 | - JSCLASS_GLOBAL_FLAGS, | |
415 | - JS_PropertyStub, | |
416 | - JS_PropertyStub, | |
417 | - JS_PropertyStub, | |
418 | - JS_PropertyStub, | |
419 | - JS_EnumerateStub, | |
420 | - JS_ResolveStub, | |
421 | - JS_ConvertStub, | |
422 | - JS_FinalizeStub, | |
423 | - JSCLASS_NO_OPTIONAL_MEMBERS | |
424 | + {"evalcx", evalcx, 0, 0}, | |
425 | + {"gc", gc, 0, 0}, | |
426 | + {"print", print, 0, 0}, | |
427 | + {"quit", quit, 0, 0}, | |
428 | + {"readline", readline, 0, 0}, | |
429 | + {"seal", seal, 0, 0}, | |
430 | + {0, 0, 0, 0} | |
431 | }; | |
432 | ||
433 | int | |
434 | @@ -291,7 +281,7 @@ main(int argc, const char * argv[]) | |
435 | ||
436 | SETUP_REQUEST(cx); | |
437 | ||
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; | |
442 | ||
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); | |
449 | if(!str) goto error; | |
450 | ||
451 | - src = JS_GetStringChars(str); | |
452 | + src = JS_GetStringCharsZ(cx, str); | |
453 | srclen = JS_GetStringLength(str); | |
454 | ||
455 | if(!enc_charbuf(src, srclen, NULL, &byteslen)) goto error; | |
456 | @@ -283,4 +283,4 @@ error: | |
457 | ||
458 | success: | |
459 | return str; | |
460 | -} | |
461 | \ No newline at end of file | |
462 | +} | |
463 | -- | |
464 | 1.7.6 | |
465 |