Revision: 20572
Author:   [email protected]
Date:     Tue Apr  8 09:49:49 2014 UTC
Log:      Implement handlified String::Flatten.

[email protected]

Review URL: https://codereview.chromium.org/228093004
http://code.google.com/p/v8/source/detail?r=20572

Modified:
 /branches/bleeding_edge/src/api.cc
 /branches/bleeding_edge/src/factory.cc
 /branches/bleeding_edge/src/handles.cc
 /branches/bleeding_edge/src/handles.h
 /branches/bleeding_edge/src/hydrogen.cc
 /branches/bleeding_edge/src/json-parser.h
 /branches/bleeding_edge/src/json-stringifier.h
 /branches/bleeding_edge/src/jsregexp.cc
 /branches/bleeding_edge/src/liveedit.cc
 /branches/bleeding_edge/src/messages.cc
 /branches/bleeding_edge/src/objects-debug.cc
 /branches/bleeding_edge/src/objects-inl.h
 /branches/bleeding_edge/src/objects.cc
 /branches/bleeding_edge/src/objects.h
 /branches/bleeding_edge/src/parser.cc
 /branches/bleeding_edge/src/runtime.cc
 /branches/bleeding_edge/test/cctest/test-api.cc
 /branches/bleeding_edge/test/cctest/test-strings.cc

=======================================
--- /branches/bleeding_edge/src/api.cc  Tue Apr  8 07:04:13 2014 UTC
+++ /branches/bleeding_edge/src/api.cc  Tue Apr  8 09:49:49 2014 UTC
@@ -2312,8 +2312,8 @@
   EnsureInitializedForIsolate(isolate, "v8::JSON::Parse");
   ENTER_V8(isolate);
   i::HandleScope scope(isolate);
-  i::Handle<i::String> source = i::Handle<i::String>(
-      FlattenGetString(Utils::OpenHandle(*json_string)));
+  i::Handle<i::String> source =
+      i::String::Flatten(Utils::OpenHandle(*json_string));
   EXCEPTION_PREAMBLE(isolate);
   i::MaybeHandle<i::Object> maybe_result =
       source->IsSeqOneByteString() ? i::JsonParser<true>::Parse(source)
@@ -4676,7 +4676,7 @@
   ENTER_V8(isolate);
   i::Handle<i::String> str = Utils::OpenHandle(this);
   if (options & HINT_MANY_WRITES_EXPECTED) {
-    FlattenString(str);  // Flatten the string for efficiency.
+    str = i::String::Flatten(str);  // Flatten the string for efficiency.
   }
   const int string_length = str->length();
   bool write_null = !(options & NO_NULL_TERMINATION);
@@ -4711,7 +4711,7 @@
     }
   }
   // Recursive slow path can potentially be unreasonable slow. Flatten.
-  str = FlattenGetString(str);
+  str = i::String::Flatten(str);
   Utf8WriterVisitor writer(buffer, capacity, false, replace_invalid_utf8);
   i::String::VisitFlat(&writer, *str);
   return writer.CompleteWrite(write_null, nchars_ref);
@@ -4733,7 +4733,7 @@
   if (options & String::HINT_MANY_WRITES_EXPECTED) {
     // Flatten the string for efficiency.  This applies whether we are
     // using StringCharacterStream or Get(i) to access the characters.
-    FlattenString(str);
+    str = i::String::Flatten(str);
   }
   int end = start + length;
   if ((length == -1) || (length > str->length() - start) )
=======================================
--- /branches/bleeding_edge/src/factory.cc      Tue Apr  8 06:45:53 2014 UTC
+++ /branches/bleeding_edge/src/factory.cc      Tue Apr  8 09:49:49 2014 UTC
@@ -529,7 +529,7 @@
     str = Handle<String>(slice->parent(), isolate());
     offset += slice->offset();
   } else {
-    str = FlattenGetString(str);
+    str = String::Flatten(str);
   }

   ASSERT(str->IsSeqString() || str->IsExternalString());
=======================================
--- /branches/bleeding_edge/src/handles.cc      Tue Apr  8 07:04:13 2014 UTC
+++ /branches/bleeding_edge/src/handles.cc      Tue Apr  8 09:49:49 2014 UTC
@@ -132,16 +132,6 @@
constructor->GetHeap()->ReinitializeJSGlobalProxy(*constructor, *global),
       JSGlobalProxy);
 }
