diff options
Diffstat (limited to 'deps/v8/src/stub-cache.cc')
-rw-r--r-- | deps/v8/src/stub-cache.cc | 84 |
1 files changed, 53 insertions, 31 deletions
diff --git a/deps/v8/src/stub-cache.cc b/deps/v8/src/stub-cache.cc index 411914719c..bfed6bbac7 100644 --- a/deps/v8/src/stub-cache.cc +++ b/deps/v8/src/stub-cache.cc @@ -120,7 +120,8 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name, // name specific if there are global objects involved. Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NONEXISTENT); - Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); LoadStubCompiler compiler(isolate_); @@ -136,10 +137,11 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name, Handle<Code> StubCache::ComputeLoadField(Handle<String> name, Handle<JSObject> receiver, Handle<JSObject> holder, - int field_index) { + PropertyIndex field_index) { ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::FIELD); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); LoadStubCompiler compiler(isolate_); @@ -160,7 +162,8 @@ Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name, ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); LoadStubCompiler compiler(isolate_); @@ -180,7 +183,8 @@ Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name, ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); LoadStubCompiler compiler(isolate_); @@ -200,7 +204,8 @@ Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name, ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CONSTANT_FUNCTION); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); LoadStubCompiler compiler(isolate_); @@ -219,7 +224,8 @@ Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::INTERCEPTOR); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); LoadStubCompiler compiler(isolate_); @@ -245,7 +251,8 @@ Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NORMAL); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); LoadStubCompiler compiler(isolate_); @@ -261,11 +268,12 @@ Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name, Handle<JSObject> receiver, Handle<JSObject> holder, - int field_index) { + PropertyIndex field_index) { ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::FIELD); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); KeyedLoadStubCompiler compiler(isolate_); @@ -285,7 +293,8 @@ Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name, ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CONSTANT_FUNCTION); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); KeyedLoadStubCompiler compiler(isolate_); @@ -304,7 +313,8 @@ Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name, ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::INTERCEPTOR); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); KeyedLoadStubCompiler compiler(isolate_); @@ -324,7 +334,8 @@ Handle<Code> StubCache::ComputeKeyedLoadCallback( ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); KeyedLoadStubCompiler compiler(isolate_); @@ -341,7 +352,8 @@ Handle<Code> StubCache::ComputeKeyedLoadArrayLength(Handle<String> name, Handle<JSArray> receiver) { Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); KeyedLoadStubCompiler compiler(isolate_); @@ -358,7 +370,7 @@ Handle<Code> StubCache::ComputeKeyedLoadStringLength(Handle<String> name, Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); Handle<Map> map(receiver->map()); - Handle<Object> probe(map->FindInCodeCache(*name, flags)); + Handle<Object> probe(map->FindInCodeCache(*name, flags), isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); KeyedLoadStubCompiler compiler(isolate_); @@ -375,7 +387,8 @@ Handle<Code> StubCache::ComputeKeyedLoadFunctionPrototype( Handle<JSFunction> receiver) { Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); KeyedLoadStubCompiler compiler(isolate_); @@ -396,7 +409,8 @@ Handle<Code> StubCache::ComputeStoreField(Handle<String> name, (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; Code::Flags flags = Code::ComputeMonomorphicFlags( Code::STORE_IC, type, strict_mode); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); StoreStubCompiler compiler(isolate_, strict_mode); @@ -438,7 +452,7 @@ Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement( UNREACHABLE(); break; } - Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags), isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); Handle<Code> code; @@ -490,7 +504,8 @@ Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name, StrictModeFlag strict_mode) { Code::Flags flags = Code::ComputeMonomorphicFlags( Code::STORE_IC, Code::NORMAL, strict_mode); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); StoreStubCompiler compiler(isolate_, strict_mode); @@ -510,7 +525,8 @@ Handle<Code> StubCache::ComputeStoreCallback(Handle<String> name, ASSERT(v8::ToCData<Address>(callback->setter()) != 0); Code::Flags flags = Code::ComputeMonomorphicFlags( Code::STORE_IC, Code::CALLBACKS, strict_mode); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); StoreStubCompiler compiler(isolate_, strict_mode); @@ -530,7 +546,8 @@ Handle<Code> StubCache::ComputeStoreViaSetter(Handle<String> name, StrictModeFlag strict_mode) { Code::Flags flags = Code::ComputeMonomorphicFlags( Code::STORE_IC, Code::CALLBACKS, strict_mode); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); StoreStubCompiler compiler(isolate_, strict_mode); @@ -548,7 +565,8 @@ Handle<Code> StubCache::ComputeStoreInterceptor(Handle<String> name, StrictModeFlag strict_mode) { Code::Flags flags = Code::ComputeMonomorphicFlags( Code::STORE_IC, Code::INTERCEPTOR, strict_mode); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); StoreStubCompiler compiler(isolate_, strict_mode); @@ -568,7 +586,8 @@ Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name, (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; Code::Flags flags = Code::ComputeMonomorphicFlags( Code::KEYED_STORE_IC, type, strict_mode); - Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); KeyedStoreStubCompiler compiler(isolate(), strict_mode, @@ -610,7 +629,8 @@ Handle<Code> StubCache::ComputeCallConstant(int argc, Code::Flags flags = Code::ComputeMonomorphicFlags(kind, Code::CONSTANT_FUNCTION, extra_state, cache_holder, argc); - Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); @@ -632,7 +652,7 @@ Handle<Code> StubCache::ComputeCallField(int argc, Handle<String> name, Handle<Object> object, Handle<JSObject> holder, - int index) { + PropertyIndex index) { // Compute the check type and the map. InlineCacheHolderFlag cache_holder = IC::GetCodeCacheForObject(*object, *holder); @@ -648,7 +668,8 @@ Handle<Code> StubCache::ComputeCallField(int argc, Code::Flags flags = Code::ComputeMonomorphicFlags(kind, Code::FIELD, extra_state, cache_holder, argc); - Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); @@ -685,7 +706,8 @@ Handle<Code> StubCache::ComputeCallInterceptor(int argc, Code::Flags flags = Code::ComputeMonomorphicFlags(kind, Code::INTERCEPTOR, extra_state, cache_holder, argc); - Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); @@ -715,7 +737,8 @@ Handle<Code> StubCache::ComputeCallGlobal(int argc, Code::Flags flags = Code::ComputeMonomorphicFlags(kind, Code::NORMAL, extra_state, cache_holder, argc); - Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); + Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), + isolate_); if (probe->IsCode()) return Handle<Code>::cast(probe); CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); @@ -747,10 +770,8 @@ Code* StubCache::FindCallInitialize(int argc, CallICBase::Contextual::encode(mode == RelocInfo::CODE_TARGET_CONTEXT); Code::Flags flags = Code::ComputeFlags(kind, UNINITIALIZED, extra_state, Code::NORMAL, argc); - - // Use raw_unchecked... so we don't get assert failures during GC. UnseededNumberDictionary* dictionary = - isolate()->heap()->raw_unchecked_non_monomorphic_cache(); + isolate()->heap()->non_monomorphic_cache(); int entry = dictionary->FindEntry(isolate(), flags); ASSERT(entry != -1); Object* code = dictionary->ValueAt(entry); @@ -1541,6 +1562,7 @@ int CallOptimization::GetPrototypeDepthOfExpectedType( while (!object.is_identical_to(holder)) { if (object->IsInstanceOf(*expected_receiver_type_)) return depth; object = Handle<JSObject>(JSObject::cast(object->GetPrototype())); + if (!object->map()->is_hidden_prototype()) return kInvalidProtoDepth; ++depth; } if (holder->IsInstanceOf(*expected_receiver_type_)) return depth; |