| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 24361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 24372 isolate, &source, v8::ScriptCompiler::kProduceParserCache); | 24372 isolate, &source, v8::ScriptCompiler::kProduceParserCache); |
| 24373 | 24373 |
| 24374 // TestSourceStream::GetMoreData won't block, so it's OK to just run the | 24374 // TestSourceStream::GetMoreData won't block, so it's OK to just run the |
| 24375 // task here in the main thread. | 24375 // task here in the main thread. |
| 24376 task->Run(); | 24376 task->Run(); |
| 24377 delete task; | 24377 delete task; |
| 24378 | 24378 |
| 24379 const v8::ScriptCompiler::CachedData* cached_data = source.GetCachedData(); | 24379 const v8::ScriptCompiler::CachedData* cached_data = source.GetCachedData(); |
| 24380 CHECK(cached_data != NULL); | 24380 CHECK(cached_data != NULL); |
| 24381 CHECK(cached_data->data != NULL); | 24381 CHECK(cached_data->data != NULL); |
| 24382 CHECK(!cached_data->rejected); |
| 24382 CHECK_GT(cached_data->length, 0); | 24383 CHECK_GT(cached_data->length, 0); |
| 24383 } | 24384 } |
| 24384 | 24385 |
| 24385 | 24386 |
| 24386 TEST(StreamingScriptWithInvalidUtf8) { | 24387 TEST(StreamingScriptWithInvalidUtf8) { |
| 24387 // Regression test for a crash: test that invalid UTF-8 bytes in the end of a | 24388 // Regression test for a crash: test that invalid UTF-8 bytes in the end of a |
| 24388 // chunk don't produce a crash. | 24389 // chunk don't produce a crash. |
| 24389 const char* reference = "\xec\x92\x81\x80\x80"; | 24390 const char* reference = "\xec\x92\x81\x80\x80"; |
| 24390 char chunk1[] = | 24391 char chunk1[] = |
| 24391 "function foo() {\n" | 24392 "function foo() {\n" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 24463 | 24464 |
| 24464 TEST(InvalidCacheData) { | 24465 TEST(InvalidCacheData) { |
| 24465 v8::V8::Initialize(); | 24466 v8::V8::Initialize(); |
| 24466 v8::HandleScope scope(CcTest::isolate()); | 24467 v8::HandleScope scope(CcTest::isolate()); |
| 24467 LocalContext context; | 24468 LocalContext context; |
| 24468 TestInvalidCacheData(v8::ScriptCompiler::kConsumeParserCache); | 24469 TestInvalidCacheData(v8::ScriptCompiler::kConsumeParserCache); |
| 24469 TestInvalidCacheData(v8::ScriptCompiler::kConsumeCodeCache); | 24470 TestInvalidCacheData(v8::ScriptCompiler::kConsumeCodeCache); |
| 24470 } | 24471 } |
| 24471 | 24472 |
| 24472 | 24473 |
| 24474 TEST(ParserCacheRejectedGracefully) { |
| 24475 i::FLAG_min_preparse_length = 0; |
| 24476 v8::V8::Initialize(); |
| 24477 v8::HandleScope scope(CcTest::isolate()); |
| 24478 LocalContext context; |
| 24479 // Produce valid cached data. |
| 24480 v8::ScriptOrigin origin(v8_str("origin")); |
| 24481 v8::Local<v8::String> source_str = v8_str("function foo() {}"); |
| 24482 v8::ScriptCompiler::Source source(source_str, origin); |
| 24483 v8::Handle<v8::Script> script = v8::ScriptCompiler::Compile( |
| 24484 CcTest::isolate(), &source, v8::ScriptCompiler::kProduceParserCache); |
| 24485 CHECK(!script.IsEmpty()); |
| 24486 const v8::ScriptCompiler::CachedData* original_cached_data = |
| 24487 source.GetCachedData(); |
| 24488 CHECK(original_cached_data != NULL); |
| 24489 CHECK(original_cached_data->data != NULL); |
| 24490 CHECK(!original_cached_data->rejected); |
| 24491 CHECK_GT(original_cached_data->length, 0); |
| 24492 // Recompiling the same script with it won't reject the data. |
| 24493 { |
| 24494 v8::ScriptCompiler::Source source_with_cached_data( |
| 24495 source_str, origin, |
| 24496 new v8::ScriptCompiler::CachedData(original_cached_data->data, |
| 24497 original_cached_data->length)); |
| 24498 v8::Handle<v8::Script> script = |
| 24499 v8::ScriptCompiler::Compile(CcTest::isolate(), &source_with_cached_data, |
| 24500 v8::ScriptCompiler::kConsumeParserCache); |
| 24501 CHECK(!script.IsEmpty()); |
| 24502 const v8::ScriptCompiler::CachedData* new_cached_data = |
| 24503 source_with_cached_data.GetCachedData(); |
| 24504 CHECK(new_cached_data != NULL); |
| 24505 CHECK(!new_cached_data->rejected); |
| 24506 } |
| 24507 // Compile an incompatible script with the cached data. The new script doesn't |
| 24508 // have the same starting position for the function as the old one, so the old |
| 24509 // cached data will be incompatible with it and will be rejected. |
| 24510 { |
| 24511 v8::Local<v8::String> incompatible_source_str = |
| 24512 v8_str(" function foo() {}"); |
| 24513 v8::ScriptCompiler::Source source_with_cached_data( |
| 24514 incompatible_source_str, origin, |
| 24515 new v8::ScriptCompiler::CachedData(original_cached_data->data, |
| 24516 original_cached_data->length)); |
| 24517 v8::Handle<v8::Script> script = |
| 24518 v8::ScriptCompiler::Compile(CcTest::isolate(), &source_with_cached_data, |
| 24519 v8::ScriptCompiler::kConsumeParserCache); |
| 24520 CHECK(!script.IsEmpty()); |
| 24521 const v8::ScriptCompiler::CachedData* new_cached_data = |
| 24522 source_with_cached_data.GetCachedData(); |
| 24523 CHECK(new_cached_data != NULL); |
| 24524 CHECK(new_cached_data->rejected); |
| 24525 } |
| 24526 } |
| 24527 |
| 24528 |
| 24473 TEST(StringConcatOverflow) { | 24529 TEST(StringConcatOverflow) { |
| 24474 v8::V8::Initialize(); | 24530 v8::V8::Initialize(); |
| 24475 v8::HandleScope scope(CcTest::isolate()); | 24531 v8::HandleScope scope(CcTest::isolate()); |
| 24476 RandomLengthOneByteResource* r = | 24532 RandomLengthOneByteResource* r = |
| 24477 new RandomLengthOneByteResource(i::String::kMaxLength); | 24533 new RandomLengthOneByteResource(i::String::kMaxLength); |
| 24478 v8::Local<v8::String> str = v8::String::NewExternal(CcTest::isolate(), r); | 24534 v8::Local<v8::String> str = v8::String::NewExternal(CcTest::isolate(), r); |
| 24479 CHECK(!str.IsEmpty()); | 24535 CHECK(!str.IsEmpty()); |
| 24480 v8::TryCatch try_catch; | 24536 v8::TryCatch try_catch; |
| 24481 v8::Local<v8::String> result = v8::String::Concat(str, str); | 24537 v8::Local<v8::String> result = v8::String::Concat(str, str); |
| 24482 CHECK(result.IsEmpty()); | 24538 CHECK(result.IsEmpty()); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 24564 | 24620 |
| 24565 v8::Handle<v8::Value> result = CompileRun("%_GetPrototype(object)"); | 24621 v8::Handle<v8::Value> result = CompileRun("%_GetPrototype(object)"); |
| 24566 CHECK(result->Equals(proto2)); | 24622 CHECK(result->Equals(proto2)); |
| 24567 | 24623 |
| 24568 result = CompileRun( | 24624 result = CompileRun( |
| 24569 "function f() { return %_GetPrototype(object); }" | 24625 "function f() { return %_GetPrototype(object); }" |
| 24570 "%OptimizeFunctionOnNextCall(f);" | 24626 "%OptimizeFunctionOnNextCall(f);" |
| 24571 "f()"); | 24627 "f()"); |
| 24572 CHECK(result->Equals(proto2)); | 24628 CHECK(result->Equals(proto2)); |
| 24573 } | 24629 } |
| OLD | NEW |