Index: runtime/vm/object_test.cc |
=================================================================== |
--- runtime/vm/object_test.cc (revision 32487) |
+++ runtime/vm/object_test.cc (working copy) |
@@ -2464,6 +2464,31 @@ |
} |
+// Test for immutability of generated instructions. The test crashes with a |
+// segmentation fault when writing into it. |
+TEST_CASE(CodeImmutability) { |
+ extern void GenerateIncrement(Assembler* assembler); |
+ Assembler _assembler_; |
+ GenerateIncrement(&_assembler_); |
+ Code& code = Code::Handle(Code::FinalizeCode( |
+ *CreateFunction("Test_Code"), &_assembler_)); |
+ Instructions& instructions = Instructions::Handle(code.instructions()); |
+ uword entry_point = instructions.EntryPoint(); |
+ // Try writing into the generated code, expected to crash. |
+ *(reinterpret_cast<char*>(entry_point) + 1) = 1; |
+ intptr_t retval = 0; |
+#if defined(USING_SIMULATOR) |
+ retval = bit_copy<intptr_t, int64_t>(Simulator::Current()->Call( |
+ static_cast<int32_t>(entry_point), 0, 0, 0, 0)); |
+#else |
+ typedef intptr_t (*IncrementCode)(); |
+ retval = reinterpret_cast<IncrementCode>(entry_point)(); |
+#endif |
+ EXPECT_EQ(3, retval); |
+ EXPECT_EQ(instructions.raw(), Instructions::FromEntryPoint(entry_point)); |
+} |
+ |
+ |
// Test for Embedded String object in the instructions. |
TEST_CASE(EmbedStringInCode) { |
extern void GenerateEmbedStringInCode(Assembler* assembler, const char* str); |