Revision: 22729
Author:   [email protected]
Date:     Thu Jul 31 01:04:48 2014 UTC
Log:      Version 3.28.51 (based on bleeding_edge revision r22707)

Drop deprecated memory related notification API (Chromium issue 397026).

Performance and stability improvements on all platforms.
http://code.google.com/p/v8/source/detail?r=22729

Modified:
 /trunk/ChangeLog
 /trunk/include/v8.h
 /trunk/src/api.cc
 /trunk/src/arm/ic-arm.cc
 /trunk/src/arm/stub-cache-arm.cc
 /trunk/src/arm64/ic-arm64.cc
 /trunk/src/arm64/stub-cache-arm64.cc
 /trunk/src/debug.cc
 /trunk/src/ia32/ic-ia32.cc
 /trunk/src/ia32/lithium-ia32.h
 /trunk/src/ia32/stub-cache-ia32.cc
 /trunk/src/ic.cc
 /trunk/src/ic.h
 /trunk/src/isolate.cc
 /trunk/src/mirror-debugger.js
 /trunk/src/objects-inl.h
 /trunk/src/objects.cc
 /trunk/src/objects.h
 /trunk/src/stub-cache.cc
 /trunk/src/stub-cache.h
 /trunk/src/version.cc
 /trunk/src/x64/ic-x64.cc
 /trunk/src/x64/stub-cache-x64.cc
 /trunk/src/x87/stub-cache-x87.cc
 /trunk/test/cctest/test-api.cc
 /trunk/tools/generate-runtime-tests.py

=======================================
--- /trunk/ChangeLog    Thu Jul 31 00:04:39 2014 UTC
+++ /trunk/ChangeLog    Thu Jul 31 01:04:48 2014 UTC
@@ -1,3 +1,10 @@
+2014-07-31: Version 3.28.51
+
+ Drop deprecated memory related notification API (Chromium issue 397026).
+
+        Performance and stability improvements on all platforms.
+
+
 2014-07-31: Version 3.28.50

         Use emergency memory in the case of out of memory during evacuation
=======================================
--- /trunk/include/v8.h Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/include/v8.h Thu Jul 31 01:04:48 2014 UTC
@@ -4993,40 +4993,6 @@
   static void VisitHandlesForPartialDependence(
       Isolate* isolate, PersistentHandleVisitor* visitor);

