OLD | NEW |
1 // Copyright 2007-2010 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2010 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 |
11 // with the distribution. | 11 // with the distribution. |
12 // * Neither the name of Google Inc. nor the names of its | 12 // * Neither the name of Google Inc. nor the names of its |
13 // contributors may be used to endorse or promote products derived | 13 // contributors may be used to endorse or promote products derived |
14 // from this software without specific prior written permission. | 14 // from this software without specific prior written permission. |
15 // | 15 // |
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
| 28 // TODO(mythria): Remove this define after this flag is turned on globally |
| 29 #define V8_IMMINENT_DEPRECATION_WARNINGS |
| 30 |
28 #include <signal.h> | 31 #include <signal.h> |
29 | 32 |
30 #include <sys/stat.h> | 33 #include <sys/stat.h> |
31 | 34 |
32 #include "src/v8.h" | 35 #include "src/v8.h" |
33 | 36 |
34 #include "src/bootstrapper.h" | 37 #include "src/bootstrapper.h" |
35 #include "src/compilation-cache.h" | 38 #include "src/compilation-cache.h" |
36 #include "src/debug/debug.h" | 39 #include "src/debug/debug.h" |
37 #include "src/heap/spaces.h" | 40 #include "src/heap/spaces.h" |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 v8::Isolate* isolate = Deserialize(); | 240 v8::Isolate* isolate = Deserialize(); |
238 { | 241 { |
239 v8::Isolate::Scope isolate_scope(isolate); | 242 v8::Isolate::Scope isolate_scope(isolate); |
240 v8::HandleScope handle_scope(isolate); | 243 v8::HandleScope handle_scope(isolate); |
241 | 244 |
242 | 245 |
243 v8::Local<v8::Context> env = v8::Context::New(isolate); | 246 v8::Local<v8::Context> env = v8::Context::New(isolate); |
244 env->Enter(); | 247 env->Enter(); |
245 | 248 |
246 const char* c_source = "\"1234\".length"; | 249 const char* c_source = "\"1234\".length"; |
247 v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, c_source); | 250 v8::Local<v8::Script> script = v8_compile(c_source); |
248 v8::Local<v8::Script> script = v8::Script::Compile(source); | 251 v8::Maybe<int32_t> result = script->Run(isolate->GetCurrentContext()) |
249 CHECK_EQ(4, script->Run()->Int32Value()); | 252 .ToLocalChecked() |
| 253 ->Int32Value(isolate->GetCurrentContext()); |
| 254 CHECK_EQ(4, result.FromJust()); |
250 } | 255 } |
251 isolate->Dispose(); | 256 isolate->Dispose(); |
252 } | 257 } |
253 | 258 |
254 | 259 |
255 UNINITIALIZED_DEPENDENT_TEST(DeserializeFromSecondSerializationAndRunScript2, | 260 UNINITIALIZED_DEPENDENT_TEST(DeserializeFromSecondSerializationAndRunScript2, |
256 SerializeTwice) { | 261 SerializeTwice) { |
257 DisableTurbofan(); | 262 DisableTurbofan(); |
258 if (DefaultSnapshotAvailable()) return; | 263 if (DefaultSnapshotAvailable()) return; |
259 v8::Isolate* isolate = Deserialize(); | 264 v8::Isolate* isolate = Deserialize(); |
260 { | 265 { |
261 v8::Isolate::Scope isolate_scope(isolate); | 266 v8::Isolate::Scope isolate_scope(isolate); |
262 v8::HandleScope handle_scope(isolate); | 267 v8::HandleScope handle_scope(isolate); |
263 | 268 |
264 v8::Local<v8::Context> env = v8::Context::New(isolate); | 269 v8::Local<v8::Context> env = v8::Context::New(isolate); |
265 env->Enter(); | 270 env->Enter(); |
266 | 271 |
267 const char* c_source = "\"1234\".length"; | 272 const char* c_source = "\"1234\".length"; |
268 v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, c_source); | 273 v8::Local<v8::Script> script = v8_compile(c_source); |
269 v8::Local<v8::Script> script = v8::Script::Compile(source); | 274 v8::Maybe<int32_t> result = script->Run(isolate->GetCurrentContext()) |
270 CHECK_EQ(4, script->Run()->Int32Value()); | 275 .ToLocalChecked() |
| 276 ->Int32Value(isolate->GetCurrentContext()); |
| 277 CHECK_EQ(4, result.FromJust()); |
271 } | 278 } |
272 isolate->Dispose(); | 279 isolate->Dispose(); |
273 } | 280 } |
274 | 281 |
275 | 282 |
276 UNINITIALIZED_TEST(PartialSerialization) { | 283 UNINITIALIZED_TEST(PartialSerialization) { |
277 DisableTurbofan(); | 284 DisableTurbofan(); |
278 if (DefaultSnapshotAvailable()) return; | 285 if (DefaultSnapshotAvailable()) return; |
279 v8::Isolate* v8_isolate = TestIsolate::NewInitialized(true); | 286 v8::Isolate* v8_isolate = TestIsolate::NewInitialized(true); |
280 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); | 287 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); |
(...skipping 17 matching lines...) Expand all Loading... |
298 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { | 305 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { |
299 isolate->bootstrapper()->SourceLookup<Natives>(i); | 306 isolate->bootstrapper()->SourceLookup<Natives>(i); |
300 } | 307 } |
301 } | 308 } |
302 heap->CollectAllGarbage(); | 309 heap->CollectAllGarbage(); |
303 heap->CollectAllGarbage(); | 310 heap->CollectAllGarbage(); |
304 | 311 |
305 Object* raw_foo; | 312 Object* raw_foo; |
306 { | 313 { |
307 v8::HandleScope handle_scope(v8_isolate); | 314 v8::HandleScope handle_scope(v8_isolate); |
308 v8::Local<v8::String> foo = v8::String::NewFromUtf8(v8_isolate, "foo"); | 315 v8::Local<v8::String> foo = v8_str("foo"); |
309 DCHECK(!foo.IsEmpty()); | 316 DCHECK(!foo.IsEmpty()); |
310 raw_foo = *(v8::Utils::OpenHandle(*foo)); | 317 raw_foo = *(v8::Utils::OpenHandle(*foo)); |
311 } | 318 } |
312 | 319 |
313 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; | 320 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; |
314 Vector<char> startup_name = Vector<char>::New(file_name_length + 1); | 321 Vector<char> startup_name = Vector<char>::New(file_name_length + 1); |
315 SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); | 322 SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); |
316 | 323 |
317 { | 324 { |
318 v8::HandleScope handle_scope(v8_isolate); | 325 v8::HandleScope handle_scope(v8_isolate); |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
537 "})();" | 544 "})();" |
538 "var o = this;" | 545 "var o = this;" |
539 "var r = Math.random() + Math.cos(0);" | 546 "var r = Math.random() + Math.cos(0);" |
540 "var f = (function(a, b) { return a + b; }).bind(1, 2, 3);" | 547 "var f = (function(a, b) { return a + b; }).bind(1, 2, 3);" |
541 "var s = parseInt('12345');"); | 548 "var s = parseInt('12345');"); |
542 | 549 |
543 Vector<const uint8_t> source = ConstructSource( | 550 Vector<const uint8_t> source = ConstructSource( |
544 STATIC_CHAR_VECTOR("function g() { return [,"), | 551 STATIC_CHAR_VECTOR("function g() { return [,"), |
545 STATIC_CHAR_VECTOR("1,"), | 552 STATIC_CHAR_VECTOR("1,"), |
546 STATIC_CHAR_VECTOR("];} a = g(); b = g(); b.push(1);"), 100000); | 553 STATIC_CHAR_VECTOR("];} a = g(); b = g(); b.push(1);"), 100000); |
547 v8::Handle<v8::String> source_str = v8::String::NewFromOneByte( | 554 v8::MaybeLocal<v8::String> source_str = v8::String::NewFromOneByte( |
548 v8_isolate, source.start(), v8::String::kNormalString, | 555 v8_isolate, source.start(), v8::NewStringType::kNormal, |
549 source.length()); | 556 source.length()); |
550 CompileRun(source_str); | 557 CompileRun(source_str.ToLocalChecked()); |
551 source.Dispose(); | 558 source.Dispose(); |
552 } | 559 } |
553 // Make sure all builtin scripts are cached. | 560 // Make sure all builtin scripts are cached. |
554 { | 561 { |
555 HandleScope scope(isolate); | 562 HandleScope scope(isolate); |
556 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { | 563 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { |
557 isolate->bootstrapper()->SourceLookup<Natives>(i); | 564 isolate->bootstrapper()->SourceLookup<Natives>(i); |
558 } | 565 } |
559 } | 566 } |
560 // If we don't do this then we end up with a stray root pointing at the | 567 // If we don't do this then we end up with a stray root pointing at the |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 CHECK_EQ(3, outdated_contexts->length()); | 641 CHECK_EQ(3, outdated_contexts->length()); |
635 } | 642 } |
636 CHECK(root->IsContext()); | 643 CHECK(root->IsContext()); |
637 Handle<Context> context = Handle<Context>::cast(root); | 644 Handle<Context> context = Handle<Context>::cast(root); |
638 CHECK(context->global_proxy() == *global_proxy); | 645 CHECK(context->global_proxy() == *global_proxy); |
639 Handle<String> o = isolate->factory()->NewStringFromAsciiChecked("o"); | 646 Handle<String> o = isolate->factory()->NewStringFromAsciiChecked("o"); |
640 Handle<JSObject> global_object(context->global_object(), isolate); | 647 Handle<JSObject> global_object(context->global_object(), isolate); |
641 Handle<Object> property = JSReceiver::GetDataProperty(global_object, o); | 648 Handle<Object> property = JSReceiver::GetDataProperty(global_object, o); |
642 CHECK(property.is_identical_to(global_proxy)); | 649 CHECK(property.is_identical_to(global_proxy)); |
643 | 650 |
644 v8::Handle<v8::Context> v8_context = v8::Utils::ToLocal(context); | 651 v8::Local<v8::Context> v8_context = v8::Utils::ToLocal(context); |
645 v8::Context::Scope context_scope(v8_context); | 652 v8::Context::Scope context_scope(v8_context); |
646 double r = CompileRun("r")->ToNumber(v8_isolate)->Value(); | 653 double r = CompileRun("r") |
| 654 ->ToNumber(v8_isolate->GetCurrentContext()) |
| 655 .ToLocalChecked() |
| 656 ->Value(); |
647 CHECK(r >= 1 && r <= 2); | 657 CHECK(r >= 1 && r <= 2); |
648 int f = CompileRun("f()")->ToNumber(v8_isolate)->Int32Value(); | 658 int f = CompileRun("f()") |
| 659 ->ToNumber(v8_isolate->GetCurrentContext()) |
| 660 .ToLocalChecked() |
| 661 ->Int32Value(v8_isolate->GetCurrentContext()) |
| 662 .FromJust(); |
649 CHECK_EQ(5, f); | 663 CHECK_EQ(5, f); |
650 f = CompileRun("e('f()')")->ToNumber(v8_isolate)->Int32Value(); | 664 f = CompileRun("e('f()')") |
| 665 ->ToNumber(v8_isolate->GetCurrentContext()) |
| 666 .ToLocalChecked() |
| 667 ->Int32Value(v8_isolate->GetCurrentContext()) |
| 668 .FromJust(); |
651 CHECK_EQ(5, f); | 669 CHECK_EQ(5, f); |
652 v8::Handle<v8::String> s = CompileRun("s")->ToString(v8_isolate); | 670 v8::Local<v8::String> s = CompileRun("s") |
653 CHECK(s->Equals(v8_str("12345"))); | 671 ->ToString(v8_isolate->GetCurrentContext()) |
654 int a = CompileRun("a.length")->ToNumber(v8_isolate)->Int32Value(); | 672 .ToLocalChecked(); |
| 673 CHECK(s->Equals(v8_isolate->GetCurrentContext(), v8_str("12345")) |
| 674 .FromJust()); |
| 675 int a = CompileRun("a.length") |
| 676 ->ToNumber(v8_isolate->GetCurrentContext()) |
| 677 .ToLocalChecked() |
| 678 ->Int32Value(v8_isolate->GetCurrentContext()) |
| 679 .FromJust(); |
655 CHECK_EQ(100001, a); | 680 CHECK_EQ(100001, a); |
656 int b = CompileRun("b.length")->ToNumber(v8_isolate)->Int32Value(); | 681 int b = CompileRun("b.length") |
| 682 ->ToNumber(v8_isolate->GetCurrentContext()) |
| 683 .ToLocalChecked() |
| 684 ->Int32Value(v8_isolate->GetCurrentContext()) |
| 685 .FromJust(); |
657 CHECK_EQ(100002, b); | 686 CHECK_EQ(100002, b); |
658 } | 687 } |
659 DeleteArray(snapshot); | 688 DeleteArray(snapshot); |
660 } | 689 } |
661 v8_isolate->Dispose(); | 690 v8_isolate->Dispose(); |
662 } | 691 } |
663 | 692 |
664 | 693 |
665 TEST(PerIsolateSnapshotBlobs) { | 694 TEST(PerIsolateSnapshotBlobs) { |
666 DisableTurbofan(); | 695 DisableTurbofan(); |
(...skipping 10 matching lines...) Expand all Loading... |
677 params1.snapshot_blob = &data1; | 706 params1.snapshot_blob = &data1; |
678 params1.array_buffer_allocator = CcTest::array_buffer_allocator(); | 707 params1.array_buffer_allocator = CcTest::array_buffer_allocator(); |
679 | 708 |
680 v8::Isolate* isolate1 = v8::Isolate::New(params1); | 709 v8::Isolate* isolate1 = v8::Isolate::New(params1); |
681 { | 710 { |
682 v8::Isolate::Scope i_scope(isolate1); | 711 v8::Isolate::Scope i_scope(isolate1); |
683 v8::HandleScope h_scope(isolate1); | 712 v8::HandleScope h_scope(isolate1); |
684 v8::Local<v8::Context> context = v8::Context::New(isolate1); | 713 v8::Local<v8::Context> context = v8::Context::New(isolate1); |
685 delete[] data1.data; // We can dispose of the snapshot blob now. | 714 delete[] data1.data; // We can dispose of the snapshot blob now. |
686 v8::Context::Scope c_scope(context); | 715 v8::Context::Scope c_scope(context); |
687 CHECK_EQ(42, CompileRun("f()")->ToInt32(isolate1)->Int32Value()); | 716 v8::Maybe<int32_t> result = |
| 717 CompileRun("f()")->Int32Value(isolate1->GetCurrentContext()); |
| 718 CHECK_EQ(42, result.FromJust()); |
688 CHECK(CompileRun("this.g")->IsUndefined()); | 719 CHECK(CompileRun("this.g")->IsUndefined()); |
689 } | 720 } |
690 isolate1->Dispose(); | 721 isolate1->Dispose(); |
691 | 722 |
692 v8::Isolate::CreateParams params2; | 723 v8::Isolate::CreateParams params2; |
693 params2.snapshot_blob = &data2; | 724 params2.snapshot_blob = &data2; |
694 params2.array_buffer_allocator = CcTest::array_buffer_allocator(); | 725 params2.array_buffer_allocator = CcTest::array_buffer_allocator(); |
695 v8::Isolate* isolate2 = v8::Isolate::New(params2); | 726 v8::Isolate* isolate2 = v8::Isolate::New(params2); |
696 { | 727 { |
697 v8::Isolate::Scope i_scope(isolate2); | 728 v8::Isolate::Scope i_scope(isolate2); |
698 v8::HandleScope h_scope(isolate2); | 729 v8::HandleScope h_scope(isolate2); |
699 v8::Local<v8::Context> context = v8::Context::New(isolate2); | 730 v8::Local<v8::Context> context = v8::Context::New(isolate2); |
700 delete[] data2.data; // We can dispose of the snapshot blob now. | 731 delete[] data2.data; // We can dispose of the snapshot blob now. |
701 v8::Context::Scope c_scope(context); | 732 v8::Context::Scope c_scope(context); |
702 CHECK_EQ(86, CompileRun("f()")->ToInt32(isolate2)->Int32Value()); | 733 v8::Maybe<int32_t> result = |
703 CHECK_EQ(43, CompileRun("g()")->ToInt32(isolate2)->Int32Value()); | 734 CompileRun("f()")->Int32Value(isolate1->GetCurrentContext()); |
| 735 CHECK_EQ(86, result.FromJust()); |
| 736 result = CompileRun("g()")->Int32Value(isolate1->GetCurrentContext()); |
| 737 CHECK_EQ(43, result.FromJust()); |
704 } | 738 } |
705 isolate2->Dispose(); | 739 isolate2->Dispose(); |
706 } | 740 } |
707 | 741 |
708 | 742 |
709 static void SerializationFunctionTemplate( | 743 static void SerializationFunctionTemplate( |
710 const v8::FunctionCallbackInfo<v8::Value>& args) { | 744 const v8::FunctionCallbackInfo<v8::Value>& args) { |
711 args.GetReturnValue().Set(args[0]); | 745 args.GetReturnValue().Set(args[0]); |
712 } | 746 } |
713 | 747 |
(...skipping 30 matching lines...) Expand all Loading... |
744 v8::Local<v8::ObjectTemplate> property = v8::ObjectTemplate::New(isolate); | 778 v8::Local<v8::ObjectTemplate> property = v8::ObjectTemplate::New(isolate); |
745 v8::Local<v8::FunctionTemplate> function = | 779 v8::Local<v8::FunctionTemplate> function = |
746 v8::FunctionTemplate::New(isolate, SerializationFunctionTemplate); | 780 v8::FunctionTemplate::New(isolate, SerializationFunctionTemplate); |
747 property->Set(isolate, "bar", function); | 781 property->Set(isolate, "bar", function); |
748 global->Set(isolate, "foo", property); | 782 global->Set(isolate, "foo", property); |
749 | 783 |
750 v8::Local<v8::Context> context = v8::Context::New(isolate, NULL, global); | 784 v8::Local<v8::Context> context = v8::Context::New(isolate, NULL, global); |
751 delete[] data.data; // We can dispose of the snapshot blob now. | 785 delete[] data.data; // We can dispose of the snapshot blob now. |
752 v8::Context::Scope c_scope(context); | 786 v8::Context::Scope c_scope(context); |
753 v8::Local<v8::Value> result = CompileRun(source2); | 787 v8::Local<v8::Value> result = CompileRun(source2); |
754 CHECK(v8_str("42")->Equals(result)); | 788 v8::Maybe<bool> compare = v8_str("42")->Equals( |
| 789 v8::Isolate::GetCurrent()->GetCurrentContext(), result); |
| 790 CHECK(compare.FromJust()); |
755 } | 791 } |
756 isolate->Dispose(); | 792 isolate->Dispose(); |
757 } | 793 } |
758 | 794 |
759 | 795 |
760 TEST(PerIsolateSnapshotBlobsWithLocker) { | 796 TEST(PerIsolateSnapshotBlobsWithLocker) { |
761 DisableTurbofan(); | 797 DisableTurbofan(); |
762 v8::Isolate::CreateParams create_params; | 798 v8::Isolate::CreateParams create_params; |
763 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 799 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
764 v8::Isolate* isolate0 = v8::Isolate::New(create_params); | 800 v8::Isolate* isolate0 = v8::Isolate::New(create_params); |
765 { | 801 { |
766 v8::Locker locker(isolate0); | 802 v8::Locker locker(isolate0); |
767 v8::Isolate::Scope i_scope(isolate0); | 803 v8::Isolate::Scope i_scope(isolate0); |
768 v8::HandleScope h_scope(isolate0); | 804 v8::HandleScope h_scope(isolate0); |
769 v8::Local<v8::Context> context = v8::Context::New(isolate0); | 805 v8::Local<v8::Context> context = v8::Context::New(isolate0); |
770 v8::Context::Scope c_scope(context); | 806 v8::Context::Scope c_scope(context); |
771 CHECK_EQ(1, CompileRun("Math.cos(0)")->ToInt32(isolate0)->Int32Value()); | 807 v8::Maybe<int32_t> result = |
| 808 CompileRun("Math.cos(0)")->Int32Value(isolate0->GetCurrentContext()); |
| 809 CHECK_EQ(1, result.FromJust()); |
772 } | 810 } |
773 isolate0->Dispose(); | 811 isolate0->Dispose(); |
774 | 812 |
775 const char* source1 = "function f() { return 42; }"; | 813 const char* source1 = "function f() { return 42; }"; |
776 | 814 |
777 v8::StartupData data1 = v8::V8::CreateSnapshotDataBlob(source1); | 815 v8::StartupData data1 = v8::V8::CreateSnapshotDataBlob(source1); |
778 | 816 |
779 v8::Isolate::CreateParams params1; | 817 v8::Isolate::CreateParams params1; |
780 params1.snapshot_blob = &data1; | 818 params1.snapshot_blob = &data1; |
781 params1.array_buffer_allocator = CcTest::array_buffer_allocator(); | 819 params1.array_buffer_allocator = CcTest::array_buffer_allocator(); |
782 v8::Isolate* isolate1 = v8::Isolate::New(params1); | 820 v8::Isolate* isolate1 = v8::Isolate::New(params1); |
783 { | 821 { |
784 v8::Locker locker(isolate1); | 822 v8::Locker locker(isolate1); |
785 v8::Isolate::Scope i_scope(isolate1); | 823 v8::Isolate::Scope i_scope(isolate1); |
786 v8::HandleScope h_scope(isolate1); | 824 v8::HandleScope h_scope(isolate1); |
787 v8::Local<v8::Context> context = v8::Context::New(isolate1); | 825 v8::Local<v8::Context> context = v8::Context::New(isolate1); |
788 delete[] data1.data; // We can dispose of the snapshot blob now. | 826 delete[] data1.data; // We can dispose of the snapshot blob now. |
789 v8::Context::Scope c_scope(context); | 827 v8::Context::Scope c_scope(context); |
790 CHECK_EQ(42, CompileRun("f()")->ToInt32(isolate1)->Int32Value()); | 828 v8::Maybe<int32_t> result = CompileRun("f()")->Int32Value(context); |
| 829 CHECK_EQ(42, result.FromJust()); |
791 } | 830 } |
792 isolate1->Dispose(); | 831 isolate1->Dispose(); |
793 } | 832 } |
794 | 833 |
795 | 834 |
796 TEST(SnapshotBlobsStackOverflow) { | 835 TEST(SnapshotBlobsStackOverflow) { |
797 DisableTurbofan(); | 836 DisableTurbofan(); |
798 const char* source = | 837 const char* source = |
799 "var a = [0];" | 838 "var a = [0];" |
800 "var b = a;" | 839 "var b = a;" |
(...skipping 17 matching lines...) Expand all Loading... |
818 v8::Local<v8::Context> context = v8::Context::New(isolate); | 857 v8::Local<v8::Context> context = v8::Context::New(isolate); |
819 delete[] data.data; // We can dispose of the snapshot blob now. | 858 delete[] data.data; // We can dispose of the snapshot blob now. |
820 v8::Context::Scope c_scope(context); | 859 v8::Context::Scope c_scope(context); |
821 const char* test = | 860 const char* test = |
822 "var sum = 0;" | 861 "var sum = 0;" |
823 "while (a) {" | 862 "while (a) {" |
824 " sum += a[0];" | 863 " sum += a[0];" |
825 " a = a[1];" | 864 " a = a[1];" |
826 "}" | 865 "}" |
827 "sum"; | 866 "sum"; |
828 CHECK_EQ(9999 * 5000, CompileRun(test)->ToInt32(isolate)->Int32Value()); | 867 v8::Maybe<int32_t> result = |
| 868 CompileRun(test)->Int32Value(isolate->GetCurrentContext()); |
| 869 CHECK_EQ(9999 * 5000, result.FromJust()); |
829 } | 870 } |
830 isolate->Dispose(); | 871 isolate->Dispose(); |
831 } | 872 } |
832 | 873 |
833 | 874 |
834 TEST(TestThatAlwaysSucceeds) { | 875 TEST(TestThatAlwaysSucceeds) { |
835 } | 876 } |
836 | 877 |
837 | 878 |
838 TEST(TestThatAlwaysFails) { | 879 TEST(TestThatAlwaysFails) { |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1163 v8::ScriptCompiler::kConsumeCodeCache); | 1204 v8::ScriptCompiler::kConsumeCodeCache); |
1164 } | 1205 } |
1165 CHECK_NE(*orig, *copy); | 1206 CHECK_NE(*orig, *copy); |
1166 | 1207 |
1167 Handle<JSFunction> copy_fun = | 1208 Handle<JSFunction> copy_fun = |
1168 isolate->factory()->NewFunctionFromSharedFunctionInfo( | 1209 isolate->factory()->NewFunctionFromSharedFunctionInfo( |
1169 copy, isolate->native_context()); | 1210 copy, isolate->native_context()); |
1170 | 1211 |
1171 USE(Execution::Call(isolate, copy_fun, global, 0, NULL)); | 1212 USE(Execution::Call(isolate, copy_fun, global, 0, NULL)); |
1172 | 1213 |
1173 CHECK_EQ(600000 + 700000, CompileRun("(a + b).length")->Int32Value()); | 1214 v8::Maybe<int32_t> result = |
1174 CHECK_EQ(500000 + 600000, CompileRun("(b + c).length")->Int32Value()); | 1215 CompileRun("(a + b).length") |
| 1216 ->Int32Value(v8::Isolate::GetCurrent()->GetCurrentContext()); |
| 1217 CHECK_EQ(600000 + 700000, result.FromJust()); |
| 1218 result = CompileRun("(b + c).length") |
| 1219 ->Int32Value(v8::Isolate::GetCurrent()->GetCurrentContext()); |
| 1220 CHECK_EQ(500000 + 600000, result.FromJust()); |
1175 Heap* heap = isolate->heap(); | 1221 Heap* heap = isolate->heap(); |
1176 CHECK(heap->InSpace( | 1222 v8::Local<v8::String> result_str = |
1177 *v8::Utils::OpenHandle(*CompileRun("a")->ToString(CcTest::isolate())), | 1223 CompileRun("a") |
1178 OLD_SPACE)); | 1224 ->ToString(CcTest::isolate()->GetCurrentContext()) |
1179 CHECK(heap->InSpace( | 1225 .ToLocalChecked(); |
1180 *v8::Utils::OpenHandle(*CompileRun("b")->ToString(CcTest::isolate())), | 1226 CHECK(heap->InSpace(*v8::Utils::OpenHandle(*result_str), OLD_SPACE)); |
1181 OLD_SPACE)); | 1227 result_str = CompileRun("b") |
1182 CHECK(heap->InSpace( | 1228 ->ToString(CcTest::isolate()->GetCurrentContext()) |
1183 *v8::Utils::OpenHandle(*CompileRun("c")->ToString(CcTest::isolate())), | 1229 .ToLocalChecked(); |
1184 OLD_SPACE)); | 1230 CHECK(heap->InSpace(*v8::Utils::OpenHandle(*result_str), OLD_SPACE)); |
| 1231 result_str = CompileRun("c") |
| 1232 ->ToString(CcTest::isolate()->GetCurrentContext()) |
| 1233 .ToLocalChecked(); |
| 1234 CHECK(heap->InSpace(*v8::Utils::OpenHandle(*result_str), OLD_SPACE)); |
1185 | 1235 |
1186 delete cache; | 1236 delete cache; |
1187 source_a.Dispose(); | 1237 source_a.Dispose(); |
1188 source_b.Dispose(); | 1238 source_b.Dispose(); |
1189 source_c.Dispose(); | 1239 source_c.Dispose(); |
1190 } | 1240 } |
1191 | 1241 |
1192 | 1242 |
1193 class SerializerOneByteResource | 1243 class SerializerOneByteResource |
1194 : public v8::String::ExternalOneByteStringResource { | 1244 : public v8::String::ExternalOneByteStringResource { |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1409 v8::Isolate* isolate1 = v8::Isolate::New(create_params); | 1459 v8::Isolate* isolate1 = v8::Isolate::New(create_params); |
1410 { | 1460 { |
1411 v8::Isolate::Scope iscope(isolate1); | 1461 v8::Isolate::Scope iscope(isolate1); |
1412 v8::HandleScope scope(isolate1); | 1462 v8::HandleScope scope(isolate1); |
1413 v8::Local<v8::Context> context = v8::Context::New(isolate1); | 1463 v8::Local<v8::Context> context = v8::Context::New(isolate1); |
1414 v8::Context::Scope context_scope(context); | 1464 v8::Context::Scope context_scope(context); |
1415 | 1465 |
1416 v8::Local<v8::String> source_str = v8_str(source); | 1466 v8::Local<v8::String> source_str = v8_str(source); |
1417 v8::ScriptOrigin origin(v8_str("test")); | 1467 v8::ScriptOrigin origin(v8_str("test")); |
1418 v8::ScriptCompiler::Source source(source_str, origin); | 1468 v8::ScriptCompiler::Source source(source_str, origin); |
1419 v8::Local<v8::UnboundScript> script = v8::ScriptCompiler::CompileUnbound( | 1469 v8::Local<v8::UnboundScript> script = |
1420 isolate1, &source, v8::ScriptCompiler::kProduceCodeCache); | 1470 v8::ScriptCompiler::CompileUnboundScript( |
| 1471 isolate1, &source, v8::ScriptCompiler::kProduceCodeCache) |
| 1472 .ToLocalChecked(); |
1421 const v8::ScriptCompiler::CachedData* data = source.GetCachedData(); | 1473 const v8::ScriptCompiler::CachedData* data = source.GetCachedData(); |
1422 CHECK(data); | 1474 CHECK(data); |
1423 // Persist cached data. | 1475 // Persist cached data. |
1424 uint8_t* buffer = NewArray<uint8_t>(data->length); | 1476 uint8_t* buffer = NewArray<uint8_t>(data->length); |
1425 MemCopy(buffer, data->data, data->length); | 1477 MemCopy(buffer, data->data, data->length); |
1426 cache = new v8::ScriptCompiler::CachedData( | 1478 cache = new v8::ScriptCompiler::CachedData( |
1427 buffer, data->length, v8::ScriptCompiler::CachedData::BufferOwned); | 1479 buffer, data->length, v8::ScriptCompiler::CachedData::BufferOwned); |
1428 | 1480 |
1429 v8::Local<v8::Value> result = script->BindToCurrentContext()->Run(); | 1481 v8::Local<v8::Value> result = script->BindToCurrentContext() |
1430 CHECK(result->ToString(isolate1)->Equals(v8_str("abcdef"))); | 1482 ->Run(isolate1->GetCurrentContext()) |
| 1483 .ToLocalChecked(); |
| 1484 v8::Local<v8::String> result_string = |
| 1485 result->ToString(isolate1->GetCurrentContext()).ToLocalChecked(); |
| 1486 CHECK(result_string->Equals(isolate1->GetCurrentContext(), v8_str("abcdef")) |
| 1487 .FromJust()); |
1431 } | 1488 } |
1432 isolate1->Dispose(); | 1489 isolate1->Dispose(); |
1433 return cache; | 1490 return cache; |
1434 } | 1491 } |
1435 | 1492 |
1436 | 1493 |
1437 TEST(SerializeToplevelIsolates) { | 1494 TEST(SerializeToplevelIsolates) { |
1438 FLAG_serialize_toplevel = true; | 1495 FLAG_serialize_toplevel = true; |
1439 | 1496 |
1440 const char* source = "function f() { return 'abc'; }; f() + 'def'"; | 1497 const char* source = "function f() { return 'abc'; }; f() + 'def'"; |
(...skipping 10 matching lines...) Expand all Loading... |
1451 v8::HandleScope scope(isolate2); | 1508 v8::HandleScope scope(isolate2); |
1452 v8::Local<v8::Context> context = v8::Context::New(isolate2); | 1509 v8::Local<v8::Context> context = v8::Context::New(isolate2); |
1453 v8::Context::Scope context_scope(context); | 1510 v8::Context::Scope context_scope(context); |
1454 | 1511 |
1455 v8::Local<v8::String> source_str = v8_str(source); | 1512 v8::Local<v8::String> source_str = v8_str(source); |
1456 v8::ScriptOrigin origin(v8_str("test")); | 1513 v8::ScriptOrigin origin(v8_str("test")); |
1457 v8::ScriptCompiler::Source source(source_str, origin, cache); | 1514 v8::ScriptCompiler::Source source(source_str, origin, cache); |
1458 v8::Local<v8::UnboundScript> script; | 1515 v8::Local<v8::UnboundScript> script; |
1459 { | 1516 { |
1460 DisallowCompilation no_compile(reinterpret_cast<Isolate*>(isolate2)); | 1517 DisallowCompilation no_compile(reinterpret_cast<Isolate*>(isolate2)); |
1461 script = v8::ScriptCompiler::CompileUnbound( | 1518 script = v8::ScriptCompiler::CompileUnboundScript( |
1462 isolate2, &source, v8::ScriptCompiler::kConsumeCodeCache); | 1519 isolate2, &source, v8::ScriptCompiler::kConsumeCodeCache) |
| 1520 .ToLocalChecked(); |
1463 } | 1521 } |
1464 CHECK(!cache->rejected); | 1522 CHECK(!cache->rejected); |
1465 v8::Local<v8::Value> result = script->BindToCurrentContext()->Run(); | 1523 v8::Local<v8::Value> result = script->BindToCurrentContext() |
1466 CHECK(result->ToString(isolate2)->Equals(v8_str("abcdef"))); | 1524 ->Run(isolate2->GetCurrentContext()) |
| 1525 .ToLocalChecked(); |
| 1526 CHECK(result->ToString(isolate2->GetCurrentContext()) |
| 1527 .ToLocalChecked() |
| 1528 ->Equals(isolate2->GetCurrentContext(), v8_str("abcdef")) |
| 1529 .FromJust()); |
1467 } | 1530 } |
1468 DCHECK(toplevel_test_code_event_found); | 1531 DCHECK(toplevel_test_code_event_found); |
1469 isolate2->Dispose(); | 1532 isolate2->Dispose(); |
1470 } | 1533 } |
1471 | 1534 |
1472 | 1535 |
1473 TEST(SerializeToplevelFlagChange) { | 1536 TEST(SerializeToplevelFlagChange) { |
1474 FLAG_serialize_toplevel = true; | 1537 FLAG_serialize_toplevel = true; |
1475 | 1538 |
1476 const char* source = "function f() { return 'abc'; }; f() + 'def'"; | 1539 const char* source = "function f() { return 'abc'; }; f() + 'def'"; |
1477 v8::ScriptCompiler::CachedData* cache = ProduceCache(source); | 1540 v8::ScriptCompiler::CachedData* cache = ProduceCache(source); |
1478 | 1541 |
1479 v8::Isolate::CreateParams create_params; | 1542 v8::Isolate::CreateParams create_params; |
1480 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 1543 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
1481 v8::Isolate* isolate2 = v8::Isolate::New(create_params); | 1544 v8::Isolate* isolate2 = v8::Isolate::New(create_params); |
1482 | 1545 |
1483 FLAG_allow_natives_syntax = true; // Flag change should trigger cache reject. | 1546 FLAG_allow_natives_syntax = true; // Flag change should trigger cache reject. |
1484 FlagList::EnforceFlagImplications(); | 1547 FlagList::EnforceFlagImplications(); |
1485 { | 1548 { |
1486 v8::Isolate::Scope iscope(isolate2); | 1549 v8::Isolate::Scope iscope(isolate2); |
1487 v8::HandleScope scope(isolate2); | 1550 v8::HandleScope scope(isolate2); |
1488 v8::Local<v8::Context> context = v8::Context::New(isolate2); | 1551 v8::Local<v8::Context> context = v8::Context::New(isolate2); |
1489 v8::Context::Scope context_scope(context); | 1552 v8::Context::Scope context_scope(context); |
1490 | 1553 |
1491 v8::Local<v8::String> source_str = v8_str(source); | 1554 v8::Local<v8::String> source_str = v8_str(source); |
1492 v8::ScriptOrigin origin(v8_str("test")); | 1555 v8::ScriptOrigin origin(v8_str("test")); |
1493 v8::ScriptCompiler::Source source(source_str, origin, cache); | 1556 v8::ScriptCompiler::Source source(source_str, origin, cache); |
1494 v8::ScriptCompiler::CompileUnbound(isolate2, &source, | 1557 v8::ScriptCompiler::CompileUnboundScript( |
1495 v8::ScriptCompiler::kConsumeCodeCache); | 1558 isolate2, &source, v8::ScriptCompiler::kConsumeCodeCache) |
| 1559 .ToLocalChecked(); |
1496 CHECK(cache->rejected); | 1560 CHECK(cache->rejected); |
1497 } | 1561 } |
1498 isolate2->Dispose(); | 1562 isolate2->Dispose(); |
1499 } | 1563 } |
1500 | 1564 |
1501 | 1565 |
1502 TEST(SerializeToplevelBitFlip) { | 1566 TEST(SerializeToplevelBitFlip) { |
1503 FLAG_serialize_toplevel = true; | 1567 FLAG_serialize_toplevel = true; |
1504 | 1568 |
1505 const char* source = "function f() { return 'abc'; }; f() + 'def'"; | 1569 const char* source = "function f() { return 'abc'; }; f() + 'def'"; |
1506 v8::ScriptCompiler::CachedData* cache = ProduceCache(source); | 1570 v8::ScriptCompiler::CachedData* cache = ProduceCache(source); |
1507 | 1571 |
1508 // Random bit flip. | 1572 // Random bit flip. |
1509 const_cast<uint8_t*>(cache->data)[337] ^= 0x40; | 1573 const_cast<uint8_t*>(cache->data)[337] ^= 0x40; |
1510 | 1574 |
1511 v8::Isolate::CreateParams create_params; | 1575 v8::Isolate::CreateParams create_params; |
1512 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 1576 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
1513 v8::Isolate* isolate2 = v8::Isolate::New(create_params); | 1577 v8::Isolate* isolate2 = v8::Isolate::New(create_params); |
1514 { | 1578 { |
1515 v8::Isolate::Scope iscope(isolate2); | 1579 v8::Isolate::Scope iscope(isolate2); |
1516 v8::HandleScope scope(isolate2); | 1580 v8::HandleScope scope(isolate2); |
1517 v8::Local<v8::Context> context = v8::Context::New(isolate2); | 1581 v8::Local<v8::Context> context = v8::Context::New(isolate2); |
1518 v8::Context::Scope context_scope(context); | 1582 v8::Context::Scope context_scope(context); |
1519 | 1583 |
1520 v8::Local<v8::String> source_str = v8_str(source); | 1584 v8::Local<v8::String> source_str = v8_str(source); |
1521 v8::ScriptOrigin origin(v8_str("test")); | 1585 v8::ScriptOrigin origin(v8_str("test")); |
1522 v8::ScriptCompiler::Source source(source_str, origin, cache); | 1586 v8::ScriptCompiler::Source source(source_str, origin, cache); |
1523 v8::ScriptCompiler::CompileUnbound(isolate2, &source, | 1587 v8::ScriptCompiler::CompileUnboundScript( |
1524 v8::ScriptCompiler::kConsumeCodeCache); | 1588 isolate2, &source, v8::ScriptCompiler::kConsumeCodeCache) |
| 1589 .ToLocalChecked(); |
1525 CHECK(cache->rejected); | 1590 CHECK(cache->rejected); |
1526 } | 1591 } |
1527 isolate2->Dispose(); | 1592 isolate2->Dispose(); |
1528 } | 1593 } |
1529 | 1594 |
1530 | 1595 |
1531 TEST(SerializeWithHarmonyScoping) { | 1596 TEST(SerializeWithHarmonyScoping) { |
1532 FLAG_serialize_toplevel = true; | 1597 FLAG_serialize_toplevel = true; |
1533 | 1598 |
1534 const char* source1 = "'use strict'; let x = 'X'"; | 1599 const char* source1 = "'use strict'; let x = 'X'"; |
(...skipping 10 matching lines...) Expand all Loading... |
1545 v8::HandleScope scope(isolate1); | 1610 v8::HandleScope scope(isolate1); |
1546 v8::Local<v8::Context> context = v8::Context::New(isolate1); | 1611 v8::Local<v8::Context> context = v8::Context::New(isolate1); |
1547 v8::Context::Scope context_scope(context); | 1612 v8::Context::Scope context_scope(context); |
1548 | 1613 |
1549 CompileRun(source1); | 1614 CompileRun(source1); |
1550 CompileRun(source2); | 1615 CompileRun(source2); |
1551 | 1616 |
1552 v8::Local<v8::String> source_str = v8_str(source3); | 1617 v8::Local<v8::String> source_str = v8_str(source3); |
1553 v8::ScriptOrigin origin(v8_str("test")); | 1618 v8::ScriptOrigin origin(v8_str("test")); |
1554 v8::ScriptCompiler::Source source(source_str, origin); | 1619 v8::ScriptCompiler::Source source(source_str, origin); |
1555 v8::Local<v8::UnboundScript> script = v8::ScriptCompiler::CompileUnbound( | 1620 v8::Local<v8::UnboundScript> script = |
1556 isolate1, &source, v8::ScriptCompiler::kProduceCodeCache); | 1621 v8::ScriptCompiler::CompileUnboundScript( |
| 1622 isolate1, &source, v8::ScriptCompiler::kProduceCodeCache) |
| 1623 .ToLocalChecked(); |
1557 const v8::ScriptCompiler::CachedData* data = source.GetCachedData(); | 1624 const v8::ScriptCompiler::CachedData* data = source.GetCachedData(); |
1558 CHECK(data); | 1625 CHECK(data); |
1559 // Persist cached data. | 1626 // Persist cached data. |
1560 uint8_t* buffer = NewArray<uint8_t>(data->length); | 1627 uint8_t* buffer = NewArray<uint8_t>(data->length); |
1561 MemCopy(buffer, data->data, data->length); | 1628 MemCopy(buffer, data->data, data->length); |
1562 cache = new v8::ScriptCompiler::CachedData( | 1629 cache = new v8::ScriptCompiler::CachedData( |
1563 buffer, data->length, v8::ScriptCompiler::CachedData::BufferOwned); | 1630 buffer, data->length, v8::ScriptCompiler::CachedData::BufferOwned); |
1564 | 1631 |
1565 v8::Local<v8::Value> result = script->BindToCurrentContext()->Run(); | 1632 v8::Local<v8::Value> result = script->BindToCurrentContext() |
1566 CHECK(result->ToString(isolate1)->Equals(v8_str("XY"))); | 1633 ->Run(isolate1->GetCurrentContext()) |
| 1634 .ToLocalChecked(); |
| 1635 v8::Local<v8::String> result_str = |
| 1636 result->ToString(isolate1->GetCurrentContext()).ToLocalChecked(); |
| 1637 CHECK(result_str->Equals(isolate1->GetCurrentContext(), v8_str("XY")) |
| 1638 .FromJust()); |
1567 } | 1639 } |
1568 isolate1->Dispose(); | 1640 isolate1->Dispose(); |
1569 | 1641 |
1570 v8::Isolate* isolate2 = v8::Isolate::New(create_params); | 1642 v8::Isolate* isolate2 = v8::Isolate::New(create_params); |
1571 { | 1643 { |
1572 v8::Isolate::Scope iscope(isolate2); | 1644 v8::Isolate::Scope iscope(isolate2); |
1573 v8::HandleScope scope(isolate2); | 1645 v8::HandleScope scope(isolate2); |
1574 v8::Local<v8::Context> context = v8::Context::New(isolate2); | 1646 v8::Local<v8::Context> context = v8::Context::New(isolate2); |
1575 v8::Context::Scope context_scope(context); | 1647 v8::Context::Scope context_scope(context); |
1576 | 1648 |
1577 // Reverse order of prior running scripts. | 1649 // Reverse order of prior running scripts. |
1578 CompileRun(source2); | 1650 CompileRun(source2); |
1579 CompileRun(source1); | 1651 CompileRun(source1); |
1580 | 1652 |
1581 v8::Local<v8::String> source_str = v8_str(source3); | 1653 v8::Local<v8::String> source_str = v8_str(source3); |
1582 v8::ScriptOrigin origin(v8_str("test")); | 1654 v8::ScriptOrigin origin(v8_str("test")); |
1583 v8::ScriptCompiler::Source source(source_str, origin, cache); | 1655 v8::ScriptCompiler::Source source(source_str, origin, cache); |
1584 v8::Local<v8::UnboundScript> script; | 1656 v8::Local<v8::UnboundScript> script; |
1585 { | 1657 { |
1586 DisallowCompilation no_compile(reinterpret_cast<Isolate*>(isolate2)); | 1658 DisallowCompilation no_compile(reinterpret_cast<Isolate*>(isolate2)); |
1587 script = v8::ScriptCompiler::CompileUnbound( | 1659 script = v8::ScriptCompiler::CompileUnboundScript( |
1588 isolate2, &source, v8::ScriptCompiler::kConsumeCodeCache); | 1660 isolate2, &source, v8::ScriptCompiler::kConsumeCodeCache) |
| 1661 .ToLocalChecked(); |
1589 } | 1662 } |
1590 v8::Local<v8::Value> result = script->BindToCurrentContext()->Run(); | 1663 v8::Local<v8::Value> result = script->BindToCurrentContext() |
1591 CHECK(result->ToString(isolate2)->Equals(v8_str("XY"))); | 1664 ->Run(isolate1->GetCurrentContext()) |
| 1665 .ToLocalChecked(); |
| 1666 v8::Local<v8::String> result_str = |
| 1667 result->ToString(isolate1->GetCurrentContext()).ToLocalChecked(); |
| 1668 CHECK(result_str->Equals(isolate2->GetCurrentContext(), v8_str("XY")) |
| 1669 .FromJust()); |
1592 } | 1670 } |
1593 isolate2->Dispose(); | 1671 isolate2->Dispose(); |
1594 } | 1672 } |
1595 | 1673 |
1596 | 1674 |
1597 TEST(SerializeInternalReference) { | 1675 TEST(SerializeInternalReference) { |
1598 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 | 1676 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 |
1599 return; | 1677 return; |
1600 #endif | 1678 #endif |
1601 // Disable experimental natives that are loaded after deserialization. | 1679 // Disable experimental natives that are loaded after deserialization. |
(...skipping 28 matching lines...) Expand all Loading... |
1630 v8::Isolate::CreateParams params; | 1708 v8::Isolate::CreateParams params; |
1631 params.snapshot_blob = &data; | 1709 params.snapshot_blob = &data; |
1632 params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 1710 params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
1633 v8::Isolate* isolate = v8::Isolate::New(params); | 1711 v8::Isolate* isolate = v8::Isolate::New(params); |
1634 { | 1712 { |
1635 v8::Isolate::Scope i_scope(isolate); | 1713 v8::Isolate::Scope i_scope(isolate); |
1636 v8::HandleScope h_scope(isolate); | 1714 v8::HandleScope h_scope(isolate); |
1637 v8::Local<v8::Context> context = v8::Context::New(isolate); | 1715 v8::Local<v8::Context> context = v8::Context::New(isolate); |
1638 delete[] data.data; // We can dispose of the snapshot blob now. | 1716 delete[] data.data; // We can dispose of the snapshot blob now. |
1639 v8::Context::Scope c_scope(context); | 1717 v8::Context::Scope c_scope(context); |
1640 v8::Handle<v8::Function> foo = | 1718 v8::Local<v8::Function> foo = |
1641 v8::Handle<v8::Function>::Cast(CompileRun("foo")); | 1719 v8::Local<v8::Function>::Cast(CompileRun("foo")); |
1642 | 1720 |
1643 // There are at least 6 internal references. | 1721 // There are at least 6 internal references. |
1644 int mask = RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) | | 1722 int mask = RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) | |
1645 RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED); | 1723 RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED); |
1646 RelocIterator it(v8::Utils::OpenHandle(*foo)->code(), mask); | 1724 RelocIterator it(v8::Utils::OpenHandle(*foo)->code(), mask); |
1647 for (int i = 0; i < 6; ++i) { | 1725 for (int i = 0; i < 6; ++i) { |
1648 CHECK(!it.done()); | 1726 CHECK(!it.done()); |
1649 it.next(); | 1727 it.next(); |
1650 } | 1728 } |
1651 | 1729 |
1652 CHECK(v8::Utils::OpenHandle(*foo)->code()->is_turbofanned()); | 1730 CHECK(v8::Utils::OpenHandle(*foo)->code()->is_turbofanned()); |
1653 CHECK_EQ(11, CompileRun("foo(0)")->ToInt32(isolate)->Int32Value()); | 1731 CHECK_EQ(11, CompileRun("foo(0)") |
1654 CHECK_EQ(11, CompileRun("foo(1)")->ToInt32(isolate)->Int32Value()); | 1732 ->Int32Value(isolate->GetCurrentContext()) |
1655 CHECK_EQ(12, CompileRun("foo(2)")->ToInt32(isolate)->Int32Value()); | 1733 .FromJust()); |
1656 CHECK_EQ(12, CompileRun("foo(3)")->ToInt32(isolate)->Int32Value()); | 1734 CHECK_EQ(11, CompileRun("foo(1)") |
1657 CHECK_EQ(23, CompileRun("foo(4)")->ToInt32(isolate)->Int32Value()); | 1735 ->Int32Value(isolate->GetCurrentContext()) |
1658 CHECK_EQ(23, CompileRun("foo(5)")->ToInt32(isolate)->Int32Value()); | 1736 .FromJust()); |
1659 CHECK_EQ(10, CompileRun("foo(6)")->ToInt32(isolate)->Int32Value()); | 1737 CHECK_EQ(12, CompileRun("foo(2)") |
| 1738 ->Int32Value(isolate->GetCurrentContext()) |
| 1739 .FromJust()); |
| 1740 CHECK_EQ(12, CompileRun("foo(3)") |
| 1741 ->Int32Value(isolate->GetCurrentContext()) |
| 1742 .FromJust()); |
| 1743 CHECK_EQ(23, CompileRun("foo(4)") |
| 1744 ->Int32Value(isolate->GetCurrentContext()) |
| 1745 .FromJust()); |
| 1746 CHECK_EQ(23, CompileRun("foo(5)") |
| 1747 ->Int32Value(isolate->GetCurrentContext()) |
| 1748 .FromJust()); |
| 1749 CHECK_EQ(10, CompileRun("foo(6)") |
| 1750 ->Int32Value(isolate->GetCurrentContext()) |
| 1751 .FromJust()); |
1660 } | 1752 } |
1661 isolate->Dispose(); | 1753 isolate->Dispose(); |
1662 } | 1754 } |
1663 | 1755 |
1664 | 1756 |
1665 TEST(Regress503552) { | 1757 TEST(Regress503552) { |
1666 // Test that the code serializer can deal with weak cells that form a linked | 1758 // Test that the code serializer can deal with weak cells that form a linked |
1667 // list during incremental marking. | 1759 // list during incremental marking. |
1668 | 1760 |
1669 CcTest::InitializeVM(); | 1761 CcTest::InitializeVM(); |
(...skipping 16 matching lines...) Expand all Loading... |
1686 delete script_data; | 1778 delete script_data; |
1687 } | 1779 } |
1688 | 1780 |
1689 | 1781 |
1690 TEST(SerializationMemoryStats) { | 1782 TEST(SerializationMemoryStats) { |
1691 FLAG_profile_deserialization = true; | 1783 FLAG_profile_deserialization = true; |
1692 FLAG_always_opt = false; | 1784 FLAG_always_opt = false; |
1693 v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); | 1785 v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); |
1694 delete[] blob.data; | 1786 delete[] blob.data; |
1695 } | 1787 } |
OLD | NEW |