| 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 |