| Index: test/cctest/test-api.cc
 | 
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
 | 
| index 0ddf5ba7651470ae1cb6ec6ed9fd0fa04f6b2ba1..6ae08da819c020fb9c0629d4aeece78a9a8b8528 100644
 | 
| --- a/test/cctest/test-api.cc
 | 
| +++ b/test/cctest/test-api.cc
 | 
| @@ -14814,134 +14814,21 @@ TEST(PreCompileSerialization) {
 | 
|                                v8::ScriptCompiler::kProduceDataToCache);
 | 
|    // Serialize.
 | 
|    const v8::ScriptCompiler::CachedData* cd = source.GetCachedData();
 | 
| -  char* serialized_data = i::NewArray<char>(cd->length);
 | 
| +  i::byte* serialized_data = i::NewArray<i::byte>(cd->length);
 | 
|    i::MemCopy(serialized_data, cd->data, cd->length);
 | 
|  
 | 
|    // Deserialize.
 | 
| -  i::ScriptData* deserialized = i::ScriptData::New(serialized_data, cd->length);
 | 
| +  i::ScriptData* deserialized = new i::ScriptData(serialized_data, cd->length);
 | 
|  
 | 
|    // Verify that the original is the same as the deserialized.
 | 
| -  CHECK_EQ(cd->length, deserialized->Length());
 | 
| -  CHECK_EQ(0, memcmp(cd->data, deserialized->Data(), cd->length));
 | 
| +  CHECK_EQ(cd->length, deserialized->length());
 | 
| +  CHECK_EQ(0, memcmp(cd->data, deserialized->data(), cd->length));
 | 
|  
 | 
|    delete deserialized;
 | 
|    i::DeleteArray(serialized_data);
 | 
|  }
 | 
|  
 | 
|  
 | 
| -// Attempts to deserialize bad data.
 | 
| -TEST(PreCompileDeserializationError) {
 | 
| -  v8::V8::Initialize();
 | 
| -  const char* data = "DONT CARE";
 | 
| -  int invalid_size = 3;
 | 
| -  i::ScriptData* sd = i::ScriptData::New(data, invalid_size);
 | 
| -  CHECK_EQ(NULL, sd);
 | 
| -}
 | 
| -
 | 
| -
 | 
