Index: src/stub-cache.cc |
diff --git a/src/stub-cache.cc b/src/stub-cache.cc |
index 21ff8eb80d1d50bc6903068acb593b96d019260e..1bf39b5b4daf56cab8e4f60279540085b5c3fe52 100644 |
--- a/src/stub-cache.cc |
+++ b/src/stub-cache.cc |
@@ -109,12 +109,12 @@ Handle<JSObject> StubCache::StubHolder(Handle<JSObject> receiver, |
} |
-Handle<Code> StubCache::FindStub(Handle<Name> name, |
- Handle<JSObject> stub_holder, |
- Code::Kind kind, |
- Code::StubType type, |
- Code::IcFragment fragment) { |
- Code::Flags flags = Code::ComputeMonomorphicFlags(kind, fragment, type); |
+Handle<Code> StubCache::FindIC(Handle<Name> name, |
+ Handle<JSObject> stub_holder, |
+ Code::Kind kind, |
+ Code::StubType type) { |
+ Code::Flags flags = Code::ComputeMonomorphicFlags( |
+ kind, Code::kNoExtraICState, type); |
Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags), |
isolate_); |
if (probe->IsCode()) return Handle<Code>::cast(probe); |
@@ -122,19 +122,29 @@ Handle<Code> StubCache::FindStub(Handle<Name> name, |
} |
-Handle<Code> StubCache::FindHandler(Handle<Name> name, |
- Handle<JSObject> handler_holder, |
- Code::Kind kind, |
- Code::StubType type) { |
- return FindStub(name, handler_holder, kind, type, Code::HANDLER_FRAGMENT); |
+Handle<Code> StubCache::FindStub(Handle<Name> name, |
+ Handle<JSObject> stub_holder, |
+ Code::Kind kind, |
+ Code::StubType type) { |
+ ASSERT(type != Code::NORMAL); |
+ int extra_flags = -1; |
+ if (kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC) { |
+ extra_flags = kind; |
+ kind = Code::STUB; |
+ } |
+ Code::Flags flags = Code::ComputeMonomorphicFlags( |
+ kind, Code::kNoExtraICState, type, extra_flags); |
+ Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags), |
+ isolate_); |
+ if (probe->IsCode()) return Handle<Code>::cast(probe); |
+ return Handle<Code>::null(); |
} |
Handle<Code> StubCache::ComputeMonomorphicIC(Handle<JSObject> receiver, |
Handle<Code> handler, |
Handle<Name> name) { |
- Handle<Code> ic = FindStub(name, receiver, Code::LOAD_IC, |
- handler->type(), Code::IC_FRAGMENT); |
+ Handle<Code> ic = FindIC(name, receiver, Code::LOAD_IC, handler->type()); |
if (!ic.is_null()) return ic; |
LoadStubCompiler ic_compiler(isolate()); |
@@ -149,8 +159,8 @@ Handle<Code> StubCache::ComputeMonomorphicIC(Handle<JSObject> receiver, |
Handle<Code> StubCache::ComputeKeyedMonomorphicIC(Handle<JSObject> receiver, |
Handle<Code> handler, |
Handle<Name> name) { |
- Handle<Code> ic = FindStub(name, receiver, Code::KEYED_LOAD_IC, |
- handler->type(), Code::IC_FRAGMENT); |
+ Handle<Code> ic = FindIC( |
+ name, receiver, Code::KEYED_LOAD_IC, handler->type()); |
if (!ic.is_null()) return ic; |
KeyedLoadStubCompiler ic_compiler(isolate()); |
@@ -187,7 +197,7 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<Name> name, |
// Compile the stub that is either shared for all names or |
// name specific if there are global objects involved. |
- Handle<Code> handler = FindHandler( |
+ Handle<Code> handler = FindStub( |
cache_name, receiver, Code::LOAD_IC, Code::NONEXISTENT); |
if (!handler.is_null()) return handler; |
@@ -211,7 +221,7 @@ Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, |
} |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
- Handle<Code> stub = FindHandler( |
+ Handle<Code> stub = FindStub( |
name, stub_holder, Code::LOAD_IC, Code::FIELD); |
if (!stub.is_null()) return stub; |
@@ -230,7 +240,7 @@ Handle<Code> StubCache::ComputeLoadCallback( |
Handle<ExecutableAccessorInfo> callback) { |
ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
- Handle<Code> stub = FindHandler( |
+ Handle<Code> stub = FindStub( |
name, stub_holder, Code::LOAD_IC, Code::CALLBACKS); |
if (!stub.is_null()) return stub; |
@@ -247,7 +257,7 @@ Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, |
Handle<JSObject> holder, |
Handle<JSFunction> getter) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
- Handle<Code> stub = FindHandler( |
+ Handle<Code> stub = FindStub( |
name, stub_holder, Code::LOAD_IC, Code::CALLBACKS); |
if (!stub.is_null()) return stub; |
@@ -264,7 +274,7 @@ Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, |
Handle<JSObject> holder, |
Handle<JSFunction> value) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
- Handle<Code> handler = FindHandler( |
+ Handle<Code> handler = FindStub( |
name, stub_holder, Code::LOAD_IC, Code::CONSTANT_FUNCTION); |
if (!handler.is_null()) return handler; |
@@ -280,7 +290,7 @@ Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, |
Handle<JSObject> receiver, |
Handle<JSObject> holder) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
- Handle<Code> stub = FindHandler( |
+ Handle<Code> stub = FindStub( |
name, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR); |
if (!stub.is_null()) return stub; |
@@ -304,8 +314,7 @@ Handle<Code> StubCache::ComputeLoadGlobal(Handle<Name> name, |
Handle<JSGlobalPropertyCell> cell, |
bool is_dont_delete) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
- Handle<Code> stub = FindStub( |
- name, stub_holder, Code::LOAD_IC, Code::NORMAL, Code::IC_FRAGMENT); |
+ Handle<Code> stub = FindIC(name, stub_holder, Code::LOAD_IC, Code::NORMAL); |
if (!stub.is_null()) return stub; |
LoadStubCompiler compiler(isolate_); |
@@ -328,7 +337,7 @@ Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name, |
} |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
- Handle<Code> stub = FindHandler( |
+ Handle<Code> stub = FindStub( |
name, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD); |
if (!stub.is_null()) return stub; |
@@ -345,7 +354,7 @@ Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, |
Handle<JSObject> holder, |
Handle<JSFunction> value) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
- Handle<Code> handler = FindHandler( |
+ Handle<Code> handler = FindStub( |
name, stub_holder, Code::KEYED_LOAD_IC, Code::CONSTANT_FUNCTION); |
if (!handler.is_null()) return handler; |
@@ -360,7 +369,7 @@ Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name, |
Handle<JSObject> receiver, |
Handle<JSObject> holder) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
- Handle<Code> stub = FindHandler( |
+ Handle<Code> stub = FindStub( |
name, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR); |
if (!stub.is_null()) return stub; |
@@ -378,7 +387,7 @@ Handle<Code> StubCache::ComputeKeyedLoadCallback( |
Handle<JSObject> holder, |
Handle<ExecutableAccessorInfo> callback) { |
Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
- Handle<Code> stub = FindHandler( |
+ Handle<Code> stub = FindStub( |
name, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); |
if (!stub.is_null()) return stub; |
@@ -895,8 +904,10 @@ Handle<Code> StubCache::ComputePolymorphicIC(MapHandleList* receiver_maps, |
CodeHandleList* handlers, |
Handle<Name> name) { |
LoadStubCompiler ic_compiler(isolate_); |
+ Code::StubType type = handlers->length() == 1 ? handlers->at(0)->type() |
+ : Code::NORMAL; |
Handle<Code> ic = ic_compiler.CompilePolymorphicIC( |
- receiver_maps, handlers, name, Code::NORMAL, PROPERTY); |
+ receiver_maps, handlers, name, type, PROPERTY); |
return ic; |
} |
@@ -981,7 +992,7 @@ void StubCache::CollectMatchingMaps(SmallMapList* types, |
Zone* zone) { |
for (int i = 0; i < kPrimaryTableSize; i++) { |
if (primary_[i].key == name) { |
- Map* map = primary_[i].value->FindFirstMap(); |
+ Map* map = primary_[i].map; |
// Map can be NULL, if the stub is constant function call |
// with a primitive receiver. |
if (map == NULL) continue; |
@@ -996,7 +1007,7 @@ void StubCache::CollectMatchingMaps(SmallMapList* types, |
for (int i = 0; i < kSecondaryTableSize; i++) { |
if (secondary_[i].key == name) { |
- Map* map = secondary_[i].value->FindFirstMap(); |
+ Map* map = secondary_[i].map; |
// Map can be NULL, if the stub is constant function call |
// with a primitive receiver. |
if (map == NULL) continue; |
@@ -1005,7 +1016,7 @@ void StubCache::CollectMatchingMaps(SmallMapList* types, |
int primary_offset = PrimaryOffset(name, flags, map); |
Entry* primary_entry = entry(primary_, primary_offset); |
if (primary_entry->key == name) { |
- Map* primary_map = primary_entry->value->FindFirstMap(); |
+ Map* primary_map = primary_entry->map; |
if (map == primary_map) continue; |
} |
@@ -1448,7 +1459,7 @@ Handle<Code> BaseLoadStubCompiler::CompileLoadField(Handle<JSObject> object, |
GenerateLoadMiss(masm(), kind()); |
// Return the generated code. |
- return GetCode(Code::HANDLER_FRAGMENT, Code::FIELD, name); |
+ return GetCode(kind(), Code::FIELD, name); |
} |
@@ -1463,7 +1474,7 @@ Handle<Code> BaseLoadStubCompiler::CompileLoadConstant( |
GenerateLoadConstant(value); |
// Return the generated code. |
- return GetCode(Code::HANDLER_FRAGMENT, Code::CONSTANT_FUNCTION, name); |
+ return GetCode(kind(), Code::CONSTANT_FUNCTION, name); |
} |
@@ -1480,7 +1491,7 @@ Handle<Code> BaseLoadStubCompiler::CompileLoadCallback( |
GenerateLoadCallback(reg, callback); |
// Return the generated code. |
- return GetCode(Code::HANDLER_FRAGMENT, Code::CALLBACKS, name); |
+ return GetCode(kind(), Code::CALLBACKS, name); |
} |
@@ -1500,7 +1511,7 @@ Handle<Code> BaseLoadStubCompiler::CompileLoadInterceptor( |
GenerateLoadInterceptor(reg, object, holder, &lookup, name); |
// Return the generated code. |
- return GetCode(Code::HANDLER_FRAGMENT, Code::INTERCEPTOR, name); |
+ return GetCode(kind(), Code::INTERCEPTOR, name); |
} |
@@ -1567,7 +1578,7 @@ Handle<Code> LoadStubCompiler::CompileLoadViaGetter( |
GenerateLoadViaGetter(masm(), getter); |
// Return the generated code. |
- return GetCode(Code::HANDLER_FRAGMENT, Code::CALLBACKS, name); |
+ return GetCode(kind(), Code::CALLBACKS, name); |
} |
@@ -1584,11 +1595,25 @@ void KeyedLoadStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) { |
} |
-Handle<Code> BaseLoadStubCompiler::GetCode(Code::IcFragment fragment, |
+Handle<Code> BaseLoadStubCompiler::GetICCode(Code::Kind kind, |
+ Code::StubType type, |
+ Handle<Name> name, |
+ InlineCacheState state) { |
+ Code::Flags flags = Code::ComputeFlags( |
+ kind, state, Code::kNoExtraICState, type); |
+ Handle<Code> code = GetCodeWithFlags(flags, name); |
+ PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name)); |
+ JitEvent(name, code); |
+ return code; |
+} |
+ |
+ |
+Handle<Code> BaseLoadStubCompiler::GetCode(Code::Kind kind, |
Code::StubType type, |
- Handle<Name> name, |
- InlineCacheState state) { |
- Code::Flags flags = Code::ComputeFlags(kind(), state, fragment, type); |
+ Handle<Name> name) { |
+ ASSERT(type != Code::NORMAL); |
+ Code::Flags flags = Code::ComputeFlags( |
+ Code::STUB, MONOMORPHIC, Code::kNoExtraICState, type, kind); |
Handle<Code> code = GetCodeWithFlags(flags, name); |
PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name)); |
JitEvent(name, code); |