| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index 52a71ac1b2c8e3bd3ac490626b119cb2937567e7..3c461853228e2166468b3f4bcf60ae475d7a745a 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -14823,74 +14823,32 @@ THREADED_TEST(TurnOnAccessCheckAndRecompile) {
|
| }
|
|
|
|
|
| -// This test verifies that pre-compilation (aka preparsing) can be called
|
| -// without initializing the whole VM. Thus we cannot run this test in a
|
| -// multi-threaded setup.
|
| -TEST(PreCompile) {
|
| - // TODO(155): This test would break without the initialization of V8. This is
|
| - // a workaround for now to make this test not fail.
|
| - v8::V8::Initialize();
|
| - v8::Isolate* isolate = CcTest::isolate();
|
| - HandleScope handle_scope(isolate);
|
| - const char* script = "function foo(a) { return a+1; }";
|
| - v8::ScriptData* sd = v8::ScriptData::PreCompile(v8::String::NewFromUtf8(
|
| - isolate, script, v8::String::kNormalString, i::StrLength(script)));
|
| - CHECK_NE(sd->Length(), 0);
|
| - CHECK_NE(sd->Data(), NULL);
|
| - CHECK(!sd->HasError());
|
| - delete sd;
|
| -}
|
| -
|
| -
|
| -TEST(PreCompileWithError) {
|
| - v8::V8::Initialize();
|
| - v8::Isolate* isolate = CcTest::isolate();
|
| - HandleScope handle_scope(isolate);
|
| - const char* script = "function foo(a) { return 1 * * 2; }";
|
| - v8::ScriptData* sd = v8::ScriptData::PreCompile(v8::String::NewFromUtf8(
|
| - isolate, script, v8::String::kNormalString, i::StrLength(script)));
|
| - CHECK(sd->HasError());
|
| - delete sd;
|
| -}
|
| -
|
| -
|
| -TEST(Regress31661) {
|
| - v8::V8::Initialize();
|
| - v8::Isolate* isolate = CcTest::isolate();
|
| - HandleScope handle_scope(isolate);
|
| - const char* script = " The Definintive Guide";
|
| - v8::ScriptData* sd = v8::ScriptData::PreCompile(v8::String::NewFromUtf8(
|
| - isolate, script, v8::String::kNormalString, i::StrLength(script)));
|
| - CHECK(sd->HasError());
|
| - delete sd;
|
| -}
|
| -
|
| -
|
| // Tests that ScriptData can be serialized and deserialized.
|
| TEST(PreCompileSerialization) {
|
| v8::V8::Initialize();
|
| - v8::Isolate* isolate = CcTest::isolate();
|
| + LocalContext env;
|
| + v8::Isolate* isolate = env->GetIsolate();
|
| HandleScope handle_scope(isolate);
|
| - const char* script = "function foo(a) { return a+1; }";
|
| - v8::ScriptData* sd = v8::ScriptData::PreCompile(v8::String::NewFromUtf8(
|
| - isolate, script, v8::String::kNormalString, i::StrLength(script)));
|
|
|
| + i::FLAG_min_preparse_length = 0;
|
| + const char* script = "function foo(a) { return a+1; }";
|
| + v8::ScriptCompiler::Source source(v8_str(script));
|
| + v8::ScriptCompiler::Compile(isolate, &source,
|
| + v8::ScriptCompiler::kProduceDataToCache);
|
| // Serialize.
|
| - int serialized_data_length = sd->Length();
|
| - char* serialized_data = i::NewArray<char>(serialized_data_length);
|
| - i::OS::MemCopy(serialized_data, sd->Data(), serialized_data_length);
|
| + const v8::ScriptCompiler::CachedData* cd = source.GetCachedData();
|
| + char* serialized_data = i::NewArray<char>(cd->length);
|
| + i::OS::MemCopy(serialized_data, cd->data, cd->length);
|
|
|
| // Deserialize.
|
| - v8::ScriptData* deserialized_sd =
|
| - v8::ScriptData::New(serialized_data, serialized_data_length);
|
| + v8::ScriptData* deserialized =
|
| + v8::ScriptData::New(serialized_data, cd->length);
|
|
|
| // Verify that the original is the same as the deserialized.
|
| - CHECK_EQ(sd->Length(), deserialized_sd->Length());
|
| - CHECK_EQ(0, memcmp(sd->Data(), deserialized_sd->Data(), sd->Length()));
|
| - CHECK_EQ(sd->HasError(), deserialized_sd->HasError());
|
| + CHECK_EQ(cd->length, deserialized->Length());
|
| + CHECK_EQ(0, memcmp(cd->data, deserialized->Data(), cd->length));
|
|
|
| - delete sd;
|
| - delete deserialized_sd;
|
| + delete deserialized;
|
| i::DeleteArray(serialized_data);
|
| }
|
|
|
| @@ -14908,17 +14866,25 @@ TEST(PreCompileDeserializationError) {
|
| }
|
|
|
|
|
| -// Attempts to deserialize bad data.
|
| -TEST(PreCompileInvalidPreparseDataError) {
|
| +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::ScriptData* sd = v8::ScriptData::PreCompile(v8::String::NewFromUtf8(
|
| - isolate, script, v8::String::kNormalString, i::StrLength(script)));
|
| + 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.
|
| + v8::ScriptData* sd =
|
| + v8::ScriptData::New(reinterpret_cast<const char*>(cd->data), cd->length);
|
| CHECK(!sd->HasError());
|
| // ScriptDataImpl private implementation details
|
| const int kHeaderSize = i::PreparseDataConstants::kHeaderSize;
|
| @@ -14932,12 +14898,18 @@ TEST(PreCompileInvalidPreparseDataError) {
|
| sd_data[kHeaderSize + 1 * kFunctionEntrySize + kFunctionEntryEndOffset] = 0;
|
| v8::TryCatch try_catch;
|
|
|
| - v8::ScriptCompiler::Source script_source(
|
| - String::NewFromUtf8(isolate, script),
|
| + // 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, &script_source);
|
| + v8::ScriptCompiler::CompileUnbound(isolate, &source2);
|
|
|
| CHECK(try_catch.HasCaught());
|
| String::Utf8Value exception_value(try_catch.Message()->Get());
|
| @@ -14950,19 +14922,20 @@ TEST(PreCompileInvalidPreparseDataError) {
|
| // Overwrite function bar's start position with 200. The function entry
|
| // will not be found when searching for it by position and we should fall
|
| // back on eager compilation.
|
| - sd = v8::ScriptData::PreCompile(v8::String::NewFromUtf8(
|
| - isolate, script, v8::String::kNormalString, i::StrLength(script)));
|
| + // ScriptData does not take ownership of the buffers passed to it.
|
| + sd = v8::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;
|
| - v8::ScriptCompiler::Source script_source2(
|
| - String::NewFromUtf8(isolate, script),
|
| + 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, &script_source2);
|
| + v8::ScriptCompiler::CompileUnbound(isolate, &source3);
|
| CHECK(!try_catch.HasCaught());
|
| -
|
| delete sd;
|
| }
|
|
|
|
|