-  /**
-   * Optional notification that the embedder is idle.
-   * V8 uses the notification to reduce memory footprint.
-   * This call can be used repeatedly if the embedder remains idle.
-   * Returns true if the embedder should stop calling IdleNotification
-   * until real work has been done.  This indicates that V8 has done
-   * as much cleanup as it will be able to do.
-   *
- * The hint argument specifies the amount of work to be done in the function - * on scale from 1 to 1000. There is no guarantee that the actual work will
-   * match the hint.
-   *
-   * Deprecated, please use Isolate::IdleNotification.
-   */
-  static bool IdleNotification(int hint = 1000);
-
-  /**
-   * Optional notification that the system is running low on memory.
-   * V8 uses these notifications to attempt to free memory.
-   *
-   * Deprecated, please use Isolate::LowMemoryNotification.
-   */
-  static void LowMemoryNotification();
-
-  /**
-   * Optional notification that a context has been disposed. V8 uses
-   * these notifications to guide the GC heuristic. Returns the number
-   * of context disposals - including this one - since the last time
-   * V8 had a chance to clean up.
-   *
-   * Deprecated, please use Isolate::ContextDisposedNotification.
-   */
-  static int ContextDisposedNotification();
-
   /**
    * Initialize the ICU library bundled with V8. The embedder should only
* invoke this method when using the bundled ICU. Returns true on success.
=======================================
--- /trunk/src/api.cc   Mon Jul 28 00:04:53 2014 UTC
+++ /trunk/src/api.cc   Thu Jul 31 01:04:48 2014 UTC
@@ -5076,34 +5076,6 @@
   isolate->global_handles()->IterateAllRootsInNewSpaceWithClassIds(
       &visitor_adapter);
 }
-
-
-bool v8::V8::IdleNotification(int hint) {
-  // Returning true tells the caller that it need not
-  // continue to call IdleNotification.
-  i::Isolate* isolate = i::Isolate::Current();
-  if (isolate == NULL || !isolate->IsInitialized()) return true;
-  if (!i::FLAG_use_idle_notification) return true;
-  return isolate->heap()->IdleNotification(hint);
-}
-
-
-void v8::V8::LowMemoryNotification() {
-  i::Isolate* isolate = i::Isolate::Current();
-  if (isolate == NULL || !isolate->IsInitialized()) return;
-  {
-    i::HistogramTimerScope idle_notification_scope(
-        isolate->counters()->gc_low_memory_notification());
-    isolate->heap()->CollectAllAvailableGarbage("low memory notification");
-  }
-}
-
-
-int v8::V8::ContextDisposedNotification() {
-  i::Isolate* isolate = i::Isolate::Current();
-  if (!isolate->IsInitialized()) return 0;
-  return isolate->heap()->NotifyContextDisposed();
-}


 bool v8::V8::InitializeICU(const char* icu_data_file) {
=======================================
--- /trunk/src/arm/ic-arm.cc    Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/arm/ic-arm.cc    Thu Jul 31 01:04:48 2014 UTC
@@ -512,21 +512,6 @@
 const Register StoreIC::ReceiverRegister() { return r1; }
 const Register StoreIC::NameRegister() { return r2; }
 const Register StoreIC::ValueRegister() { return r0; }
-
-
-const Register KeyedStoreIC::ReceiverRegister() {
-  return StoreIC::ReceiverRegister();
-}
-
-
-const Register KeyedStoreIC::NameRegister() {
-  return StoreIC::NameRegister();
-}
-
-
-const Register KeyedStoreIC::ValueRegister() {
-  return StoreIC::ValueRegister();
-}


 const Register KeyedStoreIC::MapRegister() {
=======================================
--- /trunk/src/arm/stub-cache-arm.cc    Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/arm/stub-cache-arm.cc    Thu Jul 31 01:04:48 2014 UTC
@@ -311,10 +311,10 @@
 // may be clobbered.  Upon branch to miss_label, the receiver and name
 // registers have their original values.
 void NamedStoreHandlerCompiler::GenerateStoreTransition(
-    MacroAssembler* masm, Handle<JSObject> object, LookupResult* lookup,
-    Handle<Map> transition, Handle<Name> name, Register receiver_reg,
-    Register storage_reg, Register value_reg, Register scratch1,
-    Register scratch2, Register scratch3, Label* miss_label, Label* slow) {
+    MacroAssembler* masm, LookupResult* lookup, Handle<Map> transition,
+    Handle<Name> name, Register receiver_reg, Register storage_reg,
+ Register value_reg, Register scratch1, Register scratch2, Register scratch3,
+    Label* miss_label, Label* slow) {
   // r0 : value
   Label exit;

@@ -370,13 +370,12 @@
     __ vstr(d0, FieldMemOperand(storage_reg, HeapNumber::kValueOffset));
   }

-  // Stub never generated for non-global objects that require access
-  // checks.
-  ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
+  // Stub never generated for objects that require access checks.
+  ASSERT(!transition->is_access_check_needed());

   // Perform map transition for the receiver if necessary.
   if (details.type() == FIELD &&
-      object->map()->unused_property_fields() == 0) {
+ Map::cast(transition->GetBackPointer())->unused_property_fields() == 0) {
     // The properties must be extended before we can store the value.
     // We jump to a runtime call that extends the properties array.
     __ push(receiver_reg);
@@ -416,14 +415,14 @@
   // Adjust for the number of properties stored in the object. Even in the
// face of a transition we can use the old map here because the size of the
   // object and the number of in-object properties is not going to change.
-  index -= object->map()->inobject_properties();
+  index -= transition->inobject_properties();

   // TODO(verwaest): Share this code as a code stub.
   SmiCheck smi_check = representation.IsTagged()
       ? INLINE_SMI_CHECK : OMIT_SMI_CHECK;
   if (index < 0) {
     // Set the property straight into the object.
-    int offset = object->map()->instance_size() + (index * kPointerSize);
+    int offset = transition->instance_size() + (index * kPointerSize);
     if (representation.IsDouble()) {
       __ str(storage_reg, FieldMemOperand(receiver_reg, offset));
     } else {
@@ -733,10 +732,10 @@


 Register PropertyHandlerCompiler::CheckPrototypes(
-    Handle<HeapType> type, Register object_reg, Handle<JSObject> holder,
-    Register holder_reg, Register scratch1, Register scratch2,
-    Handle<Name> name, Label* miss, PrototypeCheckType check) {
-  Handle<Map> receiver_map(IC::TypeToMap(*type, isolate()));
+    Register object_reg, Register holder_reg, Register scratch1,
+    Register scratch2, Handle<Name> name, Label* miss,
+    PrototypeCheckType check) {
+  Handle<Map> receiver_map(IC::TypeToMap(*type(), isolate()));

   // Make sure there's no overlap between holder and object registers.
   ASSERT(!scratch1.is(object_reg) && !scratch1.is(holder_reg));
@@ -748,12 +747,12 @@
   int depth = 0;

   Handle<JSObject> current = Handle<JSObject>::null();
-  if (type->IsConstant()) {
-    current = Handle<JSObject>::cast(type->AsConstant()->Value());
+  if (type()->IsConstant()) {
+    current = Handle<JSObject>::cast(type()->AsConstant()->Value());
   }
   Handle<JSObject> prototype = Handle<JSObject>::null();
   Handle<Map> current_map = receiver_map;
-  Handle<Map> holder_map(holder->map());
+  Handle<Map> holder_map(holder()->map());
// Traverse the prototype chain and check the maps in the prototype chain for
   // fast and global objects or do negative lookup for normal objects.
   while (!current_map.is_identical_to(holder_map)) {
@@ -864,16 +863,15 @@
 }


-Register NamedLoadHandlerCompiler::CallbackFrontend(Handle<HeapType> type,
-                                                    Register object_reg,
- Handle<JSObject> holder,
+Register NamedLoadHandlerCompiler::CallbackFrontend(Register object_reg,
                                                     Handle<Name> name,
Handle<Object> callback) {
   Label miss;

-  Register reg = FrontendHeader(type, object_reg, holder, name, &miss);
+  Register reg = FrontendHeader(object_reg, name, &miss);

-  if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) {
+  if (!holder()->HasFastProperties()) {
+    ASSERT(!holder()->IsGlobalObject());
     ASSERT(!reg.is(scratch2()));
     ASSERT(!reg.is(scratch3()));
     ASSERT(!reg.is(scratch4()));
@@ -910,8 +908,7 @@


 void NamedLoadHandlerCompiler::GenerateLoadField(
-    Register reg, Handle<JSObject> holder, FieldIndex field,
-    Representation representation) {
+    Register reg, FieldIndex field, Representation representation) {
   if (!reg.is(receiver())) __ mov(receiver(), reg);
   LoadFieldStub stub(isolate(), field);
   GenerateTailCall(masm(), stub.GetCode());
@@ -971,12 +968,11 @@
 }


-void NamedLoadHandlerCompiler::GenerateLoadInterceptor(
-    Register holder_reg, Handle<Object> object,
-    Handle<JSObject> interceptor_holder, LookupResult* lookup,
-    Handle<Name> name) {
-  ASSERT(interceptor_holder->HasNamedInterceptor());
- ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined());
+void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg,
+ LookupResult* lookup,
+                                                       Handle<Name> name) {
+  ASSERT(holder()->HasNamedInterceptor());
+  ASSERT(!holder()->GetNamedInterceptor()->getter()->IsUndefined());

   // So far the most popular follow ups for interceptor loads are FIELD
   // and CALLBACKS, so inline only them, other cases may be added
@@ -987,10 +983,12 @@
       compile_followup_inline = true;
     } else if (lookup->type() == CALLBACKS &&
                lookup->GetCallbackObject()->IsExecutableAccessorInfo()) {
-      ExecutableAccessorInfo* callback =
-          ExecutableAccessorInfo::cast(lookup->GetCallbackObject());
-      compile_followup_inline = callback->getter() != NULL &&
-          callback->IsCompatibleReceiver(*object);
+      Handle<ExecutableAccessorInfo> callback(
+          ExecutableAccessorInfo::cast(lookup->GetCallbackObject()));
+      compile_followup_inline =
+          callback->getter() != NULL &&
+ ExecutableAccessorInfo::IsCompatibleReceiverType(isolate(), callback,
+                                                           type());
     }
   }

@@ -1004,7 +1002,7 @@
// the holder and it is needed should the interceptor return without any // result. The CALLBACKS case needs the receiver to be passed into C++ code,
     // the FIELD case might cause a miss during the prototype check.
- bool must_perfrom_prototype_check = *interceptor_holder != lookup->holder();
+    bool must_perfrom_prototype_check = *holder() != lookup->holder();
     bool must_preserve_receiver_reg = !receiver().is(holder_reg) &&
         (lookup->type() == CALLBACKS || must_perfrom_prototype_check);

@@ -1021,7 +1019,7 @@
       // interceptor's holder has been compiled before (see a caller
       // of this method.)
       CompileCallLoadPropertyWithInterceptor(
-          masm(), receiver(), holder_reg, this->name(), interceptor_holder,
+          masm(), receiver(), holder_reg, this->name(), holder(),
           IC::kLoadPropertyWithInterceptorOnly);

       // Check if interceptor provided a value for property.  If it's
@@ -1042,12 +1040,12 @@
       // Leave the internal frame.
     }

- GenerateLoadPostInterceptor(holder_reg, interceptor_holder, name, lookup);
+    GenerateLoadPostInterceptor(holder_reg, name, lookup);
   } else {  // !compile_followup_inline
     // Call the runtime system to load the interceptor.
     // Check that the maps haven't changed.
-    PushInterceptorArguments(masm(), receiver(), holder_reg,
-                             this->name(), interceptor_holder);
+    PushInterceptorArguments(masm(), receiver(), holder_reg, this->name(),
+                             holder());

     ExternalReference ref =
         ExternalReference(IC_Utility(IC::kLoadPropertyWithInterceptor),
@@ -1059,13 +1057,9 @@


 Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
-    Handle<JSObject> object, Handle<JSObject> holder, Handle<Name> name,
+    Handle<JSObject> object, Handle<Name> name,
     Handle<ExecutableAccessorInfo> callback) {
-  Register holder_reg =
- Frontend(IC::CurrentTypeOf(object, isolate()), receiver(), holder, name);
-
- // Stub never generated for non-global objects that require access checks.
-  ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded());
+  Register holder_reg = Frontend(receiver(), name);

   __ push(receiver());  // receiver
   __ push(holder_reg);
@@ -1133,7 +1127,7 @@


 Handle<Code> NamedStoreHandlerCompiler::CompileStoreInterceptor(
-    Handle<JSObject> object, Handle<Name> name) {
+    Handle<Name> name) {
   __ Push(receiver(), this->name(), value());

   // Do tail-call to the runtime system.
@@ -1147,8 +1141,8 @@


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadNonexistent(
-    Handle<HeapType> type, Handle<JSObject> last, Handle<Name> name) {
-  NonexistentFrontend(type, last, name);
+    Handle<Name> name) {
+  NonexistentFrontend(name);

   // Return undefined if maps of the full prototype chain are still the
   // same and no global property with this name contains a value.
@@ -1173,19 +1167,10 @@
   // receiver, name, scratch1, scratch2, scratch3.
   Register receiver = StoreIC::ReceiverRegister();
   Register name = StoreIC::NameRegister();
+  ASSERT(r3.is(KeyedStoreIC::MapRegister()));
   static Register registers[] = { receiver, name, r3, r4, r5 };
   return registers;
 }
-
-
-Register* PropertyAccessCompiler::keyed_store_calling_convention() {
-  // receiver, name, scratch1/map, scratch2, scratch3.
-  Register receiver = KeyedStoreIC::ReceiverRegister();
-  Register name = KeyedStoreIC::NameRegister();
-  Register map = KeyedStoreIC::MapRegister();
-  static Register registers[] = { receiver, name, map, r4, r5 };
-  return registers;
-}


Register NamedStoreHandlerCompiler::value() { return StoreIC::ValueRegister(); }
@@ -1236,25 +1221,24 @@


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal(
-    Handle<HeapType> type, Handle<GlobalObject> global,
     Handle<PropertyCell> cell, Handle<Name> name, bool is_dont_delete) {
   Label miss;
-  FrontendHeader(type, receiver(), global, name, &miss);
+  FrontendHeader(receiver(), name, &miss);

   // Get the value from the cell.
-  __ mov(r3, Operand(cell));
-  __ ldr(r4, FieldMemOperand(r3, Cell::kValueOffset));
+  Register result = StoreIC::ValueRegister();
+  __ mov(result, Operand(cell));
+  __ ldr(result, FieldMemOperand(result, Cell::kValueOffset));

   // Check for deleted property if property can actually be deleted.
   if (!is_dont_delete) {
     __ LoadRoot(ip, Heap::kTheHoleValueRootIndex);
-    __ cmp(r4, ip);
+    __ cmp(result, ip);
     __ b(eq, &miss);
   }

   Counters* counters = isolate()->counters();
   __ IncrementCounter(counters->named_load_global_stub(), 1, r1, r3);
-  __ mov(r0, r4);
   __ Ret();

   FrontendFooter(name, &miss);
=======================================
--- /trunk/src/arm64/ic-arm64.cc        Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/arm64/ic-arm64.cc        Thu Jul 31 01:04:48 2014 UTC
@@ -530,21 +530,6 @@
 const Register StoreIC::ReceiverRegister() { return x1; }
 const Register StoreIC::NameRegister() { return x2; }
 const Register StoreIC::ValueRegister() { return x0; }
-
-
-const Register KeyedStoreIC::ReceiverRegister() {
-  return StoreIC::ReceiverRegister();
-}
-
-
-const Register KeyedStoreIC::NameRegister() {
-  return StoreIC::NameRegister();
-}
-
-
-const Register KeyedStoreIC::ValueRegister() {
-  return StoreIC::ValueRegister();
-}


 const Register KeyedStoreIC::MapRegister() {
=======================================
--- /trunk/src/arm64/stub-cache-arm64.cc        Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/arm64/stub-cache-arm64.cc        Thu Jul 31 01:04:48 2014 UTC
@@ -265,10 +265,10 @@
// may be clobbered. Upon branch to miss_label, the receiver and name registers
 // have their original values.
 void NamedStoreHandlerCompiler::GenerateStoreTransition(
-    MacroAssembler* masm, Handle<JSObject> object, LookupResult* lookup,
-    Handle<Map> transition, Handle<Name> name, Register receiver_reg,
-    Register storage_reg, Register value_reg, Register scratch1,
-    Register scratch2, Register scratch3, Label* miss_label, Label* slow) {
+    MacroAssembler* masm, LookupResult* lookup, Handle<Map> transition,
+    Handle<Name> name, Register receiver_reg, Register storage_reg,
+ Register value_reg, Register scratch1, Register scratch2, Register scratch3,
+    Label* miss_label, Label* slow) {
   Label exit;

   ASSERT(!AreAliased(receiver_reg, storage_reg, value_reg,
@@ -325,12 +325,12 @@
                           NoReg, MUTABLE);
   }

- // Stub never generated for non-global objects that require access checks.
-  ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
+  // Stub never generated for objects that require access checks.
+  ASSERT(!transition->is_access_check_needed());

   // Perform map transition for the receiver if necessary.
-  if ((details.type() == FIELD) &&
-      (object->map()->unused_property_fields() == 0)) {
+  if (details.type() == FIELD &&
+ Map::cast(transition->GetBackPointer())->unused_property_fields() == 0) {
     // The properties must be extended before we can store the value.
     // We jump to a runtime call that extends the properties array.
     __ Mov(scratch1, Operand(transition));
@@ -369,7 +369,7 @@
   // Adjust for the number of properties stored in the object. Even in the
// face of a transition we can use the old map here because the size of the
   // object and the number of in-object properties is not going to change.
-  index -= object->map()->inobject_properties();
+  index -= transition->inobject_properties();

   // TODO(verwaest): Share this code as a code stub.
   SmiCheck smi_check = representation.IsTagged()
@@ -377,7 +377,7 @@
   Register prop_reg = representation.IsDouble() ? storage_reg : value_reg;
   if (index < 0) {
     // Set the property straight into the object.
-    int offset = object->map()->instance_size() + (index * kPointerSize);
+    int offset = transition->instance_size() + (index * kPointerSize);
     __ Str(prop_reg, FieldMemOperand(receiver_reg, offset));

     if (!representation.IsSmi()) {
@@ -682,10 +682,10 @@


 Register PropertyHandlerCompiler::CheckPrototypes(
-    Handle<HeapType> type, Register object_reg, Handle<JSObject> holder,
-    Register holder_reg, Register scratch1, Register scratch2,
-    Handle<Name> name, Label* miss, PrototypeCheckType check) {
-  Handle<Map> receiver_map(IC::TypeToMap(*type, isolate()));
+    Register object_reg, Register holder_reg, Register scratch1,
+    Register scratch2, Handle<Name> name, Label* miss,
+    PrototypeCheckType check) {
+  Handle<Map> receiver_map(IC::TypeToMap(*type(), isolate()));

   // object_reg and holder_reg registers can alias.
   ASSERT(!AreAliased(object_reg, scratch1, scratch2));
@@ -696,12 +696,12 @@
   int depth = 0;

   Handle<JSObject> current = Handle<JSObject>::null();
-  if (type->IsConstant()) {
-    current = Handle<JSObject>::cast(type->AsConstant()->Value());
+  if (type()->IsConstant()) {
+    current = Handle<JSObject>::cast(type()->AsConstant()->Value());
   }
   Handle<JSObject> prototype = Handle<JSObject>::null();
   Handle<Map> current_map = receiver_map;
-  Handle<Map> holder_map(holder->map());
+  Handle<Map> holder_map(holder()->map());
// Traverse the prototype chain and check the maps in the prototype chain for
   // fast and global objects or do negative lookup for normal objects.
   while (!current_map.is_identical_to(holder_map)) {
@@ -817,14 +817,12 @@
 }


-Register NamedLoadHandlerCompiler::CallbackFrontend(Handle<HeapType> type,
-                                                    Register object_reg,
- Handle<JSObject> holder,
+Register NamedLoadHandlerCompiler::CallbackFrontend(Register object_reg,
                                                     Handle<Name> name,
Handle<Object> callback) {
   Label miss;

-  Register reg = FrontendHeader(type, object_reg, holder, name, &miss);
+  Register reg = FrontendHeader(object_reg, name, &miss);
   // FrontendHeader can return its result into scratch1() so do not
   // use it.
   Register scratch2 = this->scratch2();
@@ -832,7 +830,8 @@
   Register dictionary = this->scratch4();
   ASSERT(!AreAliased(reg, scratch2, scratch3, dictionary));

-  if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) {
+  if (!holder()->HasFastProperties()) {
+    ASSERT(!holder()->IsGlobalObject());
     // Load the properties dictionary.
     __ Ldr(dictionary, FieldMemOperand(reg, JSObject::kPropertiesOffset));

@@ -864,8 +863,7 @@


 void NamedLoadHandlerCompiler::GenerateLoadField(
-    Register reg, Handle<JSObject> holder, FieldIndex field,
-    Representation representation) {
+    Register reg, FieldIndex field, Representation representation) {
   __ Mov(receiver(), reg);
   LoadFieldStub stub(isolate(), field);
   GenerateTailCall(masm(), stub.GetCode());
@@ -933,14 +931,13 @@
 }


-void NamedLoadHandlerCompiler::GenerateLoadInterceptor(
-    Register holder_reg, Handle<Object> object,
-    Handle<JSObject> interceptor_holder, LookupResult* lookup,
-    Handle<Name> name) {
+void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg,
+ LookupResult* lookup,
+                                                       Handle<Name> name) {
   ASSERT(!AreAliased(receiver(), this->name(),
                      scratch1(), scratch2(), scratch3()));
-  ASSERT(interceptor_holder->HasNamedInterceptor());
- ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined());
+  ASSERT(holder()->HasNamedInterceptor());
+  ASSERT(!holder()->GetNamedInterceptor()->getter()->IsUndefined());

   // So far the most popular follow ups for interceptor loads are FIELD
   // and CALLBACKS, so inline only them, other cases may be added later.
@@ -950,10 +947,12 @@
       compile_followup_inline = true;
     } else if (lookup->type() == CALLBACKS &&
                lookup->GetCallbackObject()->IsExecutableAccessorInfo()) {
-      ExecutableAccessorInfo* callback =
-          ExecutableAccessorInfo::cast(lookup->GetCallbackObject());
-      compile_followup_inline = callback->getter() != NULL &&
-          callback->IsCompatibleReceiver(*object);
+      Handle<ExecutableAccessorInfo> callback(
+          ExecutableAccessorInfo::cast(lookup->GetCallbackObject()));
+      compile_followup_inline =
+          callback->getter() != NULL &&
+ ExecutableAccessorInfo::IsCompatibleReceiverType(isolate(), callback,
+                                                           type());
     }
   }

@@ -967,7 +966,7 @@
// the holder and it is needed should the interceptor return without any // result. The CALLBACKS case needs the receiver to be passed into C++ code,
     // the FIELD case might cause a miss during the prototype check.
- bool must_perfrom_prototype_check = *interceptor_holder != lookup->holder();
+    bool must_perfrom_prototype_check = *holder() != lookup->holder();
     bool must_preserve_receiver_reg = !receiver().Is(holder_reg) &&
         (lookup->type() == CALLBACKS || must_perfrom_prototype_check);

@@ -984,7 +983,7 @@
       // interceptor's holder has been compiled before (see a caller
       // of this method.)
       CompileCallLoadPropertyWithInterceptor(
-          masm(), receiver(), holder_reg, this->name(), interceptor_holder,
+          masm(), receiver(), holder_reg, this->name(), holder(),
           IC::kLoadPropertyWithInterceptorOnly);

       // Check if interceptor provided a value for property.  If it's
@@ -1004,12 +1003,12 @@
       }
       // Leave the internal frame.
     }
- GenerateLoadPostInterceptor(holder_reg, interceptor_holder, name, lookup);
+    GenerateLoadPostInterceptor(holder_reg, name, lookup);
   } else {  // !compile_followup_inline
     // Call the runtime system to load the interceptor.
     // Check that the maps haven't changed.
-    PushInterceptorArguments(
-        masm(), receiver(), holder_reg, this->name(), interceptor_holder);
+    PushInterceptorArguments(masm(), receiver(), holder_reg, this->name(),
+                             holder());

     ExternalReference ref =
         ExternalReference(IC_Utility(IC::kLoadPropertyWithInterceptor),
@@ -1021,14 +1020,13 @@


 Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
-    Handle<JSObject> object, Handle<JSObject> holder, Handle<Name> name,
+    Handle<JSObject> object, Handle<Name> name,
     Handle<ExecutableAccessorInfo> callback) {
   ASM_LOCATION("NamedStoreHandlerCompiler::CompileStoreCallback");
-  Register holder_reg =
- Frontend(IC::CurrentTypeOf(object, isolate()), receiver(), holder, name);
+  Register holder_reg = Frontend(receiver(), name);

// Stub never generated for non-global objects that require access checks.
-  ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded());
+  ASSERT(holder()->IsJSGlobalProxy() || !holder()->IsAccessCheckNeeded());

   // receiver() and holder_reg can alias.
   ASSERT(!AreAliased(receiver(), scratch1(), scratch2(), value()));
@@ -1098,7 +1096,7 @@


 Handle<Code> NamedStoreHandlerCompiler::CompileStoreInterceptor(
-    Handle<JSObject> object, Handle<Name> name) {
+    Handle<Name> name) {
   Label miss;

   ASM_LOCATION("NamedStoreHandlerCompiler::CompileStoreInterceptor");
@@ -1116,8 +1114,8 @@


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadNonexistent(
-    Handle<HeapType> type, Handle<JSObject> last, Handle<Name> name) {
-  NonexistentFrontend(type, last, name);
+    Handle<Name> name) {
+  NonexistentFrontend(name);

   // Return undefined if maps of the full prototype chain are still the
   // same and no global property with this name contains a value.
@@ -1149,19 +1147,10 @@
   // receiver, value, scratch1, scratch2, scratch3.
   Register receiver = StoreIC::ReceiverRegister();
   Register name = StoreIC::NameRegister();
+  ASSERT(x3.is(KeyedStoreIC::MapRegister()));
   static Register registers[] = { receiver, name, x3, x4, x5 };
   return registers;
 }
-
-
-Register* PropertyAccessCompiler::keyed_store_calling_convention() {
-  // receiver, name, scratch1/map, scratch2, scratch3.
-  Register receiver = KeyedStoreIC::ReceiverRegister();
-  Register name = KeyedStoreIC::NameRegister();
-  Register map = KeyedStoreIC::MapRegister();
-  static Register registers[] = { receiver, name, map, x4, x5 };
-  return registers;
-}


Register NamedStoreHandlerCompiler::value() { return StoreIC::ValueRegister(); }
@@ -1206,23 +1195,22 @@


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal(
-    Handle<HeapType> type, Handle<GlobalObject> global,
     Handle<PropertyCell> cell, Handle<Name> name, bool is_dont_delete) {
   Label miss;
-  FrontendHeader(type, receiver(), global, name, &miss);
+  FrontendHeader(receiver(), name, &miss);

   // Get the value from the cell.
-  __ Mov(x3, Operand(cell));
-  __ Ldr(x4, FieldMemOperand(x3, Cell::kValueOffset));
+  Register result = StoreIC::ValueRegister();
+  __ Mov(result, Operand(cell));
+  __ Ldr(result, FieldMemOperand(result, Cell::kValueOffset));

   // Check for deleted property if property can actually be deleted.
   if (!is_dont_delete) {
-    __ JumpIfRoot(x4, Heap::kTheHoleValueRootIndex, &miss);
+    __ JumpIfRoot(result, Heap::kTheHoleValueRootIndex, &miss);
   }

   Counters* counters = isolate()->counters();
   __ IncrementCounter(counters->named_load_global_stub(), 1, x1, x3);
-  __ Mov(x0, x4);
   __ Ret();

   FrontendFooter(name, &miss);
=======================================
--- /trunk/src/debug.cc Thu Jul 24 00:04:58 2014 UTC
+++ /trunk/src/debug.cc Thu Jul 31 01:04:48 2014 UTC
@@ -1889,6 +1889,11 @@
              reinterpret_cast<intptr_t>(frame->pc()),
              reinterpret_cast<intptr_t>(new_pc));
     }
+
+    if (FLAG_enable_ool_constant_pool) {
+      // Update constant pool pointer for new code.
+      frame->set_constant_pool(new_code->constant_pool());
+    }

     // Patch the return address to return into the code with
     // debug break slots.
=======================================
--- /trunk/src/ia32/ic-ia32.cc  Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/ia32/ic-ia32.cc  Thu Jul 31 01:04:48 2014 UTC
@@ -988,21 +988,6 @@
 const Register StoreIC::ReceiverRegister() { return edx; }
 const Register StoreIC::NameRegister() { return ecx; }
 const Register StoreIC::ValueRegister() { return eax; }
-
-
-const Register KeyedStoreIC::ReceiverRegister() {
-  return StoreIC::ReceiverRegister();
-}
-
-
-const Register KeyedStoreIC::NameRegister() {
-  return StoreIC::NameRegister();
-}
-
-
-const Register KeyedStoreIC::ValueRegister() {
-  return StoreIC::ValueRegister();
-}


 const Register KeyedStoreIC::MapRegister() {
=======================================
--- /trunk/src/ia32/lithium-ia32.h      Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/ia32/lithium-ia32.h      Thu Jul 31 01:04:48 2014 UTC
@@ -865,7 +865,7 @@

   LOperand* value() { return inputs_[0]; }

-  DECLARE_CONCRETE_INSTRUCTION(MathRound, "math-fround")
+  DECLARE_CONCRETE_INSTRUCTION(MathFround, "math-fround")
 };


=======================================
--- /trunk/src/ia32/stub-cache-ia32.cc  Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/ia32/stub-cache-ia32.cc  Thu Jul 31 01:04:48 2014 UTC
@@ -417,10 +417,10 @@
// Receiver_reg is preserved on jumps to miss_label, but may be destroyed if
 // store is successful.
 void NamedStoreHandlerCompiler::GenerateStoreTransition(
-    MacroAssembler* masm, Handle<JSObject> object, LookupResult* lookup,
-    Handle<Map> transition, Handle<Name> name, Register receiver_reg,
-    Register storage_reg, Register value_reg, Register scratch1,
-    Register scratch2, Register unused, Label* miss_label, Label* slow) {
+    MacroAssembler* masm, LookupResult* lookup, Handle<Map> transition,
+    Handle<Name> name, Register receiver_reg, Register storage_reg,
+ Register value_reg, Register scratch1, Register scratch2, Register unused,
+    Label* miss_label, Label* slow) {
   int descriptor = transition->LastAdded();
   DescriptorArray* descriptors = transition->instance_descriptors();
   PropertyDetails details = descriptors->GetDetails(descriptor);
@@ -469,13 +469,12 @@
     __ movsd(FieldOperand(storage_reg, HeapNumber::kValueOffset), xmm0);
   }

-  // Stub never generated for non-global objects that require access
-  // checks.
-  ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
+  // Stub never generated for objects that require access checks.
+  ASSERT(!transition->is_access_check_needed());

   // Perform map transition for the receiver if necessary.
   if (details.type() == FIELD &&
-      object->map()->unused_property_fields() == 0) {
+ Map::cast(transition->GetBackPointer())->unused_property_fields() == 0) {
     // The properties must be extended before we can store the value.
     // We jump to a runtime call that extends the properties array.
     __ pop(scratch1);  // Return address.
@@ -516,14 +515,14 @@
   // Adjust for the number of properties stored in the object. Even in the
// face of a transition we can use the old map here because the size of the
   // object and the number of in-object properties is not going to change.
-  index -= object->map()->inobject_properties();
+  index -= transition->inobject_properties();

   SmiCheck smi_check = representation.IsTagged()
       ? INLINE_SMI_CHECK : OMIT_SMI_CHECK;
   // TODO(verwaest): Share this code as a code stub.
   if (index < 0) {
     // Set the property straight into the object.
-    int offset = object->map()->instance_size() + (index * kPointerSize);
+    int offset = transition->instance_size() + (index * kPointerSize);
     if (representation.IsDouble()) {
       __ mov(FieldOperand(receiver_reg, offset), storage_reg);
     } else {
@@ -693,10 +692,10 @@


 Register PropertyHandlerCompiler::CheckPrototypes(
-    Handle<HeapType> type, Register object_reg, Handle<JSObject> holder,
-    Register holder_reg, Register scratch1, Register scratch2,
-    Handle<Name> name, Label* miss, PrototypeCheckType check) {
-  Handle<Map> receiver_map(IC::TypeToMap(*type, isolate()));
+    Register object_reg, Register holder_reg, Register scratch1,
+    Register scratch2, Handle<Name> name, Label* miss,
+    PrototypeCheckType check) {
+  Handle<Map> receiver_map(IC::TypeToMap(*type(), isolate()));

   // Make sure there's no overlap between holder and object registers.
   ASSERT(!scratch1.is(object_reg) && !scratch1.is(holder_reg));
@@ -708,11 +707,11 @@
   int depth = 0;

   Handle<JSObject> current = Handle<JSObject>::null();
-  if (type->IsConstant()) current =
-      Handle<JSObject>::cast(type->AsConstant()->Value());
+  if (type()->IsConstant())
+    current = Handle<JSObject>::cast(type()->AsConstant()->Value());
   Handle<JSObject> prototype = Handle<JSObject>::null();
   Handle<Map> current_map = receiver_map;
-  Handle<Map> holder_map(holder->map());
+  Handle<Map> holder_map(holder()->map());
// Traverse the prototype chain and check the maps in the prototype chain for
   // fast and global objects or do negative lookup for normal objects.
   while (!current_map.is_identical_to(holder_map)) {
@@ -824,16 +823,15 @@
 }


-Register NamedLoadHandlerCompiler::CallbackFrontend(Handle<HeapType> type,
-                                                    Register object_reg,
- Handle<JSObject> holder,
+Register NamedLoadHandlerCompiler::CallbackFrontend(Register object_reg,
                                                     Handle<Name> name,
Handle<Object> callback) {
   Label miss;

-  Register reg = FrontendHeader(type, object_reg, holder, name, &miss);
+  Register reg = FrontendHeader(object_reg, name, &miss);

-  if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) {
+  if (!holder()->HasFastProperties()) {
+    ASSERT(!holder()->IsGlobalObject());
     ASSERT(!reg.is(scratch2()));
     ASSERT(!reg.is(scratch3()));
     Register dictionary = scratch1();
@@ -883,8 +881,7 @@


 void NamedLoadHandlerCompiler::GenerateLoadField(
-    Register reg, Handle<JSObject> holder, FieldIndex field,
-    Representation representation) {
+    Register reg, FieldIndex field, Representation representation) {
   if (!reg.is(receiver())) __ mov(receiver(), reg);
   LoadFieldStub stub(isolate(), field);
   GenerateTailCall(masm(), stub.GetCode());
@@ -943,12 +940,11 @@
 }


-void NamedLoadHandlerCompiler::GenerateLoadInterceptor(
-    Register holder_reg, Handle<Object> object,
-    Handle<JSObject> interceptor_holder, LookupResult* lookup,
-    Handle<Name> name) {
-  ASSERT(interceptor_holder->HasNamedInterceptor());
- ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined());
+void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg,
+ LookupResult* lookup,
+                                                       Handle<Name> name) {
+  ASSERT(holder()->HasNamedInterceptor());
+  ASSERT(!holder()->GetNamedInterceptor()->getter()->IsUndefined());

   // So far the most popular follow ups for interceptor loads are FIELD
   // and CALLBACKS, so inline only them, other cases may be added
@@ -959,10 +955,12 @@
       compile_followup_inline = true;
     } else if (lookup->type() == CALLBACKS &&
                lookup->GetCallbackObject()->IsExecutableAccessorInfo()) {
-      ExecutableAccessorInfo* callback =
-          ExecutableAccessorInfo::cast(lookup->GetCallbackObject());
-      compile_followup_inline = callback->getter() != NULL &&
-          callback->IsCompatibleReceiver(*object);
+      Handle<ExecutableAccessorInfo> callback(
+          ExecutableAccessorInfo::cast(lookup->GetCallbackObject()));
+      compile_followup_inline =
+          callback->getter() != NULL &&
+ ExecutableAccessorInfo::IsCompatibleReceiverType(isolate(), callback,
+                                                           type());
     }
   }

@@ -976,7 +974,7 @@
// the holder and it is needed should the interceptor return without any // result. The CALLBACKS case needs the receiver to be passed into C++ code,
     // the FIELD case might cause a miss during the prototype check.
- bool must_perfrom_prototype_check = *interceptor_holder != lookup->holder();
+    bool must_perfrom_prototype_check = *holder() != lookup->holder();
     bool must_preserve_receiver_reg = !receiver().is(holder_reg) &&
         (lookup->type() == CALLBACKS || must_perfrom_prototype_check);

@@ -995,7 +993,7 @@
       // interceptor's holder has been compiled before (see a caller
       // of this method.)
       CompileCallLoadPropertyWithInterceptor(
-          masm(), receiver(), holder_reg, this->name(), interceptor_holder,
+          masm(), receiver(), holder_reg, this->name(), holder(),
           IC::kLoadPropertyWithInterceptorOnly);

       // Check if interceptor provided a value for property.  If it's
@@ -1023,13 +1021,13 @@
       // Leave the internal frame.
     }

- GenerateLoadPostInterceptor(holder_reg, interceptor_holder, name, lookup);
+    GenerateLoadPostInterceptor(holder_reg, name, lookup);
   } else {  // !compile_followup_inline
     // Call the runtime system to load the interceptor.
     // Check that the maps haven't changed.
     __ pop(scratch2());  // save old return address
-    PushInterceptorArguments(masm(), receiver(), holder_reg,
-                             this->name(), interceptor_holder);
+    PushInterceptorArguments(masm(), receiver(), holder_reg, this->name(),
+                             holder());
     __ push(scratch2());  // restore old return address

     ExternalReference ref =
@@ -1042,10 +1040,9 @@


 Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
-    Handle<JSObject> object, Handle<JSObject> holder, Handle<Name> name,
+    Handle<JSObject> object, Handle<Name> name,
     Handle<ExecutableAccessorInfo> callback) {
-  Register holder_reg =
- Frontend(IC::CurrentTypeOf(object, isolate()), receiver(), holder, name);
+  Register holder_reg = Frontend(receiver(), name);

   __ pop(scratch1());  // remove the return address
   __ push(receiver());
@@ -1115,7 +1112,7 @@


 Handle<Code> NamedStoreHandlerCompiler::CompileStoreInterceptor(
-    Handle<JSObject> object, Handle<Name> name) {
+    Handle<Name> name) {
   __ pop(scratch1());  // remove the return address
   __ push(receiver());
   __ push(this->name());
@@ -1173,8 +1170,8 @@


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadNonexistent(
-    Handle<HeapType> type, Handle<JSObject> last, Handle<Name> name) {
-  NonexistentFrontend(type, last, name);
+    Handle<Name> name) {
+  NonexistentFrontend(name);

   // Return undefined if maps of the full prototype chain are still the
   // same and no global property with this name contains a value.
@@ -1199,19 +1196,10 @@
   // receiver, name, scratch1, scratch2, scratch3.
   Register receiver = StoreIC::ReceiverRegister();
   Register name = StoreIC::NameRegister();
+  ASSERT(ebx.is(KeyedStoreIC::MapRegister()));
   static Register registers[] = { receiver, name, ebx, edi, no_reg };
   return registers;
 }
-
-
-Register* PropertyAccessCompiler::keyed_store_calling_convention() {
-  // receiver, name, scratch1/map, scratch2, scratch3.
-  Register receiver = KeyedStoreIC::ReceiverRegister();
-  Register name = KeyedStoreIC::NameRegister();
-  Register map = KeyedStoreIC::MapRegister();
-  static Register registers[] = { receiver, name, map, edi, no_reg };
-  return registers;
-}


Register NamedStoreHandlerCompiler::value() { return StoreIC::ValueRegister(); }
@@ -1257,25 +1245,25 @@


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal(
-    Handle<HeapType> type, Handle<GlobalObject> global,
     Handle<PropertyCell> cell, Handle<Name> name, bool is_dont_delete) {
   Label miss;

-  FrontendHeader(type, receiver(), global, name, &miss);
+  FrontendHeader(receiver(), name, &miss);
   // Get the value from the cell.
+  Register result = StoreIC::ValueRegister();
   if (masm()->serializer_enabled()) {
-    __ mov(eax, Immediate(cell));
-    __ mov(eax, FieldOperand(eax, PropertyCell::kValueOffset));
+    __ mov(result, Immediate(cell));
+    __ mov(result, FieldOperand(result, PropertyCell::kValueOffset));
   } else {
-    __ mov(eax, Operand::ForCell(cell));
+    __ mov(result, Operand::ForCell(cell));
   }

   // Check for deleted property if property can actually be deleted.
   if (!is_dont_delete) {
-    __ cmp(eax, factory()->the_hole_value());
+    __ cmp(result, factory()->the_hole_value());
     __ j(equal, &miss);
   } else if (FLAG_debug_code) {
-    __ cmp(eax, factory()->the_hole_value());
+    __ cmp(result, factory()->the_hole_value());
     __ Check(not_equal, kDontDeleteCellsCannotContainTheHole);
   }

=======================================
--- /trunk/src/ic.cc    Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/ic.cc    Thu Jul 31 01:04:48 2014 UTC
@@ -942,7 +942,8 @@
   Handle<HeapType> type = receiver_type();
   Handle<JSObject> holder(lookup->holder());
   bool receiver_is_holder = object.is_identical_to(holder);
-  NamedLoadHandlerCompiler compiler(isolate(), cache_holder);
+  NamedLoadHandlerCompiler compiler(isolate(), receiver_type(), holder,
+                                    cache_holder);

   switch (lookup->type()) {
     case FIELD: {
@@ -950,12 +951,11 @@
       if (receiver_is_holder) {
         return SimpleFieldLoad(field);
       }
-      return compiler.CompileLoadField(
-          type, holder, name, field, lookup->representation());
+ return compiler.CompileLoadField(name, field, lookup->representation());
     }
     case CONSTANT: {
       Handle<Object> constant(lookup->GetConstant(), isolate());
-      return compiler.CompileLoadConstant(type, holder, name, constant);
+      return compiler.CompileLoadConstant(name, constant);
     }
     case NORMAL:
       if (kind() != Code::LOAD_IC) break;
@@ -963,8 +963,8 @@
         Handle<GlobalObject> global = Handle<GlobalObject>::cast(holder);
         Handle<PropertyCell> cell(
             global->GetPropertyCell(lookup), isolate());
-        Handle<Code> code = compiler.CompileLoadGlobal(
-            type, global, cell, name, lookup->IsDontDelete());
+        Handle<Code> code =
+            compiler.CompileLoadGlobal(cell, name, lookup->IsDontDelete());
// TODO(verwaest): Move caching of these NORMAL stubs outside as well.
         CacheHolderFlag flag;
         Handle<Map> stub_holder_map =
@@ -997,8 +997,12 @@
         Handle<ExecutableAccessorInfo> info =
             Handle<ExecutableAccessorInfo>::cast(callback);
         if (v8::ToCData<Address>(info->getter()) == 0) break;
-        if (!info->IsCompatibleReceiver(*object)) break;
-        return compiler.CompileLoadCallback(type, holder, name, info);
+ if (!ExecutableAccessorInfo::IsCompatibleReceiverType(isolate(), info,
+                                                              type)) {
+          break;
+        }
+        if (holder->IsGlobalObject()) break;
+        return compiler.CompileLoadCallback(name, info);
       } else if (callback->IsAccessorPair()) {
Handle<Object> getter(Handle<AccessorPair>::cast(callback)->getter(),
                               isolate());
@@ -1016,10 +1020,9 @@
         CallOptimization call_optimization(function);
         if (call_optimization.is_simple_api_call() &&
             call_optimization.IsCompatibleReceiver(object, holder)) {
-          return compiler.CompileLoadCallback(
-              type, holder, name, call_optimization);
+          return compiler.CompileLoadCallback(name, call_optimization);
         }
-        return compiler.CompileLoadViaGetter(type, holder, name, function);
+        return compiler.CompileLoadViaGetter(name, function);
       }
       // TODO(dcarney): Handle correctly.
       ASSERT(callback->IsDeclaredAccessorInfo());
@@ -1027,7 +1030,7 @@
     }
     case INTERCEPTOR:
       ASSERT(HasInterceptorGetter(*holder));
-      return compiler.CompileLoadInterceptor(type, holder, name);
+      return compiler.CompileLoadInterceptor(name);
     default:
       break;
   }
@@ -1392,7 +1395,7 @@
   Handle<JSObject> receiver = Handle<JSObject>::cast(object);

   Handle<JSObject> holder(lookup->holder());
-  NamedStoreHandlerCompiler compiler(isolate());
+  NamedStoreHandlerCompiler compiler(isolate(), receiver_type(), holder);

   if (lookup->IsTransition()) {
     // Explicitly pass in the receiver map since LookupForWrite may have
@@ -1401,13 +1404,12 @@
     PropertyDetails details = lookup->GetPropertyDetails();

     if (details.type() != CALLBACKS && details.attributes() == NONE) {
-      return compiler.CompileStoreTransition(
-          receiver, lookup, transition, name);
+      return compiler.CompileStoreTransition(lookup, transition, name);
     }
   } else {
     switch (lookup->type()) {
       case FIELD:
-        return compiler.CompileStoreField(receiver, lookup, name);
+        return compiler.CompileStoreField(lookup, name);
       case NORMAL:
         if (kind() == Code::KEYED_STORE_IC) break;
         if (receiver->IsJSGlobalProxy() || receiver->IsGlobalObject()) {
@@ -1438,8 +1440,11 @@
               Handle<ExecutableAccessorInfo>::cast(callback);
           if (v8::ToCData<Address>(info->setter()) == 0) break;
           if (!holder->HasFastProperties()) break;
-          if (!info->IsCompatibleReceiver(*receiver)) break;
- return compiler.CompileStoreCallback(receiver, holder, name, info);
+          if (!ExecutableAccessorInfo::IsCompatibleReceiverType(
+                  isolate(), info, receiver_type())) {
+            break;
+          }
+          return compiler.CompileStoreCallback(receiver, name, info);
         } else if (callback->IsAccessorPair()) {
           Handle<Object> setter(
               Handle<AccessorPair>::cast(callback)->setter(), isolate());
@@ -1450,11 +1455,11 @@
           CallOptimization call_optimization(function);
           if (call_optimization.is_simple_api_call() &&
               call_optimization.IsCompatibleReceiver(receiver, holder)) {
-            return compiler.CompileStoreCallback(
-                receiver, holder, name, call_optimization);
+            return compiler.CompileStoreCallback(receiver, name,
+                                                 call_optimization);
           }
           return compiler.CompileStoreViaSetter(
-              receiver, holder, name, Handle<JSFunction>::cast(setter));
+              receiver, name, Handle<JSFunction>::cast(setter));
         }
         // TODO(dcarney): Handle correctly.
         ASSERT(callback->IsDeclaredAccessorInfo());
@@ -1463,7 +1468,7 @@
       case INTERCEPTOR:
         if (kind() == Code::KEYED_STORE_IC) break;
         ASSERT(HasInterceptorSetter(*holder));
-        return compiler.CompileStoreInterceptor(receiver, name);
+        return compiler.CompileStoreInterceptor(name);
       case CONSTANT:
         break;
       case NONEXISTENT:
=======================================
--- /trunk/src/ic.h     Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/ic.h     Thu Jul 31 01:04:48 2014 UTC
@@ -689,10 +689,6 @@
       ExtraICState extra_state) {
     return ExtraICStateKeyedAccessStoreMode::decode(extra_state);
   }
-
-  static const Register ReceiverRegister();
-  static const Register NameRegister();
-  static const Register ValueRegister();

   // The map register isn't part of the normal call specification, but
   // ElementsTransitionAndStoreStub, used in polymorphic keyed store
=======================================
--- /trunk/src/isolate.cc       Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/isolate.cc       Thu Jul 31 01:04:48 2014 UTC
@@ -638,7 +638,11 @@

 void Isolate::ReportFailedAccessCheck(Handle<JSObject> receiver,
                                       v8::AccessType type) {
-  if (!thread_local_top()->failed_access_check_callback_) return;
+  if (!thread_local_top()->failed_access_check_callback_) {
+    Handle<String> message = factory()->InternalizeUtf8String("no access");
+    ScheduleThrow(*factory()->NewTypeError(message));
+    return;
+  }

   ASSERT(receiver->IsAccessCheckNeeded());
   ASSERT(context());
=======================================
--- /trunk/src/mirror-debugger.js       Thu Jul 24 00:04:58 2014 UTC
+++ /trunk/src/mirror-debugger.js       Thu Jul 31 01:04:48 2014 UTC
@@ -171,7 +171,7 @@
 PropertyKind.Indexed = 2;


-// A copy of the PropertyType enum from global.h
+// A copy of the PropertyType enum from property-details.h
 var PropertyType = {};
 PropertyType.Normal                  = 0;
 PropertyType.Field                   = 1;
@@ -179,8 +179,7 @@
 PropertyType.Callbacks               = 3;
 PropertyType.Handler                 = 4;
 PropertyType.Interceptor             = 5;
-PropertyType.Transition              = 6;
-PropertyType.Nonexistent             = 7;
+PropertyType.Nonexistent             = 6;


 // Different attributes for a property.
@@ -682,6 +681,19 @@
   var x = %GetInterceptorInfo(this.value_);
   return (x & 1) != 0;
 };
+
+
+// Get all own property names except for private symbols.
+function TryGetPropertyNames(object) {
+  try {
+    // TODO(yangguo): Should there be a special debugger implementation of
+    // %GetOwnPropertyNames that doesn't perform access checks?
+ return %GetOwnPropertyNames(object, PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL);
+  } catch (e) {
+    // Might have hit a failed access check.
+    return [];
+  }
+}


 /**
@@ -702,9 +714,7 @@

   // Find all the named properties.
   if (kind & PropertyKind.Named) {
-    // Get all own property names except for private symbols.
-    propertyNames =
- %GetOwnPropertyNames(this.value_, PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL);
+    propertyNames = TryGetPropertyNames(this.value_);
     total += propertyNames.length;

     // Get names for named interceptor properties if any.
=======================================
--- /trunk/src/objects-inl.h    Tue Jul 29 08:45:47 2014 UTC
+++ /trunk/src/objects-inl.h    Thu Jul 31 01:04:48 2014 UTC
@@ -6771,9 +6771,10 @@


 bool AccessorInfo::IsCompatibleReceiver(Object* receiver) {
-  Object* function_template = expected_receiver_type();
-  if (!function_template->IsFunctionTemplateInfo()) return true;
- return FunctionTemplateInfo::cast(function_template)->IsTemplateFor(receiver);
+  if (!HasExpectedReceiverType()) return true;
+  if (!receiver->IsJSObject()) return false;
+  return FunctionTemplateInfo::cast(expected_receiver_type())
+      ->IsTemplateFor(JSObject::cast(receiver)->map());
 }


=======================================
--- /trunk/src/objects.cc       Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/objects.cc       Thu Jul 31 01:04:48 2014 UTC
@@ -409,8 +409,8 @@
   ASSERT(!structure->IsForeign());
   // api style callbacks.
   if (structure->IsAccessorInfo()) {
- Handle<AccessorInfo> accessor_info = Handle<AccessorInfo>::cast(structure);
-    if (!accessor_info->IsCompatibleReceiver(*receiver)) {
+    Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure);
+    if (!info->IsCompatibleReceiver(*receiver)) {
       Handle<Object> args[2] = { name, receiver };
       Handle<Object> error =
           isolate->factory()->NewTypeError("incompatible_method_receiver",
@@ -460,6 +460,17 @@
   // Getter is not a function.
   return isolate->factory()->undefined_value();
 }
+
+
+bool AccessorInfo::IsCompatibleReceiverType(Isolate* isolate,
+                                            Handle<AccessorInfo> info,
+                                            Handle<HeapType> type) {
+  if (!info->HasExpectedReceiverType()) return true;
+  Handle<Map> map = IC::TypeToMap(*type, isolate);
+  if (!map->IsJSObjectMap()) return false;
+  return FunctionTemplateInfo::cast(info->expected_receiver_type())
+      ->IsTemplateFor(*map);
+}


 MaybeHandle<Object> Object::SetPropertyWithAccessor(
@@ -474,8 +485,8 @@
     // Don't call executable accessor setters with non-JSObject receivers.
     if (!receiver->IsJSObject()) return value;
     // api style callbacks
- ExecutableAccessorInfo* data = ExecutableAccessorInfo::cast(*structure);
-    if (!data->IsCompatibleReceiver(*receiver)) {
+ ExecutableAccessorInfo* info = ExecutableAccessorInfo::cast(*structure);
+    if (!info->IsCompatibleReceiver(*receiver)) {
       Handle<Object> args[2] = { name, receiver };
       Handle<Object> error =
           isolate->factory()->NewTypeError("incompatible_method_receiver",
@@ -485,13 +496,13 @@
     }
     // TODO(rossberg): Support symbols in the API.
     if (name->IsSymbol()) return value;
-    Object* call_obj = data->setter();
+    Object* call_obj = info->setter();
     v8::AccessorSetterCallback call_fun =
         v8::ToCData<v8::AccessorSetterCallback>(call_obj);
     if (call_fun == NULL) return value;
     Handle<String> key = Handle<String>::cast(name);
     LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name));
- PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder); + PropertyCallbackArguments args(isolate, info->data(), *receiver, *holder);
     args.Call(call_fun,
               v8::Utils::ToLocal(key),
               v8::Utils::ToLocal(value));
=======================================
--- /trunk/src/objects.h        Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/objects.h        Thu Jul 31 01:04:48 2014 UTC
@@ -10528,6 +10528,9 @@
   inline void set_property_attributes(PropertyAttributes attributes);

   // Checks whether the given receiver is compatible with this accessor.
+  static bool IsCompatibleReceiverType(Isolate* isolate,
+                                       Handle<AccessorInfo> info,
+                                       Handle<HeapType> type);
   inline bool IsCompatibleReceiver(Object* receiver);

   DECLARE_CAST(AccessorInfo)
@@ -10547,6 +10550,9 @@
   static const int kSize = kExpectedReceiverTypeOffset + kPointerSize;

  private:
+  inline bool HasExpectedReceiverType() {
+    return expected_receiver_type()->IsFunctionTemplateInfo();
+  }
   // Bit positions in flag.
   static const int kAllCanReadBit = 0;
   static const int kAllCanWriteBit = 1;
=======================================
--- /trunk/src/stub-cache.cc    Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/stub-cache.cc    Thu Jul 31 01:04:48 2014 UTC
@@ -203,8 +203,8 @@
       cache_name, stub_holder_map, Code::LOAD_IC, flag, Code::FAST);
   if (!handler.is_null()) return handler;

-  NamedLoadHandlerCompiler compiler(isolate, flag);
-  handler = compiler.CompileLoadNonexistent(type, last, cache_name);
+  NamedLoadHandlerCompiler compiler(isolate, type, last, flag);
+  handler = compiler.CompileLoadNonexistent(cache_name);
   Map::UpdateCodeCache(stub_holder_map, cache_name, handler);
   return handler;
 }
@@ -497,25 +497,27 @@


 RUNTIME_FUNCTION(StoreCallbackProperty) {
-  JSObject* receiver = JSObject::cast(args[0]);
-  JSObject* holder = JSObject::cast(args[1]);
-  ExecutableAccessorInfo* callback = ExecutableAccessorInfo::cast(args[2]);
+  Handle<JSObject> receiver = args.at<JSObject>(0);
+  Handle<JSObject> holder = args.at<JSObject>(1);
+ Handle<ExecutableAccessorInfo> callback = args.at<ExecutableAccessorInfo>(2);
+  Handle<Name> name = args.at<Name>(3);
+  Handle<Object> value = args.at<Object>(4);
+  HandleScope scope(isolate);
+
+  ASSERT(callback->IsCompatibleReceiver(*receiver));
+
   Address setter_address = v8::ToCData<Address>(callback->setter());
   v8::AccessorSetterCallback fun =
       FUNCTION_CAST<v8::AccessorSetterCallback>(setter_address);
   ASSERT(fun != NULL);
-  ASSERT(callback->IsCompatibleReceiver(receiver));
-  Handle<Name> name = args.at<Name>(3);
-  Handle<Object> value = args.at<Object>(4);
-  HandleScope scope(isolate);

   // TODO(rossberg): Support symbols in the API.
   if (name->IsSymbol()) return *value;
   Handle<String> str = Handle<String>::cast(name);

-  LOG(isolate, ApiNamedPropertyAccess("store", receiver, *name));
-  PropertyCallbackArguments
-      custom_args(isolate, callback->data(), receiver, holder);
+  LOG(isolate, ApiNamedPropertyAccess("store", *receiver, *name));
+ PropertyCallbackArguments custom_args(isolate, callback->data(), *receiver,
+                                        *holder);
custom_args.Call(fun, v8::Utils::ToLocal(str), v8::Utils::ToLocal(value));
   RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
   return *value;
@@ -746,20 +748,18 @@
 #define __ ACCESS_MASM(masm())


-Register NamedLoadHandlerCompiler::FrontendHeader(Handle<HeapType> type,
-                                                  Register object_reg,
-                                                  Handle<JSObject> holder,
+Register NamedLoadHandlerCompiler::FrontendHeader(Register object_reg,
                                                   Handle<Name> name,
                                                   Label* miss) {
   PrototypeCheckType check_type = CHECK_ALL_MAPS;
   int function_index = -1;
-  if (type->Is(HeapType::String())) {
+  if (type()->Is(HeapType::String())) {
     function_index = Context::STRING_FUNCTION_INDEX;
-  } else if (type->Is(HeapType::Symbol())) {
+  } else if (type()->Is(HeapType::Symbol())) {
     function_index = Context::SYMBOL_FUNCTION_INDEX;
-  } else if (type->Is(HeapType::Number())) {
+  } else if (type()->Is(HeapType::Number())) {
     function_index = Context::NUMBER_FUNCTION_INDEX;
-  } else if (type->Is(HeapType::Boolean())) {
+  } else if (type()->Is(HeapType::Boolean())) {
     function_index = Context::BOOLEAN_FUNCTION_INDEX;
   } else {
     check_type = SKIP_RECEIVER;
@@ -770,26 +770,23 @@
         masm(), function_index, scratch1(), miss);
     Object* function = isolate()->native_context()->get(function_index);
     Object* prototype = JSFunction::cast(function)->instance_prototype();
-    type = IC::CurrentTypeOf(handle(prototype, isolate()), isolate());
+    set_type_for_object(handle(prototype, isolate()));
     object_reg = scratch1();
   }

   // Check that the maps starting from the prototype haven't changed.
-  return CheckPrototypes(
-      type, object_reg, holder, scratch1(), scratch2(), scratch3(),
-      name, miss, check_type);
+ return CheckPrototypes(object_reg, scratch1(), scratch2(), scratch3(), name,
+                         miss, check_type);
 }


// Frontend for store uses the name register. It has to be restored before a
 // miss.
-Register NamedStoreHandlerCompiler::FrontendHeader(Handle<HeapType> type,
-                                                   Register object_reg,
-                                                   Handle<JSObject> holder,
+Register NamedStoreHandlerCompiler::FrontendHeader(Register object_reg,
                                                    Handle<Name> name,
                                                    Label* miss) {
-  return CheckPrototypes(type, object_reg, holder, this->name(),
- scratch1(), scratch2(), name, miss, SKIP_RECEIVER); + return CheckPrototypes(object_reg, this->name(), scratch1(), scratch2(), name,
+                         miss, SKIP_RECEIVER);
 }


@@ -801,54 +798,50 @@
 }


-Register PropertyHandlerCompiler::Frontend(Handle<HeapType> type,
-                                           Register object_reg,
-                                           Handle<JSObject> holder,
+Register PropertyHandlerCompiler::Frontend(Register object_reg,
                                            Handle<Name> name) {
   Label miss;
-  Register reg = FrontendHeader(type, object_reg, holder, name, &miss);
+  Register reg = FrontendHeader(object_reg, name, &miss);
   FrontendFooter(name, &miss);
   return reg;
 }


-void NamedLoadHandlerCompiler::NonexistentFrontend(Handle<HeapType> type,
-                                                   Handle<JSObject> last,
-                                                   Handle<Name> name) {
+void NamedLoadHandlerCompiler::NonexistentFrontend(Handle<Name> name) {
   Label miss;

-  Register holder;
+  Register holder_reg;
   Handle<Map> last_map;
-  if (last.is_null()) {
-    holder = receiver();
-    last_map = IC::TypeToMap(*type, isolate());
- // If |type| has null as its prototype, |last| is Handle<JSObject>::null().
+  if (holder().is_null()) {
+    holder_reg = receiver();
+    last_map = IC::TypeToMap(*type(), isolate());
+    // If |type| has null as its prototype, |holder()| is
+    // Handle<JSObject>::null().
     ASSERT(last_map->prototype() == isolate()->heap()->null_value());
   } else {
-    holder = FrontendHeader(type, receiver(), last, name, &miss);
-    last_map = handle(last->map());
+    holder_reg = FrontendHeader(receiver(), name, &miss);
+    last_map = handle(holder()->map());
   }

-  if (last_map->is_dictionary_map() &&
-      !last_map->IsJSGlobalObjectMap() &&
-      !last_map->IsJSGlobalProxyMap()) {
+  if (last_map->is_dictionary_map() && !last_map->IsJSGlobalObjectMap()) {
     if (!name->IsUniqueName()) {
       ASSERT(name->IsString());
       name = factory()->InternalizeString(Handle<String>::cast(name));
     }
-    ASSERT(last.is_null() ||
-           last->property_dictionary()->FindEntry(name) ==
+    ASSERT(holder().is_null() ||
+           holder()->property_dictionary()->FindEntry(name) ==
                NameDictionary::kNotFound);
-    GenerateDictionaryNegativeLookup(masm(), &miss, holder, name,
+    GenerateDictionaryNegativeLookup(masm(), &miss, holder_reg, name,
                                      scratch2(), scratch3());
   }

   // If the last object in the prototype chain is a global object,
   // check that the global property cell is empty.
   if (last_map->IsJSGlobalObjectMap()) {
-    Handle<JSGlobalObject> global = last.is_null()
-        ? Handle<JSGlobalObject>::cast(type->AsConstant()->Value())
-        : Handle<JSGlobalObject>::cast(last);
+    Handle<JSGlobalObject> global =
+        holder().is_null()
+            ? Handle<JSGlobalObject>::cast(type()->AsConstant()->Value())
+            : Handle<JSGlobalObject>::cast(holder());
     GenerateCheckPropertyCell(masm(), global, name, scratch2(), &miss);
   }

@@ -857,39 +850,35 @@


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadField(
-    Handle<HeapType> type, Handle<JSObject> holder, Handle<Name> name,
-    FieldIndex field, Representation representation) {
-  Register reg = Frontend(type, receiver(), holder, name);
-  GenerateLoadField(reg, holder, field, representation);
+    Handle<Name> name, FieldIndex field, Representation representation) {
+  Register reg = Frontend(receiver(), name);
+  GenerateLoadField(reg, field, representation);
   return GetCode(kind(), Code::FAST, name);
 }


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadConstant(
-    Handle<HeapType> type, Handle<JSObject> holder, Handle<Name> name,
-    Handle<Object> value) {
-  Frontend(type, receiver(), holder, name);
+    Handle<Name> name, Handle<Object> value) {
+  Frontend(receiver(), name);
   GenerateLoadConstant(value);
   return GetCode(kind(), Code::FAST, name);
 }


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadCallback(
-    Handle<HeapType> type, Handle<JSObject> holder, Handle<Name> name,
-    Handle<ExecutableAccessorInfo> callback) {
- Register reg = CallbackFrontend(type, receiver(), holder, name, callback);
+    Handle<Name> name, Handle<ExecutableAccessorInfo> callback) {
+  Register reg = CallbackFrontend(receiver(), name, callback);
   GenerateLoadCallback(reg, callback);
   return GetCode(kind(), Code::FAST, name);
 }


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadCallback(
-    Handle<HeapType> type, Handle<JSObject> holder, Handle<Name> name,
-    const CallOptimization& call_optimization) {
+    Handle<Name> name, const CallOptimization& call_optimization) {
   ASSERT(call_optimization.is_simple_api_call());
   Handle<JSFunction> callback = call_optimization.constant_function();
-  CallbackFrontend(type, receiver(), holder, name, callback);
-  Handle<Map>receiver_map = IC::TypeToMap(*type, isolate());
+  CallbackFrontend(receiver(), name, callback);
+  Handle<Map> receiver_map = IC::TypeToMap(*type(), isolate());
   GenerateFastApiCall(
       masm(), call_optimization, receiver_map,
       receiver(), scratch1(), false, 0, NULL);
@@ -898,53 +887,48 @@


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadInterceptor(
-    Handle<HeapType> type, Handle<JSObject> holder, Handle<Name> name) {
+    Handle<Name> name) {
   // Perform a lookup after the interceptor.
   LookupResult lookup(isolate());
-  holder->LookupOwnRealNamedProperty(name, &lookup);
+  holder()->LookupOwnRealNamedProperty(name, &lookup);
   if (!lookup.IsFound()) {
-    PrototypeIterator iter(holder->GetIsolate(), holder);
+    PrototypeIterator iter(holder()->GetIsolate(), holder());
     if (!iter.IsAtEnd()) {
       PrototypeIterator::GetCurrent(iter)->Lookup(name, &lookup);
     }
   }

-  Register reg = Frontend(type, receiver(), holder, name);
+  Register reg = Frontend(receiver(), name);
   // TODO(368): Compile in the whole chain: all the interceptors in
   // prototypes and ultimate answer.
-  GenerateLoadInterceptor(reg, type, holder, &lookup, name);
+  GenerateLoadInterceptor(reg, &lookup, name);
   return GetCode(kind(), Code::FAST, name);
 }


 void NamedLoadHandlerCompiler::GenerateLoadPostInterceptor(
-    Register interceptor_reg, Handle<JSObject> interceptor_holder,
-    Handle<Name> name, LookupResult* lookup) {
-  Handle<JSObject> holder(lookup->holder());
+    Register interceptor_reg, Handle<Name> name, LookupResult* lookup) {
+  Handle<JSObject> real_named_property_holder(lookup->holder());
   if (lookup->IsField()) {
     FieldIndex field = lookup->GetFieldIndex();
-    if (interceptor_holder.is_identical_to(holder)) {
-      GenerateLoadField(
-          interceptor_reg, holder, field, lookup->representation());
+    if (holder().is_identical_to(real_named_property_holder)) {
+      GenerateLoadField(interceptor_reg, field, lookup->representation());
     } else {
- // We found FIELD property in prototype chain of interceptor's holder.
-      // Retrieve a field from field's holder.
- Register reg = Frontend(IC::CurrentTypeOf(interceptor_holder, isolate()),
-                              interceptor_reg, holder, name);
-      GenerateLoadField(
-          reg, holder, field, lookup->representation());
+      set_type_for_object(holder());
+      set_holder(real_named_property_holder);
+      Register reg = Frontend(interceptor_reg, name);
+      GenerateLoadField(reg, field, lookup->representation());
     }
   } else {
-    // We found CALLBACKS property in prototype chain of interceptor's
-    // holder.
+ // We found CALLBACKS property in prototype chain of interceptor's holder.
     ASSERT(lookup->type() == CALLBACKS);
     Handle<ExecutableAccessorInfo> callback(
         ExecutableAccessorInfo::cast(lookup->GetCallbackObject()));
     ASSERT(callback->getter() != NULL);

-    Register reg =
-        CallbackFrontend(IC::CurrentTypeOf(interceptor_holder, isolate()),
-                         interceptor_reg, holder, name, callback);
+    set_type_for_object(holder());
+    set_holder(real_named_property_holder);
+    Register reg = CallbackFrontend(interceptor_reg, name, callback);
     GenerateLoadCallback(reg, callback);
   }
 }
@@ -964,50 +948,44 @@


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadViaGetter(
-    Handle<HeapType> type, Handle<JSObject> holder, Handle<Name> name,
-    Handle<JSFunction> getter) {
-  Frontend(type, receiver(), holder, name);
-  GenerateLoadViaGetter(masm(), type, receiver(), getter);
+    Handle<Name> name, Handle<JSFunction> getter) {
+  Frontend(receiver(), name);
+  GenerateLoadViaGetter(masm(), type(), receiver(), getter);
   return GetCode(kind(), Code::FAST, name);
 }


+// TODO(verwaest): Cleanup. holder() is actually the receiver.
 Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition(
-    Handle<JSObject> object, LookupResult* lookup, Handle<Map> transition,
-    Handle<Name> name) {
+    LookupResult* lookup, Handle<Map> transition, Handle<Name> name) {
   Label miss, slow;

   // Ensure no transitions to deprecated maps are followed.
   __ CheckMapDeprecated(transition, scratch1(), &miss);

   // Check that we are allowed to write this.
-  PrototypeIterator iter(object->GetIsolate(), object);
-  if (!iter.IsAtEnd()) {
-    Handle<JSObject> holder;
-    // holder == object indicates that no property was found.
-    if (lookup->holder() != *object) {
-      holder = Handle<JSObject>(lookup->holder());
-    } else {
-      // Find the top object.
-      do {
- holder = Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter));
-        iter.Advance();
-      } while (!iter.IsAtEnd());
+  bool is_nonexistent = holder()->map() == transition->GetBackPointer();
+  if (is_nonexistent) {
+    // Find the top object.
+    Handle<JSObject> last;
+    PrototypeIterator iter(isolate(), holder());
+    while (!iter.IsAtEnd()) {
+      last = Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter));
+      iter.Advance();
     }
+    if (!last.is_null()) set_holder(last);
+  }

- Register holder_reg = FrontendHeader(IC::CurrentTypeOf(object, isolate()),
-                                         receiver(), holder, name, &miss);
+  Register holder_reg = FrontendHeader(receiver(), name, &miss);

-    // If no property was found, and the holder (the last object in the
- // prototype chain) is in slow mode, we need to do a negative lookup on the
-    // holder.
-    if (lookup->holder() == *object) {
- GenerateNegativeHolderLookup(masm(), holder, holder_reg, name, &miss);
-    }
+  // If no property was found, and the holder (the last object in the
+ // prototype chain) is in slow mode, we need to do a negative lookup on the
+  // holder.
+  if (is_nonexistent) {
+ GenerateNegativeHolderLookup(masm(), holder(), holder_reg, name, &miss);
   }

   GenerateStoreTransition(masm(),
-                          object,
                           lookup,
                           transition,
                           name,
@@ -1026,19 +1004,15 @@
 }


-Handle<Code> NamedStoreHandlerCompiler::CompileStoreField(
-    Handle<JSObject> object, LookupResult* lookup, Handle<Name> name) {
+Handle<Code> NamedStoreHandlerCompiler::CompileStoreField(LookupResult* lookup, + Handle<Name> name) {
   Label miss;

- FrontendHeader(IC::CurrentTypeOf(object, isolate()), receiver(), object, name,
-                 &miss);
+  FrontendHeader(receiver(), name, &miss);

   // Generate store field code.
-  GenerateStoreField(masm(),
-                     object,
-                     lookup,
- receiver(), this->name(), value(), scratch1(), scratch2(),
-                     &miss);
+  GenerateStoreField(masm(), holder(), lookup, receiver(), this->name(),
+                     value(), scratch1(), scratch2(), &miss);

   // Handle store cache miss.
   __ bind(&miss);
@@ -1048,7 +1022,7 @@


 Handle<Code> NamedStoreHandlerCompiler::CompileStoreArrayLength(
-    Handle<JSObject> object, LookupResult* lookup, Handle<Name> name) {
+    LookupResult* lookup, Handle<Name> name) {
   // This accepts as a receiver anything JSArray::SetElementsLength accepts
// (currently anything except for external arrays which means anything with // elements of FixedArray type). Value must be a number, but only smis are
@@ -1069,20 +1043,18 @@


 Handle<Code> NamedStoreHandlerCompiler::CompileStoreViaSetter(
-    Handle<JSObject> object, Handle<JSObject> holder, Handle<Name> name,
-    Handle<JSFunction> setter) {
-  Handle<HeapType> type = IC::CurrentTypeOf(object, isolate());
-  Frontend(type, receiver(), holder, name);
-  GenerateStoreViaSetter(masm(), type, receiver(), setter);
+ Handle<JSObject> object, Handle<Name> name, Handle<JSFunction> setter) {
+  Frontend(receiver(), name);
+  GenerateStoreViaSetter(masm(), type(), receiver(), setter);

   return GetCode(kind(), Code::FAST, name);
 }


 Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
-    Handle<JSObject> object, Handle<JSObject> holder, Handle<Name> name,
+    Handle<JSObject> object, Handle<Name> name,
     const CallOptimization& call_optimization) {
-  Frontend(IC::CurrentTypeOf(object, isolate()), receiver(), holder, name);
+  Frontend(receiver(), name);
   Register values[] = { value() };
   GenerateFastApiCall(
       masm(), call_optimization, handle(object->map()),
@@ -1127,12 +1099,9 @@
 Register* PropertyAccessCompiler::GetCallingConvention(Code::Kind kind) {
   if (kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC) {
     return load_calling_convention();
-  } else if (kind == Code::STORE_IC) {
-    return store_calling_convention();
-  } else {
-    ASSERT_EQ(Code::KEYED_STORE_IC, kind);
-    return keyed_store_calling_convention();
   }
+  ASSERT(kind == Code::STORE_IC || kind == Code::KEYED_STORE_IC);
+  return store_calling_convention();
 }


=======================================
--- /trunk/src/stub-cache.h     Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/stub-cache.h     Thu Jul 31 01:04:48 2014 UTC
@@ -374,13 +374,15 @@

  protected:
   PropertyHandlerCompiler(Isolate* isolate, Code::Kind kind,
+                          Handle<HeapType> type, Handle<JSObject> holder,
                           CacheHolderFlag cache_holder)
-      : PropertyAccessCompiler(isolate, kind, cache_holder) {}
+      : PropertyAccessCompiler(isolate, kind, cache_holder),
+        type_(type),
+        holder_(holder) {}

   virtual ~PropertyHandlerCompiler() {}

- virtual Register FrontendHeader(Handle<HeapType> type, Register object_reg, - Handle<JSObject> holder, Handle<Name> name,
+  virtual Register FrontendHeader(Register object_reg, Handle<Name> name,
                                   Label* miss) {
     UNREACHABLE();
     return receiver();
@@ -388,8 +390,7 @@

virtual void FrontendFooter(Handle<Name> name, Label* miss) { UNREACHABLE(); }

-  Register Frontend(Handle<HeapType> type, Register object_reg,
-                    Handle<JSObject> holder, Handle<Name> name);
+  Register Frontend(Register object_reg, Handle<Name> name);

   // TODO(verwaest): Make non-static.
   static void GenerateFastApiCall(MacroAssembler* masm,
@@ -431,67 +432,58 @@
   // register is only clobbered if it the same as the holder register. The
// function returns a register containing the holder - either object_reg or
   // holder_reg.
-  Register CheckPrototypes(Handle<HeapType> type,
-                           Register object_reg,
-                           Handle<JSObject> holder,
-                           Register holder_reg,
-                           Register scratch1,
-                           Register scratch2,
-                           Handle<Name> name,
-                           Label* miss,
+  Register CheckPrototypes(Register object_reg, Register holder_reg,
+                           Register scratch1, Register scratch2,
+                           Handle<Name> name, Label* miss,
                            PrototypeCheckType check = CHECK_ALL_MAPS);

Handle<Code> GetCode(Code::Kind kind, Code::StubType type, Handle<Name> name);
+  void set_type_for_object(Handle<Object> object) {
+    type_ = IC::CurrentTypeOf(object, isolate());
+  }
+  void set_holder(Handle<JSObject> holder) { holder_ = holder; }
+  Handle<HeapType> type() const { return type_; }
+  Handle<JSObject> holder() const { return holder_; }
+
+ private:
+  Handle<HeapType> type_;
+  Handle<JSObject> holder_;
 };


 class NamedLoadHandlerCompiler : public PropertyHandlerCompiler {
  public:
-  NamedLoadHandlerCompiler(Isolate* isolate,
-                           CacheHolderFlag cache_holder = kCacheOnReceiver)
-      : PropertyHandlerCompiler(isolate, Code::LOAD_IC, cache_holder) {}
+  NamedLoadHandlerCompiler(Isolate* isolate, Handle<HeapType> type,
+                           Handle<JSObject> holder,
+                           CacheHolderFlag cache_holder)
+      : PropertyHandlerCompiler(isolate, Code::LOAD_IC, type, holder,
+                                cache_holder) {}

   virtual ~NamedLoadHandlerCompiler() {}

-  Handle<Code> CompileLoadField(Handle<HeapType> type,
-                                Handle<JSObject> holder,
-                                Handle<Name> name,
-                                FieldIndex index,
+  Handle<Code> CompileLoadField(Handle<Name> name, FieldIndex index,
                                 Representation representation);

-  Handle<Code> CompileLoadCallback(Handle<HeapType> type,
-                                   Handle<JSObject> holder,
-                                   Handle<Name> name,
+  Handle<Code> CompileLoadCallback(Handle<Name> name,
Handle<ExecutableAccessorInfo> callback);

-  Handle<Code> CompileLoadCallback(Handle<HeapType> type,
-                                   Handle<JSObject> holder,
-                                   Handle<Name> name,
+  Handle<Code> CompileLoadCallback(Handle<Name> name,
const CallOptimization& call_optimization);

-  Handle<Code> CompileLoadConstant(Handle<HeapType> type,
-                                   Handle<JSObject> holder,
-                                   Handle<Name> name,
-                                   Handle<Object> value);
+ Handle<Code> CompileLoadConstant(Handle<Name> name, Handle<Object> value);

-  Handle<Code> CompileLoadInterceptor(Handle<HeapType> type,
-                                      Handle<JSObject> holder,
-                                      Handle<Name> name);
+  Handle<Code> CompileLoadInterceptor(Handle<Name> name);

-  Handle<Code> CompileLoadViaGetter(Handle<HeapType> type,
-                                    Handle<JSObject> holder,
-                                    Handle<Name> name,
+  Handle<Code> CompileLoadViaGetter(Handle<Name> name,
                                     Handle<JSFunction> getter);

+ Handle<Code> CompileLoadGlobal(Handle<PropertyCell> cell, Handle<Name> name,
+                                 bool is_dont_delete);
+
+  // Static interface
   static Handle<Code> ComputeLoadNonexistent(Handle<Name> name,
                                              Handle<HeapType> type);

-  Handle<Code> CompileLoadGlobal(Handle<HeapType> type,
-                                 Handle<GlobalObject> holder,
-                                 Handle<PropertyCell> cell,
-                                 Handle<Name> name,
-                                 bool is_dont_delete);
-
static void GenerateLoadViaGetter(MacroAssembler* masm, Handle<HeapType> type,
                                     Register receiver,
                                     Handle<JSFunction> getter);
@@ -518,23 +510,18 @@
   static const int kInterceptorArgsLength = 4;

  protected:
- virtual Register FrontendHeader(Handle<HeapType> type, Register object_reg, - Handle<JSObject> holder, Handle<Name> name,
+  virtual Register FrontendHeader(Register object_reg, Handle<Name> name,
                                   Label* miss);

   virtual void FrontendFooter(Handle<Name> name, Label* miss);

  private:
-  Register CallbackFrontend(Handle<HeapType> type, Register object_reg,
-                            Handle<JSObject> holder, Handle<Name> name,
+  Register CallbackFrontend(Register object_reg, Handle<Name> name,
                             Handle<Object> callback);
-  Handle<Code> CompileLoadNonexistent(Handle<HeapType> type,
- Handle<JSObject> last, Handle<Name> name);
-  void NonexistentFrontend(Handle<HeapType> type, Handle<JSObject> last,
-                           Handle<Name> name);
+  Handle<Code> CompileLoadNonexistent(Handle<Name> name);
+  void NonexistentFrontend(Handle<Name> name);

   void GenerateLoadField(Register reg,
-                         Handle<JSObject> holder,
                          FieldIndex field,
                          Representation representation);
   void GenerateLoadConstant(Handle<Object> value);
@@ -543,12 +530,9 @@
   void GenerateLoadCallback(const CallOptimization& call_optimization,
                             Handle<Map> receiver_map);
   void GenerateLoadInterceptor(Register holder_reg,
-                               Handle<Object> object,
-                               Handle<JSObject> holder,
                                LookupResult* lookup,
                                Handle<Name> name);
   void GenerateLoadPostInterceptor(Register reg,
-                                   Handle<JSObject> interceptor_holder,
                                    Handle<Name> name,
                                    LookupResult* lookup);

@@ -570,38 +554,31 @@

 class NamedStoreHandlerCompiler : public PropertyHandlerCompiler {
  public:
-  explicit NamedStoreHandlerCompiler(Isolate* isolate)
- : PropertyHandlerCompiler(isolate, Code::STORE_IC, kCacheOnReceiver) {} + explicit NamedStoreHandlerCompiler(Isolate* isolate, Handle<HeapType> type,
+                                     Handle<JSObject> holder)
+      : PropertyHandlerCompiler(isolate, Code::STORE_IC, type, holder,
+                                kCacheOnReceiver) {}

   virtual ~NamedStoreHandlerCompiler() {}

-  Handle<Code> CompileStoreTransition(Handle<JSObject> object,
-                                      LookupResult* lookup,
+  Handle<Code> CompileStoreTransition(LookupResult* lookup,
                                       Handle<Map> transition,
                                       Handle<Name> name);

-  Handle<Code> CompileStoreField(Handle<JSObject> object,
-                                 LookupResult* lookup,
-                                 Handle<Name> name);
+  Handle<Code> CompileStoreField(LookupResult* lookup, Handle<Name> name);

-  Handle<Code> CompileStoreArrayLength(Handle<JSObject> object,
-                                       LookupResult* lookup,
-                                       Handle<Name> name);
+ Handle<Code> CompileStoreArrayLength(LookupResult* lookup, Handle<Name> name);

-  Handle<Code> CompileStoreCallback(Handle<JSObject> object,
- Handle<JSObject> holder, Handle<Name> name, + Handle<Code> CompileStoreCallback(Handle<JSObject> object, Handle<Name> name, Handle<ExecutableAccessorInfo> callback);

-  Handle<Code> CompileStoreCallback(Handle<JSObject> object,
- Handle<JSObject> holder, Handle<Name> name, + Handle<Code> CompileStoreCallback(Handle<JSObject> object, Handle<Name> name, const CallOptimization& call_optimization);

-  Handle<Code> CompileStoreViaSetter(Handle<JSObject> object,
- Handle<JSObject> holder, Handle<Name> name, + Handle<Code> CompileStoreViaSetter(Handle<JSObject> object, Handle<Name> name,
                                      Handle<JSFunction> setter);

-  Handle<Code> CompileStoreInterceptor(Handle<JSObject> object,
-                                       Handle<Name> name);
+  Handle<Code> CompileStoreInterceptor(Handle<Name> name);


   static void GenerateStoreViaSetter(MacroAssembler* masm,
@@ -614,8 +591,7 @@
   }

  protected:
- virtual Register FrontendHeader(Handle<HeapType> type, Register object_reg, - Handle<JSObject> holder, Handle<Name> name,
+  virtual Register FrontendHeader(Register object_reg, Handle<Name> name,
                                   Label* miss);

   virtual void FrontendFooter(Handle<Name> name, Label* miss);
@@ -632,7 +608,6 @@
                                     Label* miss);

   void GenerateStoreTransition(MacroAssembler* masm,
-                               Handle<JSObject> object,
                                LookupResult* lookup,
                                Handle<Map> transition,
                                Handle<Name> name,
@@ -672,7 +647,8 @@
  public:
   explicit ElementHandlerCompiler(Isolate* isolate)
       : PropertyHandlerCompiler(isolate, Code::KEYED_LOAD_IC,
-                                kCacheOnReceiver) {}
+                                Handle<HeapType>::null(),
+ Handle<JSObject>::null(), kCacheOnReceiver) {}

   virtual ~ElementHandlerCompiler() {}

=======================================
--- /trunk/src/version.cc       Thu Jul 31 00:04:39 2014 UTC
+++ /trunk/src/version.cc       Thu Jul 31 01:04:48 2014 UTC
@@ -34,7 +34,7 @@
 // system so their names cannot be changed without changing the scripts.
 #define MAJOR_VERSION     3
 #define MINOR_VERSION     28
-#define BUILD_NUMBER      50
+#define BUILD_NUMBER      51
 #define PATCH_LEVEL       0
 // Use 1 for candidates and 0 otherwise.
 // (Boolean macro values are not supported by all preprocessors.)
=======================================
--- /trunk/src/x64/ic-x64.cc    Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/x64/ic-x64.cc    Thu Jul 31 01:04:48 2014 UTC
@@ -1014,21 +1014,6 @@
 const Register StoreIC::ReceiverRegister() { return rdx; }
 const Register StoreIC::NameRegister() { return rcx; }
 const Register StoreIC::ValueRegister() { return rax; }
-
-
-const Register KeyedStoreIC::ReceiverRegister() {
-  return StoreIC::ReceiverRegister();
-}
-
-
-const Register KeyedStoreIC::NameRegister() {
-  return StoreIC::NameRegister();
-}
-
-
-const Register KeyedStoreIC::ValueRegister() {
-  return StoreIC::ValueRegister();
-}


 const Register KeyedStoreIC::MapRegister() {
=======================================
--- /trunk/src/x64/stub-cache-x64.cc    Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/src/x64/stub-cache-x64.cc    Thu Jul 31 01:04:48 2014 UTC
@@ -374,10 +374,10 @@
// Receiver_reg is preserved on jumps to miss_label, but may be destroyed if
 // store is successful.
 void NamedStoreHandlerCompiler::GenerateStoreTransition(
-    MacroAssembler* masm, Handle<JSObject> object, LookupResult* lookup,
-    Handle<Map> transition, Handle<Name> name, Register receiver_reg,
-    Register storage_reg, Register value_reg, Register scratch1,
-    Register scratch2, Register unused, Label* miss_label, Label* slow) {
+    MacroAssembler* masm, LookupResult* lookup, Handle<Map> transition,
+    Handle<Name> name, Register receiver_reg, Register storage_reg,
+ Register value_reg, Register scratch1, Register scratch2, Register unused,
+    Label* miss_label, Label* slow) {
   int descriptor = transition->LastAdded();
   DescriptorArray* descriptors = transition->instance_descriptors();
   PropertyDetails details = descriptors->GetDetails(descriptor);
@@ -425,13 +425,12 @@
     __ movsd(FieldOperand(storage_reg, HeapNumber::kValueOffset), xmm0);
   }

-  // Stub never generated for non-global objects that require access
-  // checks.
-  ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
+  // Stub never generated for objects that require access checks.
+  ASSERT(!transition->is_access_check_needed());

   // Perform map transition for the receiver if necessary.
   if (details.type() == FIELD &&
-      object->map()->unused_property_fields() == 0) {
+ Map::cast(transition->GetBackPointer())->unused_property_fields() == 0) {
     // The properties must be extended before we can store the value.
     // We jump to a runtime call that extends the properties array.
     __ PopReturnAddressTo(scratch1);
@@ -472,14 +471,14 @@
   // Adjust for the number of properties stored in the object. Even in the
// face of a transition we can use the old map here because the size of the
   // object and the number of in-object properties is not going to change.
-  index -= object->map()->inobject_properties();
+  index -= transition->inobject_properties();

   // TODO(verwaest): Share this code as a code stub.
   SmiCheck smi_check = representation.IsTagged()
       ? INLINE_SMI_CHECK : OMIT_SMI_CHECK;
   if (index < 0) {
     // Set the property straight into the object.
-    int offset = object->map()->instance_size() + (index * kPointerSize);
+    int offset = transition->instance_size() + (index * kPointerSize);
     if (representation.IsDouble()) {
       __ movp(FieldOperand(receiver_reg, offset), storage_reg);
     } else {
@@ -633,10 +632,10 @@


 Register PropertyHandlerCompiler::CheckPrototypes(
-    Handle<HeapType> type, Register object_reg, Handle<JSObject> holder,
-    Register holder_reg, Register scratch1, Register scratch2,
-    Handle<Name> name, Label* miss, PrototypeCheckType check) {
-  Handle<Map> receiver_map(IC::TypeToMap(*type, isolate()));
+    Register object_reg, Register holder_reg, Register scratch1,
+    Register scratch2, Handle<Name> name, Label* miss,
+    PrototypeCheckType check) {
+  Handle<Map> receiver_map(IC::TypeToMap(*type(), isolate()));

   // Make sure there's no overlap between holder and object registers.
   ASSERT(!scratch1.is(object_reg) && !scratch1.is(holder_reg));
@@ -650,12 +649,12 @@
   int depth = 0;

   Handle<JSObject> current = Handle<JSObject>::null();
-  if (type->IsConstant()) {
-    current = Handle<JSObject>::cast(type->AsConstant()->Value());
+  if (type()->IsConstant()) {
+    current = Handle<JSObject>::cast(type()->AsConstant()->Value());
   }
   Handle<JSObject> prototype = Handle<JSObject>::null();
   Handle<Map> current_map = receiver_map;
-  Handle<Map> holder_map(holder->map());
+  Handle<Map> holder_map(holder()->map());
// Traverse the prototype chain and check the maps in the prototype chain for
   // fast and global objects or do negative lookup for normal objects.
   while (!current_map.is_identical_to(holder_map)) {
@@ -765,16 +764,15 @@
 }


-Register NamedLoadHandlerCompiler::CallbackFrontend(Handle<HeapType> type,
-                                                    Register object_reg,
- Handle<JSObject> holder,
+Register NamedLoadHandlerCompiler::CallbackFrontend(Register object_reg,
                                                     Handle<Name> name,
Handle<Object> callback) {
   Label miss;

-  Register reg = FrontendHeader(type, object_reg, holder, name, &miss);
+  Register reg = FrontendHeader(object_reg, name, &miss);

-  if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) {
+  if (!holder()->HasFastProperties()) {
+    ASSERT(!holder()->IsGlobalObject());
     ASSERT(!reg.is(scratch2()));
     ASSERT(!reg.is(scratch3()));
     ASSERT(!reg.is(scratch4()));
@@ -815,8 +813,7 @@


 void NamedLoadHandlerCompiler::GenerateLoadField(
-    Register reg, Handle<JSObject> holder, FieldIndex field,
-    Representation representation) {
+    Register reg, FieldIndex field, Representation representation) {
   if (!reg.is(receiver())) __ movp(receiver(), reg);
   LoadFieldStub stub(isolate(), field);
   GenerateTailCall(masm(), stub.GetCode());
@@ -874,12 +871,11 @@
 }


-void NamedLoadHandlerCompiler::GenerateLoadInterceptor(
-    Register holder_reg, Handle<Object> object,
-    Handle<JSObject> interceptor_holder, LookupResult* lookup,
-    Handle<Name> name) {
-  ASSERT(interceptor_holder->HasNamedInterceptor());
- ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined());
+void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg,
+ LookupResult* lookup,
+                                                       Handle<Name> name) {
+  ASSERT(holder()->HasNamedInterceptor());
+  ASSERT(!holder()->GetNamedInterceptor()->getter()->IsUndefined());

   // So far the most popular follow ups for interceptor loads are FIELD
   // and CALLBACKS, so inline only them, other cases may be added
@@ -890,10 +886,12 @@
       compile_followup_inline = true;
     } else if (lookup->type() == CALLBACKS &&
                lookup->GetCallbackObject()->IsExecutableAccessorInfo()) {
-      ExecutableAccessorInfo* callback =
-          ExecutableAccessorInfo::cast(lookup->GetCallbackObject());
-      compile_followup_inline = callback->getter() != NULL &&
-          callback->IsCompatibleReceiver(*object);
+      Handle<ExecutableAccessorInfo> callback(
+          ExecutableAccessorInfo::cast(lookup->GetCallbackObject()));
+      compile_followup_inline =
+          callback->getter() != NULL &&
+ ExecutableAccessorInfo::IsCompatibleReceiverType(isolate(), callback,
+                                                           type());
     }
   }

@@ -907,7 +905,7 @@
// the holder and it is needed should the interceptor return without any // result. The CALLBACKS case needs the receiver to be passed into C++ code,
     // the FIELD case might cause a miss during the prototype check.
- bool must_perfrom_prototype_check = *interceptor_holder != lookup->holder();
+    bool must_perfrom_prototype_check = *holder() != lookup->holder();
     bool must_preserve_receiver_reg = !receiver().is(holder_reg) &&
         (lookup->type() == CALLBACKS || must_perfrom_prototype_check);

@@ -926,7 +924,7 @@
       // interceptor's holder has been compiled before (see a caller
       // of this method.)
       CompileCallLoadPropertyWithInterceptor(
-          masm(), receiver(), holder_reg, this->name(), interceptor_holder,
+          masm(), receiver(), holder_reg, this->name(), holder(),
           IC::kLoadPropertyWithInterceptorOnly);

       // Check if interceptor provided a value for property.  If it's
@@ -947,13 +945,13 @@
       // Leave the internal frame.
     }

- GenerateLoadPostInterceptor(holder_reg, interceptor_holder, name, lookup);
+    GenerateLoadPostInterceptor(holder_reg, name, lookup);
   } else {  // !compile_followup_inline
     // Call the runtime system to load the interceptor.
     // Check that the maps haven't changed.
     __ PopReturnAddressTo(scratch2());
-    PushInterceptorArguments(masm(), receiver(), holder_reg,
-                             this->name(), interceptor_holder);
+    PushInterceptorArguments(masm(), receiver(), holder_reg, this->name(),
+                             holder());
     __ PushReturnAddressFrom(scratch2());

     ExternalReference ref = ExternalReference(
@@ -965,10 +963,9 @@


 Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
-    Handle<JSObject> object, Handle<JSObject> holder, Handle<Name> name,
+    Handle<JSObject> object, Handle<Name> name,
     Handle<ExecutableAccessorInfo> callback) {
-  Register holder_reg =
- Frontend(IC::CurrentTypeOf(object, isolate()), receiver(), holder, name);
+  Register holder_reg = Frontend(receiver(), name);

   __ PopReturnAddressTo(scratch1());
   __ Push(receiver());
@@ -1038,7 +1035,7 @@


 Handle<Code> NamedStoreHandlerCompiler::CompileStoreInterceptor(
-    Handle<JSObject> object, Handle<Name> name) {
+    Handle<Name> name) {
   __ PopReturnAddressTo(scratch1());
   __ Push(receiver());
   __ Push(this->name());
@@ -1103,8 +1100,8 @@


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadNonexistent(
-    Handle<HeapType> type, Handle<JSObject> last, Handle<Name> name) {
-  NonexistentFrontend(type, last, name);
+    Handle<Name> name) {
+  NonexistentFrontend(name);

   // Return undefined if maps of the full prototype chain are still the
   // same and no global property with this name contains a value.
@@ -1129,19 +1126,10 @@
   // receiver, name, scratch1, scratch2, scratch3.
   Register receiver = KeyedStoreIC::ReceiverRegister();
   Register name = KeyedStoreIC::NameRegister();
+  ASSERT(rbx.is(KeyedStoreIC::MapRegister()));
   static Register registers[] = { receiver, name, rbx, rdi, r8 };
   return registers;
 }
-
-
-Register* PropertyAccessCompiler::keyed_store_calling_convention() {
-  // receiver, name, scratch1/map, scratch2, scratch3.
-  Register receiver = KeyedStoreIC::ReceiverRegister();
-  Register name = KeyedStoreIC::NameRegister();
-  Register map = KeyedStoreIC::MapRegister();
-  static Register registers[] = { receiver, name, map, rdi, r8 };
-  return registers;
-}


Register NamedStoreHandlerCompiler::value() { return StoreIC::ValueRegister(); }
@@ -1192,30 +1180,26 @@


 Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal(
-    Handle<HeapType> type, Handle<GlobalObject> global,
     Handle<PropertyCell> cell, Handle<Name> name, bool is_dont_delete) {
   Label miss;
- // TODO(verwaest): Directly store to rax. Currently we cannot do this, since
-  // rax is used as receiver(), which we would otherwise clobber before a
-  // potential miss.
-  FrontendHeader(type, receiver(), global, name, &miss);
+  FrontendHeader(receiver(), name, &miss);

   // Get the value from the cell.
-  __ Move(rbx, cell);
-  __ movp(rbx, FieldOperand(rbx, PropertyCell::kValueOffset));
+  Register result = StoreIC::ValueRegister();
+  __ Move(result, cell);
+  __ movp(result, FieldOperand(result, PropertyCell::kValueOffset));

   // Check for deleted property if property can actually be deleted.
   if (!is_dont_delete) {
-    __ CompareRoot(rbx, Heap::kTheHoleValueRootIndex);
+    __ CompareRoot(result, Heap::kTheHoleValueRootIndex);
     __ j(equal, &miss);
   } else if (FLAG_debug_code) {
-    __ CompareRoot(rbx, Heap::kTheHoleValueRootIndex);
+    __ CompareRoot(result, Heap::kTheHoleValueRootIndex);
     __ Check(not_equal, kDontDeleteCellsCannotContainTheHole);
   }

   Counters* counters = isolate()->counters();
   __ IncrementCounter(counters->named_load_global_stub(), 1);
-  __ movp(rax, rbx);
   __ ret(0);

   FrontendFooter(name, &miss);
=======================================
--- /trunk/src/x87/stub-cache-x87.cc    Thu Jul 31 00:04:39 2014 UTC
+++ /trunk/src/x87/stub-cache-x87.cc    Thu Jul 31 01:04:48 2014 UTC
@@ -1299,8 +1299,14 @@

   if (check == PROPERTY &&
       (kind() == Code::KEYED_LOAD_IC || kind() == Code::KEYED_STORE_IC)) {
-    __ cmp(this->name(), Immediate(name));
-    __ j(not_equal, &miss);
+    // In case we are compiling an IC for dictionary loads and stores, just
+    // check whether the name is unique.
+    if (name.is_identical_to(isolate()->factory()->normal_ic_symbol())) {
+      __ JumpIfNotUniqueName(this->name(), &miss);
+    } else {
+      __ cmp(this->name(), Immediate(name));
+      __ j(not_equal, &miss);
+    }
   }

   Label number_case;
=======================================
--- /trunk/test/cctest/test-api.cc      Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/test/cctest/test-api.cc      Thu Jul 31 01:04:48 2014 UTC
@@ -6178,15 +6178,17 @@
   context->Global()->Set(v8_str("obj"), obj);

   const char* code =
-      "try {"
-      "  for (var i = 0; i < 100; i++) {"
+      "var result = 'PASSED';"
+      "for (var i = 0; i < 100; i++) {"
+      "  try {"
       "    var v = obj[0];"
- " if (v != undefined) throw 'Wrong value ' + v + ' at iteration ' + i;"
+      "    result = 'Wrong value ' + v + ' at iteration ' + i;"
+      "    break;"
+      "  } catch (e) {"
+      "    /* pass */"
       "  }"