| -TEST(CompileWithInvalidCachedData) {
 | 
| -  v8::V8::Initialize();
 | 
| -  v8::Isolate* isolate = CcTest::isolate();
 | 
| -  LocalContext context;
 | 
| -  v8::HandleScope scope(context->GetIsolate());
 | 
| -  i::FLAG_min_preparse_length = 0;
 | 
| -
 | 
| -  const char* script = "function foo(){ return 5;}\n"
 | 
| -      "function bar(){ return 6 + 7;}  foo();";
 | 
| -  v8::ScriptCompiler::Source source(v8_str(script));
 | 
| -  v8::ScriptCompiler::Compile(isolate, &source,
 | 
| -                              v8::ScriptCompiler::kProduceDataToCache);
 | 
| -  // source owns its cached data. Create a ScriptData based on it. The user
 | 
| -  // never needs to create ScriptDatas any more; we only need it here because we
 | 
| -  // want to modify the data before passing it back.
 | 
| -  const v8::ScriptCompiler::CachedData* cd = source.GetCachedData();
 | 
| -  // ScriptData does not take ownership of the buffers passed to it.
 | 
| -  i::ScriptData* sd =
 | 
| -      i::ScriptData::New(reinterpret_cast<const char*>(cd->data), cd->length);
 | 
| -  CHECK(!sd->HasError());
 | 
| -  // ScriptData private implementation details
 | 
| -  const int kHeaderSize = i::PreparseDataConstants::kHeaderSize;
 | 
| -  const int kFunctionEntrySize = i::FunctionEntry::kSize;
 | 
| -  const int kFunctionEntryStartOffset = 0;
 | 
| -  const int kFunctionEntryEndOffset = 1;
 | 
| -  unsigned* sd_data =
 | 
| -      reinterpret_cast<unsigned*>(const_cast<char*>(sd->Data()));
 | 
| -
 | 
| -  // Overwrite function bar's end position with 0.
 | 
| -  sd_data[kHeaderSize + 1 * kFunctionEntrySize + kFunctionEntryEndOffset] = 0;
 | 
| -  v8::TryCatch try_catch;
 | 
| -
 | 
| -  // Make the script slightly different so that we don't hit the compilation
 | 
| -  // cache. Don't change the lenghts of tokens.
 | 
| -  const char* script2 = "function foo(){ return 6;}\n"
 | 
| -      "function bar(){ return 6 + 7;}  foo();";
 | 
| -  v8::ScriptCompiler::Source source2(
 | 
| -      v8_str(script2),
 | 
| -      // CachedData doesn't take ownership of the buffers, Source takes
 | 
| -      // ownership of CachedData.
 | 
| -      new v8::ScriptCompiler::CachedData(
 | 
| -          reinterpret_cast<const uint8_t*>(sd->Data()), sd->Length()));
 | 
| -  Local<v8::UnboundScript> compiled_script =
 | 
| -      v8::ScriptCompiler::CompileUnbound(isolate, &source2);
 | 
| -
 | 
| -  CHECK(try_catch.HasCaught());
 | 
| -  {
 | 
| -    String::Utf8Value exception_value(try_catch.Message()->Get());
 | 
| -    CHECK_EQ("Uncaught SyntaxError: Invalid cached data for function bar",
 | 
| -             *exception_value);
 | 
| -  }
 | 
| -
 | 
| -  try_catch.Reset();
 | 
| -  delete sd;
 | 
| -
 | 
| -  // Overwrite function bar's start position with 200. The function entry will
 | 
| -  // not be found when searching for it by position, and the compilation fails.
 | 
| -
 | 
| -  // ScriptData does not take ownership of the buffers passed to it.
 | 
| -  sd = i::ScriptData::New(reinterpret_cast<const char*>(cd->data), cd->length);
 | 
| -  sd_data = reinterpret_cast<unsigned*>(const_cast<char*>(sd->Data()));
 | 
| -  sd_data[kHeaderSize + 1 * kFunctionEntrySize + kFunctionEntryStartOffset] =
 | 
| -      200;
 | 
| -  const char* script3 = "function foo(){ return 7;}\n"
 | 
| -      "function bar(){ return 6 + 7;}  foo();";
 | 
| -  v8::ScriptCompiler::Source source3(
 | 
| -      v8_str(script3),
 | 
| -      new v8::ScriptCompiler::CachedData(
 | 
| -          reinterpret_cast<const uint8_t*>(sd->Data()), sd->Length()));
 | 
| -  compiled_script =
 | 
| -      v8::ScriptCompiler::CompileUnbound(isolate, &source3);
 | 
| -  CHECK(try_catch.HasCaught());
 | 
| -  {
 | 
| -    String::Utf8Value exception_value(try_catch.Message()->Get());
 | 
| -    CHECK_EQ("Uncaught SyntaxError: Invalid cached data for function bar",
 | 
| -             *exception_value);
 | 
| -  }
 | 
| -  CHECK(compiled_script.IsEmpty());
 | 
| -  try_catch.Reset();
 | 
| -  delete sd;
 | 
| -
 | 
| -  // Try passing in cached data which is obviously invalid (wrong length).
 | 
| -  sd = i::ScriptData::New(reinterpret_cast<const char*>(cd->data), cd->length);
 | 
| -  const char* script4 =
 | 
| -      "function foo(){ return 8;}\n"
 | 
| -      "function bar(){ return 6 + 7;}  foo();";
 | 
| -  v8::ScriptCompiler::Source source4(
 | 
| -      v8_str(script4),
 | 
| -      new v8::ScriptCompiler::CachedData(
 | 
| -          reinterpret_cast<const uint8_t*>(sd->Data()), sd->Length() - 1));
 | 
| -  compiled_script =
 | 
| -      v8::ScriptCompiler::CompileUnbound(isolate, &source4);
 | 
| -  CHECK(try_catch.HasCaught());
 | 
| -  {
 | 
| -    String::Utf8Value exception_value(try_catch.Message()->Get());
 | 
| -    CHECK_EQ("Uncaught SyntaxError: Invalid cached data",
 | 
| -             *exception_value);
 | 
| -  }
 | 
| -  CHECK(compiled_script.IsEmpty());
 | 
| -  delete sd;
 | 
| -}
 | 
| -
 | 
| -
 | 
|  // This tests that we do not allow dictionary load/call inline caches
 | 
|  // to use functions that have not yet been compiled.  The potential
 | 
|  // problem of loading a function that has not yet been compiled can
 | 
| 
 |