Index: src/ia32/ic-ia32.cc |
=================================================================== |
--- src/ia32/ic-ia32.cc (revision 2143) |
+++ src/ia32/ic-ia32.cc (working copy) |
@@ -747,6 +747,21 @@ |
} |
+void KeyedStoreIC::ClearInlinedVersion(Address address) { |
+ // Insert null as the elements map to check for. This will make |
+ // sure that the elements fast-case map check fails so that control |
+ // flows to the IC instead of the inlined version. |
+ PatchInlinedStore(address, Heap::null_value()); |
+} |
+ |
+ |
+void KeyedStoreIC::RestoreInlinedVersion(Address address) { |
+ // Restore the fast-case elements map check so that the inlined |
+ // version can be used again. |
+ PatchInlinedStore(address, Heap::fixed_array_map()); |
+} |
+ |
+ |
bool LoadIC::PatchInlinedLoad(Address address, Object* map, int offset) { |
// The address of the instruction following the call. |
Address test_instruction_address = address + 4; |
@@ -774,7 +789,7 @@ |
} |
-bool KeyedLoadIC::PatchInlinedLoad(Address address, Object* map) { |
+static bool PatchInlinedMapCheck(Address address, Object* map) { |
Address test_instruction_address = address + 4; // 4 = stub address |
// The keyed load has a fast inlined case if the IC call instruction |
// is immediately followed by a test instruction. |
@@ -795,6 +810,16 @@ |
} |
+bool KeyedLoadIC::PatchInlinedLoad(Address address, Object* map) { |
+ return PatchInlinedMapCheck(address, map); |
+} |
+ |
+ |
+bool KeyedStoreIC::PatchInlinedStore(Address address, Object* map) { |
+ return PatchInlinedMapCheck(address, map); |
+} |
+ |
+ |
// Defined in ic.cc. |
Object* KeyedLoadIC_Miss(Arguments args); |