Upgrade V8 to version 4.9.385.28
https://chromium.googlesource.com/v8/v8/+/4.9.385.28
FPIIM-449
Change-Id: I4b2e74289d4bf3667f2f3dc8aa2e541f63e26eb4
diff --git a/src/ic/call-optimization.cc b/src/ic/call-optimization.cc
index 7ef1b7e..45717b5 100644
--- a/src/ic/call-optimization.cc
+++ b/src/ic/call-optimization.cc
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "src/v8.h"
-
#include "src/ic/call-optimization.h"
@@ -16,7 +14,8 @@
Handle<JSObject> CallOptimization::LookupHolderOfExpectedType(
- Handle<Map> object_map, HolderLookup* holder_lookup) const {
+ Handle<Map> object_map, HolderLookup* holder_lookup,
+ int* holder_depth_in_prototype_chain) const {
DCHECK(is_simple_api_call());
if (!object_map->IsJSObjectMap()) {
*holder_lookup = kHolderNotFound;
@@ -27,13 +26,16 @@
*holder_lookup = kHolderIsReceiver;
return Handle<JSObject>::null();
}
- while (true) {
+ for (int depth = 1; true; depth++) {
if (!object_map->prototype()->IsJSObject()) break;
Handle<JSObject> prototype(JSObject::cast(object_map->prototype()));
if (!prototype->map()->is_hidden_prototype()) break;
object_map = handle(prototype->map());
if (expected_receiver_type_->IsTemplateFor(*object_map)) {
*holder_lookup = kHolderFound;
+ if (holder_depth_in_prototype_chain != NULL) {
+ *holder_depth_in_prototype_chain = depth;
+ }
return prototype;
}
}
@@ -45,8 +47,14 @@
bool CallOptimization::IsCompatibleReceiver(Handle<Object> receiver,
Handle<JSObject> holder) const {
DCHECK(is_simple_api_call());
- if (!receiver->IsJSObject()) return false;
- Handle<Map> map(JSObject::cast(*receiver)->map());
+ if (!receiver->IsHeapObject()) return false;
+ Handle<Map> map(HeapObject::cast(*receiver)->map());
+ return IsCompatibleReceiverMap(map, holder);
+}
+
+
+bool CallOptimization::IsCompatibleReceiverMap(Handle<Map> map,
+ Handle<JSObject> holder) const {
HolderLookup holder_lookup;
Handle<JSObject> api_holder = LookupHolderOfExpectedType(map, &holder_lookup);
switch (holder_lookup) {
@@ -92,22 +100,14 @@
// Require a C++ callback.
if (info->call_code()->IsUndefined()) return;
- api_call_info_ =
- Handle<CallHandlerInfo>(CallHandlerInfo::cast(info->call_code()));
+ api_call_info_ = handle(CallHandlerInfo::cast(info->call_code()));
- // Accept signatures that either have no restrictions at all or
- // only have restrictions on the receiver.
if (!info->signature()->IsUndefined()) {
- Handle<SignatureInfo> signature =
- Handle<SignatureInfo>(SignatureInfo::cast(info->signature()));
- if (!signature->args()->IsUndefined()) return;
- if (!signature->receiver()->IsUndefined()) {
- expected_receiver_type_ = Handle<FunctionTemplateInfo>(
- FunctionTemplateInfo::cast(signature->receiver()));
- }
+ expected_receiver_type_ =
+ handle(FunctionTemplateInfo::cast(info->signature()));
}
is_simple_api_call_ = true;
}
-}
-} // namespace v8::internal
+} // namespace internal
+} // namespace v8