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