-      "  'PASSED'"
-      "} catch(e) {"
-      "  e"
-      "}";
+      "}"
+      "result";
   ExpectString(code, "PASSED");
 }

@@ -6203,21 +6205,29 @@
   context->Global()->Set(v8_str("obj"), obj);

   const char* code =
-      "try {"
-      "  for (var i = 0; i < 100; i++) {"
-      "    var expected = i;"
+      "var result = 'PASSED';"
+      "for (var i = 0; i < 100; i++) {"
+      "  var expected = i;"
+      "  if (i == 5) {"
+      "    %EnableAccessChecks(obj);"
+      "  }"
+      "  try {"
+      "    var v = obj[i];"
       "    if (i == 5) {"
-      "      %EnableAccessChecks(obj);"
-      "      expected = undefined;"
+      "      result = 'Should not have reached this!';"
+      "      break;"
+      "    } else if (v != expected) {"
+      "      result = 'Wrong value ' + v + ' at iteration ' + i;"
+      "      break;"
       "    }"
-      "    var v = obj[i];"
- " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;"
-      "    if (i == 5) %DisableAccessChecks(obj);"
+      "  } catch (e) {"
+      "    if (i != 5) {"
+      "      result = e;"
+      "    }"
       "  }"
-      "  'PASSED'"
-      "} catch(e) {"
-      "  e"
-      "}";
+      "  if (i == 5) %DisableAccessChecks(obj);"
+      "}"
+      "result";
   ExpectString(code, "PASSED");
 }

