Index: src/ic-ia32.cc |
=================================================================== |
--- src/ic-ia32.cc (revision 1755) |
+++ src/ic-ia32.cc (working copy) |
@@ -729,8 +729,24 @@ |
} |
+// One byte opcode for test eax,0xXXXXXXXX. |
+static const byte kTestEaxByte = 0xA9; |
+ |
+ |
+bool KeyedLoadIC::HasInlinedVersion(Address address) { |
+ Address test_instruction_address = address + 4; // 4 = stub address |
+ return *test_instruction_address == kTestEaxByte; |
+} |
+ |
+ |
+void KeyedLoadIC::ClearInlinedVersion(Address address) { |
+ // Insert null as the map to check for to make sure the map check fails |
+ // sending control flow to the IC instead of the inlined version. |
+ PatchInlinedMapCheck(address, Heap::null_value()); |
+} |
+ |
+ |
void KeyedLoadIC::PatchInlinedMapCheck(Address address, Object* value) { |
- static const byte kTestEaxByte = 0xA9; |
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. |
@@ -744,7 +760,7 @@ |
// bytes of the 7-byte operand-immediate compare instruction, so |
// we add 3 to the offset to get the map address. |
Address map_address = test_instruction_address + offset_value + 3; |
- // patch the map check. |
+ // Patch the map check. |
(*(reinterpret_cast<Object**>(map_address))) = value; |
} |
} |