Index: test/cctest/test-serialize.cc |
diff --git a/test/cctest/test-serialize.cc b/test/cctest/test-serialize.cc |
index 94b400e2055a67cec62e8e8a65411023e437bfd5..8aec6fb86ad65e84f1a001dfa3def9675fc598dc 100644 |
--- a/test/cctest/test-serialize.cc |
+++ b/test/cctest/test-serialize.cc |
@@ -786,6 +786,121 @@ TEST(SerializeToplevelInternalizedString) { |
} |
+Vector<const uint8_t> ConstructSource(Vector<const uint8_t> head, |
+ Vector<const uint8_t> body, |
+ Vector<const uint8_t> tail, int repeats) { |
+ int source_length = head.length() + body.length() * repeats + tail.length(); |
+ uint8_t* source = NewArray<uint8_t>(static_cast<size_t>(source_length)); |
+ CopyChars(source, head.start(), head.length()); |
+ for (int i = 0; i < repeats; i++) { |
+ CopyChars(source + head.length() + i * body.length(), body.start(), |
+ body.length()); |
+ } |
+ CopyChars(source + head.length() + repeats * body.length(), tail.start(), |
+ tail.length()); |
+ return Vector<const uint8_t>(const_cast<const uint8_t*>(source), |
+ source_length); |
+} |
+ |
+ |
+TEST(SerializeToplevelLargeCodeObject) { |
+ 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()); |
+ |
+ Vector<const uint8_t> source = |
+ ConstructSource(STATIC_CHAR_VECTOR("var j=1; try { if (j) throw 1;"), |
+ STATIC_CHAR_VECTOR("for(var i=0;i<1;i++)j++;"), |
+ STATIC_CHAR_VECTOR("} catch (e) { j=7; } j"), 10000); |
+ Handle<String> source_str = |
+ isolate->factory()->NewStringFromOneByte(source).ToHandleChecked(); |
+ |
+ Handle<JSObject> global(isolate->context()->global_object()); |
+ ScriptData* cache = NULL; |
+ |
+ Handle<SharedFunctionInfo> orig = Compiler::CompileScript( |
+ source_str, Handle<String>(), 0, 0, false, |
+ Handle<Context>(isolate->native_context()), NULL, &cache, |
+ v8::ScriptCompiler::kProduceCodeCache, NOT_NATIVES_CODE); |
+ |
+ CHECK(isolate->heap()->InSpace(orig->code(), LO_SPACE)); |
+ |
+ Handle<SharedFunctionInfo> copy; |
+ { |
+ DisallowCompilation no_compile_expected(isolate); |
+ copy = Compiler::CompileScript( |
+ source_str, Handle<String>(), 0, 0, false, |
+ Handle<Context>(isolate->native_context()), NULL, &cache, |
+ v8::ScriptCompiler::kConsumeCodeCache, NOT_NATIVES_CODE); |
+ } |
+ CHECK_NE(*orig, *copy); |
+ |
+ Handle<JSFunction> copy_fun = |
+ isolate->factory()->NewFunctionFromSharedFunctionInfo( |
+ copy, isolate->native_context()); |
+ |
+ Handle<Object> copy_result = |
+ Execution::Call(isolate, copy_fun, global, 0, NULL).ToHandleChecked(); |
+ |
+ int result_int; |
+ CHECK(copy_result->ToInt32(&result_int)); |
+ CHECK_EQ(7, result_int); |
+ |
+ delete cache; |
+ source.Dispose(); |
+} |
+ |
+ |
+TEST(SerializeToplevelLargeString) { |
+ 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()); |
+ |
+ Vector<const uint8_t> source = ConstructSource( |
+ STATIC_CHAR_VECTOR("var s = \""), STATIC_CHAR_VECTOR("abcdef"), |
+ STATIC_CHAR_VECTOR("\"; s"), 1000000); |
+ Handle<String> source_str = |
+ isolate->factory()->NewStringFromOneByte(source).ToHandleChecked(); |
+ |
+ Handle<JSObject> global(isolate->context()->global_object()); |
+ ScriptData* cache = NULL; |
+ |
+ Handle<SharedFunctionInfo> orig = Compiler::CompileScript( |
+ source_str, Handle<String>(), 0, 0, false, |
+ Handle<Context>(isolate->native_context()), NULL, &cache, |
+ v8::ScriptCompiler::kProduceCodeCache, NOT_NATIVES_CODE); |
+ |
+ Handle<SharedFunctionInfo> copy; |
+ { |
+ DisallowCompilation no_compile_expected(isolate); |
+ copy = Compiler::CompileScript( |
+ source_str, Handle<String>(), 0, 0, false, |
+ Handle<Context>(isolate->native_context()), NULL, &cache, |
+ v8::ScriptCompiler::kConsumeCodeCache, NOT_NATIVES_CODE); |
+ } |
+ CHECK_NE(*orig, *copy); |
+ |
+ Handle<JSFunction> copy_fun = |
+ isolate->factory()->NewFunctionFromSharedFunctionInfo( |
+ copy, isolate->native_context()); |
+ |
+ Handle<Object> copy_result = |
+ Execution::Call(isolate, copy_fun, global, 0, NULL).ToHandleChecked(); |
+ |
+ CHECK_EQ(6 * 1000000, Handle<String>::cast(copy_result)->length()); |
+ CHECK(isolate->heap()->InSpace(HeapObject::cast(*copy_result), LO_SPACE)); |
+ |
+ delete cache; |
+ source.Dispose(); |
+} |
+ |
+ |
TEST(SerializeToplevelIsolates) { |
FLAG_serialize_toplevel = true; |