| Index: test/mjsunit/string-slices.js
 | 
| diff --git a/test/mjsunit/substr.js b/test/mjsunit/string-slices.js
 | 
| similarity index 69%
 | 
| copy from test/mjsunit/substr.js
 | 
| copy to test/mjsunit/string-slices.js
 | 
| index f69a9c045c9aaec793ebb71ea162f9244accd05c..b0b05eca366b3a490be84b32c088b6a14aa7e11e 100755
 | 
| --- a/test/mjsunit/substr.js
 | 
| +++ b/test/mjsunit/string-slices.js
 | 
| @@ -25,6 +25,8 @@
 | 
|  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
|  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
|  
 | 
| +// Flags: --string-slices --expose-externalize-string
 | 
| +
 | 
|  var s = 'abcdefghijklmn';
 | 
|  assertEquals(s, s.substr());
 | 
|  assertEquals(s, s.substr(0));
 | 
| @@ -70,7 +72,7 @@ for (var i = 0; i < 25; i++) {
 | 
|  }
 | 
|  /x/.exec(x);  // Try to force a flatten.
 | 
|  for (var i = 5; i < 25; i++) {
 | 
| -  for (var j = 0; j < 25; j++) {
 | 
| +  for (var j = 12; j < 25; j++) {
 | 
|      var z = x.substring(i, i+j);
 | 
|      var w = Math.random() * 42;  // Allocate something new in new-space.
 | 
|      assertEquals(j, z.length);
 | 
| @@ -79,8 +81,6 @@ for (var i = 5; i < 25; i++) {
 | 
|      }
 | 
|    }
 | 
|  }
 | 
| -
 | 
| -
 | 
|  // Then two-byte strings.
 | 
|  x = "UC16\u2028";  // Non-ascii char forces two-byte string.
 | 
|  for (var i = 0; i < 25; i++) {
 | 
| @@ -98,7 +98,6 @@ for (var i = 5; i < 25; i++) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -
 | 
|  // Keep creating strings to to force allocation failure on substring creation.
 | 
|  var x = "0123456789ABCDEF";
 | 
|  x += x;  // 2^5
 | 
| @@ -135,3 +134,65 @@ for (var i = 0; i < 10000; i++) {
 | 
|    assertEquals(xl - (i % xl), z.length);
 | 
|    cache.push(z);
 | 
|  }
 | 
| +
 | 
| +// Substring of substring.
 | 
| +var cache = [];
 | 
| +var last = x;
 | 
| +var offset = 0;
 | 
| +for (var i = 0; i < 64; i++) {
 | 
| +  var z = last.substring(i);
 | 
| +  last = z;
 | 
| +  cache.push(z);
 | 
| +  offset += i;
 | 
| +}
 | 
| +for (var i = 63; i >= 0; i--) {
 | 
| +  var z = cache.pop();
 | 
| +  assertTrue(/\u2028123456789ABCDEF/.test(z));
 | 
| +  assertEquals(xl - offset, z.length);
 | 
| +  offset -= i;
 | 
| +}
 | 
| +
 | 
| +// Test charAt for different strings.
 | 
| +function f(s1, s2, s3, i) {
 | 
| +  assertEquals(String.fromCharCode(97+i%11), s1.charAt(i%11));
 | 
| +  assertEquals(String.fromCharCode(97+i%11), s2.charAt(i%11));
 | 
| +  assertEquals(String.fromCharCode(98+i%11), s3.charAt(i%11));
 | 
| +  assertEquals(String.fromCharCode(101), s3.charAt(3));
 | 
| +}
 | 
| +
 | 
| +flat = "abcdefghijkl12345";
 | 
| +cons = flat + flat.toUpperCase();
 | 
| +slice = "abcdefghijklmn12345".slice(1, -1);
 | 
| +for ( var i = 0; i < 1000; i++) {
 | 
| +  f(flat, cons, slice, i);
 | 
| +}
 | 
| +flat = "abcdefghijkl1\u20232345";
 | 
| +cons = flat + flat.toUpperCase();
 | 
| +slice = "abcdefghijklmn1\u20232345".slice(1, -1);
 | 
| +for ( var i = 0; i < 1000; i++) {
 | 
| +  f(flat, cons, slice, i);
 | 
| +}
 | 
| +
 | 
| +// Concatenate substrings.
 | 
| +var ascii = 'abcdefghijklmnop';
 | 
| +var utf = '\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB';
 | 
| +assertEquals("klmno", ascii.substring(10,15) + ascii.substring(16));
 | 
| +assertEquals("\u03B4\u03B7", utf.substring(3,4) + utf.substring(6,7));
 | 
| +assertEquals("klp", ascii.substring(10,12) + ascii.substring(15,16));
 | 
| +assertEquals("\u03B1\u03B4\u03B5", utf.substring(0,1) + utf.substring(5,3));
 | 
| +assertEquals("", ascii.substring(16) + utf.substring(16));
 | 
| +assertEquals("bcdef\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9",
 | 
| +    ascii.substring(1,6) + utf.substring(3,9));
 | 
| +assertEquals("\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9abcdefghijklmnop",
 | 
| +    utf.substring(3,9) + ascii);
 | 
| +assertEquals("\u03B2\u03B3\u03B4\u03B5\u03B4\u03B5\u03B6\u03B7",
 | 
| +    utf.substring(5,1) + utf.substring(3,7));
 | 
| +
 | 
| +/*
 | 
| +// Externalizing strings.
 | 
| +var a = "123456789qwertyuiopasdfghjklzxcvbnm";
 | 
| +var b = a.slice(1,-1);
 | 
| +assertEquals(a.slice(1,-1), b);
 | 
| +externalizeString(a);
 | 
| +assertEquals(a.slice(1,-1), b);
 | 
| +*/
 | 
| 
 |