Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 366729
Collapse All | Expand All

(-)configure.orig (-4 / +4 lines)
Lines 11372-11384 Link Here
11372
fi
11372
fi
11373
11373
11374
11374
11375
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_NewContext in -lmozjs" >&5
11375
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_NewContext in -lmozjs185" >&5
11376
$as_echo_n "checking for JS_NewContext in -lmozjs... " >&6; }
11376
$as_echo_n "checking for JS_NewContext in -lmozjs185... " >&6; }
11377
if test "${ac_cv_lib_mozjs_JS_NewContext+set}" = set; then :
11377
if test "${ac_cv_lib_mozjs_JS_NewContext+set}" = set; then :
11378
  $as_echo_n "(cached) " >&6
11378
  $as_echo_n "(cached) " >&6
11379
else
11379
else
11380
  ac_check_lib_save_LIBS=$LIBS
11380
  ac_check_lib_save_LIBS=$LIBS
11381
LIBS="-lmozjs  $LIBS"
11381
LIBS="-lmozjs185  $LIBS"
11382
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
11382
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
11383
/* end confdefs.h.  */
11383
/* end confdefs.h.  */
11384
11384
Lines 11409-11415 Link Here
11409
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mozjs_JS_NewContext" >&5
11409
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mozjs_JS_NewContext" >&5
11410
$as_echo "$ac_cv_lib_mozjs_JS_NewContext" >&6; }
11410
$as_echo "$ac_cv_lib_mozjs_JS_NewContext" >&6; }
11411
if test "x$ac_cv_lib_mozjs_JS_NewContext" = x""yes; then :
11411
if test "x$ac_cv_lib_mozjs_JS_NewContext" = x""yes; then :
11412
  JS_LIB_BASE=mozjs
11412
  JS_LIB_BASE=mozjs185
