// 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);
