Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index bd7aa7cf98e30eabe2f31d564d540b9972485d0a..470a1639b2f2c8727faa33c9beca7bdacbe136f5 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -1145,13 +1145,14 @@ void LoadIC::UpdateCaches(LookupResult* lookup, |
return; |
} |
+ Handle<Type> type = CurrentTypeOf(object, isolate()); |
Handle<Code> code; |
if (!lookup->IsCacheable()) { |
// Bail out if the result is not cacheable. |
code = slow_stub(); |
} else if (!lookup->IsProperty()) { |
if (kind() == Code::LOAD_IC) { |
- code = isolate()->stub_cache()->ComputeLoadNonexistent(name, object); |
+ code = isolate()->stub_cache()->ComputeLoadNonexistent(name, type); |
} else { |
code = slow_stub(); |
} |
@@ -1159,7 +1160,7 @@ void LoadIC::UpdateCaches(LookupResult* lookup, |
code = ComputeHandler(lookup, object, name); |
} |
- PatchCache(CurrentTypeOf(object, isolate()), name, code); |
+ PatchCache(type, name, code); |
TRACE_IC("LoadIC", name); |
} |
@@ -1181,7 +1182,7 @@ Handle<Code> IC::ComputeHandler(LookupResult* lookup, |
isolate(), *object, cache_holder)); |
Handle<Code> code = isolate()->stub_cache()->FindHandler( |
- name, stub_holder, kind(), cache_holder, strict_mode()); |
+ name, handle(stub_holder->map()), kind(), cache_holder, strict_mode()); |
if (!code.is_null()) return code; |
code = CompileHandler(lookup, object, name, value, cache_holder); |
@@ -1205,6 +1206,7 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, |
return SimpleFieldLoad(length_index); |
} |
+ Handle<Type> type = CurrentTypeOf(object, isolate()); |
Handle<JSObject> holder(lookup->holder()); |
LoadStubCompiler compiler(isolate(), cache_holder, kind()); |
@@ -1217,14 +1219,14 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, |
lookup->representation()); |
} |
return compiler.CompileLoadField( |
- object, holder, name, field, lookup->representation()); |
+ type, holder, name, field, lookup->representation()); |
} |
case CONSTANT: { |
Handle<Object> constant(lookup->GetConstant(), isolate()); |
// TODO(2803): Don't compute a stub for cons strings because they cannot |
// be embedded into code. |
if (constant->IsConsString()) break; |
- return compiler.CompileLoadConstant(object, holder, name, constant); |
+ return compiler.CompileLoadConstant(type, holder, name, constant); |
} |
case NORMAL: |
if (kind() != Code::LOAD_IC) break; |
@@ -1233,7 +1235,7 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, |
Handle<PropertyCell> cell( |
global->GetPropertyCell(lookup), isolate()); |
Handle<Code> code = compiler.CompileLoadGlobal( |
- object, global, cell, name, lookup->IsDontDelete()); |
+ type, global, cell, name, lookup->IsDontDelete()); |
// TODO(verwaest): Move caching of these NORMAL stubs outside as well. |
Handle<HeapObject> stub_holder(GetCodeCacheHolder( |
isolate(), *object, cache_holder)); |
@@ -1263,7 +1265,7 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, |
Handle<ExecutableAccessorInfo>::cast(callback); |
if (v8::ToCData<Address>(info->getter()) == 0) break; |
if (!info->IsCompatibleReceiver(*object)) break; |
- return compiler.CompileLoadCallback(object, holder, name, info); |
+ return compiler.CompileLoadCallback(type, holder, name, info); |
} else if (callback->IsAccessorPair()) { |
Handle<Object> getter(Handle<AccessorPair>::cast(callback)->getter(), |
isolate()); |
@@ -1282,9 +1284,9 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, |
if (call_optimization.is_simple_api_call() && |
call_optimization.IsCompatibleReceiver(*object)) { |
return compiler.CompileLoadCallback( |
- object, holder, name, call_optimization); |
+ type, holder, name, call_optimization); |
} |
- return compiler.CompileLoadViaGetter(object, holder, name, function); |
+ return compiler.CompileLoadViaGetter(type, holder, name, function); |
} |
// TODO(dcarney): Handle correctly. |
if (callback->IsDeclaredAccessorInfo()) break; |
@@ -1294,7 +1296,7 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, |
} |
case INTERCEPTOR: |
ASSERT(HasInterceptorGetter(*holder)); |
- return compiler.CompileLoadInterceptor(object, holder, name); |
+ return compiler.CompileLoadInterceptor(type, holder, name); |
default: |
break; |
} |