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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 using ::v8::Script; | 70 using ::v8::Script; |
71 using ::v8::StackTrace; | 71 using ::v8::StackTrace; |
72 using ::v8::String; | 72 using ::v8::String; |
73 using ::v8::TryCatch; | 73 using ::v8::TryCatch; |
74 using ::v8::Undefined; | 74 using ::v8::Undefined; |
75 using ::v8::UniqueId; | 75 using ::v8::UniqueId; |
76 using ::v8::V8; | 76 using ::v8::V8; |
77 using ::v8::Value; | 77 using ::v8::Value; |
78 | 78 |
79 | 79 |
80 // TODO(bmeurer): Don't run profiled tests when using the simulator. | |
81 // This is a temporary work-around, until the profiler is fixed. | |
82 #if USE_SIMULATOR | |
83 #define THREADED_PROFILED_TEST(Name) \ | |
84 THREADED_TEST(Name) | |
85 #else | |
86 #define THREADED_PROFILED_TEST(Name) \ | 80 #define THREADED_PROFILED_TEST(Name) \ |
87 static void Test##Name(); \ | 81 static void Test##Name(); \ |
88 TEST(Name##WithProfiler) { \ | 82 TEST(Name##WithProfiler) { \ |
89 RunWithProfiler(&Test##Name); \ | 83 RunWithProfiler(&Test##Name); \ |
90 } \ | 84 } \ |
91 THREADED_TEST(Name) | 85 THREADED_TEST(Name) |
92 #endif | |
93 | |
94 | 86 |
95 void RunWithProfiler(void (*test)()) { | 87 void RunWithProfiler(void (*test)()) { |
96 LocalContext env; | 88 LocalContext env; |
97 v8::HandleScope scope(env->GetIsolate()); | 89 v8::HandleScope scope(env->GetIsolate()); |
98 v8::Local<v8::String> profile_name = v8::String::New("my_profile1"); | 90 v8::Local<v8::String> profile_name = v8::String::New("my_profile1"); |
99 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | 91 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
100 | 92 |
101 cpu_profiler->StartCpuProfiling(profile_name); | 93 cpu_profiler->StartCpuProfiling(profile_name); |
102 (*test)(); | 94 (*test)(); |
103 cpu_profiler->DeleteAllCpuProfiles(); | 95 cpu_profiler->DeleteAllCpuProfiles(); |
(...skipping 14538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14642 } | 14634 } |
14643 two_byte_content_[14] = 'b'; | 14635 two_byte_content_[14] = 'b'; |
14644 | 14636 |
14645 // Create the input string for the regexp - the one we are going to change | 14637 // Create the input string for the regexp - the one we are going to change |
14646 // properties of. | 14638 // properties of. |
14647 input_ = factory->NewExternalStringFromAscii(&ascii_resource_); | 14639 input_ = factory->NewExternalStringFromAscii(&ascii_resource_); |
14648 | 14640 |
14649 // Inject the input as a global variable. | 14641 // Inject the input as a global variable. |
14650 i::Handle<i::String> input_name = | 14642 i::Handle<i::String> input_name = |
14651 factory->NewStringFromAscii(i::Vector<const char>("input", 5)); | 14643 factory->NewStringFromAscii(i::Vector<const char>("input", 5)); |
14652 i::JSReceiver::SetProperty( | 14644 i::Isolate::Current()->native_context()->global_object()->SetProperty( |
14653 i::handle(i::Isolate::Current()->native_context()->global_object()), | 14645 *input_name, |
14654 input_name, | 14646 *input_, |
14655 input_, | |
14656 NONE, | 14647 NONE, |
14657 i::kNonStrictMode); | 14648 i::kNonStrictMode)->ToObjectChecked(); |
14658 | 14649 |
14659 MorphThread morph_thread(this); | 14650 MorphThread morph_thread(this); |
14660 morph_thread.Start(); | 14651 morph_thread.Start(); |
14661 v8::Locker::StartPreemption(1); | 14652 v8::Locker::StartPreemption(1); |
14662 LongRunningRegExp(); | 14653 LongRunningRegExp(); |
14663 { | 14654 { |
14664 v8::Unlocker unlock(CcTest::default_isolate()); | 14655 v8::Unlocker unlock(CcTest::default_isolate()); |
14665 morph_thread.Join(); | 14656 morph_thread.Join(); |
14666 } | 14657 } |
14667 v8::Locker::StopPreemption(); | 14658 v8::Locker::StopPreemption(); |
(...skipping 3030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17698 CompileRun(source); | 17689 CompileRun(source); |
17699 | 17690 |
17700 script = v8::Script::Compile(v8_str("new C1();")); | 17691 script = v8::Script::Compile(v8_str("new C1();")); |
17701 for (int i = 0; i < 10; i++) { | 17692 for (int i = 0; i < 10; i++) { |
17702 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); | 17693 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); |
17703 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value()); | 17694 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value()); |
17704 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value()); | 17695 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value()); |
17705 } | 17696 } |
17706 } | 17697 } |
17707 | 17698 |
17708 v8::Isolate* gc_callbacks_isolate = NULL; | |
17709 int prologue_call_count = 0; | 17699 int prologue_call_count = 0; |
17710 int epilogue_call_count = 0; | 17700 int epilogue_call_count = 0; |
17711 int prologue_call_count_second = 0; | 17701 int prologue_call_count_second = 0; |
17712 int epilogue_call_count_second = 0; | 17702 int epilogue_call_count_second = 0; |
17713 | 17703 |
17714 void PrologueCallback(v8::GCType, v8::GCCallbackFlags flags) { | 17704 void PrologueCallback(v8::GCType, v8::GCCallbackFlags) { |
17715 CHECK_EQ(flags, v8::kNoGCCallbackFlags); | |
17716 ++prologue_call_count; | 17705 ++prologue_call_count; |
17717 } | 17706 } |
17718 | 17707 |
17719 | 17708 |
17720 void PrologueCallback(v8::Isolate* isolate, | 17709 void EpilogueCallback(v8::GCType, v8::GCCallbackFlags) { |
17721 v8::GCType, | |
17722 v8::GCCallbackFlags flags) { | |
17723 CHECK_EQ(flags, v8::kNoGCCallbackFlags); | |
17724 CHECK_EQ(gc_callbacks_isolate, isolate); | |
17725 ++prologue_call_count; | |
17726 } | |
17727 | |
17728 | |
17729 void EpilogueCallback(v8::GCType, v8::GCCallbackFlags flags) { | |
17730 CHECK_EQ(flags, v8::kNoGCCallbackFlags); | |
17731 ++epilogue_call_count; | 17710 ++epilogue_call_count; |
17732 } | 17711 } |
17733 | 17712 |
17734 | 17713 |
17735 void EpilogueCallback(v8::Isolate* isolate, | 17714 void PrologueCallbackSecond(v8::GCType, v8::GCCallbackFlags) { |
17736 v8::GCType, | |
17737 v8::GCCallbackFlags flags) { | |
17738 CHECK_EQ(flags, v8::kNoGCCallbackFlags); | |
17739 CHECK_EQ(gc_callbacks_isolate, isolate); | |
17740 ++epilogue_call_count; | |
17741 } | |
17742 | |
17743 | |
17744 void PrologueCallbackSecond(v8::GCType, v8::GCCallbackFlags flags) { | |
17745 CHECK_EQ(flags, v8::kNoGCCallbackFlags); | |
17746 ++prologue_call_count_second; | 17715 ++prologue_call_count_second; |
17747 } | 17716 } |
17748 | 17717 |
17749 | 17718 |
17750 void PrologueCallbackSecond(v8::Isolate* isolate, | 17719 void EpilogueCallbackSecond(v8::GCType, v8::GCCallbackFlags) { |
17751 v8::GCType, | |
17752 v8::GCCallbackFlags flags) { | |
17753 CHECK_EQ(flags, v8::kNoGCCallbackFlags); | |
17754 CHECK_EQ(gc_callbacks_isolate, isolate); | |
17755 ++prologue_call_count_second; | |
17756 } | |
17757 | |
17758 | |
17759 void EpilogueCallbackSecond(v8::GCType, v8::GCCallbackFlags flags) { | |
17760 CHECK_EQ(flags, v8::kNoGCCallbackFlags); | |
17761 ++epilogue_call_count_second; | 17720 ++epilogue_call_count_second; |
17762 } | 17721 } |
17763 | 17722 |
17764 | 17723 |
17765 void EpilogueCallbackSecond(v8::Isolate* isolate, | 17724 TEST(GCCallbacks) { |
17766 v8::GCType, | |
17767 v8::GCCallbackFlags flags) { | |
17768 CHECK_EQ(flags, v8::kNoGCCallbackFlags); | |
17769 CHECK_EQ(gc_callbacks_isolate, isolate); | |
17770 ++epilogue_call_count_second; | |
17771 } | |
17772 | |
17773 | |
17774 TEST(GCCallbacksOld) { | |
17775 LocalContext context; | 17725 LocalContext context; |
17776 | 17726 |
17777 v8::V8::AddGCPrologueCallback(PrologueCallback); | 17727 v8::V8::AddGCPrologueCallback(PrologueCallback); |
17778 v8::V8::AddGCEpilogueCallback(EpilogueCallback); | 17728 v8::V8::AddGCEpilogueCallback(EpilogueCallback); |
17779 CHECK_EQ(0, prologue_call_count); | 17729 CHECK_EQ(0, prologue_call_count); |
17780 CHECK_EQ(0, epilogue_call_count); | 17730 CHECK_EQ(0, epilogue_call_count); |
17781 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | 17731 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
17782 CHECK_EQ(1, prologue_call_count); | 17732 CHECK_EQ(1, prologue_call_count); |
17783 CHECK_EQ(1, epilogue_call_count); | 17733 CHECK_EQ(1, epilogue_call_count); |
17784 v8::V8::AddGCPrologueCallback(PrologueCallbackSecond); | 17734 v8::V8::AddGCPrologueCallback(PrologueCallbackSecond); |
(...skipping 13 matching lines...) Expand all Loading... |
17798 v8::V8::RemoveGCPrologueCallback(PrologueCallbackSecond); | 17748 v8::V8::RemoveGCPrologueCallback(PrologueCallbackSecond); |
17799 v8::V8::RemoveGCEpilogueCallback(EpilogueCallbackSecond); | 17749 v8::V8::RemoveGCEpilogueCallback(EpilogueCallbackSecond); |
17800 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | 17750 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
17801 CHECK_EQ(2, prologue_call_count); | 17751 CHECK_EQ(2, prologue_call_count); |
17802 CHECK_EQ(2, epilogue_call_count); | 17752 CHECK_EQ(2, epilogue_call_count); |
17803 CHECK_EQ(2, prologue_call_count_second); | 17753 CHECK_EQ(2, prologue_call_count_second); |
17804 CHECK_EQ(2, epilogue_call_count_second); | 17754 CHECK_EQ(2, epilogue_call_count_second); |
17805 } | 17755 } |
17806 | 17756 |
17807 | 17757 |
17808 TEST(GCCallbacks) { | |
17809 LocalContext context; | |
17810 v8::Isolate* isolate = context->GetIsolate(); | |
17811 gc_callbacks_isolate = isolate; | |
17812 isolate->AddGCPrologueCallback(PrologueCallback); | |
17813 isolate->AddGCEpilogueCallback(EpilogueCallback); | |
17814 CHECK_EQ(0, prologue_call_count); | |
17815 CHECK_EQ(0, epilogue_call_count); | |
17816 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | |
17817 CHECK_EQ(1, prologue_call_count); | |
17818 CHECK_EQ(1, epilogue_call_count); | |
17819 isolate->AddGCPrologueCallback(PrologueCallbackSecond); | |
17820 isolate->AddGCEpilogueCallback(EpilogueCallbackSecond); | |
17821 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | |
17822 CHECK_EQ(2, prologue_call_count); | |
17823 CHECK_EQ(2, epilogue_call_count); | |
17824 CHECK_EQ(1, prologue_call_count_second); | |
17825 CHECK_EQ(1, epilogue_call_count_second); | |
17826 isolate->RemoveGCPrologueCallback(PrologueCallback); | |
17827 isolate->RemoveGCEpilogueCallback(EpilogueCallback); | |
17828 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | |
17829 CHECK_EQ(2, prologue_call_count); | |
17830 CHECK_EQ(2, epilogue_call_count); | |
17831 CHECK_EQ(2, prologue_call_count_second); | |
17832 CHECK_EQ(2, epilogue_call_count_second); | |
17833 isolate->RemoveGCPrologueCallback(PrologueCallbackSecond); | |
17834 isolate->RemoveGCEpilogueCallback(EpilogueCallbackSecond); | |
17835 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | |
17836 CHECK_EQ(2, prologue_call_count); | |
17837 CHECK_EQ(2, epilogue_call_count); | |
17838 CHECK_EQ(2, prologue_call_count_second); | |
17839 CHECK_EQ(2, epilogue_call_count_second); | |
17840 } | |
17841 | |
17842 | |
17843 THREADED_TEST(AddToJSFunctionResultCache) { | 17758 THREADED_TEST(AddToJSFunctionResultCache) { |
17844 i::FLAG_stress_compaction = false; | 17759 i::FLAG_stress_compaction = false; |
17845 i::FLAG_allow_natives_syntax = true; | 17760 i::FLAG_allow_natives_syntax = true; |
17846 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 17761 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
17847 | 17762 |
17848 LocalContext context; | 17763 LocalContext context; |
17849 | 17764 |
17850 const char* code = | 17765 const char* code = |
17851 "(function() {" | 17766 "(function() {" |
17852 " var key0 = 'a';" | 17767 " var key0 = 'a';" |
(...skipping 2809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20662 env->Global()->Set(v8_str("func"), func); | 20577 env->Global()->Set(v8_str("func"), func); |
20663 Local<Value> result = CompileRun("func();"); | 20578 Local<Value> result = CompileRun("func();"); |
20664 CHECK_EQ(v8::Integer::New(17, isolate), result); | 20579 CHECK_EQ(v8::Integer::New(17, isolate), result); |
20665 // Verify function not cached | 20580 // Verify function not cached |
20666 int serial_number = | 20581 int serial_number = |
20667 i::Smi::cast(v8::Utils::OpenHandle(*func) | 20582 i::Smi::cast(v8::Utils::OpenHandle(*func) |
20668 ->shared()->get_api_func_data()->serial_number())->value(); | 20583 ->shared()->get_api_func_data()->serial_number())->value(); |
20669 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 20584 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
20670 i::Object* elm = i_isolate->native_context()->function_cache() | 20585 i::Object* elm = i_isolate->native_context()->function_cache() |
20671 ->GetElementNoExceptionThrown(i_isolate, serial_number); | 20586 ->GetElementNoExceptionThrown(i_isolate, serial_number); |
20672 CHECK(elm->IsUndefined()); | 20587 CHECK(elm->IsNull()); |
20673 // Verify that each Function::New creates a new function instance | |
20674 Local<Object> data2 = v8::Object::New(); | |
20675 function_new_expected_env = data2; | |
20676 Local<Function> func2 = Function::New(isolate, FunctionNewCallback, data2); | |
20677 CHECK(!func2->IsNull()); | |
20678 CHECK_NE(func, func2); | |
20679 env->Global()->Set(v8_str("func2"), func2); | |
20680 Local<Value> result2 = CompileRun("func2();"); | |
20681 CHECK_EQ(v8::Integer::New(17, isolate), result2); | |
20682 } | 20588 } |
20683 | 20589 |
OLD | NEW |