Import Cobalt 13.102542 Change-Id: I6bda7b03a2e33edfd735efcb981e2a731696b90d
diff --git a/src/v8/test/mjsunit/thin-strings.js b/src/v8/test/mjsunit/thin-strings.js new file mode 100644 index 0000000..c867642 --- /dev/null +++ b/src/v8/test/mjsunit/thin-strings.js
@@ -0,0 +1,90 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --allow-natives-syntax + +function get_thin_string(a, b) { + var str = a + b; // Make a ConsString. + var o = {}; + o[str]; // Turn it into a ThinString. + return str; +} + +var str = get_thin_string("foo", "bar"); + +var re = /.o+ba./; +assertEquals(["foobar"], re.exec(str)); +assertEquals(["foobar"], re.exec(str)); +assertEquals(["foobar"], re.exec(str)); + +function CheckCS() { + assertEquals("o", str.substring(1, 2)); + assertEquals("f".charCodeAt(0), str.charCodeAt(0)); + assertEquals("f", str.split(/oo/)[0]); +} +CheckCS(); +%OptimizeFunctionOnNextCall(CheckCS); +CheckCS(); + +function CheckTF() { + try {} catch(e) {} // Turbofan. + assertEquals("o", str.substring(1, 2)); + assertEquals("f".charCodeAt(0), str.charCodeAt(0)); + assertEquals("f", str.split(/oo/)[0]); +} +CheckTF(); +%OptimizeFunctionOnNextCall(CheckTF); +CheckTF(); + +// Flat cons strings can point to a thin string. + +function get_cons_thin_string(a, b) { + // Make a ConsString. + var s = a + b; + // Flatten it. + s.endsWith("a"); + // Internalize the first part. + var o = {}; + o[s]; + return s; +} + +var s = get_cons_thin_string("__________", "@@@@@@@@@@a"); +s.match(/.*a/); +assertEquals("________", s.substring(0, 8)); + +function cc1(s) { + assertEquals(95, s.charCodeAt(0)); + assertEquals(95, s.codePointAt(0)); +} +cc1(s); +cc1(s); +%OptimizeFunctionOnNextCall(cc1); +cc1(s); + +// Sliced strings can have a thin string as their parent. + +function get_sliced_thin_string(a, b) { + // Make a long thin string. + var s = a + b; + // Slice a substring out of it. + var slice = s.substring(0, 20); + // Make the original string thin. + var o = {}; + o[s]; + return slice; +} + +var t = get_sliced_thin_string("abcdefghijklmnopqrstuvwxyz", + "abcdefghijklmnopqrstuvwxyz"); +assertEquals("abcdefghijklmnopqrst", decodeURI(t)); + +function cc2(s) { + assertEquals(97, s.charCodeAt(0)); + assertEquals(97, s.codePointAt(0)); +} +cc2(t); +cc2(t); +%OptimizeFunctionOnNextCall(cc2); +cc2(t);