Index: test/cctest/test-api.cc |
=================================================================== |
--- test/cctest/test-api.cc (revision 5029) |
+++ test/cctest/test-api.cc (working copy) |
@@ -8557,6 +8557,43 @@ |
} |
+// Attempts to deserialize bad data. |
+TEST(PreCompileInvalidPreparseDataError) { |
+ v8::V8::Initialize(); |
+ v8::HandleScope scope; |
+ LocalContext context; |
+ |
+ const char* script = "function foo(){ return 5;}\n" |
+ "function bar(){ return 6 + 7;} foo();"; |
+ v8::ScriptData* sd = |
+ v8::ScriptData::PreCompile(script, i::StrLength(script)); |
+ CHECK(!sd->HasError()); |
+ // ScriptDataImpl private implementation details |
+ const int kUnsignedSize = sizeof(unsigned); |
+ const int kHeaderSize = 4; |
+ const int kFunctionEntrySize = 4; |
+ const int kFunctionEntryStartOffset = 0; |
+ const int kFunctionEntryEndOffset = 1; |
+ unsigned* sd_data = |
+ reinterpret_cast<unsigned*>(const_cast<char*>(sd->Data())); |
+ CHECK_EQ(sd->Length(), |
+ (kHeaderSize + 2 * kFunctionEntrySize) * kUnsignedSize); |
+ |
+ // Overwrite function bar's end position with 0. |
+ sd_data[kHeaderSize + 1 * kFunctionEntrySize + kFunctionEntryEndOffset] = 0; |
+ Local<String> source = String::New(script); |
+ Local<Script> compiled_script = Script::New(source, NULL, sd); |
+ |
+ // Overwrite function bar's start position with 200. The function entry |
+ // will not be found when searching for it by position. |
+ sd_data[kHeaderSize + 1 * kFunctionEntrySize + kFunctionEntryStartOffset] = |
+ 200; |
+ compiled_script = Script::New(source, NULL, sd); |
+ |
+ delete sd; |
+} |
+ |
+ |
// Verifies that the Handle<String> and const char* versions of the API produce |
// the same results (at least for one trivial case). |
TEST(PreCompileAPIVariationsAreSame) { |