]> git.pld-linux.org Git - packages/couchdb.git/blob - js185.patch
- js 1.8.5 patch from fedora
[packages/couchdb.git] / js185.patch
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
This page took 0.121463 seconds and 3 git commands to generate.