OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 | |
3 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
4 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
5 // met: | 4 // met: |
6 // | 5 // |
7 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
8 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
9 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
10 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
11 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
12 // with the distribution. | 11 // with the distribution. |
(...skipping 3722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3735 for (int i = 0; i < 10; i++) { | 3734 for (int i = 0; i < 10; i++) { |
3736 CHECK(xValue.IsEmpty()); | 3735 CHECK(xValue.IsEmpty()); |
3737 script->Run(); | 3736 script->Run(); |
3738 CHECK_EQ(v8_num(4), xValue); | 3737 CHECK_EQ(v8_num(4), xValue); |
3739 xValue.Dispose(); | 3738 xValue.Dispose(); |
3740 xValue = v8::Persistent<Value>(); | 3739 xValue = v8::Persistent<Value>(); |
3741 } | 3740 } |
3742 } | 3741 } |
3743 | 3742 |
3744 | 3743 |
3745 THREADED_TEST(SetterOnly) { | |
3746 v8::HandleScope scope; | |
3747 Local<ObjectTemplate> templ = ObjectTemplate::New(); | |
3748 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut")); | |
3749 LocalContext context; | |
3750 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | |
3751 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); | |
3752 for (int i = 0; i < 10; i++) { | |
3753 CHECK(xValue.IsEmpty()); | |
3754 script->Run(); | |
3755 CHECK_EQ(v8_num(4), xValue); | |
3756 xValue.Dispose(); | |
3757 xValue = v8::Persistent<Value>(); | |
3758 } | |
3759 } | |
3760 | |
3761 | |
3762 THREADED_TEST(NoAccessors) { | |
3763 v8::HandleScope scope; | |
3764 Local<ObjectTemplate> templ = ObjectTemplate::New(); | |
3765 templ->SetAccessor(v8_str("x"), NULL, NULL, v8_str("donut")); | |
3766 LocalContext context; | |
3767 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | |
3768 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); | |
3769 for (int i = 0; i < 10; i++) { | |
3770 script->Run(); | |
3771 } | |
3772 } | |
3773 | |
3774 | |
3775 static v8::Handle<Value> XPropertyGetter(Local<String> property, | 3744 static v8::Handle<Value> XPropertyGetter(Local<String> property, |
3776 const AccessorInfo& info) { | 3745 const AccessorInfo& info) { |
3777 ApiTestFuzzer::Fuzz(); | 3746 ApiTestFuzzer::Fuzz(); |
3778 CHECK(info.Data()->IsUndefined()); | 3747 CHECK(info.Data()->IsUndefined()); |
3779 return property; | 3748 return property; |
3780 } | 3749 } |
3781 | 3750 |
3782 | 3751 |
3783 THREADED_TEST(NamedInterceptorPropertyRead) { | 3752 THREADED_TEST(NamedInterceptorPropertyRead) { |
3784 v8::HandleScope scope; | 3753 v8::HandleScope scope; |
(...skipping 7016 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10801 | 10770 |
10802 TEST(DontLeakGlobalObjects) { | 10771 TEST(DontLeakGlobalObjects) { |
10803 // Regression test for issues 1139850 and 1174891. | 10772 // Regression test for issues 1139850 and 1174891. |
10804 | 10773 |
10805 v8::V8::Initialize(); | 10774 v8::V8::Initialize(); |
10806 | 10775 |
10807 for (int i = 0; i < 5; i++) { | 10776 for (int i = 0; i < 5; i++) { |
10808 { v8::HandleScope scope; | 10777 { v8::HandleScope scope; |
10809 LocalContext context; | 10778 LocalContext context; |
10810 } | 10779 } |
10811 // Fire context disposed notification to force clearing monomorphic ICs. | |
10812 v8::V8::ContextDisposedNotification(); | |
10813 CheckSurvivingGlobalObjectsCount(0); | 10780 CheckSurvivingGlobalObjectsCount(0); |
10814 | 10781 |
10815 { v8::HandleScope scope; | 10782 { v8::HandleScope scope; |
10816 LocalContext context; | 10783 LocalContext context; |
10817 v8_compile("Date")->Run(); | 10784 v8_compile("Date")->Run(); |
10818 } | 10785 } |
10819 // Fire context disposed notification to force clearing monomorphic ICs. | |
10820 v8::V8::ContextDisposedNotification(); | |
10821 CheckSurvivingGlobalObjectsCount(0); | 10786 CheckSurvivingGlobalObjectsCount(0); |
10822 | 10787 |
10823 { v8::HandleScope scope; | 10788 { v8::HandleScope scope; |
10824 LocalContext context; | 10789 LocalContext context; |
10825 v8_compile("/aaa/")->Run(); | 10790 v8_compile("/aaa/")->Run(); |
10826 } | 10791 } |
10827 // Fire context disposed notification to force clearing monomorphic ICs. | |
10828 v8::V8::ContextDisposedNotification(); | |
10829 CheckSurvivingGlobalObjectsCount(0); | 10792 CheckSurvivingGlobalObjectsCount(0); |
10830 | 10793 |
10831 { v8::HandleScope scope; | 10794 { v8::HandleScope scope; |
10832 const char* extension_list[] = { "v8/gc" }; | 10795 const char* extension_list[] = { "v8/gc" }; |
10833 v8::ExtensionConfiguration extensions(1, extension_list); | 10796 v8::ExtensionConfiguration extensions(1, extension_list); |
10834 LocalContext context(&extensions); | 10797 LocalContext context(&extensions); |
10835 v8_compile("gc();")->Run(); | 10798 v8_compile("gc();")->Run(); |
10836 } | 10799 } |
10837 // Fire context disposed notification to force clearing monomorphic ICs. | |
10838 v8::V8::ContextDisposedNotification(); | |
10839 CheckSurvivingGlobalObjectsCount(0); | 10800 CheckSurvivingGlobalObjectsCount(0); |
10840 } | 10801 } |
10841 } | 10802 } |
10842 | 10803 |
10843 | 10804 |
10844 v8::Persistent<v8::Object> some_object; | 10805 v8::Persistent<v8::Object> some_object; |
10845 v8::Persistent<v8::Object> bad_handle; | 10806 v8::Persistent<v8::Object> bad_handle; |
10846 | 10807 |
10847 void NewPersistentHandleCallback(v8::Persistent<v8::Value> handle, void*) { | 10808 void NewPersistentHandleCallback(v8::Persistent<v8::Value> handle, void*) { |
10848 v8::HandleScope scope; | 10809 v8::HandleScope scope; |
(...skipping 1383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12232 } | 12193 } |
12233 two_byte_content_[14] = 'b'; | 12194 two_byte_content_[14] = 'b'; |
12234 | 12195 |
12235 // Create the input string for the regexp - the one we are going to change | 12196 // Create the input string for the regexp - the one we are going to change |
12236 // properties of. | 12197 // properties of. |
12237 input_ = FACTORY->NewExternalStringFromAscii(&ascii_resource_); | 12198 input_ = FACTORY->NewExternalStringFromAscii(&ascii_resource_); |
12238 | 12199 |
12239 // Inject the input as a global variable. | 12200 // Inject the input as a global variable. |
12240 i::Handle<i::String> input_name = | 12201 i::Handle<i::String> input_name = |
12241 FACTORY->NewStringFromAscii(i::Vector<const char>("input", 5)); | 12202 FACTORY->NewStringFromAscii(i::Vector<const char>("input", 5)); |
12242 i::Isolate::Current()->native_context()->global_object()->SetProperty( | 12203 i::Isolate::Current()->global_context()->global()->SetProperty( |
12243 *input_name, | 12204 *input_name, |
12244 *input_, | 12205 *input_, |
12245 NONE, | 12206 NONE, |
12246 i::kNonStrictMode)->ToObjectChecked(); | 12207 i::kNonStrictMode)->ToObjectChecked(); |
12247 | 12208 |
12248 MorphThread morph_thread(this); | 12209 MorphThread morph_thread(this); |
12249 morph_thread.Start(); | 12210 morph_thread.Start(); |
12250 v8::Locker::StartPreemption(1); | 12211 v8::Locker::StartPreemption(1); |
12251 LongRunningRegExp(); | 12212 LongRunningRegExp(); |
12252 { | 12213 { |
(...skipping 2356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14609 { | 14570 { |
14610 v8::HandleScope scope; | 14571 v8::HandleScope scope; |
14611 | 14572 |
14612 context->Enter(); | 14573 context->Enter(); |
14613 Local<v8::String> obj = v8::String::New(""); | 14574 Local<v8::String> obj = v8::String::New(""); |
14614 context->SetData(obj); | 14575 context->SetData(obj); |
14615 CompileRun(source_simple); | 14576 CompileRun(source_simple); |
14616 context->Exit(); | 14577 context->Exit(); |
14617 } | 14578 } |
14618 context.Dispose(); | 14579 context.Dispose(); |
14619 v8::V8::ContextDisposedNotification(); | |
14620 for (gc_count = 1; gc_count < 10; gc_count++) { | 14580 for (gc_count = 1; gc_count < 10; gc_count++) { |
14621 other_context->Enter(); | 14581 other_context->Enter(); |
14622 CompileRun(source_simple); | 14582 CompileRun(source_simple); |
14623 other_context->Exit(); | 14583 other_context->Exit(); |
14624 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | 14584 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
14625 if (GetGlobalObjectsCount() == 1) break; | 14585 if (GetGlobalObjectsCount() == 1) break; |
14626 } | 14586 } |
14627 CHECK_GE(2, gc_count); | 14587 CHECK_GE(2, gc_count); |
14628 CHECK_EQ(1, GetGlobalObjectsCount()); | 14588 CHECK_EQ(1, GetGlobalObjectsCount()); |
14629 | 14589 |
14630 // Eval in a function creates reference from the compilation cache to the | 14590 // Eval in a function creates reference from the compilation cache to the |
14631 // global object. | 14591 // global object. |
14632 const char* source_eval = "function f(){eval('1')}; f()"; | 14592 const char* source_eval = "function f(){eval('1')}; f()"; |
14633 context = Context::New(); | 14593 context = Context::New(); |
14634 { | 14594 { |
14635 v8::HandleScope scope; | 14595 v8::HandleScope scope; |
14636 | 14596 |
14637 context->Enter(); | 14597 context->Enter(); |
14638 CompileRun(source_eval); | 14598 CompileRun(source_eval); |
14639 context->Exit(); | 14599 context->Exit(); |
14640 } | 14600 } |
14641 context.Dispose(); | 14601 context.Dispose(); |
14642 v8::V8::ContextDisposedNotification(); | |
14643 for (gc_count = 1; gc_count < 10; gc_count++) { | 14602 for (gc_count = 1; gc_count < 10; gc_count++) { |
14644 other_context->Enter(); | 14603 other_context->Enter(); |
14645 CompileRun(source_eval); | 14604 CompileRun(source_eval); |
14646 other_context->Exit(); | 14605 other_context->Exit(); |
14647 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | 14606 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
14648 if (GetGlobalObjectsCount() == 1) break; | 14607 if (GetGlobalObjectsCount() == 1) break; |
14649 } | 14608 } |
14650 CHECK_GE(2, gc_count); | 14609 CHECK_GE(2, gc_count); |
14651 CHECK_EQ(1, GetGlobalObjectsCount()); | 14610 CHECK_EQ(1, GetGlobalObjectsCount()); |
14652 | 14611 |
14653 // Looking up the line number for an exception creates reference from the | 14612 // Looking up the line number for an exception creates reference from the |
14654 // compilation cache to the global object. | 14613 // compilation cache to the global object. |
14655 const char* source_exception = "function f(){throw 1;} f()"; | 14614 const char* source_exception = "function f(){throw 1;} f()"; |
14656 context = Context::New(); | 14615 context = Context::New(); |
14657 { | 14616 { |
14658 v8::HandleScope scope; | 14617 v8::HandleScope scope; |
14659 | 14618 |
14660 context->Enter(); | 14619 context->Enter(); |
14661 v8::TryCatch try_catch; | 14620 v8::TryCatch try_catch; |
14662 CompileRun(source_exception); | 14621 CompileRun(source_exception); |
14663 CHECK(try_catch.HasCaught()); | 14622 CHECK(try_catch.HasCaught()); |
14664 v8::Handle<v8::Message> message = try_catch.Message(); | 14623 v8::Handle<v8::Message> message = try_catch.Message(); |
14665 CHECK(!message.IsEmpty()); | 14624 CHECK(!message.IsEmpty()); |
14666 CHECK_EQ(1, message->GetLineNumber()); | 14625 CHECK_EQ(1, message->GetLineNumber()); |
14667 context->Exit(); | 14626 context->Exit(); |
14668 } | 14627 } |
14669 context.Dispose(); | 14628 context.Dispose(); |
14670 v8::V8::ContextDisposedNotification(); | |
14671 for (gc_count = 1; gc_count < 10; gc_count++) { | 14629 for (gc_count = 1; gc_count < 10; gc_count++) { |
14672 other_context->Enter(); | 14630 other_context->Enter(); |
14673 CompileRun(source_exception); | 14631 CompileRun(source_exception); |
14674 other_context->Exit(); | 14632 other_context->Exit(); |
14675 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | 14633 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
14676 if (GetGlobalObjectsCount() == 1) break; | 14634 if (GetGlobalObjectsCount() == 1) break; |
14677 } | 14635 } |
14678 CHECK_GE(2, gc_count); | 14636 CHECK_GE(2, gc_count); |
14679 CHECK_EQ(1, GetGlobalObjectsCount()); | 14637 CHECK_EQ(1, GetGlobalObjectsCount()); |
14680 | 14638 |
14681 other_context.Dispose(); | 14639 other_context.Dispose(); |
14682 v8::V8::ContextDisposedNotification(); | |
14683 } | 14640 } |
14684 | 14641 |
14685 | 14642 |
14686 THREADED_TEST(ScriptOrigin) { | 14643 THREADED_TEST(ScriptOrigin) { |
14687 v8::HandleScope scope; | 14644 v8::HandleScope scope; |
14688 LocalContext env; | 14645 LocalContext env; |
14689 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test")); | 14646 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test")); |
14690 v8::Handle<v8::String> script = v8::String::New( | 14647 v8::Handle<v8::String> script = v8::String::New( |
14691 "function f() {}\n\nfunction g() {}"); | 14648 "function f() {}\n\nfunction g() {}"); |
14692 v8::Script::Compile(script, &origin)->Run(); | 14649 v8::Script::Compile(script, &origin)->Run(); |
(...skipping 2494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17187 v8::HandleScope scope; | 17144 v8::HandleScope scope; |
17188 LocalContext context; | 17145 LocalContext context; |
17189 | 17146 |
17190 // Compile a try-finally clause where the finally block causes a GC | 17147 // Compile a try-finally clause where the finally block causes a GC |
17191 // while there still is a message pending for external reporting. | 17148 // while there still is a message pending for external reporting. |
17192 TryCatch try_catch; | 17149 TryCatch try_catch; |
17193 try_catch.SetVerbose(true); | 17150 try_catch.SetVerbose(true); |
17194 CompileRun("try { throw new Error(); } finally { gc(); }"); | 17151 CompileRun("try { throw new Error(); } finally { gc(); }"); |
17195 CHECK(try_catch.HasCaught()); | 17152 CHECK(try_catch.HasCaught()); |
17196 } | 17153 } |
OLD | NEW |