@@ -8628,10 +8638,8 @@
   v8::Local<Script> access_other0 = v8_compile("other.Object");
   v8::Local<Script> access_other1 = v8_compile("other[42]");
   for (int i = 0; i < 5; i++) {
-    CHECK(!access_other0->Run()->Equals(other_object));
-    CHECK(access_other0->Run()->IsUndefined());
-    CHECK(!access_other1->Run()->Equals(v8_num(87)));
-    CHECK(access_other1->Run()->IsUndefined());
+    CHECK(access_other0->Run().IsEmpty());
+    CHECK(access_other1->Run().IsEmpty());
   }

   // Create an object that has 'other' in its prototype chain and make
@@ -8643,10 +8651,8 @@
   v8::Local<Script> access_f0 = v8_compile("f.Object");
   v8::Local<Script> access_f1 = v8_compile("f[42]");
   for (int j = 0; j < 5; j++) {
-    CHECK(!access_f0->Run()->Equals(other_object));
-    CHECK(access_f0->Run()->IsUndefined());
-    CHECK(!access_f1->Run()->Equals(v8_num(87)));
-    CHECK(access_f1->Run()->IsUndefined());
+    CHECK(access_f0->Run().IsEmpty());
+    CHECK(access_f1->Run().IsEmpty());
   }

   // Now it gets hairy: Set the prototype for the other global object
