Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index ae557c46a72a4632df3cde795565d5202f314941..d31070886ebf0671fe9ac60ce3ed24264abbd51c 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -76,12 +76,11 @@ void IC::TraceIC(const char* type, |
if (FLAG_trace_ic) { |
State new_state = new_target->ic_state(); |
PrintF("[%s in ", type); |
- Isolate* isolate = new_target->GetIsolate(); |
- StackFrameIterator it(isolate); |
+ StackFrameIterator it(isolate()); |
while (it.frame()->fp() != this->fp()) it.Advance(); |
StackFrame* raw_frame = it.frame(); |
if (raw_frame->is_internal()) { |
- Code* apply_builtin = isolate->builtins()->builtin( |
+ Code* apply_builtin = isolate()->builtins()->builtin( |
Builtins::kFunctionApply); |
if (raw_frame->unchecked_code() == apply_builtin) { |
PrintF("apply from "); |
@@ -89,7 +88,7 @@ void IC::TraceIC(const char* type, |
raw_frame = it.frame(); |
} |
} |
- JavaScriptFrame::PrintTop(isolate, stdout, false, true); |
+ JavaScriptFrame::PrintTop(isolate(), stdout, false, true); |
Code::ExtraICState extra_state = new_target->extra_ic_state(); |
const char* modifier = |
GetTransitionMarkModifier(Code::GetKeyedAccessStoreMode(extra_state)); |
@@ -179,30 +178,30 @@ Address IC::OriginalCodeAddress() const { |
#endif |
-static bool TryRemoveInvalidPrototypeDependentStub(Code* target, |
- Object* receiver, |
- Object* name) { |
- if (target->is_keyed_stub()) { |
+bool IC::TryRemoveInvalidPrototypeDependentStub(Object* receiver, |
+ Object* name) { |
+ DisallowHeapAllocation no_gc; |
+ |
+ if (target()->is_keyed_stub()) { |
// Determine whether the failure is due to a name failure. |
if (!name->IsName()) return false; |
- Name* stub_name = target->FindFirstName(); |
+ Name* stub_name = target()->FindFirstName(); |
if (Name::cast(name) != stub_name) return false; |
} |
InlineCacheHolderFlag cache_holder = |
- Code::ExtractCacheHolderFromFlags(target->flags()); |
+ Code::ExtractCacheHolderFromFlags(target()->flags()); |
- Isolate* isolate = target->GetIsolate(); |
if (cache_holder == OWN_MAP && !receiver->IsJSObject()) { |
// The stub was generated for JSObject but called for non-JSObject. |
// IC::GetCodeCacheHolder is not applicable. |
return false; |
} else if (cache_holder == PROTOTYPE_MAP && |
- receiver->GetPrototype(isolate)->IsNull()) { |
+ receiver->GetPrototype(isolate())->IsNull()) { |
// IC::GetCodeCacheHolder is not applicable. |
return false; |
} |
- Map* map = IC::GetCodeCacheHolder(isolate, receiver, cache_holder)->map(); |
+ Map* map = IC::GetCodeCacheHolder(isolate(), receiver, cache_holder)->map(); |
// Decide whether the inline cache failed because of changes to the |
// receiver itself or changes to one of its prototypes. |
@@ -212,11 +211,11 @@ static bool TryRemoveInvalidPrototypeDependentStub(Code* target, |
// the receiver map's code cache. Therefore, if the current target |
// is in the receiver map's code cache, the inline cache failed due |
// to prototype check failure. |
- int index = map->IndexInCodeCache(name, target); |
+ int index = map->IndexInCodeCache(name, *target()); |
if (index >= 0) { |
- map->RemoveFromCodeCache(String::cast(name), target, index); |
+ map->RemoveFromCodeCache(String::cast(name), *target(), index); |
// Handlers are stored in addition to the ICs on the map. Remove those, too. |
- Code* handler = target->FindFirstHandler(); |
+ Code* handler = target()->FindFirstHandler(); |
if (handler != NULL) { |
index = map->IndexInCodeCache(name, handler); |
if (index >= 0) { |
@@ -235,7 +234,7 @@ static bool TryRemoveInvalidPrototypeDependentStub(Code* target, |
// If the IC is shared between multiple receivers (slow dictionary mode), then |
// the map cannot be deprecated and the stub invalidated. |
if (cache_holder == OWN_MAP) { |
- Map* old_map = target->FindFirstMap(); |
+ Map* old_map = target()->FindFirstMap(); |
if (old_map == map) return true; |
if (old_map != NULL) { |
if (old_map->is_deprecated()) return true; |
@@ -248,8 +247,7 @@ static bool TryRemoveInvalidPrototypeDependentStub(Code* target, |
if (receiver->IsGlobalObject()) { |
if (!name->IsName()) return false; |
- Isolate* isolate = target->GetIsolate(); |
- LookupResult lookup(isolate); |
+ LookupResult lookup(isolate()); |
GlobalObject* global = GlobalObject::cast(receiver); |
global->LocalLookupRealNamedProperty(Name::cast(name), &lookup); |
if (!lookup.IsFound()) return false; |
@@ -272,7 +270,7 @@ void IC::UpdateState(Object* receiver, Object* name) { |
// Call stubs handle this later to allow extra IC state |
// transitions. |
if (kind != Code::CALL_IC && kind != Code::KEYED_CALL_IC && |
- TryRemoveInvalidPrototypeDependentStub(*target_, receiver, name)) { |
+ TryRemoveInvalidPrototypeDependentStub(receiver, name)) { |
MarkMonomorphicPrototypeFailure(); |
return; |
} |
@@ -743,9 +741,7 @@ void CallICBase::UpdateCaches(LookupResult* lookup, |
if (kind_ == Code::CALL_IC && |
TryUpdateExtraICState(lookup, object, &extra_ic_state)) { |
code = ComputeMonomorphicStub(lookup, extra_ic_state, object, name); |
- } else if (TryRemoveInvalidPrototypeDependentStub(*target(), |
- *object, |
- *name)) { |
+ } else if (TryRemoveInvalidPrototypeDependentStub(*object, *name)) { |
MarkMonomorphicPrototypeFailure(); |
code = ComputeMonomorphicStub(lookup, extra_ic_state, object, name); |
} else { |