-
-
-void FlattenString(Handle<String> string) {
-  CALL_HEAP_FUNCTION_VOID(string->GetIsolate(), string->TryFlatten());
-}
-
-
-Handle<String> FlattenGetString(Handle<String> string) {
-  CALL_HEAP_FUNCTION(string->GetIsolate(), string->TryFlatten(), String);
-}


 Handle<Object> GetProperty(Handle<JSReceiver> obj,
@@ -262,7 +252,7 @@

 Handle<FixedArray> CalculateLineEnds(Handle<String> src,
                                      bool with_last_line) {
-  src = FlattenGetString(src);
+  src = String::Flatten(src);
   // Rough estimate of line count based on a roughly estimated average
   // length of (unpacked) code.
   int line_count_estimate = src->length() >> 4;
=======================================
--- /branches/bleeding_edge/src/handles.h       Tue Apr  8 07:04:13 2014 UTC
+++ /branches/bleeding_edge/src/handles.h       Tue Apr  8 09:49:49 2014 UTC
@@ -287,13 +287,6 @@
 // an object of expected type, or the handle is an error if running out
 // of space or encountering an internal error.

-// Flattens a string.
-void FlattenString(Handle<String> str);
-
-// Flattens a string and returns the underlying external or sequential
-// string.
-Handle<String> FlattenGetString(Handle<String> str);
-
 Handle<Object> GetProperty(Handle<JSReceiver> obj, const char* name);

 // Get the JS object corresponding to the given script; create it
=======================================
--- /branches/bleeding_edge/src/hydrogen.cc     Fri Apr  4 12:06:11 2014 UTC
+++ /branches/bleeding_edge/src/hydrogen.cc     Tue Apr  8 09:49:49 2014 UTC
@@ -4929,7 +4929,7 @@
           Handle<Object> constant_object = cell->type()->AsConstant();
           if (constant_object->IsConsString()) {
             constant_object =
-                FlattenGetString(Handle<String>::cast(constant_object));
+                String::Flatten(Handle<String>::cast(constant_object));
           }
           HConstant* constant = New<HConstant>(constant_object);
           return ast_context()->ReturnInstruction(constant, expr->id());
=======================================
--- /branches/bleeding_edge/src/json-parser.h   Tue Apr  8 07:04:13 2014 UTC
+++ /branches/bleeding_edge/src/json-parser.h   Tue Apr  8 09:49:49 2014 UTC
@@ -59,7 +59,7 @@
         object_constructor_(isolate_->native_context()->object_function(),
                             isolate_),
         position_(-1) {
-    FlattenString(source_);
+    source_ = String::Flatten(source_);
pretenure_ = (source_length_ >= kPretenureTreshold) ? TENURED : NOT_TENURED;

     // Optimized fast case where we only have ASCII characters.
=======================================
--- /branches/bleeding_edge/src/json-stringifier.h Fri Apr 4 12:25:45 2014 UTC +++ /branches/bleeding_edge/src/json-stringifier.h Tue Apr 8 09:49:49 2014 UTC
@@ -305,7 +305,7 @@
     return stringifier.Stringify(object);
   }

-  FlattenString(object);
+  object = String::Flatten(object);
   ASSERT(object->IsFlat());
   if (object->IsOneByteRepresentationUnderneath()) {
     Handle<String> result = isolate->factory()->NewRawOneByteString(
@@ -873,7 +873,7 @@


 void BasicJsonStringifier::SerializeString(Handle<String> object) {
-  object = FlattenGetString(object);
+  object = String::Flatten(object);
   if (is_ascii_) {
     if (object->IsOneByteRepresentationUnderneath()) {
       SerializeString_<true, uint8_t>(object);
=======================================
--- /branches/bleeding_edge/src/jsregexp.cc     Tue Mar 25 09:51:13 2014 UTC
+++ /branches/bleeding_edge/src/jsregexp.cc     Tue Apr  8 09:49:49 2014 UTC
@@ -184,7 +184,7 @@
     re->set_data(*cached);
     return re;
   }
-  pattern = FlattenGetString(pattern);
+  pattern = String::Flatten(pattern);
   PostponeInterruptsScope postpone(isolate);
   RegExpCompileData parse_result;
   FlatStringReader reader(isolate, pattern);
@@ -290,7 +290,7 @@
   ASSERT(0 <= index);
   ASSERT(index <= subject->length());

-  if (!subject->IsFlat()) FlattenString(subject);
+  subject = String::Flatten(subject);
   DisallowHeapAllocation no_gc;  // ensure vectors stay valid

String* needle = String::cast(regexp->DataAt(JSRegExp::kAtomPatternIndex));
@@ -439,7 +439,7 @@
   JSRegExp::Flags flags = re->GetFlags();

   Handle<String> pattern(re->Pattern());
-  if (!pattern->IsFlat()) FlattenString(pattern);
+  pattern = String::Flatten(pattern);
   RegExpCompileData compile_data;
   FlatStringReader reader(isolate, pattern);
   if (!RegExpParser::ParseRegExp(&reader, flags.is_multiline(),
@@ -528,7 +528,7 @@

 int RegExpImpl::IrregexpPrepare(Handle<JSRegExp> regexp,
                                 Handle<String> subject) {
-  if (!subject->IsFlat()) FlattenString(subject);
+  subject = String::Flatten(subject);

   // Check the asciiness of the underlying storage.
   bool is_ascii = subject->IsOneByteRepresentationUnderneath();
@@ -6015,7 +6015,7 @@
   // Sample some characters from the middle of the string.
   static const int kSampleSize = 128;

-  FlattenString(sample_subject);
+  sample_subject = String::Flatten(sample_subject);
   int chars_sampled = 0;
   int half_way = (sample_subject->length() - kSampleSize) / 2;
   for (int i = Max(0, half_way);
=======================================
--- /branches/bleeding_edge/src/liveedit.cc     Tue Apr  8 09:44:24 2014 UTC
+++ /branches/bleeding_edge/src/liveedit.cc     Tue Apr  8 09:49:49 2014 UTC
@@ -582,8 +582,8 @@

 Handle<JSArray> LiveEdit::CompareStrings(Handle<String> s1,
                                          Handle<String> s2) {
-  s1 = FlattenGetString(s1);
-  s2 = FlattenGetString(s2);
+  s1 = String::Flatten(s1);
+  s2 = String::Flatten(s2);

   LineEndsWrapper line_ends1(s1);
   LineEndsWrapper line_ends2(s2);
=======================================
--- /branches/bleeding_edge/src/messages.cc     Tue Apr  8 09:44:24 2014 UTC
+++ /branches/bleeding_edge/src/messages.cc     Tue Apr  8 09:49:49 2014 UTC
@@ -180,7 +180,7 @@
   // here to improve the efficiency of converting it to a C string and
// other operations that are likely to take place (see GetLocalizedMessage
   // for example).
-  FlattenString(result_string);
+  result_string = String::Flatten(result_string);
   return result_string;
 }

=======================================
--- /branches/bleeding_edge/src/objects-debug.cc Mon Apr 7 09:41:13 2014 UTC +++ /branches/bleeding_edge/src/objects-debug.cc Tue Apr 8 09:49:49 2014 UTC
@@ -522,6 +522,7 @@
   CHECK(this->second() == GetHeap()->empty_string() ||
         this->second()->IsString());
   CHECK(this->length() >= ConsString::kMinLength);
+ CHECK(this->length() == this->first()->length() + this->second()->length());
   if (this->IsFlat()) {
     // A flat cons can only be created by String::SlowTryFlatten.
     // Afterwards, the first part may be externalized.
=======================================
--- /branches/bleeding_edge/src/objects-inl.h   Mon Apr  7 10:00:14 2014 UTC
+++ /branches/bleeding_edge/src/objects-inl.h   Tue Apr  8 09:49:49 2014 UTC
@@ -3029,6 +3029,14 @@
   }
   return SlowEquals(other);
 }
+
+
+Handle<String> String::Flatten(Handle<String> string, PretenureFlag pretenure) {
+  if (!string->IsConsString()) return string;
+  Handle<ConsString> cons = Handle<ConsString>::cast(string);
+  if (cons->IsFlat()) return handle(cons->first());
+  return SlowFlatten(cons, pretenure);
+}


 MaybeObject* String::TryFlatten(PretenureFlag pretenure) {
=======================================
--- /branches/bleeding_edge/src/objects.cc      Tue Apr  8 09:36:04 2014 UTC
+++ /branches/bleeding_edge/src/objects.cc      Tue Apr  8 09:49:49 2014 UTC
@@ -1180,6 +1180,34 @@
   }
   return false;
 }
+
+
+Handle<String> String::SlowFlatten(Handle<ConsString> cons,
+                                   PretenureFlag pretenure) {
+  ASSERT(AllowHeapAllocation::IsAllowed());
+  ASSERT(cons->second()->length() != 0);
+  Isolate* isolate = cons->GetIsolate();
+  int length = cons->length();
+  PretenureFlag tenure = isolate->heap()->InNewSpace(*cons) ? pretenure
+                                                            : TENURED;
+  Handle<SeqString> result;
+  if (cons->IsOneByteRepresentation()) {
+ Handle<SeqOneByteString> flat = isolate->factory()->NewRawOneByteString(
+        length, tenure).ToHandleChecked();
+    DisallowHeapAllocation no_gc;
+    WriteToFlat(*cons, flat->GetChars(), 0, length);
+    result = flat;
+  } else {
+ Handle<SeqTwoByteString> flat = isolate->factory()->NewRawTwoByteString(
+        length, tenure).ToHandleChecked();
+    DisallowHeapAllocation no_gc;
+    WriteToFlat(*cons, flat->GetChars(), 0, length);
+    result = flat;
+  }
+  cons->set_first(*result);
+  cons->set_second(isolate->heap()->empty_string());
+  return result;
+}


 MaybeObject* String::SlowTryFlatten(PretenureFlag pretenure) {
@@ -6388,7 +6416,7 @@
   AssertNoContextChange ncc(isolate);

   // Try to flatten before operating on the string.
-  if (name->IsString()) String::cast(*name)->TryFlatten();
+  if (name->IsString()) name = String::Flatten(Handle<String>::cast(name));

   if (!JSObject::CanSetCallback(object, name)) return;

@@ -6576,7 +6604,7 @@
   AssertNoContextChange ncc(isolate);

   // Try to flatten before operating on the string.
-  if (name->IsString()) FlattenString(Handle<String>::cast(name));
+  if (name->IsString()) name = String::Flatten(Handle<String>::cast(name));

   if (!JSObject::CanSetCallback(object, name)) {
     return factory->undefined_value();
=======================================
--- /branches/bleeding_edge/src/objects.h       Tue Apr  8 07:04:13 2014 UTC
+++ /branches/bleeding_edge/src/objects.h       Tue Apr  8 09:49:49 2014 UTC
@@ -9005,6 +9005,13 @@
   // string.
inline String* TryFlattenGetString(PretenureFlag pretenure = NOT_TENURED);

+  static inline Handle<String> Flatten(Handle<String> string,
+ PretenureFlag pretenure = NOT_TENURED);
+
+  static Handle<String> SlowFlatten(Handle<ConsString> cons,
+                                    PretenureFlag tenure);
+
+
// Tries to return the content of a flat string as a structure holding either
   // a flat vector of char or of uc16.
   // If the string isn't flat, and therefore doesn't have flat content, the
=======================================
--- /branches/bleeding_edge/src/parser.cc       Thu Apr  3 12:30:37 2014 UTC
+++ /branches/bleeding_edge/src/parser.cc       Tue Apr  8 09:49:49 2014 UTC
@@ -859,7 +859,7 @@
     (*cached_data_)->Initialize();
   }

-  source->TryFlatten();
+  source = String::Flatten(source);
   FunctionLiteral* result;
   if (source->IsExternalTwoByteString()) {
     // Notice that the stream is destroyed at the end of the branch block.
@@ -998,7 +998,7 @@
   Handle<SharedFunctionInfo> shared_info = info()->shared_info();

   // Initialize parser state.
-  source->TryFlatten();
+  source = String::Flatten(source);
   FunctionLiteral* result;
   if (source->IsExternalTwoByteString()) {
     ExternalTwoByteStringUtf16CharacterStream stream(
=======================================
--- /branches/bleeding_edge/src/runtime.cc      Tue Apr  8 09:44:24 2014 UTC
+++ /branches/bleeding_edge/src/runtime.cc      Tue Apr  8 09:49:49 2014 UTC
@@ -3238,20 +3238,16 @@


 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_StringCharCodeAt) {
-  SealHandleScope shs(isolate);
+  HandleScope handle_scope(isolate);
   ASSERT(args.length() == 2);

-  CONVERT_ARG_CHECKED(String, subject, 0);
+  CONVERT_ARG_HANDLE_CHECKED(String, subject, 0);
   CONVERT_NUMBER_CHECKED(uint32_t, i, Uint32, args[1]);

   // Flatten the string.  If someone wants to get a char at an index
   // in a cons string, it is likely that more indices will be
   // accessed.
-  Object* flat;
-  { MaybeObject* maybe_flat = subject->TryFlatten();
-    if (!maybe_flat->ToObject(&flat)) return maybe_flat;
-  }
-  subject = String::cast(flat);
+  subject = String::Flatten(subject);

   if (i >= static_cast<uint32_t>(subject->length())) {
     return isolate->heap()->nan_value();
@@ -4210,7 +4206,7 @@

   ASSERT(regexp->GetFlags().is_global());

-  if (!subject->IsFlat()) subject = FlattenGetString(subject);
+  subject = String::Flatten(subject);

   if (replacement->length() == 0) {
     if (subject->HasOnlyOneByteChars()) {
@@ -4222,7 +4218,7 @@
     }
   }

-  if (!replacement->IsFlat()) replacement = FlattenGetString(replacement);
+  replacement = String::Flatten(replacement);

   return StringReplaceGlobalRegExpWithString(
       isolate, subject, regexp, replacement, last_match_info);
@@ -4296,7 +4292,7 @@
   }
   if (isolate->has_pending_exception()) return Failure::Exception();

-  subject = FlattenGetString(subject);
+  subject = String::Flatten(subject);
   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
       isolate, result,
       StringReplaceOneCharWithString(
@@ -4321,8 +4317,8 @@
   int subject_length = sub->length();
   if (start_index + pattern_length > subject_length) return -1;

-  if (!sub->IsFlat()) FlattenString(sub);
-  if (!pat->IsFlat()) FlattenString(pat);
+  sub = String::Flatten(sub);
+  pat = String::Flatten(pat);

   DisallowHeapAllocation no_gc;  // ensure vectors stay valid
// Extract flattened substrings of cons strings before determining asciiness.
@@ -4432,8 +4428,8 @@
     return Smi::FromInt(start_index);
   }

-  if (!sub->IsFlat()) FlattenString(sub);
-  if (!pat->IsFlat()) FlattenString(pat);
+  sub = String::Flatten(sub);
+  pat = String::Flatten(pat);

   int position = -1;
   DisallowHeapAllocation no_gc;  // ensure vectors stay valid
@@ -4758,11 +4754,11 @@
   ASSERT(args.length() == 4);

   CONVERT_ARG_HANDLE_CHECKED(String, subject, 1);
-  if (!subject->IsFlat()) FlattenString(subject);
   CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0);
   CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 2);
   CONVERT_ARG_HANDLE_CHECKED(JSArray, result_array, 3);

+  subject = String::Flatten(subject);
   ASSERT(regexp->GetFlags().is_global());

   if (regexp->CaptureCount() == 0) {
@@ -4876,9 +4872,9 @@
 // string->Get(index).
 static Handle<Object> GetCharAt(Handle<String> string, uint32_t index) {
   if (index < static_cast<uint32_t>(string->length())) {
-    string->TryFlatten();
- return string->GetIsolate()->factory()->LookupSingleCharacterStringFromCode(
-        string->Get(index));
+    Factory* factory = string->GetIsolate()->factory();
+    return factory->LookupSingleCharacterStringFromCode(
+        String::Flatten(string)->Get(index));
   }
   return Execution::CharAt(string, index);
 }
@@ -5310,7 +5306,7 @@
       return JSObject::SetElement(js_object, index, value, attr,
                                   strict_mode, true, set_mode);
     } else {
-      if (name->IsString()) Handle<String>::cast(name)->TryFlatten();
+ if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode);
     }
   }
@@ -5360,9 +5356,9 @@
       return JSObject::SetElement(js_object, index, value, attr,
                                   SLOPPY, false, DEFINE_PROPERTY);
     } else {
-      if (name->IsString()) Handle<String>::cast(name)->TryFlatten();
-      return JSObject::SetLocalPropertyIgnoreAttributes(js_object, name,
-                                                        value, attr);
+ if (name->IsString()) name = String::Flatten(Handle<String>::cast(name));
+      return JSObject::SetLocalPropertyIgnoreAttributes(
+          js_object, name, value, attr);
     }
   }

@@ -5415,7 +5411,7 @@
     name = Handle<String>::cast(converted);
   }

-  if (name->IsString()) Handle<String>::cast(name)->TryFlatten();
+  if (name->IsString()) name = String::Flatten(Handle<String>::cast(name));
   return JSReceiver::DeleteProperty(receiver, name, mode);
 }

@@ -6263,7 +6259,7 @@
   HandleScope scope(isolate);
   ASSERT(args.length() == 1);
   CONVERT_ARG_HANDLE_CHECKED(String, source, 0);
-  Handle<String> string = FlattenGetString(source);
+  Handle<String> string = String::Flatten(source);
   ASSERT(string->IsFlat());
   Handle<String> result;
   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
@@ -6279,7 +6275,7 @@
   HandleScope scope(isolate);
   ASSERT(args.length() == 1);
   CONVERT_ARG_HANDLE_CHECKED(String, source, 0);
-  Handle<String> string = FlattenGetString(source);
+  Handle<String> string = String::Flatten(source);
   ASSERT(string->IsFlat());
   Handle<String> result;
   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
@@ -6573,7 +6569,7 @@
     unibrow::Mapping<Converter, 128>* mapping) {
   HandleScope handle_scope(isolate);
   CONVERT_ARG_HANDLE_CHECKED(String, s, 0);
-  s = FlattenGetString(s);
+  s = String::Flatten(s);
   int length = s->length();
   // Assume that the string is not empty; we need this assumption later
   if (length == 0) return *s;
@@ -6647,7 +6643,7 @@
   CONVERT_BOOLEAN_ARG_CHECKED(trimLeft, 1);
   CONVERT_BOOLEAN_ARG_CHECKED(trimRight, 2);

-  string = FlattenGetString(string);
+  string = String::Flatten(string);
   int length = string->length();

   int left = 0;
@@ -6703,7 +6699,8 @@
   // isn't empty, we can never create more parts than ~half the length
   // of the subject.

-  if (!subject->IsFlat()) FlattenString(subject);
+  subject = String::Flatten(subject);
+  pattern = String::Flatten(pattern);

   static const int kMaxInitialListCapacity = 16;

@@ -6712,7 +6709,6 @@
   // Find (up to limit) indices of separator and end-of-string in subject
   int initial_capacity = Min<uint32_t>(kMaxInitialListCapacity, limit);
   ZoneList<int> indices(initial_capacity, zone_scope.zone());
-  if (!pattern->IsFlat()) FlattenString(pattern);

   FindStringIndicesDispatch(isolate, *subject, *pattern,
                             &indices, limit, zone_scope.zone());
@@ -6803,7 +6799,7 @@
   CONVERT_ARG_HANDLE_CHECKED(String, s, 0);
   CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]);

-  s = FlattenGetString(s);
+  s = String::Flatten(s);
   const int length = static_cast<int>(Min<uint32_t>(s->length(), limit));

   Handle<FixedArray> elements;
@@ -7677,7 +7673,7 @@


 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_StringCompare) {
-  SealHandleScope shs(isolate);
+  HandleScope shs(isolate);
   ASSERT(args.length() == 2);

   CONVERT_ARG_CHECKED(String, x, 0);
@@ -9651,15 +9647,13 @@
 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateParseString) {
   HandleScope scope(isolate);
   ASSERT(args.length() == 2);
-
   CONVERT_ARG_HANDLE_CHECKED(String, str, 0);
-  FlattenString(str);
-
   CONVERT_ARG_HANDLE_CHECKED(JSArray, output, 1);

   JSObject::EnsureCanContainHeapObjectElements(output);
   RUNTIME_ASSERT(output->HasFastObjectElements());

+  str = String::Flatten(str);
   DisallowHeapAllocation no_gc;

   FixedArray* output_array = FixedArray::cast(output->elements());
@@ -9752,7 +9746,7 @@
   ASSERT_EQ(1, args.length());
   CONVERT_ARG_HANDLE_CHECKED(String, source, 0);

-  source = Handle<String>(FlattenGetString(source));
+  source = String::Flatten(source);
   // Optimized fast case where we only have ASCII characters.
   Handle<Object> result;
   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
@@ -14578,8 +14572,7 @@
   HandleScope scope(isolate);
   ASSERT(args.length() == 1);
   CONVERT_ARG_HANDLE_CHECKED(String, str, 0);
-  FlattenString(str);
-  return isolate->heap()->undefined_value();
+  return *String::Flatten(str);
 }


=======================================
--- /branches/bleeding_edge/test/cctest/test-api.cc Tue Apr 8 07:04:13 2014 UTC +++ /branches/bleeding_edge/test/cctest/test-api.cc Tue Apr 8 09:49:49 2014 UTC
@@ -7589,7 +7589,7 @@
   int len = str->Utf8Length();
   if (len < 0) {
     i::Handle<i::String> istr(v8::Utils::OpenHandle(*str));
-    i::FlattenString(istr);
+    i::String::Flatten(istr);
     len = str->Utf8Length();
   }
   return len;
@@ -18935,8 +18935,7 @@
   int length = string->length();
   CHECK(string->IsOneByteRepresentation());

-  FlattenString(string);
-  i::Handle<i::String> flat_string = FlattenGetString(string);
+  i::Handle<i::String> flat_string = i::String::Flatten(string);

   CHECK(string->IsOneByteRepresentation());
   CHECK(flat_string->IsOneByteRepresentation());
=======================================
--- /branches/bleeding_edge/test/cctest/test-strings.cc Thu Apr 3 12:41:37 2014 UTC +++ /branches/bleeding_edge/test/cctest/test-strings.cc Tue Apr 8 09:49:49 2014 UTC
@@ -452,7 +452,7 @@
   // Special work needed for flat string.
   if (flat) {
     data->stats_.empty_leaves_++;
-    FlattenString(root);
+    String::Flatten(root);
     CHECK(root->IsConsString() && root->IsFlat());
   }
   return root;
@@ -573,7 +573,7 @@
   v8::HandleScope scope(CcTest::isolate());
   ConsStringGenerationData data(false);
   Handle<String> flat = ConstructBalanced(&data);
-  FlattenString(flat);
+  String::Flatten(flat);
   Handle<String> left_asymmetric = ConstructLeft(&data, DEEP_DEPTH);
   Handle<String> right_asymmetric = ConstructRight(&data, DEEP_DEPTH);
   Handle<String> symmetric = ConstructBalanced(&data);
@@ -593,19 +593,19 @@
   printf("6\n");
   TraverseFirst(left_asymmetric, right_deep_asymmetric, 65536);
   printf("7\n");
-  FlattenString(left_asymmetric);
+  String::Flatten(left_asymmetric);
   printf("10\n");
   Traverse(flat, left_asymmetric);
   printf("11\n");
-  FlattenString(right_asymmetric);
+  String::Flatten(right_asymmetric);
   printf("12\n");
   Traverse(flat, right_asymmetric);
   printf("14\n");
-  FlattenString(symmetric);
+  String::Flatten(symmetric);
   printf("15\n");
   Traverse(flat, symmetric);
   printf("16\n");
-  FlattenString(left_deep_asymmetric);
+  String::Flatten(left_deep_asymmetric);
   printf("18\n");
 }

