Reviewers: Toon Verwaest,

Description:
Move compatible receiver check from CompileHandler to ComputeHandler

We also need to do the check before using an existing handler from the
cache

BUG=chromium:505374
[email protected]
LOG=y

Please review this at https://codereview.chromium.org/1221433010/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+52, -9 lines):
  M src/ic/ic.h
  M src/ic/ic.cc


Index: src/ic/ic.cc
diff --git a/src/ic/ic.cc b/src/ic/ic.cc
index 52c4732e81ee7866bd2d49550a55cf330d79c123..4f58ec6a0e6c1b3b26dcff699e015ae3436d85e8 100644
--- a/src/ic/ic.cc
+++ b/src/ic/ic.cc
@@ -1098,6 +1098,41 @@ Handle<Code> IC::ComputeHandler(LookupIterator* lookup, Handle<Object> value) {
 }


+Handle<Code> LoadIC::ComputeHandler(LookupIterator* lookup,
+                                    Handle<Object> value) {
+  if (lookup->state() == LookupIterator::ACCESSOR) {
+    Handle<Object> accessors = lookup->GetAccessors();
+    Handle<Map> map = receiver_map();
+    if (accessors->IsExecutableAccessorInfo()) {
+      Handle<ExecutableAccessorInfo> info =
+          Handle<ExecutableAccessorInfo>::cast(accessors);
+      if ((v8::ToCData<Address>(info->getter()) != 0) &&
+          !ExecutableAccessorInfo::IsCompatibleReceiverMap(isolate(), info,
+                                                           map)) {
+        return slow_stub();
+      }
+    } else if (accessors->IsAccessorPair()) {
+ Handle<Object> getter(Handle<AccessorPair>::cast(accessors)->getter(),
+                            isolate());
+      Handle<JSObject> holder = lookup->GetHolder<JSObject>();
+      Handle<Object> receiver = lookup->GetReceiver();
+      if (getter->IsJSFunction() && holder->HasFastProperties()) {
+        Handle<JSFunction> function = Handle<JSFunction>::cast(getter);
+        if (receiver->IsJSObject() || function->IsBuiltin() ||
+            !is_sloppy(function->shared()->language_mode())) {
+          CallOptimization call_optimization(function);
+          if (call_optimization.is_simple_api_call() &&
+              !call_optimization.IsCompatibleReceiver(receiver, holder)) {
+            return slow_stub();
+          }
+        }
+      }
+    }
+  }
+  return IC::ComputeHandler(lookup, value);
+}
+
+
 Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup,
                                     Handle<Object> unused,
                                     CacheHolderFlag cache_holder) {
@@ -1165,6 +1200,8 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup,
         if (v8::ToCData<Address>(info->getter()) == 0) break;
if (!ExecutableAccessorInfo::IsCompatibleReceiverMap(isolate(), info,
                                                              map)) {
+          // This case should be already handled in LoadIC::ComputeHandler.
+          UNREACHABLE();
           break;
         }
         if (!holder->HasFastProperties()) break;
@@ -1185,10 +1222,14 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup,
         }
         CallOptimization call_optimization(function);
NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder);
-        if (call_optimization.is_simple_api_call() &&
-            call_optimization.IsCompatibleReceiver(receiver, holder)) {
- return compiler.CompileLoadCallback(lookup->name(), call_optimization,
-                                              lookup->GetAccessorIndex());
+        if (call_optimization.is_simple_api_call()) {
+          if (call_optimization.IsCompatibleReceiver(receiver, holder)) {
+            return compiler.CompileLoadCallback(
+ lookup->name(), call_optimization, lookup->GetAccessorIndex());
+          } else {
+ // This case should be already handled in LoadIC::ComputeHandler.
+            UNREACHABLE();
+          }
         }
         int expected_arguments =
             function->shared()->internal_formal_parameter_count();
Index: src/ic/ic.h
diff --git a/src/ic/ic.h b/src/ic/ic.h
index dec8318ae5c7cfd2b6c40fb253365cb055a630a6..a9e8fce7e2ab9980ab4129dc0bf1b1e958e6e919 100644
--- a/src/ic/ic.h
+++ b/src/ic/ic.h
@@ -184,8 +184,8 @@ class IC {
static void PostPatching(Address address, Code* target, Code* old_target);

// Compute the handler either by compiling or by retrieving a cached version.
-  Handle<Code> ComputeHandler(LookupIterator* lookup,
-                              Handle<Object> value = Handle<Code>::null());
+  virtual Handle<Code> ComputeHandler(
+      LookupIterator* lookup, Handle<Object> value = Handle<Code>::null());
   virtual Handle<Code> CompileHandler(LookupIterator* lookup,
                                       Handle<Object> value,
                                       CacheHolderFlag cache_holder) {
@@ -432,9 +432,11 @@ class LoadIC : public IC {
   // lookup result.
   void UpdateCaches(LookupIterator* lookup);

-  virtual Handle<Code> CompileHandler(LookupIterator* lookup,
-                                      Handle<Object> unused,
- CacheHolderFlag cache_holder) override;
+  Handle<Code> ComputeHandler(
+      LookupIterator* lookup,
+      Handle<Object> value = Handle<Code>::null()) override;
+ Handle<Code> CompileHandler(LookupIterator* lookup, Handle<Object> unused,
+                              CacheHolderFlag cache_holder) override;

  private:
   Handle<Code> SimpleFieldLoad(FieldIndex index);


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to