diff options
author | Ali Ijaz Sheikh <ofrobots@google.com> | 2015-09-29 08:51:07 -0700 |
---|---|---|
committer | Ali Ijaz Sheikh <ofrobots@google.com> | 2015-09-30 16:23:26 -0700 |
commit | c2739443e6743cd92c1ab9a10747eca8bb9c5ed1 (patch) | |
tree | 7c5d914b37118ada996388b4812a5526dee28967 /deps/v8/src | |
parent | dbe48446b7981a60ac3e461056c7a888572b8e24 (diff) | |
download | node-new-c2739443e6743cd92c1ab9a10747eca8bb9c5ed1.tar.gz |
deps: upgrade V8 to 4.5.103.35
Apply the latest fixes from V8 4.5 branch & bring us up to 4.5.103.35:
* Disallow Object.observe calls on access checked objects.
https://github.com/v8/v8/commit/134e541ad149b9732bc4fee6fe6952cf669703a7
* Avoid excessive data copying for ExternalStreamingStream::SetBookmark.
https://github.com/v8/v8/commit/96dddb455daff3d8626bc4e5d7b2898fbab55991
PR-URL: https://github.com/nodejs/node/pull/3117
Reviewed-By: indutny - Fedor Indutny <fedor.indutny@gmail.com>
Reviewed-By: bnoordhuis - Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: trevnorris - Trevor Norris <trev.norris@gmail.com>
Reviewed-By: targos - Michaƫl Zasso <mic.besace@gmail.com>
Diffstat (limited to 'deps/v8/src')
-rw-r--r-- | deps/v8/src/messages.h | 1 | ||||
-rw-r--r-- | deps/v8/src/object-observe.js | 4 | ||||
-rw-r--r-- | deps/v8/src/runtime/runtime-object.cc | 8 | ||||
-rw-r--r-- | deps/v8/src/runtime/runtime.h | 3 | ||||
-rw-r--r-- | deps/v8/src/scanner-character-streams.cc | 38 | ||||
-rw-r--r-- | deps/v8/src/scanner-character-streams.h | 4 |
6 files changed, 50 insertions, 8 deletions
diff --git a/deps/v8/src/messages.h b/deps/v8/src/messages.h index 4072300bf6..5c3e867933 100644 --- a/deps/v8/src/messages.h +++ b/deps/v8/src/messages.h @@ -173,6 +173,7 @@ class CallSite { T(ObserveCallbackFrozen, \ "Object.observe cannot deliver to a frozen function object") \ T(ObserveGlobalProxy, "% cannot be called on the global proxy object") \ + T(ObserveAccessChecked, "% cannot be called on access-checked objects") \ T(ObserveInvalidAccept, \ "Third argument to Object.observe must be an array of strings.") \ T(ObserveNonFunction, "Object.% cannot deliver to non-function") \ diff --git a/deps/v8/src/object-observe.js b/deps/v8/src/object-observe.js index 56859a1c97..9c49fd38fb 100644 --- a/deps/v8/src/object-observe.js +++ b/deps/v8/src/object-observe.js @@ -389,6 +389,8 @@ function ObjectObserve(object, callback, acceptList) { throw MakeTypeError(kObserveNonObject, "observe", "observe"); if (%IsJSGlobalProxy(object)) throw MakeTypeError(kObserveGlobalProxy, "observe"); + if (%IsAccessCheckNeeded(object)) + throw MakeTypeError(kObserveAccessChecked, "observe"); if (!IS_SPEC_FUNCTION(callback)) throw MakeTypeError(kObserveNonFunction, "observe"); if (ObjectIsFrozen(callback)) @@ -617,6 +619,8 @@ function ObjectGetNotifier(object) { throw MakeTypeError(kObserveNonObject, "getNotifier", "getNotifier"); if (%IsJSGlobalProxy(object)) throw MakeTypeError(kObserveGlobalProxy, "getNotifier"); + if (%IsAccessCheckNeeded(object)) + throw MakeTypeError(kObserveAccessChecked, "getNotifier"); if (ObjectIsFrozen(object)) return null; diff --git a/deps/v8/src/runtime/runtime-object.cc b/deps/v8/src/runtime/runtime-object.cc index da1ec4977b..9536ec0cc4 100644 --- a/deps/v8/src/runtime/runtime-object.cc +++ b/deps/v8/src/runtime/runtime-object.cc @@ -1435,5 +1435,13 @@ RUNTIME_FUNCTION(Runtime_DefineSetterPropertyUnchecked) { setter, attrs)); return isolate->heap()->undefined_value(); } + + +RUNTIME_FUNCTION(Runtime_IsAccessCheckNeeded) { + SealHandleScope shs(isolate); + DCHECK_EQ(1, args.length()); + CONVERT_ARG_CHECKED(Object, object, 0); + return isolate->heap()->ToBoolean(object->IsAccessCheckNeeded()); +} } // namespace internal } // namespace v8 diff --git a/deps/v8/src/runtime/runtime.h b/deps/v8/src/runtime/runtime.h index da1ae40ba0..c4f74e7de1 100644 --- a/deps/v8/src/runtime/runtime.h +++ b/deps/v8/src/runtime/runtime.h @@ -483,7 +483,8 @@ namespace internal { F(IsStrong, 1, 1) \ F(ClassOf, 1, 1) \ F(DefineGetterPropertyUnchecked, 4, 1) \ - F(DefineSetterPropertyUnchecked, 4, 1) + F(DefineSetterPropertyUnchecked, 4, 1) \ + F(IsAccessCheckNeeded, 1, 1) #define FOR_EACH_INTRINSIC_OBSERVE(F) \ diff --git a/deps/v8/src/scanner-character-streams.cc b/deps/v8/src/scanner-character-streams.cc index 442bc75d6c..eaaa9bc1f7 100644 --- a/deps/v8/src/scanner-character-streams.cc +++ b/deps/v8/src/scanner-character-streams.cc @@ -346,6 +346,7 @@ size_t ExternalStreamingStream::FillBuffer(size_t position) { current_data_length_ = source_stream_->GetMoreData(¤t_data_); current_data_offset_ = 0; bool data_ends = current_data_length_ == 0; + bookmark_data_is_from_current_data_ = false; // A caveat: a data chunk might end with bytes from an incomplete UTF-8 // character (the rest of the bytes will be in the next chunk). @@ -405,6 +406,15 @@ bool ExternalStreamingStream::SetBookmark() { // - buffer_[buffer_cursor_ .. buffer_end_] => bookmark_buffer_ // - current_data_[.._offset_ .. .._length_] => bookmark_data_ // - utf8_split_char_buffer_* => bookmark_utf8_split... + // + // To make sure we don't unnecessarily copy data, we also maintain + // whether bookmark_data_ contains a copy of the current current_data_ + // block. This is done with: + // - bookmark_data_is_from_current_data_ + // - bookmark_data_offset_: offset into bookmark_data_ + // + // Note that bookmark_data_is_from_current_data_ must be maintained + // whenever current_data_ is updated. bookmark_ = pos_; @@ -414,10 +424,21 @@ bool ExternalStreamingStream::SetBookmark() { CopyCharsUnsigned(bookmark_buffer_.start(), buffer_cursor_, buffer_length); size_t data_length = current_data_length_ - current_data_offset_; - bookmark_data_.Dispose(); - bookmark_data_ = Vector<uint8_t>::New(static_cast<int>(data_length)); - CopyBytes(bookmark_data_.start(), current_data_ + current_data_offset_, - data_length); + size_t bookmark_data_length = static_cast<size_t>(bookmark_data_.length()); + if (bookmark_data_is_from_current_data_ && + data_length < bookmark_data_length) { + // Fast case: bookmark_data_ was previously copied from the current + // data block, and we have enough data for this bookmark. + bookmark_data_offset_ = bookmark_data_length - data_length; + } else { + // Slow case: We need to copy current_data_. + bookmark_data_.Dispose(); + bookmark_data_ = Vector<uint8_t>::New(static_cast<int>(data_length)); + CopyBytes(bookmark_data_.start(), current_data_ + current_data_offset_, + data_length); + bookmark_data_is_from_current_data_ = true; + bookmark_data_offset_ = 0; + } bookmark_utf8_split_char_buffer_length_ = utf8_split_char_buffer_length_; for (size_t i = 0; i < utf8_split_char_buffer_length_; i++) { @@ -436,12 +457,14 @@ void ExternalStreamingStream::ResetToBookmark() { // bookmark_data_* => current_data_* // (current_data_ assumes ownership of its memory.) - uint8_t* data = new uint8_t[bookmark_data_.length()]; current_data_offset_ = 0; - current_data_length_ = bookmark_data_.length(); - CopyCharsUnsigned(data, bookmark_data_.begin(), bookmark_data_.length()); + current_data_length_ = bookmark_data_.length() - bookmark_data_offset_; + uint8_t* data = new uint8_t[current_data_length_]; + CopyCharsUnsigned(data, bookmark_data_.begin() + bookmark_data_offset_, + current_data_length_); delete[] current_data_; current_data_ = data; + bookmark_data_is_from_current_data_ = true; // bookmark_buffer_ needs to be copied to buffer_. CopyCharsUnsigned(buffer_, bookmark_buffer_.begin(), @@ -462,6 +485,7 @@ void ExternalStreamingStream::FlushCurrent() { current_data_ = NULL; current_data_length_ = 0; current_data_offset_ = 0; + bookmark_data_is_from_current_data_ = false; } diff --git a/deps/v8/src/scanner-character-streams.h b/deps/v8/src/scanner-character-streams.h index 582165710d..f3ee20463a 100644 --- a/deps/v8/src/scanner-character-streams.h +++ b/deps/v8/src/scanner-character-streams.h @@ -94,6 +94,8 @@ class ExternalStreamingStream : public BufferedUtf16CharacterStream { current_data_length_(0), utf8_split_char_buffer_length_(0), bookmark_(0), + bookmark_data_is_from_current_data_(false), + bookmark_data_offset_(0), bookmark_utf8_split_char_buffer_length_(0) {} virtual ~ExternalStreamingStream() { @@ -134,6 +136,8 @@ class ExternalStreamingStream : public BufferedUtf16CharacterStream { size_t bookmark_; Vector<uint16_t> bookmark_buffer_; Vector<uint8_t> bookmark_data_; + bool bookmark_data_is_from_current_data_; + size_t bookmark_data_offset_; uint8_t bookmark_utf8_split_char_buffer_[4]; size_t bookmark_utf8_split_char_buffer_length_; }; |