Revert r5174.
authorvegorov@chromium.org <vegorov@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 5 Aug 2010 11:19:43 +0000 (11:19 +0000)
committervegorov@chromium.org <vegorov@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 5 Aug 2010 11:19:43 +0000 (11:19 +0000)
Review URL: http://codereview.chromium.org/2868108

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5177 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/arm/stub-cache-arm.cc
src/heap-inl.h
src/heap.cc
src/heap.h
src/ia32/stub-cache-ia32.cc
src/ic.cc
src/stub-cache.cc
src/stub-cache.h
src/x64/stub-cache-x64.cc

index 8c8e702..ff3007c 100644 (file)
@@ -1252,11 +1252,9 @@ void CallStubCompiler::GenerateNameCheck(String* name, Label* miss) {
 }
 
 
-Object* CallStubCompiler::GenerateMissBranch() {
-  Object* obj = StubCache::ComputeCallMiss(arguments().immediate(), kind_);
-  if (obj->IsFailure()) return obj;
-  __ Jump(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET);
-  return obj;
+void CallStubCompiler::GenerateMissBranch() {
+  Handle<Code> ic = ComputeCallMiss(arguments().immediate(), kind_);
+  __ Jump(ic, RelocInfo::CODE_TARGET);
 }
 
 
@@ -1288,8 +1286,7 @@ Object* CallStubCompiler::CompileCallField(JSObject* object,
 
   // Handle call cache miss.
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(FIELD, name);
@@ -1340,8 +1337,7 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object,
 
   // Handle call cache miss.
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(function);
@@ -1392,8 +1388,7 @@ Object* CallStubCompiler::CompileArrayPopCall(Object* object,
 
   // Handle call cache miss.
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(function);
@@ -1566,8 +1561,7 @@ Object* CallStubCompiler::CompileCallConstant(Object* object,
   }
 
   __ bind(&miss_in_smi_check);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(function);
@@ -1616,8 +1610,7 @@ Object* CallStubCompiler::CompileCallInterceptor(JSObject* object,
 
   // Handle call cache miss.
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(INTERCEPTOR, name);
@@ -1701,8 +1694,7 @@ Object* CallStubCompiler::CompileCallGlobal(JSObject* object,
   // Handle call cache miss.
   __ bind(&miss);
   __ IncrementCounter(&Counters::call_global_inline_miss, 1, r1, r3);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(NORMAL, name);
index 27c6f1c..5cb24ee 100644 (file)
@@ -435,12 +435,6 @@ inline bool Heap::allow_allocation(bool new_state) {
   return old;
 }
 
-inline bool Heap::allow_gc(bool new_state) {
-  bool old = gc_allowed_;
-  gc_allowed_ = new_state;
-  return old;
-}
-
 #endif
 
 
index a7416c6..9f27a49 100644 (file)
@@ -134,7 +134,6 @@ Heap::SurvivalRateTrend Heap::survival_rate_trend_ = Heap::STABLE;
 
 #ifdef DEBUG
 bool Heap::allocation_allowed_ = true;
-bool Heap::gc_allowed_ = true;
 
 int Heap::allocation_timeout_ = 0;
 bool Heap::disallow_allocation_failure_ = false;
@@ -320,9 +319,6 @@ void Heap::ReportStatisticsAfterGC() {
 
 
 void Heap::GarbageCollectionPrologue() {
-#ifdef DEBUG
-  ASSERT(gc_allowed_);
-#endif
   TranscendentalCache::Clear();
   ClearJSFunctionResultCaches();
   gc_count_++;
index b5bfb92..2994a6d 100644 (file)
@@ -877,8 +877,6 @@ class Heap : public AllStatic {
 #ifdef DEBUG
   static bool IsAllocationAllowed() { return allocation_allowed_; }
   static inline bool allow_allocation(bool enable);
-  static bool IsGCAllowed() { return gc_allowed_; }
-  static inline bool allow_gc(bool enable);
 
   static bool disallow_allocation_failure() {
     return disallow_allocation_failure_;
@@ -1080,7 +1078,6 @@ class Heap : public AllStatic {
 
 #ifdef DEBUG
   static bool allocation_allowed_;
-  static bool gc_allowed_;
 
   // If the --gc-interval flag is set to a positive value, this
   // variable holds the value indicating the number of allocations
@@ -1683,20 +1680,6 @@ class AssertNoAllocation {
   bool old_state_;
 };
 
-class AssertNoGC {
- public:
-  AssertNoGC() {
-    old_state_ = Heap::allow_gc(false);
-  }
-
-  ~AssertNoGC() {
-    Heap::allow_gc(old_state_);
-  }
-
- private:
-  bool old_state_;
-};
-
 class DisableAssertNoAllocation {
  public:
   DisableAssertNoAllocation() {
@@ -1719,12 +1702,6 @@ class AssertNoAllocation {
   ~AssertNoAllocation() { }
 };
 
-class AssertNoGC {
- public:
-  AssertNoGC() { }
-  ~AssertNoGC() { }
-};
-
 class DisableAssertNoAllocation {
  public:
   DisableAssertNoAllocation() { }
index c21dd4f..48f08a9 100644 (file)
@@ -1287,11 +1287,9 @@ void CallStubCompiler::GenerateNameCheck(String* name, Label* miss) {
 }
 
 
-Object* CallStubCompiler::GenerateMissBranch() {
-  Object* obj = StubCache::ComputeCallMiss(arguments().immediate(), kind_);
-  if (obj->IsFailure()) return obj;
-  __ jmp(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET);
-  return obj;
+void CallStubCompiler::GenerateMissBranch() {
+  Handle<Code> ic = ComputeCallMiss(arguments().immediate(), kind_);
+  __ jmp(ic, RelocInfo::CODE_TARGET);
 }
 
 
@@ -1342,8 +1340,7 @@ Object* CallStubCompiler::CompileCallField(JSObject* object,
 
   // Handle call cache miss.
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(FIELD, name);
@@ -1490,8 +1487,7 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object,
   }
 
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(function);
@@ -1574,8 +1570,7 @@ Object* CallStubCompiler::CompileArrayPopCall(Object* object,
                                1);
 
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(function);
@@ -1638,8 +1633,8 @@ Object* CallStubCompiler::CompileStringCharCodeAtCall(Object* object,
   __ ret((argc + 1) * kPointerSize);
 
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(function);
@@ -1705,8 +1700,9 @@ Object* CallStubCompiler::CompileStringCharAtCall(Object* object,
   __ ret((argc + 1) * kPointerSize);
 
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  // Restore function name in ecx.
+
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(function);
@@ -1860,8 +1856,7 @@ Object* CallStubCompiler::CompileCallConstant(Object* object,
     FreeSpaceForFastApiCall(masm(), eax);
   }
   __ bind(&miss_in_smi_check);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(function);
@@ -1925,8 +1920,7 @@ Object* CallStubCompiler::CompileCallInterceptor(JSObject* object,
 
   // Handle load cache miss.
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(INTERCEPTOR, name);
@@ -2011,8 +2005,7 @@ Object* CallStubCompiler::CompileCallGlobal(JSObject* object,
   // Handle call cache miss.
   __ bind(&miss);
   __ IncrementCounter(&Counters::call_global_inline_miss, 1);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(NORMAL, name);
index aace456..a5370a6 100644 (file)
--- a/src/ic.cc
+++ b/src/ic.cc
@@ -501,24 +501,20 @@ Object* CallICBase::LoadFunction(State state,
 
   // Lookup the property in the object.
   LookupResult lookup;
-  {
-    AssertNoGC nogc;  // GC could invalidate the pointers held in lookup.
+  LookupForRead(*object, *name, &lookup);
 
-    LookupForRead(*object, *name, &lookup);
-
-    if (!lookup.IsProperty()) {
-      // If the object does not have the requested property, check which
-      // exception we need to throw.
-      if (IsContextual(object)) {
-        return ReferenceError("not_defined", name);
-      }
-      return TypeError("undefined_method", object, name);
+  if (!lookup.IsProperty()) {
+    // If the object does not have the requested property, check which
+    // exception we need to throw.
+    if (IsContextual(object)) {
+      return ReferenceError("not_defined", name);
     }
+    return TypeError("undefined_method", object, name);
+  }
 
-    // Lookup is valid: Update inline cache and stub cache.
-    if (FLAG_use_ic) {
-      UpdateCaches(&lookup, state, object, name);
-    }
+  // Lookup is valid: Update inline cache and stub cache.
+  if (FLAG_use_ic) {
+    UpdateCaches(&lookup, state, object, name);
   }
 
   // Get the property.
@@ -791,73 +787,69 @@ Object* LoadIC::Load(State state, Handle<Object> object, Handle<String> name) {
 
   // Named lookup in the object.
   LookupResult lookup;
-  {
-    AssertNoGC nogc;  // GC could invalidate the pointers held in lookup.
-
-    LookupForRead(*object, *name, &lookup);
+  LookupForRead(*object, *name, &lookup);
 
-    // If we did not find a property, check if we need to throw an exception.
-    if (!lookup.IsProperty()) {
-      if (FLAG_strict || IsContextual(object)) {
-        return ReferenceError("not_defined", name);
-      }
-      LOG(SuspectReadEvent(*name, *object));
+  // If we did not find a property, check if we need to throw an exception.
+  if (!lookup.IsProperty()) {
+    if (FLAG_strict || IsContextual(object)) {
+      return ReferenceError("not_defined", name);
     }
+    LOG(SuspectReadEvent(*name, *object));
+  }
 
-    bool can_be_inlined =
-        FLAG_use_ic &&
-        state == PREMONOMORPHIC &&
-        lookup.IsProperty() &&
-        lookup.IsCacheable() &&
-        lookup.holder() == *object &&
-        lookup.type() == FIELD &&
-        !object->IsAccessCheckNeeded();
-
-    if (can_be_inlined) {
-      Map* map = lookup.holder()->map();
-      // Property's index in the properties array.  If negative we have
-      // an inobject property.
-      int index = lookup.GetFieldIndex() - map->inobject_properties();
-      if (index < 0) {
-        // Index is an offset from the end of the object.
-        int offset = map->instance_size() + (index * kPointerSize);
-        if (PatchInlinedLoad(address(), map, offset)) {
-          set_target(megamorphic_stub());
-  #ifdef DEBUG
-          if (FLAG_trace_ic) {
-            PrintF("[LoadIC : inline patch %s]\n", *name->ToCString());
-          }
-  #endif
-          return lookup.holder()->FastPropertyAt(lookup.GetFieldIndex());
-  #ifdef DEBUG
-        } else {
-          if (FLAG_trace_ic) {
-            PrintF("[LoadIC : no inline patch %s (patching failed)]\n",
-                   *name->ToCString());
-          }
+  bool can_be_inlined =
+      FLAG_use_ic &&
+      state == PREMONOMORPHIC &&
+      lookup.IsProperty() &&
+      lookup.IsCacheable() &&
+      lookup.holder() == *object &&
+      lookup.type() == FIELD &&
+      !object->IsAccessCheckNeeded();
+
+  if (can_be_inlined) {
+    Map* map = lookup.holder()->map();
+    // Property's index in the properties array.  If negative we have
+    // an inobject property.
+    int index = lookup.GetFieldIndex() - map->inobject_properties();
+    if (index < 0) {
+      // Index is an offset from the end of the object.
+      int offset = map->instance_size() + (index * kPointerSize);
+      if (PatchInlinedLoad(address(), map, offset)) {
+        set_target(megamorphic_stub());
+#ifdef DEBUG
+        if (FLAG_trace_ic) {
+          PrintF("[LoadIC : inline patch %s]\n", *name->ToCString());
         }
+#endif
+        return lookup.holder()->FastPropertyAt(lookup.GetFieldIndex());
+#ifdef DEBUG
       } else {
         if (FLAG_trace_ic) {
-          PrintF("[LoadIC : no inline patch %s (not inobject)]\n",
+          PrintF("[LoadIC : no inline patch %s (patching failed)]\n",
                  *name->ToCString());
         }
       }
     } else {
-      if (FLAG_use_ic && state == PREMONOMORPHIC) {
-        if (FLAG_trace_ic) {
-          PrintF("[LoadIC : no inline patch %s (not inlinable)]\n",
-                 *name->ToCString());
-  #endif
-        }
+      if (FLAG_trace_ic) {
+        PrintF("[LoadIC : no inline patch %s (not inobject)]\n",
+               *name->ToCString());
       }
     }
-
-    // Update inline cache and stub cache.
-    if (FLAG_use_ic) {
-      UpdateCaches(&lookup, state, object, name);
+  } else {
+    if (FLAG_use_ic && state == PREMONOMORPHIC) {
+      if (FLAG_trace_ic) {
+        PrintF("[LoadIC : no inline patch %s (not inlinable)]\n",
+               *name->ToCString());
+#endif
+      }
     }
   }
 
+  // Update inline cache and stub cache.
+  if (FLAG_use_ic) {
+    UpdateCaches(&lookup, state, object, name);
+  }
+
   PropertyAttributes attr;
   if (lookup.IsProperty() && lookup.type() == INTERCEPTOR) {
     // Get the property.
@@ -1045,21 +1037,17 @@ Object* KeyedLoadIC::Load(State state,
 
     // Named lookup.
     LookupResult lookup;
-    {
-      AssertNoGC nogc;  // GC could invalidate the pointers held in lookup.
-
-      LookupForRead(*object, *name, &lookup);
+    LookupForRead(*object, *name, &lookup);
 
-      // If we did not find a property, check if we need to throw an exception.
-      if (!lookup.IsProperty()) {
-        if (FLAG_strict || IsContextual(object)) {
-          return ReferenceError("not_defined", name);
-        }
+    // If we did not find a property, check if we need to throw an exception.
+    if (!lookup.IsProperty()) {
+      if (FLAG_strict || IsContextual(object)) {
+        return ReferenceError("not_defined", name);
       }
+    }
 
-      if (FLAG_use_ic) {
-        UpdateCaches(&lookup, state, object, name);
-      }
+    if (FLAG_use_ic) {
+      UpdateCaches(&lookup, state, object, name);
     }
 
     PropertyAttributes attr;
@@ -1257,8 +1245,6 @@ Object* StoreIC::Store(State state,
 
   // Lookup the property locally in the receiver.
   if (FLAG_use_ic && !receiver->IsJSGlobalProxy()) {
-    AssertNoGC nogc;  // GC could invalidate the pointers held in lookup.
-
     LookupResult lookup;
 
     if (LookupForWrite(*receiver, *name, &lookup)) {
@@ -1432,17 +1418,13 @@ Object* KeyedStoreIC::Store(State state,
       return *value;
     }
 
-    {
-      AssertNoGC nogc;  // GC could invalidate the pointers held in lookup.
-
-      // Lookup the property locally in the receiver.
-      LookupResult lookup;
-      receiver->LocalLookup(*name, &lookup);
+    // Lookup the property locally in the receiver.
+    LookupResult lookup;
+    receiver->LocalLookup(*name, &lookup);
 
-      // Update inline cache and stub cache.
-      if (FLAG_use_ic) {
-        UpdateCaches(&lookup, state, receiver, name, value);
-      }
+    // Update inline cache and stub cache.
+    if (FLAG_use_ic) {
+      UpdateCaches(&lookup, state, receiver, name, value);
     }
 
     // Set the property.
index 6a0c93e..bc29d06 100644 (file)
@@ -822,6 +822,13 @@ void StubCache::Clear() {
 // StubCompiler implementation.
 
 
+// Support function for computing call IC miss stubs.
+Handle<Code> ComputeCallMiss(int argc, Code::Kind kind) {
+  CALL_HEAP_FUNCTION(StubCache::ComputeCallMiss(argc, kind), Code);
+}
+
+
+
 Object* LoadCallbackProperty(Arguments args) {
   ASSERT(args[0]->IsJSObject());
   ASSERT(args[1]->IsJSObject());
index 0be32f1..8c00ee8 100644 (file)
@@ -336,6 +336,10 @@ Object* CallInterceptorProperty(Arguments args);
 Object* KeyedLoadPropertyWithInterceptor(Arguments args);
 
 
+// Support function for computing call IC miss stubs.
+Handle<Code> ComputeCallMiss(int argc, Code::Kind kind);
+
+
 // The stub compiler compiles stubs for the stub cache.
 class StubCompiler BASE_EMBEDDED {
  public:
@@ -684,9 +688,7 @@ class CallStubCompiler: public StubCompiler {
 
   void GenerateNameCheck(String* name, Label* miss);
 
-  // Generates a jump to CallIC miss stub. Returns Failure if the jump cannot
-  // be generated.
-  Object* GenerateMissBranch();
+  void GenerateMissBranch();
 };
 
 
index 4c15715..e67000a 100644 (file)
@@ -820,11 +820,9 @@ void CallStubCompiler::GenerateNameCheck(String* name, Label* miss) {
 }
 
 
-Object* CallStubCompiler::GenerateMissBranch() {
-  Object* obj = StubCache::ComputeCallMiss(arguments().immediate(), kind_);
-  if (obj->IsFailure()) return obj;
-  __ Jump(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET);
-  return obj;
+void CallStubCompiler::GenerateMissBranch() {
+  Handle<Code> ic = ComputeCallMiss(arguments().immediate(), kind_);
+  __ Jump(ic, RelocInfo::CODE_TARGET);
 }
 
 
@@ -977,8 +975,7 @@ Object* CallStubCompiler::CompileCallConstant(Object* object,
 
   // Handle call cache miss.
   __ bind(&miss_in_smi_check);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(function);
@@ -1032,8 +1029,7 @@ Object* CallStubCompiler::CompileCallField(JSObject* object,
 
   // Handle call cache miss.
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(FIELD, name);
@@ -1190,8 +1186,8 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object,
   }
 
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(function);
@@ -1274,8 +1270,8 @@ Object* CallStubCompiler::CompileArrayPopCall(Object* object,
                                argc + 1,
                                1);
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(function);
@@ -1361,8 +1357,7 @@ Object* CallStubCompiler::CompileCallInterceptor(JSObject* object,
 
   // Handle load cache miss.
   __ bind(&miss);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(INTERCEPTOR, name);
@@ -1447,8 +1442,7 @@ Object* CallStubCompiler::CompileCallGlobal(JSObject* object,
   // Handle call cache miss.
   __ bind(&miss);
   __ IncrementCounter(&Counters::call_global_inline_miss, 1);
-  Object* obj = GenerateMissBranch();
-  if (obj->IsFailure()) return obj;
+  GenerateMissBranch();
 
   // Return the generated code.
   return GetCode(NORMAL, name);