@@ -8665,10 +8671,8 @@
   Local<Script> access_f2 = v8_compile("f.foo");
   Local<Script> access_f3 = v8_compile("f[99]");
   for (int k = 0; k < 5; k++) {
-    CHECK(!access_f2->Run()->Equals(v8_num(100)));
-    CHECK(access_f2->Run()->IsUndefined());
-    CHECK(!access_f3->Run()->Equals(v8_num(101)));
-    CHECK(access_f3->Run()->IsUndefined());
+    CHECK(access_f2->Run().IsEmpty());
+    CHECK(access_f3->Run().IsEmpty());
   }
 }

@@ -8749,7 +8753,7 @@
     Context::Scope scope_env2(env2);
     Local<Value> result =
         CompileRun("delete env1.prop");
-    CHECK(result->IsFalse());
+    CHECK(result.IsEmpty());
   }

   // Check that env1.prop still exists.
@@ -8787,7 +8791,7 @@
   {
     Context::Scope scope_env2(env2);
     Local<Value> result = CompileRun(test);
-    CHECK(result->IsFalse());
+    CHECK(result.IsEmpty());
   }
 }

@@ -8814,11 +8818,18 @@
   env2->SetSecurityToken(bar);
   {
     Context::Scope scope_env2(env2);
-    Local<Value> result =
-        CompileRun("(function(){var obj = {'__proto__':env1};"
-                   "for (var p in obj)"
-                   "   if (p == 'prop') return false;"
-                   "return true;})()");
+    Local<Value> result = CompileRun(
+        "(function() {"
+        "  var obj = { '__proto__': env1 };"
+        "  try {"
+        "    for (var p in obj) {"
+        "      if (p == 'prop') return false;"
+        "    }"
+        "    return false;"
+        "  } catch (e) {"
+        "    return true;"
+        "  }"
+        "})()");
     CHECK(result->IsTrue());
   }
 }