@@ -670,7 +670,7 @@
     ConsStringStats flat_string_stats;
     AccumulateStats(flat_string, &flat_string_stats);
     // Flatten string.
-    FlattenString(flat_string);
+    String::Flatten(flat_string);
     // Build unflattened version of cons string to test.
     Handle<String> cons_string = build(i, &data);
     ConsStringStats cons_string_stats;
@@ -725,7 +725,7 @@
         Handle<String> string =
             factory->NewConsString(data->block(0), data->block(1))
                 .ToHandleChecked();
-        FlattenString(string);
+        String::Flatten(string);
         return string;
       }
     case 7:
@@ -740,7 +740,7 @@
         Handle<String> left =
             factory->NewConsString(data->block(0), data->block(1))
                 .ToHandleChecked();
-        FlattenString(left);
+        String::Flatten(left);
return factory->NewConsString(left, data->block(2)).ToHandleChecked();
       }
     case 8:
@@ -757,11 +757,11 @@
         Handle<String> left =
             factory->NewConsString(data->block(0), data->block(1))
                 .ToHandleChecked();
-        FlattenString(left);
+        String::Flatten(left);
         Handle<String> right =
             factory->NewConsString(data->block(2), data->block(2))
                 .ToHandleChecked();
-        FlattenString(right);
+        String::Flatten(right);
         return factory->NewConsString(left, right).ToHandleChecked();
       }
   }
@@ -878,7 +878,7 @@
   }
   Handle<String> flat_string =
       factory->NewConsString(string, foo_string).ToHandleChecked();
-  FlattenString(flat_string);
+  String::Flatten(flat_string);

   for (int i = 0; i < 500; i++) {
     TraverseFirst(flat_string, string, DEEP_ASCII_DEPTH);

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to