Index: runtime/vm/instructions_x64_test.cc |
diff --git a/runtime/vm/instructions_x64_test.cc b/runtime/vm/instructions_x64_test.cc |
index 3e7fb7db96a335f30749764059bd91d576a0736c..0ad829486502baee864a79a04058bf6cc7d56ac6 100644 |
--- a/runtime/vm/instructions_x64_test.cc |
+++ b/runtime/vm/instructions_x64_test.cc |
@@ -35,6 +35,34 @@ ASSEMBLER_TEST_GENERATE(Jump, assembler) { |
} |
+ASSEMBLER_TEST_RUN(Jump, test) { |
+ ASSERT(prologue_code_size != -1); |
+ 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() + prologue_code_size, test->code()); |
+ jump1.IsValid(); |
+ EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(), |
+ jump1.TargetAddress()); |
+ JumpPattern jump2((test->entry() + |
+ jump1.pattern_length_in_bytes() + prologue_code_size), |
+ 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()->label().address(), |
+ jump2.TargetAddress()); |
+} |
+ |
} // namespace dart |
#endif // defined TARGET_ARCH_X64 |