@@ -8880,7 +8891,7 @@
   // Check that env3 is not accessible from env1
   {
     Local<Value> r = global3->Get(v8_str("prop2"));
-    CHECK(r->IsUndefined());
+    CHECK(r.IsEmpty());
   }
 }

@@ -8919,7 +8930,7 @@
   // Check that the global has been detached. No other.p property can
   // be found.
   result = CompileRun("other.p");
-  CHECK(result->IsUndefined());
+  CHECK(result.IsEmpty());

   // Reuse global2 for env3.
   v8::Handle<Context> env3 = Context::New(env1->GetIsolate(),
@@ -8949,7 +8960,7 @@
   // the global object for env3 which has a different security token,
   // so access should be blocked.
   result = CompileRun("other.p");
-  CHECK(result->IsUndefined());
+  CHECK(result.IsEmpty());
 }


@@ -9002,9 +9013,9 @@
   result = CompileRun("bound_x()");
   CHECK_EQ(v8_str("env2_x"), result);
   result = CompileRun("get_x()");
-  CHECK(result->IsUndefined());
+  CHECK(result.IsEmpty());
   result = CompileRun("get_x_w()");
-  CHECK(result->IsUndefined());
+  CHECK(result.IsEmpty());
   result = CompileRun("this_x()");
   CHECK_EQ(v8_str("env2_x"), result);

