From 6a806b9917cf39c8ed24a2ec0287b9f929839a3f Mon Sep 17 00:00:00 2001 From: "yangguo@chromium.org" Date: Thu, 23 May 2013 13:53:49 +0000 Subject: [PATCH] Add asserts to String::GetFlatContent. R=verwaest@chromium.org BUG= Review URL: https://chromiumcodereview.appspot.com/13841012 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14776 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/json-stringifier.h | 23 ++++++++++++----------- src/objects.cc | 5 +++++ src/runtime.cc | 20 +++++++++++--------- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/json-stringifier.h b/src/json-stringifier.h index b67a9f6..f548a2e 100644 --- a/src/json-stringifier.h +++ b/src/json-stringifier.h @@ -773,9 +773,16 @@ void BasicJsonStringifier::SerializeString_(Handle string) { length); } } else { - String* string_location = *string; - Vector vector = GetCharVector(string); + String* string_location = NULL; + Vector vector(NULL, 0); for (int i = 0; i < length; i++) { + // If GC moved the string, we need to refresh the vector. + if (*string != string_location) { + AssertNoAllocation no_gc; + // This does not actually prevent the string from being relocated later. + vector = GetCharVector(string); + string_location = *string; + } Char c = vector[i]; if (DoNotEscape(c)) { Append_(c); @@ -783,11 +790,6 @@ void BasicJsonStringifier::SerializeString_(Handle string) { Append_(reinterpret_cast( &JsonEscapeTable[c * kJsonEscapeTableEntrySize])); } - // If GC moved the string, we need to refresh the vector. - if (*string != string_location) { - vector = GetCharVector(string); - string_location = *string; - } } } @@ -825,17 +827,16 @@ Vector BasicJsonStringifier::GetCharVector(Handle string) { void BasicJsonStringifier::SerializeString(Handle object) { - FlattenString(object); - String::FlatContent flat = object->GetFlatContent(); + object = FlattenGetString(object); if (is_ascii_) { - if (flat.IsAscii()) { + if (object->IsOneByteRepresentation()) { SerializeString_(object); } else { ChangeEncoding(); SerializeString(object); } } else { - if (flat.IsAscii()) { + if (object->IsOneByteRepresentation()) { SerializeString_(object); } else { SerializeString_(object); diff --git a/src/objects.cc b/src/objects.cc index 40b8dfb..99fd8e2 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -7841,6 +7841,7 @@ bool String::LooksValid() { String::FlatContent String::GetFlatContent() { + ASSERT(!GetHeap()->allow_allocation(false)); int length = this->length(); StringShape shape(this); String* string = this; @@ -8067,6 +8068,8 @@ void FlatStringReader::PostGarbageCollection() { if (str_ == NULL) return; Handle str(str_); ASSERT(str->IsFlat()); + AssertNoAllocation no_gc; + // This does not actually prevent the vector from being relocated later. String::FlatContent content = str->GetFlatContent(); ASSERT(content.IsFlat()); is_ascii_ = content.IsAscii(); @@ -8618,6 +8621,7 @@ bool String::IsUtf8EqualTo(Vector str, bool allow_prefix_match) { bool String::IsOneByteEqualTo(Vector str) { int slen = length(); if (str.length() != slen) return false; + AssertNoAllocation no_gc; FlatContent content = GetFlatContent(); if (content.IsAscii()) { return CompareChars(content.ToOneByteVector().start(), @@ -8633,6 +8637,7 @@ bool String::IsOneByteEqualTo(Vector str) { bool String::IsTwoByteEqualTo(Vector str) { int slen = length(); if (str.length() != slen) return false; + AssertNoAllocation no_gc; FlatContent content = GetFlatContent(); if (content.IsTwoByte()) { return CompareChars(content.ToUC16Vector().start(), str.start(), slen) == 0; diff --git a/src/runtime.cc b/src/runtime.cc index 36cd206..1d0d262 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -5663,11 +5663,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_URIEscape) { ASSERT(args.length() == 1); CONVERT_ARG_HANDLE_CHECKED(String, source, 0); Handle string = FlattenGetString(source); - String::FlatContent content = string->GetFlatContent(); - ASSERT(content.IsFlat()); - Handle result = - content.IsAscii() ? URIEscape::Escape(isolate, source) - : URIEscape::Escape(isolate, source); + ASSERT(string->IsFlat()); + Handle result = string->IsOneByteRepresentationUnderneath() + ? URIEscape::Escape(isolate, source) + : URIEscape::Escape(isolate, source); if (result.is_null()) return Failure::OutOfMemoryException(0x12); return *result; } @@ -5678,10 +5677,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_URIUnescape) { ASSERT(args.length() == 1); CONVERT_ARG_HANDLE_CHECKED(String, source, 0); Handle string = FlattenGetString(source); - String::FlatContent content = string->GetFlatContent(); - ASSERT(content.IsFlat()); - return content.IsAscii() ? *URIUnescape::Unescape(isolate, source) - : *URIUnescape::Unescape(isolate, source); + ASSERT(string->IsFlat()); + return string->IsOneByteRepresentationUnderneath() + ? *URIUnescape::Unescape(isolate, source) + : *URIUnescape::Unescape(isolate, source); } @@ -6210,6 +6209,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToArray) { if (!maybe_obj->ToObject(&obj)) return maybe_obj; } elements = Handle(FixedArray::cast(obj), isolate); + AssertNoAllocation no_gc; String::FlatContent content = s->GetFlatContent(); if (content.IsAscii()) { Vector chars = content.ToOneByteVector(); @@ -7076,6 +7076,7 @@ static Object* FlatStringCompare(String* x, String* y) { equal_prefix_result = Smi::FromInt(LESS); } int r; + AssertNoAllocation no_gc; String::FlatContent x_content = x->GetFlatContent(); String::FlatContent y_content = y->GetFlatContent(); if (x_content.IsAscii()) { @@ -13295,6 +13296,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Log) { ASSERT(args.length() == 2); CONVERT_ARG_CHECKED(String, format, 0); CONVERT_ARG_CHECKED(JSArray, elms, 1); + AssertNoAllocation no_gc; String::FlatContent format_content = format->GetFlatContent(); RUNTIME_ASSERT(format_content.IsAscii()); Vector chars = format_content.ToOneByteVector(); -- 2.7.4