| 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;
|
|
|
|
|