@@ -9200,33 +9211,35 @@
   // Access blocked property.
   CompileRun("other.blocked_prop = 1");

-  ExpectUndefined("other.blocked_prop");
-  ExpectUndefined(
-      "Object.getOwnPropertyDescriptor(other, 'blocked_prop')");
-  ExpectFalse("propertyIsEnumerable.call(other, 'blocked_prop')");
+  CHECK(CompileRun("other.blocked_prop").IsEmpty());
+ CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'blocked_prop')")
+            .IsEmpty());
+  CHECK(
+ CompileRun("propertyIsEnumerable.call(other, 'blocked_prop')").IsEmpty());

   // Access blocked element.
-  CompileRun("other[239] = 1");
+  CHECK(CompileRun("other[239] = 1").IsEmpty());

-  ExpectUndefined("other[239]");
-  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '239')");
-  ExpectFalse("propertyIsEnumerable.call(other, '239')");
+  CHECK(CompileRun("other[239]").IsEmpty());
+ CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '239')").IsEmpty());
+  CHECK(CompileRun("propertyIsEnumerable.call(other, '239')").IsEmpty());

   // Enable ACCESS_HAS
   allowed_access_type[v8::ACCESS_HAS] = true;
-  ExpectUndefined("other[239]");
+  CHECK(CompileRun("other[239]").IsEmpty());
   // ... and now we can get the descriptor...
