2007-08-02 Mark Rowe <mrowe@apple.com>
[WebKit-https.git] / LayoutTests / fast / js / resources / string-concatenate-outofmemory.js
1 description(
2 'This test checks if repeated string concatenation causes an exception (and not a crash). From WebKit Bug <a href="http://bugs.webkit.org/show_bug.cgi?id=11131">Repeated string concatenation results in OOM crash</a>.'
3 );
4
5 shouldThrow('s = "a"; while (1) { s += s; }', '"Error: Out of memory"'); // Expand at end of string
6 shouldThrow('s = "a"; while (1) { s += ("a" + s); }', '"Error: Out of memory"'); // Expand at beginning of string
7 shouldThrow('s = "a"; while (1) { s = [s, s].join(); }', '"Error: Out of memory"'); // Expand using UString::append.
8
9 debug('');
10 debug(
11 'We also verify that the the string is stil functional after the out of memory exception is raised.  In <a href="rdar://problem/5352887">rdar://problem/5352887</a>, accessing the string after the exception would crash.'
12 );
13
14 function ensureStringIsUsable(testName, stringName, str) {
15     str[str.length - 1];
16     try { [str, str].join(str); } catch (o) { }
17     "a" + str;
18     str + "a";
19     debug('PASS: String ' + stringName + ' was functional after ' + testName + ' raised out of memory exception.');
20 }
21
22 var s = "a";
23 try {
24     while (1)
25         s += s; // This will expand the string at the end using UString::expandCapacity
26 } catch (o) {
27     ensureStringIsUsable('expandCapacity', 's', s);
28 }
29
30 s = "a";
31 var t = "";
32 try {
33     while (1) {
34         t = "a" + s;
35         s += t; // This will expand the string at the beginning using UString::expandPreCapacity
36     }
37 } catch (o) {
38     // Ensure both strings involved are unharmed
39     ensureStringIsUsable('expandPreCapacity', 's', s);
40     ensureStringIsUsable('expandPreCapacity', 't', t);
41 }
42
43 s = "a";
44 try {
45     while (1)
46         s = [s, s].join(); // This will expand the string using UString::append.
47 } catch (o) {
48     ensureStringIsUsable('append', 's', s);
49 }
50
51 var successfullyParsed = true;