Index: test/cctest/test-serialize.cc |
diff --git a/test/cctest/test-serialize.cc b/test/cctest/test-serialize.cc |
index cd349f9d735160753e691473f4b50a4165de434e..b544054149855ca1f7800329964a0eee3014ff9e 100644 |
--- a/test/cctest/test-serialize.cc |
+++ b/test/cctest/test-serialize.cc |
@@ -36,6 +36,7 @@ |
#include "src/compilation-cache.h" |
#include "src/debug/debug.h" |
#include "src/heap/spaces.h" |
+#include "src/macro-assembler.h" |
#include "src/objects.h" |
#include "src/parsing/parser.h" |
#include "src/runtime/runtime.h" |
@@ -1833,6 +1834,55 @@ TEST(Regress503552) { |
delete script_data; |
} |
+#if V8_TARGET_ARCH_X64 |
+TEST(CodeSerializerCell) { |
+ FLAG_serialize_toplevel = true; |
+ LocalContext context; |
+ Isolate* isolate = CcTest::i_isolate(); |
+ isolate->compilation_cache()->Disable(); // Disable same-isolate code cache. |
+ |
+ v8::HandleScope scope(CcTest::isolate()); |
+ |
+ size_t actual_size; |
+ byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
+ Assembler::kMinimalBufferSize, &actual_size, true)); |
+ CHECK(buffer); |
+ HandleScope handles(isolate); |
+ |
+ MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size), |
+ v8::internal::CodeObjectRequired::kYes); |
+ assembler.enable_serializer(); |
+ Handle<HeapNumber> number = isolate->factory()->NewHeapNumber(0.3); |
+ CHECK(isolate->heap()->InNewSpace(*number)); |
+ MacroAssembler* masm = &assembler; |
+ masm->MoveHeapObject(rax, number); |
+ masm->ret(0); |
+ CodeDesc desc; |
+ masm->GetCode(&desc); |
+ Handle<Code> code = isolate->factory()->NewCode( |
+ desc, Code::ComputeFlags(Code::FUNCTION), masm->CodeObject()); |
+ code->set_has_reloc_info_for_serialization(true); |
+ |
+ RelocIterator rit1(*code, 1 << RelocInfo::CELL); |
+ CHECK_EQ(*number, rit1.rinfo()->target_cell()->value()); |
+ |
+ Handle<String> source = isolate->factory()->empty_string(); |
+ Handle<SharedFunctionInfo> sfi = |
+ isolate->factory()->NewSharedFunctionInfo(source, code, false); |
+ ScriptData* script_data = CodeSerializer::Serialize(isolate, sfi, source); |
+ |
+ Handle<SharedFunctionInfo> copy = |
+ CodeSerializer::Deserialize(isolate, script_data, source) |
+ .ToHandleChecked(); |
+ RelocIterator rit2(copy->code(), 1 << RelocInfo::CELL); |
+ CHECK(rit2.rinfo()->target_cell()->IsCell()); |
+ Handle<Cell> cell(rit2.rinfo()->target_cell()); |
+ CHECK(cell->value()->IsHeapNumber()); |
+ CHECK_EQ(0.3, HeapNumber::cast(cell->value())->value()); |
+ |
+ delete script_data; |
+} |
+#endif // V8_TARGET_ARCH_X64 |
TEST(SerializationMemoryStats) { |
FLAG_profile_deserialization = true; |