Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index b5ae33e6b7a533841d6174f3e46fa39c2f5ac3e7..80cd033c7bc9970006483194aa3256fc7ba71e92 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -1137,8 +1137,13 @@ void LoadIC::UpdateCaches(LookupResult* lookup, |
// TODO(jkummerow): It would be nice to support non-JSObjects in |
// ComputeLoadHandler, then we wouldn't need to go generic here. |
code = slow_stub(); |
+ } else if (!lookup->IsProperty()) { |
+ code = kind() == Code::LOAD_IC |
+ ? isolate()->stub_cache()->ComputeLoadNonexistent( |
+ name, Handle<JSObject>::cast(receiver)) |
+ : slow_stub(); |
} else { |
- code = ComputeLoadHandler(lookup, Handle<JSObject>::cast(receiver), name); |
+ code = ComputeHandler(lookup, Handle<JSObject>::cast(receiver), name); |
} |
PatchCache(receiver, name, code); |
@@ -1153,20 +1158,15 @@ void IC::UpdateMegamorphicCache(Map* map, Name* name, Code* code) { |
} |
-Handle<Code> LoadIC::ComputeLoadHandler(LookupResult* lookup, |
- Handle<JSObject> receiver, |
- Handle<String> name) { |
- if (!lookup->IsProperty()) { |
- return kind() == Code::LOAD_IC |
- ? isolate()->stub_cache()->ComputeLoadNonexistent(name, receiver) |
- : generic_stub(); |
- } |
- |
+Handle<Code> IC::ComputeHandler(LookupResult* lookup, |
+ Handle<JSObject> receiver, |
+ Handle<String> name, |
+ Handle<Object> value) { |
Handle<Code> code = isolate()->stub_cache()->FindHandler( |
name, receiver, kind()); |
if (!code.is_null()) return code; |
- code = CompileLoadHandler(lookup, receiver, name); |
+ code = CompileHandler(lookup, receiver, name, value); |
if (code.is_null()) return slow_stub(); |
if (code->is_handler() && code->type() != Code::NORMAL) { |
@@ -1177,9 +1177,10 @@ Handle<Code> LoadIC::ComputeLoadHandler(LookupResult* lookup, |
} |
-Handle<Code> LoadIC::CompileLoadHandler(LookupResult* lookup, |
- Handle<JSObject> receiver, |
- Handle<String> name) { |
+Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, |
+ Handle<JSObject> receiver, |
+ Handle<String> name, |
+ Handle<Object> unused) { |
Handle<JSObject> holder(lookup->holder()); |
switch (lookup->type()) { |
case FIELD: |
@@ -1390,9 +1391,10 @@ MaybeObject* KeyedLoadIC::Load(Handle<Object> object, |
} |
-Handle<Code> KeyedLoadIC::CompileLoadHandler(LookupResult* lookup, |
- Handle<JSObject> receiver, |
- Handle<String> name) { |
+Handle<Code> KeyedLoadIC::CompileHandler(LookupResult* lookup, |
+ Handle<JSObject> receiver, |
+ Handle<String> name, |
+ Handle<Object> value) { |
// Compute a monomorphic stub. |
Handle<JSObject> holder(lookup->holder(), isolate()); |
switch (lookup->type()) { |
@@ -1633,36 +1635,17 @@ void StoreIC::UpdateCaches(LookupResult* lookup, |
// These are not cacheable, so we never see such LookupResults here. |
ASSERT(!lookup->IsHandler()); |
- Handle<Code> code = ComputeStoreHandler(lookup, receiver, name, value); |
+ Handle<Code> code = ComputeHandler(lookup, receiver, name, value); |
PatchCache(receiver, name, code); |
TRACE_IC("StoreIC", name); |
} |
-Handle<Code> StoreIC::ComputeStoreHandler(LookupResult* lookup, |
- Handle<JSObject> receiver, |
- Handle<String> name, |
- Handle<Object> value) { |
- Handle<Code> code = isolate()->stub_cache()->FindHandler( |
- name, receiver, kind(), strict_mode()); |
- if (!code.is_null()) return code; |
- |
- code = CompileStoreHandler(lookup, receiver, name, value); |
- if (code.is_null()) return slow_stub(); |
- |
- if (code->is_handler() && code->type() != Code::NORMAL) { |
- HeapObject::UpdateMapCodeCache(receiver, name, code); |
- } |
- |
- return code; |
-} |
- |
- |
-Handle<Code> StoreIC::CompileStoreHandler(LookupResult* lookup, |
- Handle<JSObject> receiver, |
- Handle<String> name, |
- Handle<Object> value) { |
+Handle<Code> StoreIC::CompileHandler(LookupResult* lookup, |
+ Handle<JSObject> receiver, |
+ Handle<String> name, |
+ Handle<Object> value) { |
Handle<JSObject> holder(lookup->holder()); |
switch (lookup->type()) { |
case FIELD: |
@@ -2051,10 +2034,10 @@ MaybeObject* KeyedStoreIC::Store(Handle<Object> object, |
} |
-Handle<Code> KeyedStoreIC::CompileStoreHandler(LookupResult* lookup, |
- Handle<JSObject> receiver, |
- Handle<String> name, |
- Handle<Object> value) { |
+Handle<Code> KeyedStoreIC::CompileHandler(LookupResult* lookup, |
+ Handle<JSObject> receiver, |
+ Handle<String> name, |
+ Handle<Object> value) { |
// If the property has a non-field type allowing map transitions |
// where there is extra room in the object, we leave the IC in its |
// current state. |