11413
else
11413
else
11414
11414
11415
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_NewContext in -ljs" >&5
11415
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_NewContext in -ljs" >&5
(-)src/couchdb/priv/couch_js/http.c.to_new_js (-25 / +39 lines)
Lines 49-60 go(JSContext* cx, JSObject* obj, HTTPDat Link Here
49
static JSString*
49
static JSString*
50
str_from_binary(JSContext* cx, char* data, size_t length);
50
str_from_binary(JSContext* cx, char* data, size_t length);
51
51
52
JSClass CouchHTTPClass;
53
52
static JSBool
54
static JSBool
53
constructor(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
55
constructor(JSContext* cx, uintN argc, jsval* vp)
54
{
56
{
55
    HTTPData* http = NULL;
57
    HTTPData* http = NULL;
56
    JSBool ret = JS_FALSE;
58
    JSBool ret = JS_FALSE;
59
    jsval* argv = JS_ARGV(cx, vp);
60
    JSObject *obj = NULL;
61
    //if (JS_IsConstructing(cx, vp)) {
62
       obj = JS_NewObject(cx, &CouchHTTPClass, NULL, NULL);
63
       if (!obj)
64
          return JS_FALSE;
65
    //} else {
66
    //   obj = JS_THIS_OBJECT(cx, vp);
67
    //}
68
    //printf("con %x\n", obj);
57
69
70
    JSBool *con = JS_IsConstructing(cx, vp);
58
    http = (HTTPData*) malloc(sizeof(HTTPData));
71
    http = (HTTPData*) malloc(sizeof(HTTPData));
59
    if(!http)
72
    if(!http)
60
    {
73
    {
Lines 67-72 constructor(JSContext* cx, JSObject* obj Link Here
67
    http->req_headers = NULL;
80
    http->req_headers = NULL;
68
    http->last_status = -1;
81
    http->last_status = -1;
69
82
83
    JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
70
    if(!JS_SetPrivate(cx, obj, http))
84
    if(!JS_SetPrivate(cx, obj, http))
71
    {
85
    {
72
        JS_ReportError(cx, "Failed to set private CouchHTTP data.");
86
        JS_ReportError(cx, "Failed to set private CouchHTTP data.");
Lines 90-95 destructor(JSContext* cx, JSObject* obj) Link Here
90
    if(!http)
104
    if(!http)
91
    {
105
    {
92
        fprintf(stderr, "Unable to destroy invalid CouchHTTP instance.\n");
106
        fprintf(stderr, "Unable to destroy invalid CouchHTTP instance.\n");
107
        //printf("Unable to destroy invalid CouchHTTP instance.\n");
93
    }
108
    }
94
    else
109
    else
95
    {
110
    {
Lines 100-111 destructor(JSContext* cx, JSObject* obj) Link Here
100
}
115
}
101
116
102
static JSBool
117
static JSBool
103
open(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
118
open(JSContext* cx, uintN argc, jsval* vp)
104
{    
119
{   
105
    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj);
120
    JSObject *obj = JS_THIS_OBJECT(cx, vp);
121
    //printf("open %x\n", obj);
122
    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, JS_THIS_OBJECT(cx, vp));
106
    char* method = NULL;
123
    char* method = NULL;
107
    char* url = NULL;
124
    char* url = NULL;
108
    JSBool ret = JS_FALSE;
125
    JSBool ret = JS_FALSE;
126
    jsval* argv = JS_ARGV(cx, vp);
109
    int methid;
127
    int methid;
110
128
111
    if(!http)
129
    if(!http)
Lines 182-195 done: Link Here
182
}
200
}
183
201
184
static JSBool
202
static JSBool
185
setheader(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
203
setheader(JSContext* cx, uintN argc, jsval* vp)
186
{    
204
{    
187
    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj);
205
    //printf("setheader %x\n", JS_THIS_OBJECT(cx, vp));
206
    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, JS_THIS_OBJECT(cx, vp));
188
    char* keystr = NULL;
207
    char* keystr = NULL;
189
    char* valstr = NULL;
208
    char* valstr = NULL;
190
    char* hdrbuf = NULL;
209
    char* hdrbuf = NULL;
191
    size_t hdrlen = -1;
210
    size_t hdrlen = -1;
192
    JSBool ret = JS_FALSE;
211
    JSBool ret = JS_FALSE;
212
    jsval* argv = JS_ARGV(cx, vp);
193
213
194
    if(!http)
214
    if(!http)
195
    {
215
    {
Lines 245-256 done: Link Here
245
}
265
}
246
266
247
static JSBool
267
static JSBool
248
sendreq(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
268
sendreq(JSContext* cx, uintN argc, jsval* vp)
249
{
269
{
250
    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj);
270
    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, JS_THIS_OBJECT(cx, vp));
271
    //printf("sendreq %x\n", JS_THIS_OBJECT(cx, vp));
251
    char* body = NULL;
272
    char* body = NULL;
252
    size_t bodylen = 0;
273
    size_t bodylen = 0;
253
    JSBool ret = JS_FALSE;
274
    JSBool ret = JS_FALSE;
275
    jsval* argv = JS_ARGV(cx, vp);
254
    
276
    
255
    if(!http)
277
    if(!http)
256
    {
278
    {
Lines 268-274 sendreq(JSContext* cx, JSObject* obj, ui Link Here
268
        }
290
        }
269
    }
291
    }
270
292
271
    ret = go(cx, obj, http, body, bodylen);
293
    ret = go(cx, JS_THIS_OBJECT(cx, argv), http, body, bodylen);
272
294
273
done:
295
done:
274
    if(body) free(body);
296
    if(body) free(body);
Lines 276-282 done: Link Here
276
}
298
}
277
299
278
static JSBool
300
static JSBool
279
status(JSContext* cx, JSObject* obj, jsval idval, jsval* vp)
301
status(JSContext* cx, JSObject* obj, jsid idval, jsval* vp)
280
{
302
{
281
    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj);
303
    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj);
282
    
304
    
Lines 286-301 status(JSContext* cx, JSObject* obj, jsv Link Here
286
        return JS_FALSE;
308
        return JS_FALSE;
287
    }
309
    }
288
    
310
    
289
    if(INT_FITS_IN_JSVAL(http->last_status))
311
    *vp = INT_TO_JSVAL(http->last_status);
290
    {
312
    return JS_TRUE;
291
        *vp = INT_TO_JSVAL(http->last_status);
292
        return JS_TRUE;
293
    }
294
    else
295
    {
296
        JS_ReportError(cx, "INTERNAL: Invalid last_status");
297
        return JS_FALSE;
298
    }
299
}
313
}
300
314
301
JSClass CouchHTTPClass = {
315
JSClass CouchHTTPClass = {
Lines 306-312 JSClass CouchHTTPClass = { Link Here
306
    JS_PropertyStub,
320
    JS_PropertyStub,
307
    JS_PropertyStub,
321
    JS_PropertyStub,
308
    JS_PropertyStub,
322
    JS_PropertyStub,
309
    JS_PropertyStub,
323
    JS_StrictPropertyStub,
310
    JS_EnumerateStub,
324
    JS_EnumerateStub,
311
    JS_ResolveStub,
325
    JS_ResolveStub,
312
    JS_ConvertStub,
326
    JS_ConvertStub,
Lines 320-329 JSPropertySpec CouchHTTPProperties[] = { Link Here
320
};
334
};
321
335
322
JSFunctionSpec CouchHTTPFunctions[] = {
336
JSFunctionSpec CouchHTTPFunctions[] = {
323
    {"_open", open, 3, 0, 0},
337
    {"_open", open, 3, 0},
324
    {"_setRequestHeader", setheader, 2, 0, 0},
338
    {"_setRequestHeader", setheader, 2, 0},
325
    {"_send", sendreq, 1, 0, 0},
339
    {"_send", sendreq, 1, 0},
326
    {0, 0, 0, 0, 0}
340
    {0, 0, 0, 0}
327
};
341
};
328
342
329
JSObject*
343
JSObject*
(-)src/couchdb/priv/couch_js/main.c.to_new_js (-71 / +56 lines)
Lines 15-21 Link Here
15
#include <string.h>
15
#include <string.h>
16
#include <jsapi.h>
16
#include <jsapi.h>
17
#include "config.h"
17
#include "config.h"
18
19
#include "utf8.h"
18
#include "utf8.h"
20
#include "http.h"
19
#include "http.h"
21
20
Lines 33-40 int gExitCode = 0; Link Here
33
#define FINISH_REQUEST(cx)
32
#define FINISH_REQUEST(cx)
34
#endif
33
#endif
35
34
35
static JSClass global_class = {
36
    "GlobalClass",
37
    JSCLASS_GLOBAL_FLAGS | JSCLASS_HAS_PRIVATE,
38
    JS_PropertyStub,
39
    JS_PropertyStub,
40
    JS_PropertyStub,
41
    JS_StrictPropertyStub,
42
    JS_EnumerateStub,
43
    JS_ResolveStub,
44
    JS_ConvertStub,
45
    JS_FinalizeStub,
46
    JSCLASS_NO_OPTIONAL_MEMBERS
47
};
48
36
static JSBool
49
static JSBool
37
evalcx(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
50
evalcx(JSContext *cx, uintN argc, jsval *vp)
38
{
51
{
39
    JSString *str;
52
    JSString *str;
40
    JSObject *sandbox;
53
    JSObject *sandbox;
Lines 45-55 evalcx(JSContext *cx, JSObject *obj, uin Link Here
45
    jsval v;
58
    jsval v;
46
59
47
    sandbox = NULL;
60
    sandbox = NULL;
48
    if(!JS_ConvertArguments(cx, argc, argv, "S / o", &str, &sandbox))
61
    if(!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S / o", &str, &sandbox))
49
    {
62
    {
50
        return JS_FALSE;
63
        return JS_FALSE;
51
    }
64
    }
52
65
66
53
    subcx = JS_NewContext(JS_GetRuntime(cx), 8L * 1024L);
67
    subcx = JS_NewContext(JS_GetRuntime(cx), 8L * 1024L);
54
    if(!subcx)
68
    if(!subcx)
55
    {
69
    {
Lines 57-80 evalcx(JSContext *cx, JSObject *obj, uin Link Here
57
        return JS_FALSE;
71
        return JS_FALSE;
58
    }
72
    }
59
73
74
    JSObject *global = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL);
75
    if (!global) return 1;
76
    JS_SetGlobalObject(subcx, global);
77
60
    SETUP_REQUEST(subcx);
78
    SETUP_REQUEST(subcx);
61
79
62
    src = JS_GetStringChars(str);
80
    src = JS_GetStringCharsZ(cx, str);
63
    srclen = JS_GetStringLength(str);
81
    srclen = JS_GetStringLength(str);
64
82
65
    if(!sandbox)
83
    if(!sandbox)
66
    {
84
    {
67
        sandbox = JS_NewObject(subcx, NULL, NULL, NULL);
85
        sandbox = JS_NewObject(subcx, NULL, NULL, NULL);
68
        if(!sandbox || !JS_InitStandardClasses(subcx, sandbox)) goto done;
86
        if(!sandbox || !JS_InitStandardClasses(subcx, global)) goto done;
69
    }
87
    }
70
88
71
    if(srclen == 0)
89
    if(srclen == 0)
72
    {
90
    {
73
        *rval = OBJECT_TO_JSVAL(sandbox);
91
        JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(sandbox));
74
    }
92
    }
75
    else
93
    else
76
    {
94
    {
77
        JS_EvaluateUCScript(subcx, sandbox, src, srclen, NULL, 0, rval);
95
        jsval rval; 
96
        JS_EvaluateUCScript(subcx, sandbox, src, srclen, NULL, 0, &rval);
97
        JS_SET_RVAL(cx, vp, rval);
78
    }
98
    }
79
    
99
    
80
    ret = JS_TRUE;
100
    ret = JS_TRUE;
Lines 86-106 done: Link Here
86
}
106
}
87
107
88
static JSBool
108
static JSBool
89
gc(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
109
gc(JSContext *cx, uintN argc, jsval *argv)
90
{
110
{
91
    JS_GC(cx);
111
    JS_GC(cx);
92
    return JS_TRUE;
112
    return JS_TRUE;
93
}
113
}
94
114
95
static JSBool
115
static JSBool
96
print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
116
print(JSContext *cx, uintN argc, jsval *argv)
97
{
117
{
98
    uintN i;
118
    uintN i;
99
    char *bytes;
119
    char *bytes;
100
101
    for(i = 0; i < argc; i++)
120
    for(i = 0; i < argc; i++)
102
    {
121
    {
103
        bytes = enc_string(cx, argv[i], NULL);
122
        bytes = enc_string(cx, JS_ARGV(cx, argv)[i], NULL);
104
        if(!bytes) return JS_FALSE;
123
        if(!bytes) return JS_FALSE;
105
124
106
        fprintf(stdout, "%s%s", i ? " " : "", bytes);
125
        fprintf(stdout, "%s%s", i ? " " : "", bytes);
Lines 113-121 print(JSContext *cx, JSObject *obj, uint Link Here
113
}
132
}
114
133
115
static JSBool
134
static JSBool
116
quit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
135
quit(JSContext *cx, uintN argc, jsval *argv)
117
{
136
{
118
    JS_ConvertArguments(cx, argc, argv, "/ i", &gExitCode);
137
    JS_ConvertArguments(cx, argc, JS_ARGV(cx, argv), "/ i", &gExitCode);
119
    return JS_FALSE;
138
    return JS_FALSE;
120
}
139
}
121
140
Lines 123-163 static char* Link Here
123
readfp(JSContext* cx, FILE* fp, size_t* buflen)
142
readfp(JSContext* cx, FILE* fp, size_t* buflen)
124
{
143
{
125
    char* bytes = NULL;
144
    char* bytes = NULL;
126
    char* tmp = NULL;
127
    size_t used = 0;
128
    size_t byteslen = 256;
145
    size_t byteslen = 256;
129
    size_t readlen = 0;
146
    ssize_t readlen;
130
147
131
    bytes = JS_malloc(cx, byteslen);
148
    bytes = JS_malloc(cx, byteslen);
132
    if(bytes == NULL) return NULL;
149
    readlen = getline(&bytes, &byteslen, fp);
133
    
150
    if (readlen <= 0) {
134
    while((readlen = js_fgets(bytes+used, byteslen-used, stdin)) > 0)
151
       *buflen = 0;
135
    {
152
       return bytes;
136
        used += readlen;
153
    }
137
154
    if (bytes[readlen-1] == '\n')
138
        if(bytes[used-1] == '\n')
155
       bytes[readlen-1] = '\0';
139
        {
156
    *buflen = readlen;
140
            bytes[used-1] = '\0';
141
            break;
142
        }
143
144
        // Double our buffer and read more.
145
        byteslen *= 2;
146
        tmp = JS_realloc(cx, bytes, byteslen);
147
        if(!tmp)
148
        {
149
            JS_free(cx, bytes);
150
            return NULL;
151
        }
152
        bytes = tmp;
153
    }
154
155
    *buflen = used;
156
    return bytes;
157
    return bytes;
157
}
158
}
158
159
159
static JSBool
160
static JSBool
160
readline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
161
readline(JSContext *cx, uintN argc, jsval *argv) {
161
    jschar *chars;
162
    jschar *chars;
162
    JSString *str;
163
    JSString *str;
163
    char* bytes;
164
    char* bytes;
Lines 173-179 readline(JSContext *cx, JSObject *obj, u Link Here
173
    /* Treat the empty string specially */
174
    /* Treat the empty string specially */
174
    if(byteslen == 0)
175
    if(byteslen == 0)
175
    {
176
    {
176
        *rval = JS_GetEmptyStringValue(cx);
177
        JS_SET_RVAL(cx, argv, JS_GetEmptyStringValue(cx));
177
        JS_free(cx, bytes);
178
        JS_free(cx, bytes);
178
        return JS_TRUE;
179
        return JS_TRUE;
179
    }
180
    }
Lines 191-218 readline(JSContext *cx, JSObject *obj, u Link Here
191
    JS_free(cx, bytes);
192
    JS_free(cx, bytes);
192
193
193
    if(!str) return JS_FALSE;
194
    if(!str) return JS_FALSE;
194
195
    JS_SET_RVAL(cx, argv, STRING_TO_JSVAL(str));
195
    *rval = STRING_TO_JSVAL(str);
196
196
197
    return JS_TRUE;
197
    return JS_TRUE;
198
}
198
}
199
199
200
static JSBool
200
static JSBool
201
seal(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
201
seal(JSContext *cx, uintN argc, jsval *argv) {
202
    JSObject *target;
202
    JSObject *target;
203
    JSBool deep = JS_FALSE;
203
    JSBool deep = JS_FALSE;
204
204
205
    if (!JS_ConvertArguments(cx, argc, argv, "o/b", &target, &deep))
205
    if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, argv), "o/b", &target, &deep))
206
        return JS_FALSE;
206
        return JS_FALSE;
207
    if (!target)
207
    if (!target)
208
        return JS_TRUE;
208
        return JS_TRUE;
209
    return JS_SealObject(cx, target, deep);
209
    return JS_FreezeObject(cx, target);
210
}
210
}
211
211
212
static void
212
static void
213
execute_script(JSContext *cx, JSObject *obj, const char *filename) {
213
execute_script(JSContext *cx, JSObject *obj, const char *filename) {
214
    FILE *file;
214
    FILE *file;
215
    JSScript *script;
215
    JSObject *script;
216
    jsval result;
216
    jsval result;
217
217
218
    if(!filename || strcmp(filename, "-") == 0)
218
    if(!filename || strcmp(filename, "-") == 0)
Lines 234-240 execute_script(JSContext *cx, JSObject * Link Here
234
    if(script)
234
    if(script)
235
    {
235
    {
236
        JS_ExecuteScript(cx, obj, script, &result);
236
        JS_ExecuteScript(cx, obj, script, &result);
237
        JS_DestroyScript(cx, script);
238
    }
237
    }
239
}
238
}
240
239
Lines 248-274 printerror(JSContext *cx, const char *me Link Here
248
}
247
}
249
248
250
static JSFunctionSpec global_functions[] = {
249
static JSFunctionSpec global_functions[] = {
251
    {"evalcx", evalcx, 0, 0, 0},
250
    {"evalcx", evalcx, 0, 0},
252
    {"gc", gc, 0, 0, 0},
251
    {"gc", gc, 0, 0},
253
    {"print", print, 0, 0, 0},
252
    {"print", print, 0, 0},
254
    {"quit", quit, 0, 0, 0},
253
    {"quit", quit, 0, 0},
255
    {"readline", readline, 0, 0, 0},
254
    {"readline", readline, 0, 0},
256
    {"seal", seal, 0, 0, 0},
255
    {"seal", seal, 0, 0},
257
    {0, 0, 0, 0, 0}
256
    {0, 0, 0, 0}
258
};
259
260
static JSClass global_class = {
261
    "GlobalClass",
262
    JSCLASS_GLOBAL_FLAGS,
263
    JS_PropertyStub,
264
    JS_PropertyStub,
265
    JS_PropertyStub,
266
    JS_PropertyStub,
267
    JS_EnumerateStub,
268
    JS_ResolveStub,
269
    JS_ConvertStub,
270
    JS_FinalizeStub,
271
    JSCLASS_NO_OPTIONAL_MEMBERS
272
};
257
};
273
258
274
int
259
int
Lines 291-297 main(int argc, const char * argv[]) Link Here
291
    
276
    
292
    SETUP_REQUEST(cx);
277
    SETUP_REQUEST(cx);
293
278
294
    global = JS_NewObject(cx, &global_class, NULL, NULL);
279
    global = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL);
295
    if (!global) return 1;
280
    if (!global) return 1;
296
    if (!JS_InitStandardClasses(cx, global)) return 1;
281
    if (!JS_InitStandardClasses(cx, global)) return 1;
297
    
282
    
(-)src/couchdb/priv/couch_js/utf8.c.to_new_js (-2 / +2 lines)
Lines 129-135 enc_string(JSContext* cx, jsval arg, siz Link Here
129
    str = JS_ValueToString(cx, arg);
129
    str = JS_ValueToString(cx, arg);
130
    if(!str) goto error;
130
    if(!str) goto error;
131
131
132
    src = JS_GetStringChars(str);
132
    src = JS_GetStringCharsZ(cx, str);
133
    srclen = JS_GetStringLength(str);
133
    srclen = JS_GetStringLength(str);
134
134
135
    if(!enc_charbuf(src, srclen, NULL, &byteslen)) goto error;
135
    if(!enc_charbuf(src, srclen, NULL, &byteslen)) goto error;
Lines 283-286 error: Link Here
283
283
284
success:
284
success:
285
    return str;
285
    return str;
286
}
286
}

Return to bug 366729