Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(322)

Unified Diff: src/ic-inl.h

Issue 400523007: Cache IC handlers on the prototype's map if possible (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: addressed comment Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/ic.cc ('k') | src/objects.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ic-inl.h
diff --git a/src/ic-inl.h b/src/ic-inl.h
index 78d42ea9c3e7d4d34f0e6c982eed00f321fd5e38..59dfeddaeae96b543e1bfde254f01e29833974bc 100644
--- a/src/ic-inl.h
+++ b/src/ic-inl.h
@@ -119,61 +119,55 @@ void IC::SetTargetAtAddress(Address address,
}
-InlineCacheHolderFlag IC::GetCodeCacheForObject(Object* object) {
- if (object->IsJSObject()) return OWN_MAP;
-
- // If the object is a value, we use the prototype map for the cache.
- ASSERT(object->IsString() || object->IsSymbol() ||
- object->IsNumber() || object->IsBoolean());
- return PROTOTYPE_MAP;
-}
-
-
-HeapObject* IC::GetCodeCacheHolder(Isolate* isolate,
- Object* object,
- InlineCacheHolderFlag holder) {
- if (object->IsSmi()) holder = PROTOTYPE_MAP;
- PrototypeIterator iter(isolate, object,
- holder == OWN_MAP
- ? PrototypeIterator::START_AT_RECEIVER
- : PrototypeIterator::START_AT_PROTOTYPE);
- return HeapObject::cast(iter.GetCurrent());
+template <class TypeClass>
+JSFunction* IC::GetRootConstructor(TypeClass* type, Context* native_context) {
+ if (type->Is(TypeClass::Boolean())) {
+ return native_context->boolean_function();
+ } else if (type->Is(TypeClass::Number())) {
+ return native_context->number_function();
+ } else if (type->Is(TypeClass::String())) {
+ return native_context->string_function();
+ } else if (type->Is(TypeClass::Symbol())) {
+ return native_context->symbol_function();
+ } else {
+ return NULL;
+ }
}
-InlineCacheHolderFlag IC::GetCodeCacheFlag(HeapType* type) {
- if (type->Is(HeapType::Boolean()) ||
- type->Is(HeapType::Number()) ||
- type->Is(HeapType::String()) ||
- type->Is(HeapType::Symbol())) {
- return PROTOTYPE_MAP;
+Handle<Map> IC::GetHandlerCacheHolder(HeapType* type, bool receiver_is_holder,
+ Isolate* isolate, CacheHolderFlag* flag) {
+ Handle<Map> receiver_map = TypeToMap(type, isolate);
+ if (receiver_is_holder) {
+ *flag = kCacheOnReceiver;
+ return receiver_map;
+ }
+ Context* native_context = *isolate->native_context();
+ JSFunction* builtin_ctor = GetRootConstructor(type, native_context);
+ if (builtin_ctor != NULL) {
+ *flag = kCacheOnPrototypeReceiverIsPrimitive;
+ return handle(HeapObject::cast(builtin_ctor->instance_prototype())->map());
}
- return OWN_MAP;
+ *flag = receiver_map->is_dictionary_map()
+ ? kCacheOnPrototypeReceiverIsDictionary
+ : kCacheOnPrototype;
+ // Callers must ensure that the prototype is non-null.
+ return handle(JSObject::cast(receiver_map->prototype())->map());
}
-Handle<Map> IC::GetCodeCacheHolder(InlineCacheHolderFlag flag,
- HeapType* type,
- Isolate* isolate) {
- if (flag == PROTOTYPE_MAP) {
- Context* context = *isolate->native_context();
- JSFunction* constructor;
- if (type->Is(HeapType::Boolean())) {
- constructor = context->boolean_function();
- } else if (type->Is(HeapType::Number())) {
- constructor = context->number_function();
- } else if (type->Is(HeapType::String())) {
- constructor = context->string_function();
- } else {
- ASSERT(type->Is(HeapType::Symbol()));
- constructor = context->symbol_function();
- }
- return handle(JSObject::cast(constructor->instance_prototype())->map());
+Handle<Map> IC::GetICCacheHolder(HeapType* type, Isolate* isolate,
+ CacheHolderFlag* flag) {
+ Context* native_context = *isolate->native_context();
+ JSFunction* builtin_ctor = GetRootConstructor(type, native_context);
+ if (builtin_ctor != NULL) {
+ *flag = kCacheOnPrototype;
+ return handle(builtin_ctor->initial_map());
}
+ *flag = kCacheOnReceiver;
return TypeToMap(type, isolate);
}
-
} } // namespace v8::internal
#endif // V8_IC_INL_H_
« no previous file with comments | « src/ic.cc ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698