summaryrefslogtreecommitdiff
path: root/chromium/v8/src/json-stringifier.h
diff options
context:
space:
mode:
authorZeno Albisser <zeno.albisser@theqtcompany.com>2014-12-05 15:04:29 +0100
committerAndras Becsi <andras.becsi@theqtcompany.com>2014-12-09 10:49:28 +0100
commitaf6588f8d723931a298c995fa97259bb7f7deb55 (patch)
tree060ca707847ba1735f01af2372e0d5e494dc0366 /chromium/v8/src/json-stringifier.h
parent2fff84d821cc7b1c785f6404e0f8091333283e74 (diff)
downloadqtwebengine-chromium-af6588f8d723931a298c995fa97259bb7f7deb55.tar.gz
BASELINE: Update chromium to 40.0.2214.28 and ninja to 1.5.3.
Change-Id: I759465284fd64d59ad120219cbe257f7402c4181 Reviewed-by: Andras Becsi <andras.becsi@theqtcompany.com>
Diffstat (limited to 'chromium/v8/src/json-stringifier.h')
-rw-r--r--chromium/v8/src/json-stringifier.h111
1 files changed, 56 insertions, 55 deletions
diff --git a/chromium/v8/src/json-stringifier.h b/chromium/v8/src/json-stringifier.h
index 03461d72353..f89a19fd4a9 100644
--- a/chromium/v8/src/json-stringifier.h
+++ b/chromium/v8/src/json-stringifier.h
@@ -6,6 +6,7 @@
#define V8_JSON_STRINGIFIER_H_
#include "src/v8.h"
+
#include "src/conversions.h"
#include "src/utils.h"
@@ -37,22 +38,22 @@ class BasicJsonStringifier BASE_EMBEDDED {
INLINE(void ShrinkCurrentPart());
- template <bool is_ascii, typename Char>
+ template <bool is_one_byte, typename Char>
INLINE(void Append_(Char c));
- template <bool is_ascii, typename Char>
+ template <bool is_one_byte, typename Char>
INLINE(void Append_(const Char* chars));
INLINE(void Append(uint8_t c)) {
- if (is_ascii_) {
+ if (is_one_byte_) {
Append_<true>(c);
} else {
Append_<false>(c);
}
}
- INLINE(void AppendAscii(const char* chars)) {
- if (is_ascii_) {
+ INLINE(void AppendOneByte(const char* chars)) {
+ if (is_one_byte_) {
Append_<true>(reinterpret_cast<const uint8_t*>(chars));
} else {
Append_<false>(reinterpret_cast<const uint8_t*>(chars));
@@ -94,7 +95,7 @@ class BasicJsonStringifier BASE_EMBEDDED {
INLINE(Result SerializeProperty(Handle<Object> object,
bool deferred_comma,
Handle<String> deferred_key)) {
- ASSERT(!deferred_key.is_null());
+ DCHECK(!deferred_key.is_null());
return Serialize_<true>(object, deferred_comma, deferred_key);
}
@@ -128,7 +129,7 @@ class BasicJsonStringifier BASE_EMBEDDED {
DestChar* dest,
int length));
- template <bool is_ascii, typename Char>
+ template <bool is_one_byte, typename Char>
INLINE(void SerializeString_(Handle<String> string));
template <typename Char>
@@ -158,7 +159,7 @@ class BasicJsonStringifier BASE_EMBEDDED {
Handle<JSArray> stack_;
int current_index_;
int part_length_;
- bool is_ascii_;
+ bool is_one_byte_;
bool overflowed_;
static const int kJsonEscapeTableEntrySize = 8;
@@ -166,7 +167,7 @@ class BasicJsonStringifier BASE_EMBEDDED {
};
-// Translation table to escape ASCII characters.
+// Translation table to escape Latin1 characters.
// Table entries start at a multiple of 8 and are null-terminated.
const char* const BasicJsonStringifier::JsonEscapeTable =
"\\u0000\0 \\u0001\0 \\u0002\0 \\u0003\0 "
@@ -238,7 +239,7 @@ const char* const BasicJsonStringifier::JsonEscapeTable =
BasicJsonStringifier::BasicJsonStringifier(Isolate* isolate)
: isolate_(isolate),
current_index_(0),
- is_ascii_(true),
+ is_one_byte_(true),
overflowed_(false) {
factory_ = isolate_->factory();
accumulator_store_ = Handle<JSValue>::cast(
@@ -257,12 +258,11 @@ MaybeHandle<Object> BasicJsonStringifier::Stringify(Handle<Object> object) {
ShrinkCurrentPart();
Accumulate();
if (overflowed_) {
- return isolate_->Throw<Object>(
- isolate_->factory()->NewInvalidStringLengthError());
+ THROW_NEW_ERROR(isolate_, NewInvalidStringLengthError(), Object);
}
return accumulator();
}
- ASSERT(result == EXCEPTION);
+ DCHECK(result == EXCEPTION);
return MaybeHandle<Object>();
}
@@ -280,7 +280,7 @@ MaybeHandle<Object> BasicJsonStringifier::StringifyString(
}
object = String::Flatten(object);
- ASSERT(object->IsFlat());
+ DCHECK(object->IsFlat());
if (object->IsOneByteRepresentationUnderneath()) {
Handle<String> result = isolate->factory()->NewRawOneByteString(
worst_case_length).ToHandleChecked();
@@ -317,9 +317,9 @@ Handle<String> BasicJsonStringifier::StringifyString_(Isolate* isolate,
}
-template <bool is_ascii, typename Char>
+template <bool is_one_byte, typename Char>
void BasicJsonStringifier::Append_(Char c) {
- if (is_ascii) {
+ if (is_one_byte) {
SeqOneByteString::cast(*current_part_)->SeqOneByteStringSet(
current_index_++, c);
} else {
@@ -330,15 +330,16 @@ void BasicJsonStringifier::Append_(Char c) {
}
-template <bool is_ascii, typename Char>
+template <bool is_one_byte, typename Char>
void BasicJsonStringifier::Append_(const Char* chars) {
- for ( ; *chars != '\0'; chars++) Append_<is_ascii, Char>(*chars);
+ for (; *chars != '\0'; chars++) Append_<is_one_byte, Char>(*chars);
}
MaybeHandle<Object> BasicJsonStringifier::ApplyToJsonFunction(
Handle<Object> object, Handle<Object> key) {
- LookupIterator it(object, tojson_string_, LookupIterator::SKIP_INTERCEPTOR);
+ LookupIterator it(object, tojson_string_,
+ LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
Handle<Object> fun;
ASSIGN_RETURN_ON_EXCEPTION(isolate_, fun, Object::GetProperty(&it), Object);
if (!fun->IsJSFunction()) return object;
@@ -370,8 +371,10 @@ BasicJsonStringifier::Result BasicJsonStringifier::StackPush(
for (int i = 0; i < length; i++) {
if (elements->get(i) == *object) {
AllowHeapAllocation allow_to_return_error;
- isolate_->Throw(*factory_->NewTypeError(
- "circular_structure", HandleVector<Object>(NULL, 0)));
+ Handle<Object> error;
+ MaybeHandle<Object> maybe_error = factory_->NewTypeError(
+ "circular_structure", HandleVector<Object>(NULL, 0));
+ if (maybe_error.ToHandle(&error)) isolate_->Throw(*error);
return EXCEPTION;
}
}
@@ -406,21 +409,22 @@ BasicJsonStringifier::Result BasicJsonStringifier::Serialize_(
switch (HeapObject::cast(*object)->map()->instance_type()) {
case HEAP_NUMBER_TYPE:
+ case MUTABLE_HEAP_NUMBER_TYPE:
if (deferred_string_key) SerializeDeferredKey(comma, key);
return SerializeHeapNumber(Handle<HeapNumber>::cast(object));
case ODDBALL_TYPE:
switch (Oddball::cast(*object)->kind()) {
case Oddball::kFalse:
if (deferred_string_key) SerializeDeferredKey(comma, key);
- AppendAscii("false");
+ AppendOneByte("false");
return SUCCESS;
case Oddball::kTrue:
if (deferred_string_key) SerializeDeferredKey(comma, key);
- AppendAscii("true");
+ AppendOneByte("true");
return SUCCESS;
case Oddball::kNull:
if (deferred_string_key) SerializeDeferredKey(comma, key);
- AppendAscii("null");
+ AppendOneByte("null");
return SUCCESS;
default:
return UNCHANGED;
@@ -440,7 +444,8 @@ BasicJsonStringifier::Result BasicJsonStringifier::Serialize_(
SerializeString(Handle<String>::cast(object));
return SUCCESS;
} else if (object->IsJSObject()) {
- if (object->IsAccessCheckNeeded()) break;
+ // Go to slow path for global proxy and objects requiring access checks.
+ if (object->IsAccessCheckNeeded() || object->IsJSGlobalProxy()) break;
if (deferred_string_key) SerializeDeferredKey(comma, key);
return SerializeJSObject(Handle<JSObject>::cast(object));
}
@@ -503,10 +508,10 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSValue(
if (value->IsSmi()) return SerializeSmi(Smi::cast(*value));
SerializeHeapNumber(Handle<HeapNumber>::cast(value));
} else {
- ASSERT(class_name == isolate_->heap()->Boolean_string());
+ DCHECK(class_name == isolate_->heap()->Boolean_string());
Object* value = JSValue::cast(*object)->value();
- ASSERT(value->IsBoolean());
- AppendAscii(value->IsTrue() ? "true" : "false");
+ DCHECK(value->IsBoolean());
+ AppendOneByte(value->IsTrue() ? "true" : "false");
}
return SUCCESS;
}
@@ -516,7 +521,7 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeSmi(Smi* object) {
static const int kBufferSize = 100;
char chars[kBufferSize];
Vector<char> buffer(chars, kBufferSize);
- AppendAscii(IntToCString(object->value(), buffer));
+ AppendOneByte(IntToCString(object->value(), buffer));
return SUCCESS;
}
@@ -524,13 +529,13 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeSmi(Smi* object) {
BasicJsonStringifier::Result BasicJsonStringifier::SerializeDouble(
double number) {
if (std::isinf(number) || std::isnan(number)) {
- AppendAscii("null");
+ AppendOneByte("null");
return SUCCESS;
}
static const int kBufferSize = 100;
char chars[kBufferSize];
Vector<char> buffer(chars, kBufferSize);
- AppendAscii(DoubleToCString(number, buffer));
+ AppendOneByte(DoubleToCString(number, buffer));
return SUCCESS;
}
@@ -575,7 +580,7 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArray(
i);
if (result == SUCCESS) continue;
if (result == UNCHANGED) {
- AppendAscii("null");
+ AppendOneByte("null");
} else {
return result;
}
@@ -608,12 +613,12 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArraySlow(
Object::GetElement(isolate_, object, i),
EXCEPTION);
if (element->IsUndefined()) {
- AppendAscii("null");
+ AppendOneByte("null");
} else {
Result result = SerializeElement(isolate_, element, i);
if (result == SUCCESS) continue;
if (result == UNCHANGED) {
- AppendAscii("null");
+ AppendOneByte("null");
} else {
return result;
}
@@ -628,11 +633,7 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSObject(
HandleScope handle_scope(isolate_);
Result stack_push = StackPush(object);
if (stack_push != SUCCESS) return stack_push;
- if (object->IsJSGlobalProxy()) {
- object = Handle<JSObject>(
- JSObject::cast(object->GetPrototype()), isolate_);
- ASSERT(object->IsGlobalObject());
- }
+ DCHECK(!object->IsJSGlobalProxy() && !object->IsGlobalObject());
Append('{');
bool comma = false;
@@ -678,7 +679,7 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSObject(
key_handle = Handle<String>(String::cast(key), isolate_);
maybe_property = Object::GetPropertyOrElement(object, key_handle);
} else {
- ASSERT(key->IsNumber());
+ DCHECK(key->IsNumber());
key_handle = factory_->NumberToString(Handle<Object>(key, isolate_));
uint32_t index;
if (key->IsSmi()) {
@@ -707,7 +708,7 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSObject(
void BasicJsonStringifier::ShrinkCurrentPart() {
- ASSERT(current_index_ < part_length_);
+ DCHECK(current_index_ < part_length_);
current_part_ = SeqString::Truncate(Handle<SeqString>::cast(current_part_),
current_index_);
}
@@ -730,14 +731,14 @@ void BasicJsonStringifier::Extend() {
if (part_length_ <= kMaxPartLength / kPartLengthGrowthFactor) {
part_length_ *= kPartLengthGrowthFactor;
}
- if (is_ascii_) {
+ if (is_one_byte_) {
current_part_ =
factory_->NewRawOneByteString(part_length_).ToHandleChecked();
} else {
current_part_ =
factory_->NewRawTwoByteString(part_length_).ToHandleChecked();
}
- ASSERT(!current_part_.is_null());
+ DCHECK(!current_part_.is_null());
current_index_ = 0;
}
@@ -747,9 +748,9 @@ void BasicJsonStringifier::ChangeEncoding() {
Accumulate();
current_part_ =
factory_->NewRawTwoByteString(part_length_).ToHandleChecked();
- ASSERT(!current_part_.is_null());
+ DCHECK(!current_part_.is_null());
current_index_ = 0;
- is_ascii_ = false;
+ is_one_byte_ = false;
}
@@ -761,7 +762,7 @@ int BasicJsonStringifier::SerializeStringUnchecked_(const SrcChar* src,
// Assert that uc16 character is not truncated down to 8 bit.
// The <uc16, char> version of this method must not be called.
- ASSERT(sizeof(*dest) >= sizeof(*src));
+ DCHECK(sizeof(*dest) >= sizeof(*src));
for (int i = 0; i < length; i++) {
SrcChar c = src[i];
@@ -778,10 +779,10 @@ int BasicJsonStringifier::SerializeStringUnchecked_(const SrcChar* src,
}
-template <bool is_ascii, typename Char>
+template <bool is_one_byte, typename Char>
void BasicJsonStringifier::SerializeString_(Handle<String> string) {
int length = string->length();
- Append_<is_ascii, char>('"');
+ Append_<is_one_byte, char>('"');
// We make a rough estimate to find out if the current string can be
// serialized without allocating a new string part. The worst case length of
// an escaped character is 6. Shifting the remainin string length right by 3
@@ -790,7 +791,7 @@ void BasicJsonStringifier::SerializeString_(Handle<String> string) {
if (((part_length_ - current_index_) >> 3) > length) {
DisallowHeapAllocation no_gc;
Vector<const Char> vector = GetCharVector<Char>(string);
- if (is_ascii) {
+ if (is_one_byte) {
current_index_ += SerializeStringUnchecked_(
vector.start(),
SeqOneByteString::cast(*current_part_)->GetChars() + current_index_,
@@ -814,15 +815,15 @@ void BasicJsonStringifier::SerializeString_(Handle<String> string) {
}
Char c = vector[i];
if (DoNotEscape(c)) {
- Append_<is_ascii, Char>(c);
+ Append_<is_one_byte, Char>(c);
} else {
- Append_<is_ascii, uint8_t>(reinterpret_cast<const uint8_t*>(
+ Append_<is_one_byte, uint8_t>(reinterpret_cast<const uint8_t*>(
&JsonEscapeTable[c * kJsonEscapeTableEntrySize]));
}
}
}
- Append_<is_ascii, uint8_t>('"');
+ Append_<is_one_byte, uint8_t>('"');
}
@@ -842,7 +843,7 @@ template <>
Vector<const uint8_t> BasicJsonStringifier::GetCharVector(
Handle<String> string) {
String::FlatContent flat = string->GetFlatContent();
- ASSERT(flat.IsAscii());
+ DCHECK(flat.IsOneByte());
return flat.ToOneByteVector();
}
@@ -850,14 +851,14 @@ Vector<const uint8_t> BasicJsonStringifier::GetCharVector(
template <>
Vector<const uc16> BasicJsonStringifier::GetCharVector(Handle<String> string) {
String::FlatContent flat = string->GetFlatContent();
- ASSERT(flat.IsTwoByte());
+ DCHECK(flat.IsTwoByte());
return flat.ToUC16Vector();
}
void BasicJsonStringifier::SerializeString(Handle<String> object) {
object = String::Flatten(object);
- if (is_ascii_) {
+ if (is_one_byte_) {
if (object->IsOneByteRepresentationUnderneath()) {
SerializeString_<true, uint8_t>(object);
} else {