diff options
author | Zeno Albisser <zeno.albisser@theqtcompany.com> | 2014-12-05 15:04:29 +0100 |
---|---|---|
committer | Andras Becsi <andras.becsi@theqtcompany.com> | 2014-12-09 10:49:28 +0100 |
commit | af6588f8d723931a298c995fa97259bb7f7deb55 (patch) | |
tree | 060ca707847ba1735f01af2372e0d5e494dc0366 /chromium/v8/src/json-stringifier.h | |
parent | 2fff84d821cc7b1c785f6404e0f8091333283e74 (diff) | |
download | qtwebengine-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.h | 111 |
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 { |