Reviewers: Toon Verwaest,
Message:
Committed patchset #2 manually as r14776 (presubmit successful).
Description:
Add asserts to String::GetFlatContent.
[email protected]
BUG=
Committed: https://code.google.com/p/v8/source/detail?r=14776
Please review this at https://chromiumcodereview.appspot.com/13841012/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/json-stringifier.h
M src/objects.cc
M src/runtime.cc
Index: src/json-stringifier.h
diff --git a/src/json-stringifier.h b/src/json-stringifier.h
index
a154a4e99a3db613a6ddf555cec9a1762773fff4..3e8072264119df2cafa52accc5a3584dacec6b93
100644
--- a/src/json-stringifier.h
+++ b/src/json-stringifier.h
@@ -779,9 +779,16 @@ void
BasicJsonStringifier::SerializeString_(Handle<String> string) {
length);
}
} else {
- String* string_location = *string;
- Vector<const Char> vector = GetCharVector<Char>(string);
+ String* string_location = NULL;
+ Vector<const Char> 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<Char>(string);
+ string_location = *string;
+ }
Char c = vector[i];
if (DoNotEscape(c)) {
Append_<is_ascii, Char>(c);
@@ -789,11 +796,6 @@ void
BasicJsonStringifier::SerializeString_(Handle<String> string) {
Append_<is_ascii, uint8_t>(reinterpret_cast<const uint8_t*>(
&JsonEscapeTable[c * kJsonEscapeTableEntrySize]));
}
- // If GC moved the string, we need to refresh the vector.
- if (*string != string_location) {
- vector = GetCharVector<Char>(string);
- string_location = *string;
- }
}
}
@@ -831,17 +833,16 @@ Vector<const uc16>
BasicJsonStringifier::GetCharVector(Handle<String> string) {
void BasicJsonStringifier::SerializeString(Handle<String> object) {
- FlattenString(object);
- String::FlatContent flat = object->GetFlatContent();
+ object = FlattenGetString(object);
if (is_ascii_) {
- if (flat.IsAscii()) {
+ if (object->IsOneByteRepresentation()) {
SerializeString_<true, uint8_t>(object);
} else {
ChangeEncoding();
SerializeString(object);
}
} else {
- if (flat.IsAscii()) {
+ if (object->IsOneByteRepresentation()) {
SerializeString_<false, uint8_t>(object);
} else {
SerializeString_<false, uc16>(object);
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
1dc170410951f7e01238815dae3b62340e6f6721..d5e28abf8d4b8bff57aad760dc6e3c192d7fedbb
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -6880,6 +6880,7 @@ bool String::LooksValid() {
String::FlatContent String::GetFlatContent() {
+ ASSERT(!GetHeap()->allow_allocation(false));
int length = this->length();
StringShape shape(this);
String* string = this;
@@ -7106,6 +7107,8 @@ void FlatStringReader::PostGarbageCollection() {
if (str_ == NULL) return;
Handle<String> 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();
@@ -7656,6 +7659,7 @@ bool String::IsUtf8EqualTo(Vector<const char> str) {
bool String::IsOneByteEqualTo(Vector<const uint8_t> str) {
int slen = length();
if (str.length() != slen) return false;
+ AssertNoAllocation no_gc;
FlatContent content = GetFlatContent();
if (content.IsAscii()) {
return CompareChars(content.ToOneByteVector().start(),
@@ -7671,6 +7675,7 @@ bool String::IsOneByteEqualTo(Vector<const uint8_t>
str) {
bool String::IsTwoByteEqualTo(Vector<const uc16> 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;
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index
5ec33895e44d50f568edeff1b0c944fd4eff5b53..3bae87d5a4f8427431ded12014bab11b667a85b0
100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -5186,11 +5186,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_URIEscape) {
ASSERT(args.length() == 1);
CONVERT_ARG_HANDLE_CHECKED(String, source, 0);
Handle<String> string = FlattenGetString(source);
- String::FlatContent content = string->GetFlatContent();
- ASSERT(content.IsFlat());
- Handle<String> result =
- content.IsAscii() ? URIEscape::Escape<uint8_t>(isolate, source)
- : URIEscape::Escape<uc16>(isolate, source);
+ ASSERT(string->IsFlat());
+ Handle<String> result = string->IsOneByteRepresentationUnderneath()
+ ? URIEscape::Escape<uint8_t>(isolate, source)
+ : URIEscape::Escape<uc16>(isolate, source);
if (result.is_null()) return Failure::OutOfMemoryException(0x12);
return *result;
}
@@ -5201,10 +5200,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_URIUnescape)
{
ASSERT(args.length() == 1);
CONVERT_ARG_HANDLE_CHECKED(String, source, 0);
Handle<String> string = FlattenGetString(source);
- String::FlatContent content = string->GetFlatContent();
- ASSERT(content.IsFlat());
- return content.IsAscii() ? *URIUnescape::Unescape<uint8_t>(isolate,
source)
- : *URIUnescape::Unescape<uc16>(isolate, source);
+ ASSERT(string->IsFlat());
+ return string->IsOneByteRepresentationUnderneath()
+ ? *URIUnescape::Unescape<uint8_t>(isolate, source)
+ : *URIUnescape::Unescape<uc16>(isolate, source);
}
@@ -5733,6 +5732,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToArray)
{
if (!maybe_obj->ToObject(&obj)) return maybe_obj;
}
elements = Handle<FixedArray>(FixedArray::cast(obj), isolate);
+ AssertNoAllocation no_gc;
String::FlatContent content = s->GetFlatContent();
if (content.IsAscii()) {
Vector<const uint8_t> chars = content.ToOneByteVector();
@@ -6588,6 +6588,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()) {
@@ -12835,6 +12836,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<const uint8_t> chars = format_content.ToOneByteVector();
--
--
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/groups/opt_out.