summaryrefslogtreecommitdiff
path: root/deps/v8/src/ic
diff options
context:
space:
mode:
authorIgor Sheludko <ishell@chromium.org>2017-07-05 20:29:13 +0200
committerAnna Henningsen <anna@addaleax.net>2017-07-15 12:15:00 +0800
commit785a9e5a57c9449787014916a4e0188750f1c3ff (patch)
tree125b9aa7af3209624b355ee40b28fde82360951c /deps/v8/src/ic
parentc34ae48083b44f1da7be75c8d11abc9f3aa7ab19 (diff)
downloadnode-new-785a9e5a57c9449787014916a4e0188750f1c3ff.tar.gz
deps: cherry-pick 6cb999b97b from V8 upstream
Original commit message: Properly handle loads from global interceptor via prototype chain. ... when receiver is in dictionary mode. Bug: v8:6490 Change-Id: Ic5a8d214adcc4efd4cb163cbc6b351c4e6b596af Reviewed-on: https://chromium-review.googlesource.com/559548 Reviewed-by: Camillo Bruni <cbruni@chromium.org> Commit-Queue: Igor Sheludko <ishell@chromium.org> Cr-Commit-Position: refs/heads/master@{#46428} Ref: https://chromium.googlesource.com/v8/v8.git/+/6cb999b97b7953ebfd4aabf2e1f62bf405f21c69 Fixes: https://github.com/nodejs/node/issues/13804 PR-URL: https://github.com/nodejs/node/pull/14188 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Michaƫl Zasso <targos@protonmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'deps/v8/src/ic')
-rw-r--r--deps/v8/src/ic/handler-configuration-inl.h5
-rw-r--r--deps/v8/src/ic/handler-configuration.h3
-rw-r--r--deps/v8/src/ic/ic.cc21
3 files changed, 24 insertions, 5 deletions
diff --git a/deps/v8/src/ic/handler-configuration-inl.h b/deps/v8/src/ic/handler-configuration-inl.h
index 2b9dc04b5a..5f31d15d46 100644
--- a/deps/v8/src/ic/handler-configuration-inl.h
+++ b/deps/v8/src/ic/handler-configuration-inl.h
@@ -13,6 +13,11 @@
namespace v8 {
namespace internal {
+// Decodes kind from Smi-handler.
+LoadHandler::Kind LoadHandler::GetHandlerKind(Smi* smi_handler) {
+ return KindBits::decode(smi_handler->value());
+}
+
Handle<Smi> LoadHandler::LoadNormal(Isolate* isolate) {
int config = KindBits::encode(kNormal);
return handle(Smi::FromInt(config), isolate);
diff --git a/deps/v8/src/ic/handler-configuration.h b/deps/v8/src/ic/handler-configuration.h
index ab117d5c9b..eed548b4d5 100644
--- a/deps/v8/src/ic/handler-configuration.h
+++ b/deps/v8/src/ic/handler-configuration.h
@@ -90,6 +90,9 @@ class LoadHandler {
static const int kHolderCellIndex = 2;
static const int kFirstPrototypeIndex = 3;
+ // Decodes kind from Smi-handler.
+ static inline Kind GetHandlerKind(Smi* smi_handler);
+
// Creates a Smi-handler for loading a property from a slow object.
static inline Handle<Smi> LoadNormal(Isolate* isolate);
diff --git a/deps/v8/src/ic/ic.cc b/deps/v8/src/ic/ic.cc
index b3b0eb4c84..ca3f70df2a 100644
--- a/deps/v8/src/ic/ic.cc
+++ b/deps/v8/src/ic/ic.cc
@@ -868,10 +868,15 @@ int GetPrototypeCheckCount(Isolate* isolate, Handle<Map> receiver_map,
Handle<FixedArray>(), 0);
}
+enum class HolderCellRequest {
+ kGlobalPropertyCell,
+ kHolder,
+};
+
Handle<WeakCell> HolderCell(Isolate* isolate, Handle<JSObject> holder,
- Handle<Name> name, Handle<Smi> smi_handler) {
- if (holder->IsJSGlobalObject() &&
- *smi_handler != *LoadHandler::LoadInterceptor(isolate)) {
+ Handle<Name> name, HolderCellRequest request) {
+ if (request == HolderCellRequest::kGlobalPropertyCell) {
+ DCHECK(holder->IsJSGlobalObject());
Handle<JSGlobalObject> global = Handle<JSGlobalObject>::cast(holder);
GlobalDictionary* dict = global->global_dictionary();
int number = dict->FindEntry(name);
@@ -908,8 +913,14 @@ Handle<Object> LoadIC::LoadFromPrototype(Handle<Map> receiver_map,
Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate());
DCHECK(!validity_cell.is_null());
- Handle<WeakCell> holder_cell =
- HolderCell(isolate(), holder, name, smi_handler);
+ // LoadIC dispatcher expects PropertyCell as a "holder" in case of kGlobal
+ // handler kind.
+ HolderCellRequest request =
+ LoadHandler::GetHandlerKind(*smi_handler) == LoadHandler::kGlobal
+ ? HolderCellRequest::kGlobalPropertyCell
+ : HolderCellRequest::kHolder;
+
+ Handle<WeakCell> holder_cell = HolderCell(isolate(), holder, name, request);
if (checks_count == 0) {
return isolate()->factory()->NewTuple3(holder_cell, smi_handler,