-  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '239').value");
+  CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '239').value")
+            .IsEmpty());
   // ... and enumerate the property.
   ExpectTrue("propertyIsEnumerable.call(other, '239')");
   allowed_access_type[v8::ACCESS_HAS] = false;

   // Access a property with JS accessor.
-  CompileRun("other.js_accessor_p = 2");
+  CHECK(CompileRun("other.js_accessor_p = 2").IsEmpty());

-  ExpectUndefined("other.js_accessor_p");
-  ExpectUndefined(
-      "Object.getOwnPropertyDescriptor(other, 'js_accessor_p')");
+  CHECK(CompileRun("other.js_accessor_p").IsEmpty());
+ CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'js_accessor_p')")
+            .IsEmpty());

   // Enable both ACCESS_HAS and ACCESS_GET.
   allowed_access_type[v8::ACCESS_HAS] = true;
@@ -9244,10 +9257,10 @@
   allowed_access_type[v8::ACCESS_GET] = false;

   // Access an element with JS accessor.
-  CompileRun("other[42] = 2");
+  CHECK(CompileRun("other[42] = 2").IsEmpty());

-  ExpectUndefined("other[42]");
-  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42')");
+  CHECK(CompileRun("other[42]").IsEmpty());
+ CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '42')").IsEmpty());

   // Enable both ACCESS_HAS and ACCESS_GET.
   allowed_access_type[v8::ACCESS_HAS] = true;
@@ -9283,15 +9296,22 @@

   // Enumeration doesn't enumerate accessors from inaccessible objects in
// the prototype chain even if the accessors are in themselves accessible.
-  value =
-      CompileRun("(function(){var obj = {'__proto__':other};"
-                 "for (var p in obj)"
-                 "   if (p == 'accessible_prop' ||"
-                 "       p == 'blocked_js_prop' ||"
-                 "       p == 'blocked_js_prop') {"
-                 "     return false;"
-                 "   }"
-                 "return true;})()");
+  value = CompileRun(
+      "(function() {"
+      "  var obj = { '__proto__': other };"
+      "  try {"
+      "    for (var p in obj) {"
+      "      if (p == 'accessible_prop' ||"
+      "          p == 'blocked_js_prop' ||"
+      "          p == 'blocked_js_prop') {"
+      "        return false;"
+      "      }"
+      "    }"
+      "    return false;"
+      "  } catch (e) {"
+      "    return true;"
+      "  }"
+      "})()");
   CHECK(value->IsTrue());

   context1->Exit();
@@ -9334,16 +9354,15 @@
   global1->Set(v8_str("other"), global0);

   // Regression test for issue 1154.
-  ExpectTrue("Object.keys(other).indexOf('blocked_prop') == -1");
-
-  ExpectUndefined("other.blocked_prop");
+  CHECK(CompileRun("Object.keys(other)").IsEmpty());
+  CHECK(CompileRun("other.blocked_prop").IsEmpty());

   // Regression test for issue 1027.
   CompileRun("Object.defineProperty(\n"
              "  other, 'blocked_prop', {configurable: false})");
-  ExpectUndefined("other.blocked_prop");
-  ExpectUndefined(
-      "Object.getOwnPropertyDescriptor(other, 'blocked_prop')");
+  CHECK(CompileRun("other.blocked_prop").IsEmpty());
+ CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'blocked_prop')")
+            .IsEmpty());

   // Regression test for issue 1171.
   ExpectTrue("Object.isExtensible(other)");
@@ -9419,10 +9438,10 @@
   // proxy object.  Accessing the object that requires access checks
   // is blocked by the access checks on the object itself.
   value = CompileRun("Object.getOwnPropertyNames(other).length == 0");
-  CHECK(value->IsTrue());
+  CHECK(value.IsEmpty());

   value = CompileRun("Object.getOwnPropertyNames(object).length == 0");
-  CHECK(value->IsTrue());
+  CHECK(value.IsEmpty());

   context1->Exit();
   context0->Exit();
@@ -9530,7 +9549,7 @@
   CHECK_EQ(10, value->Int32Value());

   value = v8_compile("other.unreachable")->Run();
-  CHECK(value->IsUndefined());
+  CHECK(value.IsEmpty());

   context1->Exit();
   context0->Exit();
@@ -14642,13 +14661,13 @@
   context->Global()->Set(v8_str("obj_1"), instance_1);

   Local<Value> value_1 = CompileRun("obj_1.a");
-  CHECK(value_1->IsUndefined());
+  CHECK(value_1.IsEmpty());

   Local<v8::Object> instance_2 = templ->NewInstance();
   context->Global()->Set(v8_str("obj_2"), instance_2);

   Local<Value> value_2 = CompileRun("obj_2.a");
-  CHECK(value_2->IsUndefined());
+  CHECK(value_2.IsEmpty());
 }


@@ -14729,11 +14748,9 @@
   context->DetachGlobal();
   hidden_global->TurnOnAccessCheck();

-  // Failing access check to property get results in undefined.
-  CHECK(f1->Call(global, 0, NULL)->IsUndefined());
-  CHECK(f2->Call(global, 0, NULL)->IsUndefined());
-
-  // Failing access check to function call results in exception.
+  // Failing access check results in exception.
+  CHECK(f1->Call(global, 0, NULL).IsEmpty());
+  CHECK(f2->Call(global, 0, NULL).IsEmpty());
   CHECK(g1->Call(global, 0, NULL).IsEmpty());
   CHECK(g2->Call(global, 0, NULL).IsEmpty());

@@ -14817,11 +14834,9 @@
   context->DetachGlobal();
   hidden_global->TurnOnAccessCheck();

-  // Failing access check to property get results in undefined.
-  CHECK(f1->Call(global, 0, NULL)->IsUndefined());
-  CHECK(f2->Call(global, 0, NULL)->IsUndefined());
-
-  // Failing access check to function call results in exception.
+  // Failing access check results in exception.
+  CHECK(f1->Call(global, 0, NULL).IsEmpty());
+  CHECK(f2->Call(global, 0, NULL).IsEmpty());
   CHECK(g1->Call(global, 0, NULL).IsEmpty());
   CHECK(g2->Call(global, 0, NULL).IsEmpty());

@@ -14835,13 +14850,13 @@
   f2 = Local<Function>::Cast(hidden_global->Get(v8_str("f2")));
   g1 = Local<Function>::Cast(hidden_global->Get(v8_str("g1")));
   g2 = Local<Function>::Cast(hidden_global->Get(v8_str("g2")));
-  CHECK(hidden_global->Get(v8_str("h"))->IsUndefined());
-
-  // Failing access check to property get results in undefined.
-  CHECK(f1->Call(global, 0, NULL)->IsUndefined());
-  CHECK(f2->Call(global, 0, NULL)->IsUndefined());
+  CHECK(hidden_global->Get(v8_str("h")).IsEmpty());

-  // Failing access check to function call results in exception.
+  // Failing access check results in exception.
+  v8::Local<v8::Value> result = f1->Call(global, 0, NULL);
+  CHECK(result.IsEmpty());
+  CHECK(f1->Call(global, 0, NULL).IsEmpty());
+  CHECK(f2->Call(global, 0, NULL).IsEmpty());
   CHECK(g1->Call(global, 0, NULL).IsEmpty());
   CHECK(g2->Call(global, 0, NULL).IsEmpty());
 }
@@ -20364,20 +20379,20 @@
   CHECK(result1->Equals(simple_object->GetPrototype()));

   Local<Value> result2 = CompileRun("Object.getPrototypeOf(protected)");
-  CHECK(result2->Equals(Undefined(isolate)));
+  CHECK(result2.IsEmpty());

   Local<Value> result3 = CompileRun("Object.getPrototypeOf(global)");
   CHECK(result3->Equals(global_object->GetPrototype()));

   Local<Value> result4 = CompileRun("Object.getPrototypeOf(proxy)");
-  CHECK(result4->Equals(Undefined(isolate)));
+  CHECK(result4.IsEmpty());

   Local<Value> result5 = CompileRun("Object.getPrototypeOf(hidden)");
   CHECK(result5->Equals(
       object_with_hidden->GetPrototype()->ToObject()->GetPrototype()));

   Local<Value> result6 = CompileRun("Object.getPrototypeOf(phidden)");
-  CHECK(result6->Equals(Undefined(isolate)));
+  CHECK(result6.IsEmpty());
 }


@@ -21572,11 +21587,9 @@
     LocalContext context1(NULL, global_template);
     context1->Global()->Set(v8_str("other"), global0);

-    ExpectString("JSON.stringify(other)", "{}");
-    ExpectString("JSON.stringify({ 'a' : other, 'b' : ['c'] })",
-                 "{\"a\":{},\"b\":[\"c\"]}");
-    ExpectString("JSON.stringify([other, 'b', 'c'])",
-                 "[{},\"b\",\"c\"]");
+    CHECK(CompileRun("JSON.stringify(other)").IsEmpty());
+ CHECK(CompileRun("JSON.stringify({ 'a' : other, 'b' : ['c'] })").IsEmpty());
+    CHECK(CompileRun("JSON.stringify([other, 'b', 'c'])").IsEmpty());

     v8::Handle<v8::Array> array = v8::Array::New(isolate, 2);
     array->Set(0, v8_str("a"));
@@ -21584,9 +21597,9 @@
     context1->Global()->Set(v8_str("array"), array);
     ExpectString("JSON.stringify(array)", "[\"a\",\"b\"]");
     array->TurnOnAccessCheck();
-    ExpectString("JSON.stringify(array)", "[]");
-    ExpectString("JSON.stringify([array])", "[[]]");
-    ExpectString("JSON.stringify({'a' : array})", "{\"a\":[]}");
+    CHECK(CompileRun("JSON.stringify(array)").IsEmpty());
+    CHECK(CompileRun("JSON.stringify([array])").IsEmpty());
+    CHECK(CompileRun("JSON.stringify({'a' : array})").IsEmpty());
   }
 }

=======================================
--- /trunk/tools/generate-runtime-tests.py      Wed Jul 30 00:05:07 2014 UTC
+++ /trunk/tools/generate-runtime-tests.py      Thu Jul 31 01:04:48 2014 UTC
@@ -51,7 +51,7 @@
 EXPECTED_FUZZABLE_COUNT = 336
 EXPECTED_CCTEST_COUNT = 8
 EXPECTED_UNKNOWN_COUNT = 4
-EXPECTED_BUILTINS_COUNT = 815
+EXPECTED_BUILTINS_COUNT = 816


 # Don't call these at all.

--
--
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