Index: runtime/vm/instructions_ia32_test.cc |
diff --git a/runtime/vm/instructions_ia32_test.cc b/runtime/vm/instructions_ia32_test.cc |
index 6b01cdb8916c71bc73c0d99c70f26ae300f79598..cace22907f15c72106f9cd0599f6d68407f57542 100644 |
--- a/runtime/vm/instructions_ia32_test.cc |
+++ b/runtime/vm/instructions_ia32_test.cc |
@@ -17,7 +17,7 @@ namespace dart { |
#define __ assembler-> |
ASSEMBLER_TEST_GENERATE(Call, assembler) { |
- __ call(&StubCode::InvokeDartCode_entry()->label()); |
+ __ Call(*StubCode::InvokeDartCode_entry()); |
__ ret(); |
} |
@@ -29,6 +29,41 @@ ASSEMBLER_TEST_RUN(Call, test) { |
} |
+ASSEMBLER_TEST_GENERATE(Jump, assembler) { |
+ __ Jmp(*StubCode::InvokeDartCode_entry()); |
+ const ExternalLabel label(StubCode::AllocateArray_entry()->EntryPoint()); |
+ __ jmp(&label); |
+ __ ret(); |
+} |
+ |
+ |
+ASSEMBLER_TEST_RUN(Jump, test) { |
+ const Code& code = test->code(); |
+ const Instructions& instrs = Instructions::Handle(code.instructions()); |
+ bool status = |
+ VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()), |
+ instrs.size(), |
+ VirtualMemory::kReadWrite); |
+ EXPECT(status); |
+ JumpPattern jump1(test->entry(), test->code()); |
+ EXPECT_EQ(StubCode::InvokeDartCode_entry()->EntryPoint(), |
+ jump1.TargetAddress()); |
+ JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(), |
+ test->code()); |
+ const Code& array_stub = |
+ Code::Handle(StubCode::AllocateArray_entry()->code()); |
+ EXPECT_EQ(array_stub.EntryPoint(), |
+ jump2.TargetAddress()); |
+ uword target1 = jump1.TargetAddress(); |
+ uword target2 = jump2.TargetAddress(); |
+ jump1.SetTargetAddress(target2); |
+ jump2.SetTargetAddress(target1); |
+ EXPECT_EQ(array_stub.EntryPoint(), |
+ jump1.TargetAddress()); |
+ EXPECT_EQ(StubCode::InvokeDartCode_entry()->EntryPoint(), |
+ jump2.TargetAddress()); |
+} |
+ |
} // namespace dart |
#endif // defined TARGET_ARCH_IA32 |