Chromium Code Reviews| 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 957 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 968 } | 968 } |
| 969 } | 969 } |
| 970 } | 970 } |
| 971 | 971 |
| 972 | 972 |
| 973 // Debug event handler which re-issues a debug break and calls the garbage | 973 // Debug event handler which re-issues a debug break and calls the garbage |
| 974 // collector to have the heap verified. | 974 // collector to have the heap verified. |
| 975 static void DebugEventBreak( | 975 static void DebugEventBreak( |
| 976 const v8::Debug::EventDetails& event_details) { | 976 const v8::Debug::EventDetails& event_details) { |
| 977 v8::DebugEvent event = event_details.GetEvent(); | 977 v8::DebugEvent event = event_details.GetEvent(); |
| 978 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug(); | 978 v8::internal::Debug* debug = CcTest::i_isolate()->debug(); |
| 979 // When hitting a debug event listener there must be a break set. | 979 // When hitting a debug event listener there must be a break set. |
| 980 CHECK_NE(debug->break_id(), 0); | 980 CHECK_NE(debug->break_id(), 0); |
| 981 | 981 |
| 982 if (event == v8::Break) { | 982 if (event == v8::Break) { |
| 983 // Count the number of breaks. | 983 // Count the number of breaks. |
| 984 break_point_hit_count++; | 984 break_point_hit_count++; |
| 985 | 985 |
| 986 // Run the garbage collector to enforce heap verification if option | 986 // Run the garbage collector to enforce heap verification if option |
| 987 // --verify-heap is set. | 987 // --verify-heap is set. |
| 988 HEAP->CollectGarbage(v8::internal::NEW_SPACE); | 988 HEAP->CollectGarbage(v8::internal::NEW_SPACE); |
| 989 | 989 |
| 990 // Set the break flag again to come back here as soon as possible. | 990 // Set the break flag again to come back here as soon as possible. |
| 991 v8::Debug::DebugBreak(); | 991 v8::Debug::DebugBreak(CcTest::isolate()); |
| 992 } | 992 } |
| 993 } | 993 } |
| 994 | 994 |
| 995 | 995 |
| 996 // Debug event handler which re-issues a debug break until a limit has been | 996 // Debug event handler which re-issues a debug break until a limit has been |
| 997 // reached. | 997 // reached. |
| 998 int max_break_point_hit_count = 0; | 998 int max_break_point_hit_count = 0; |
| 999 bool terminate_after_max_break_point_hit = false; | 999 bool terminate_after_max_break_point_hit = false; |
| 1000 static void DebugEventBreakMax( | 1000 static void DebugEventBreakMax( |
| 1001 const v8::Debug::EventDetails& event_details) { | 1001 const v8::Debug::EventDetails& event_details) { |
| 1002 v8::DebugEvent event = event_details.GetEvent(); | 1002 v8::DebugEvent event = event_details.GetEvent(); |
| 1003 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); | 1003 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); |
| 1004 v8::internal::Isolate* isolate = v8::internal::Isolate::Current(); | 1004 v8::Isolate* v8_isolate = CcTest::isolate(); |
| 1005 v8::internal::Isolate* isolate = CcTest::i_isolate(); | |
| 1005 v8::internal::Debug* debug = isolate->debug(); | 1006 v8::internal::Debug* debug = isolate->debug(); |
| 1006 // When hitting a debug event listener there must be a break set. | 1007 // When hitting a debug event listener there must be a break set. |
| 1007 CHECK_NE(debug->break_id(), 0); | 1008 CHECK_NE(debug->break_id(), 0); |
| 1008 | 1009 |
| 1009 if (event == v8::Break) { | 1010 if (event == v8::Break) { |
| 1010 if (break_point_hit_count < max_break_point_hit_count) { | 1011 if (break_point_hit_count < max_break_point_hit_count) { |
| 1011 // Count the number of breaks. | 1012 // Count the number of breaks. |
| 1012 break_point_hit_count++; | 1013 break_point_hit_count++; |
| 1013 | 1014 |
| 1014 // Collect the JavsScript stack height if the function frame_count is | 1015 // Collect the JavsScript stack height if the function frame_count is |
| 1015 // compiled. | 1016 // compiled. |
| 1016 if (!frame_count.IsEmpty()) { | 1017 if (!frame_count.IsEmpty()) { |
| 1017 static const int kArgc = 1; | 1018 static const int kArgc = 1; |
| 1018 v8::Handle<v8::Value> argv[kArgc] = { exec_state }; | 1019 v8::Handle<v8::Value> argv[kArgc] = { exec_state }; |
| 1019 // Using exec_state as receiver is just to have a receiver. | 1020 // Using exec_state as receiver is just to have a receiver. |
| 1020 v8::Handle<v8::Value> result = | 1021 v8::Handle<v8::Value> result = |
| 1021 frame_count->Call(exec_state, kArgc, argv); | 1022 frame_count->Call(exec_state, kArgc, argv); |
| 1022 last_js_stack_height = result->Int32Value(); | 1023 last_js_stack_height = result->Int32Value(); |
| 1023 } | 1024 } |
| 1024 | 1025 |
| 1025 // Set the break flag again to come back here as soon as possible. | 1026 // Set the break flag again to come back here as soon as possible. |
| 1026 v8::Debug::DebugBreak(); | 1027 v8::Debug::DebugBreak(v8_isolate); |
| 1027 | 1028 |
| 1028 } else if (terminate_after_max_break_point_hit) { | 1029 } else if (terminate_after_max_break_point_hit) { |
| 1029 // Terminate execution after the last break if requested. | 1030 // Terminate execution after the last break if requested. |
| 1030 v8::V8::TerminateExecution(); | 1031 v8::V8::TerminateExecution(v8_isolate); |
| 1031 } | 1032 } |
| 1032 | 1033 |
| 1033 // Perform a full deoptimization when the specified number of | 1034 // Perform a full deoptimization when the specified number of |
| 1034 // breaks have been hit. | 1035 // breaks have been hit. |
| 1035 if (break_point_hit_count == break_point_hit_count_deoptimize) { | 1036 if (break_point_hit_count == break_point_hit_count_deoptimize) { |
| 1036 i::Deoptimizer::DeoptimizeAll(isolate); | 1037 i::Deoptimizer::DeoptimizeAll(isolate); |
| 1037 } | 1038 } |
| 1038 } | 1039 } |
| 1039 } | 1040 } |
| 1040 | 1041 |
| (...skipping 1678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2719 uint16_t buffer[kBufferSize]; | 2720 uint16_t buffer[kBufferSize]; |
| 2720 | 2721 |
| 2721 const char* command_111 = "{\"seq\":111," | 2722 const char* command_111 = "{\"seq\":111," |
| 2722 "\"type\":\"request\"," | 2723 "\"type\":\"request\"," |
| 2723 "\"command\":\"evaluate\"," | 2724 "\"command\":\"evaluate\"," |
| 2724 "\"arguments\":{" | 2725 "\"arguments\":{" |
| 2725 " \"global\":true," | 2726 " \"global\":true," |
| 2726 " \"expression\":\"v1\",\"disable_break\":true" | 2727 " \"expression\":\"v1\",\"disable_break\":true" |
| 2727 "}}"; | 2728 "}}"; |
| 2728 | 2729 |
| 2729 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_111, buffer)); | 2730 v8::Isolate* isolate = CcTest::default_isolate(); |
| 2731 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_111, buffer)); | |
| 2730 | 2732 |
| 2731 const char* command_112 = "{\"seq\":112," | 2733 const char* command_112 = "{\"seq\":112," |
| 2732 "\"type\":\"request\"," | 2734 "\"type\":\"request\"," |
| 2733 "\"command\":\"evaluate\"," | 2735 "\"command\":\"evaluate\"," |
| 2734 "\"arguments\":{" | 2736 "\"arguments\":{" |
| 2735 " \"global\":true," | 2737 " \"global\":true," |
| 2736 " \"expression\":\"getAnimal()\",\"disable_break\":true" | 2738 " \"expression\":\"getAnimal()\",\"disable_break\":true" |
| 2737 "}}"; | 2739 "}}"; |
| 2738 | 2740 |
| 2739 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_112, buffer)); | 2741 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_112, buffer)); |
| 2740 | 2742 |
| 2741 const char* command_113 = "{\"seq\":113," | 2743 const char* command_113 = "{\"seq\":113," |
| 2742 "\"type\":\"request\"," | 2744 "\"type\":\"request\"," |
| 2743 "\"command\":\"evaluate\"," | 2745 "\"command\":\"evaluate\"," |
| 2744 "\"arguments\":{" | 2746 "\"arguments\":{" |
| 2745 " \"global\":true," | 2747 " \"global\":true," |
| 2746 " \"expression\":\"239 + 566\",\"disable_break\":true" | 2748 " \"expression\":\"239 + 566\",\"disable_break\":true" |
| 2747 "}}"; | 2749 "}}"; |
| 2748 | 2750 |
| 2749 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_113, buffer)); | 2751 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_113, buffer)); |
| 2750 | 2752 |
| 2751 v8::Debug::ProcessDebugMessages(); | 2753 v8::Debug::ProcessDebugMessages(); |
| 2752 | 2754 |
| 2753 CHECK_EQ(3, process_debug_messages_data.counter); | 2755 CHECK_EQ(3, process_debug_messages_data.counter); |
| 2754 | 2756 |
| 2755 CHECK_EQ(strcmp("Pinguin", process_debug_messages_data.results[0].buffer), 0); | 2757 CHECK_EQ(strcmp("Pinguin", process_debug_messages_data.results[0].buffer), 0); |
| 2756 CHECK_EQ(strcmp("Capybara", process_debug_messages_data.results[1].buffer), | 2758 CHECK_EQ(strcmp("Capybara", process_debug_messages_data.results[1].buffer), |
| 2757 0); | 2759 0); |
| 2758 CHECK_EQ(strcmp("805", process_debug_messages_data.results[2].buffer), 0); | 2760 CHECK_EQ(strcmp("805", process_debug_messages_data.results[2].buffer), 0); |
| 2759 | 2761 |
| (...skipping 1395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4155 v8::Number::New(1), | 4157 v8::Number::New(1), |
| 4156 v8::Number::New(1) }; | 4158 v8::Number::New(1) }; |
| 4157 | 4159 |
| 4158 // Call all functions to make sure that they are compiled. | 4160 // Call all functions to make sure that they are compiled. |
| 4159 f0->Call(env->Global(), 0, NULL); | 4161 f0->Call(env->Global(), 0, NULL); |
| 4160 f1->Call(env->Global(), 0, NULL); | 4162 f1->Call(env->Global(), 0, NULL); |
| 4161 f2->Call(env->Global(), 0, NULL); | 4163 f2->Call(env->Global(), 0, NULL); |
| 4162 f3->Call(env->Global(), 0, NULL); | 4164 f3->Call(env->Global(), 0, NULL); |
| 4163 | 4165 |
| 4164 // Set the debug break flag. | 4166 // Set the debug break flag. |
| 4165 v8::Debug::DebugBreak(); | 4167 v8::Debug::DebugBreak(env->GetIsolate()); |
| 4166 | 4168 |
| 4167 // Call all functions with different argument count. | 4169 // Call all functions with different argument count. |
| 4168 break_point_hit_count = 0; | 4170 break_point_hit_count = 0; |
| 4169 for (unsigned int i = 0; i < ARRAY_SIZE(argv); i++) { | 4171 for (unsigned int i = 0; i < ARRAY_SIZE(argv); i++) { |
| 4170 f0->Call(env->Global(), i, argv); | 4172 f0->Call(env->Global(), i, argv); |
| 4171 f1->Call(env->Global(), i, argv); | 4173 f1->Call(env->Global(), i, argv); |
| 4172 f2->Call(env->Global(), i, argv); | 4174 f2->Call(env->Global(), i, argv); |
| 4173 f3->Call(env->Global(), i, argv); | 4175 f3->Call(env->Global(), i, argv); |
| 4174 } | 4176 } |
| 4175 | 4177 |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 4189 v8::HandleScope scope(env->GetIsolate()); | 4191 v8::HandleScope scope(env->GetIsolate()); |
| 4190 | 4192 |
| 4191 // Register a debug event listener which sets the break flag and counts. | 4193 // Register a debug event listener which sets the break flag and counts. |
| 4192 v8::Debug::SetDebugEventListener2(DebugEventCounter); | 4194 v8::Debug::SetDebugEventListener2(DebugEventCounter); |
| 4193 | 4195 |
| 4194 // Create a function for testing stepping. | 4196 // Create a function for testing stepping. |
| 4195 const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}"; | 4197 const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}"; |
| 4196 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); | 4198 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); |
| 4197 | 4199 |
| 4198 // Set the debug break flag. | 4200 // Set the debug break flag. |
| 4199 v8::Debug::DebugBreak(); | 4201 v8::Debug::DebugBreak(env->GetIsolate()); |
| 4200 | 4202 |
| 4201 // Call all functions with different argument count. | 4203 // Call all functions with different argument count. |
| 4202 break_point_hit_count = 0; | 4204 break_point_hit_count = 0; |
| 4203 f->Call(env->Global(), 0, NULL); | 4205 f->Call(env->Global(), 0, NULL); |
| 4204 CHECK_EQ(1, break_point_hit_count); | 4206 CHECK_EQ(1, break_point_hit_count); |
| 4205 | 4207 |
| 4206 { | 4208 { |
| 4207 v8::Debug::DebugBreak(); | 4209 v8::Debug::DebugBreak(env->GetIsolate()); |
| 4208 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate()); | 4210 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate()); |
| 4209 v8::internal::DisableBreak disable_break(isolate, true); | 4211 v8::internal::DisableBreak disable_break(isolate, true); |
| 4210 f->Call(env->Global(), 0, NULL); | 4212 f->Call(env->Global(), 0, NULL); |
| 4211 CHECK_EQ(1, break_point_hit_count); | 4213 CHECK_EQ(1, break_point_hit_count); |
| 4212 } | 4214 } |
| 4213 | 4215 |
| 4214 f->Call(env->Global(), 0, NULL); | 4216 f->Call(env->Global(), 0, NULL); |
| 4215 CHECK_EQ(2, break_point_hit_count); | 4217 CHECK_EQ(2, break_point_hit_count); |
| 4216 | 4218 |
| 4217 // Get rid of the debug event listener. | 4219 // Get rid of the debug event listener. |
| 4218 v8::Debug::SetDebugEventListener2(NULL); | 4220 v8::Debug::SetDebugEventListener2(NULL); |
| 4219 CheckDebuggerUnloaded(); | 4221 CheckDebuggerUnloaded(); |
| 4220 } | 4222 } |
| 4221 | 4223 |
| 4222 static const char* kSimpleExtensionSource = | 4224 static const char* kSimpleExtensionSource = |
| 4223 "(function Foo() {" | 4225 "(function Foo() {" |
| 4224 " return 4;" | 4226 " return 4;" |
| 4225 "})() "; | 4227 "})() "; |
| 4226 | 4228 |
| 4227 // http://crbug.com/28933 | 4229 // http://crbug.com/28933 |
| 4228 // Test that debug break is disabled when bootstrapper is active. | 4230 // Test that debug break is disabled when bootstrapper is active. |
| 4229 TEST(NoBreakWhenBootstrapping) { | 4231 TEST(NoBreakWhenBootstrapping) { |
| 4230 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 4232 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 4231 v8::HandleScope scope(isolate); | 4233 v8::HandleScope scope(isolate); |
| 4232 | 4234 |
| 4233 // Register a debug event listener which sets the break flag and counts. | 4235 // Register a debug event listener which sets the break flag and counts. |
| 4234 v8::Debug::SetDebugEventListener2(DebugEventCounter); | 4236 v8::Debug::SetDebugEventListener2(DebugEventCounter); |
| 4235 | 4237 |
| 4236 // Set the debug break flag. | 4238 // Set the debug break flag. |
| 4237 v8::Debug::DebugBreak(); | 4239 v8::Debug::DebugBreak(isolate); |
| 4238 break_point_hit_count = 0; | 4240 break_point_hit_count = 0; |
| 4239 { | 4241 { |
| 4240 // Create a context with an extension to make sure that some JavaScript | 4242 // Create a context with an extension to make sure that some JavaScript |
| 4241 // code is executed during bootstrapping. | 4243 // code is executed during bootstrapping. |
| 4242 v8::RegisterExtension(new v8::Extension("simpletest", | 4244 v8::RegisterExtension(new v8::Extension("simpletest", |
| 4243 kSimpleExtensionSource)); | 4245 kSimpleExtensionSource)); |
| 4244 const char* extension_names[] = { "simpletest" }; | 4246 const char* extension_names[] = { "simpletest" }; |
| 4245 v8::ExtensionConfiguration extensions(1, extension_names); | 4247 v8::ExtensionConfiguration extensions(1, extension_names); |
| 4246 v8::HandleScope handle_scope(isolate); | 4248 v8::HandleScope handle_scope(isolate); |
| 4247 v8::Context::New(isolate, &extensions); | 4249 v8::Context::New(isolate, &extensions); |
| (...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4882 | 4884 |
| 4883 /* Interleaved sequence of actions by the two threads:*/ | 4885 /* Interleaved sequence of actions by the two threads:*/ |
| 4884 // Main thread compiles and runs source_1 | 4886 // Main thread compiles and runs source_1 |
| 4885 message_queue_barriers.semaphore_1.Signal(); | 4887 message_queue_barriers.semaphore_1.Signal(); |
| 4886 message_queue_barriers.barrier_1.Wait(); | 4888 message_queue_barriers.barrier_1.Wait(); |
| 4887 // Post 6 commands, filling the command queue and making it expand. | 4889 // Post 6 commands, filling the command queue and making it expand. |
| 4888 // These calls return immediately, but the commands stay on the queue | 4890 // These calls return immediately, but the commands stay on the queue |
| 4889 // until the execution of source_2. | 4891 // until the execution of source_2. |
| 4890 // Note: AsciiToUtf16 executes before SendCommand, so command is copied | 4892 // Note: AsciiToUtf16 executes before SendCommand, so command is copied |
| 4891 // to buffer before buffer is sent to SendCommand. | 4893 // to buffer before buffer is sent to SendCommand. |
| 4892 v8::Debug::SendCommand(buffer_1, AsciiToUtf16(command_1, buffer_1)); | 4894 v8::Isolate* isolate = CcTest::default_isolate(); |
| 4893 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_2, buffer_2)); | 4895 v8::Debug::SendCommand(isolate, buffer_1, AsciiToUtf16(command_1, buffer_1)); |
| 4894 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_3, buffer_2)); | 4896 v8::Debug::SendCommand(isolate, buffer_2, AsciiToUtf16(command_2, buffer_2)); |
| 4895 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_3, buffer_2)); | 4897 v8::Debug::SendCommand(isolate, buffer_2, AsciiToUtf16(command_3, buffer_2)); |
| 4896 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_3, buffer_2)); | 4898 v8::Debug::SendCommand(isolate, buffer_2, AsciiToUtf16(command_3, buffer_2)); |
| 4899 v8::Debug::SendCommand(isolate, buffer_2, AsciiToUtf16(command_3, buffer_2)); | |
| 4897 message_queue_barriers.barrier_2.Wait(); | 4900 message_queue_barriers.barrier_2.Wait(); |
| 4898 // Main thread compiles and runs source_2. | 4901 // Main thread compiles and runs source_2. |
| 4899 // Queued commands are executed at the start of compilation of source_2( | 4902 // Queued commands are executed at the start of compilation of source_2( |
| 4900 // beforeCompile event). | 4903 // beforeCompile event). |
| 4901 // Free the message handler to process all the messages from the queue. 7 | 4904 // Free the message handler to process all the messages from the queue. 7 |
| 4902 // messages are expected: 2 afterCompile events and 5 responses. | 4905 // messages are expected: 2 afterCompile events and 5 responses. |
| 4903 // All the commands added so far will fail to execute as long as call stack | 4906 // All the commands added so far will fail to execute as long as call stack |
| 4904 // is empty on beforeCompile event. | 4907 // is empty on beforeCompile event. |
| 4905 for (int i = 0; i < 6 ; ++i) { | 4908 for (int i = 0; i < 6 ; ++i) { |
| 4906 message_queue_barriers.semaphore_1.Signal(); | 4909 message_queue_barriers.semaphore_1.Signal(); |
| 4907 } | 4910 } |
| 4908 message_queue_barriers.barrier_3.Wait(); | 4911 message_queue_barriers.barrier_3.Wait(); |
| 4909 // Main thread compiles and runs source_3. | 4912 // Main thread compiles and runs source_3. |
| 4910 // Don't stop in the afterCompile handler. | 4913 // Don't stop in the afterCompile handler. |
| 4911 message_queue_barriers.semaphore_1.Signal(); | 4914 message_queue_barriers.semaphore_1.Signal(); |
| 4912 // source_3 includes a debugger statement, which causes a break event. | 4915 // source_3 includes a debugger statement, which causes a break event. |
| 4913 // Wait on break event from hitting "debugger" statement | 4916 // Wait on break event from hitting "debugger" statement |
| 4914 message_queue_barriers.semaphore_2.Wait(); | 4917 message_queue_barriers.semaphore_2.Wait(); |
| 4915 // These should execute after the "debugger" statement in source_2 | 4918 // These should execute after the "debugger" statement in source_2 |
| 4916 v8::Debug::SendCommand(buffer_1, AsciiToUtf16(command_1, buffer_1)); | 4919 v8::Debug::SendCommand(isolate, buffer_1, AsciiToUtf16(command_1, buffer_1)); |
| 4917 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_2, buffer_2)); | 4920 v8::Debug::SendCommand(isolate, buffer_2, AsciiToUtf16(command_2, buffer_2)); |
| 4918 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_3, buffer_2)); | 4921 v8::Debug::SendCommand(isolate, buffer_2, AsciiToUtf16(command_3, buffer_2)); |
| 4919 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_single_step, buffer_2)); | 4922 v8::Debug::SendCommand( |
| 4923 isolate, buffer_2, AsciiToUtf16(command_single_step, buffer_2)); | |
| 4920 // Run after 2 break events, 4 responses. | 4924 // Run after 2 break events, 4 responses. |
| 4921 for (int i = 0; i < 6 ; ++i) { | 4925 for (int i = 0; i < 6 ; ++i) { |
| 4922 message_queue_barriers.semaphore_1.Signal(); | 4926 message_queue_barriers.semaphore_1.Signal(); |
| 4923 } | 4927 } |
| 4924 // Wait on break event after a single step executes. | 4928 // Wait on break event after a single step executes. |
| 4925 message_queue_barriers.semaphore_2.Wait(); | 4929 message_queue_barriers.semaphore_2.Wait(); |
| 4926 v8::Debug::SendCommand(buffer_1, AsciiToUtf16(command_2, buffer_1)); | 4930 v8::Debug::SendCommand(isolate, buffer_1, AsciiToUtf16(command_2, buffer_1)); |
| 4927 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_continue, buffer_2)); | 4931 v8::Debug::SendCommand( |
| 4932 isolate, buffer_2, AsciiToUtf16(command_continue, buffer_2)); | |
| 4928 // Run after 2 responses. | 4933 // Run after 2 responses. |
| 4929 for (int i = 0; i < 2 ; ++i) { | 4934 for (int i = 0; i < 2 ; ++i) { |
| 4930 message_queue_barriers.semaphore_1.Signal(); | 4935 message_queue_barriers.semaphore_1.Signal(); |
| 4931 } | 4936 } |
| 4932 // Main thread continues running source_3 to end, waits for this thread. | 4937 // Main thread continues running source_3 to end, waits for this thread. |
| 4933 } | 4938 } |
| 4934 | 4939 |
| 4935 | 4940 |
| 4936 // This thread runs the v8 engine. | 4941 // This thread runs the v8 engine. |
| 4937 TEST(MessageQueues) { | 4942 TEST(MessageQueues) { |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5023 if (message.GetClientData() != NULL) { | 5028 if (message.GetClientData() != NULL) { |
| 5024 handled_client_data_instances_count++; | 5029 handled_client_data_instances_count++; |
| 5025 } | 5030 } |
| 5026 } | 5031 } |
| 5027 | 5032 |
| 5028 | 5033 |
| 5029 // Tests that all client data passed to the debugger are sent to the handler. | 5034 // Tests that all client data passed to the debugger are sent to the handler. |
| 5030 TEST(SendClientDataToHandler) { | 5035 TEST(SendClientDataToHandler) { |
| 5031 // Create a V8 environment | 5036 // Create a V8 environment |
| 5032 DebugLocalContext env; | 5037 DebugLocalContext env; |
| 5033 v8::HandleScope scope(env->GetIsolate()); | 5038 v8::Isolate* isolate = env->GetIsolate(); |
| 5039 v8::HandleScope scope(isolate); | |
| 5034 TestClientData::ResetCounters(); | 5040 TestClientData::ResetCounters(); |
| 5035 handled_client_data_instances_count = 0; | 5041 handled_client_data_instances_count = 0; |
| 5036 v8::Debug::SetMessageHandler2(MessageHandlerCountingClientData); | 5042 v8::Debug::SetMessageHandler2(MessageHandlerCountingClientData); |
| 5037 const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;"; | 5043 const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;"; |
| 5038 const int kBufferSize = 1000; | 5044 const int kBufferSize = 1000; |
| 5039 uint16_t buffer[kBufferSize]; | 5045 uint16_t buffer[kBufferSize]; |
| 5040 const char* command_1 = | 5046 const char* command_1 = |
| 5041 "{\"seq\":117," | 5047 "{\"seq\":117," |
| 5042 "\"type\":\"request\"," | 5048 "\"type\":\"request\"," |
| 5043 "\"command\":\"evaluate\"," | 5049 "\"command\":\"evaluate\"," |
| 5044 "\"arguments\":{\"expression\":\"1+2\"}}"; | 5050 "\"arguments\":{\"expression\":\"1+2\"}}"; |
| 5045 const char* command_2 = | 5051 const char* command_2 = |
| 5046 "{\"seq\":118," | 5052 "{\"seq\":118," |
| 5047 "\"type\":\"request\"," | 5053 "\"type\":\"request\"," |
| 5048 "\"command\":\"evaluate\"," | 5054 "\"command\":\"evaluate\"," |
| 5049 "\"arguments\":{\"expression\":\"1+a\"}}"; | 5055 "\"arguments\":{\"expression\":\"1+a\"}}"; |
| 5050 const char* command_continue = | 5056 const char* command_continue = |
| 5051 "{\"seq\":106," | 5057 "{\"seq\":106," |
| 5052 "\"type\":\"request\"," | 5058 "\"type\":\"request\"," |
| 5053 "\"command\":\"continue\"}"; | 5059 "\"command\":\"continue\"}"; |
| 5054 | 5060 |
| 5055 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_1, buffer), | 5061 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_1, buffer), |
| 5056 new TestClientData()); | 5062 new TestClientData()); |
| 5057 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_2, buffer), NULL); | 5063 v8::Debug::SendCommand( |
| 5058 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_2, buffer), | 5064 isolate, buffer, AsciiToUtf16(command_2, buffer), NULL); |
| 5065 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_2, buffer), | |
| 5059 new TestClientData()); | 5066 new TestClientData()); |
| 5060 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_2, buffer), | 5067 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_2, buffer), |
| 5061 new TestClientData()); | 5068 new TestClientData()); |
| 5062 // All the messages will be processed on beforeCompile event. | 5069 // All the messages will be processed on beforeCompile event. |
| 5063 CompileRun(source_1); | 5070 CompileRun(source_1); |
| 5064 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_continue, buffer)); | 5071 v8::Debug::SendCommand( |
| 5072 isolate, buffer, AsciiToUtf16(command_continue, buffer)); | |
| 5065 CHECK_EQ(3, TestClientData::constructor_call_counter); | 5073 CHECK_EQ(3, TestClientData::constructor_call_counter); |
| 5066 CHECK_EQ(TestClientData::constructor_call_counter, | 5074 CHECK_EQ(TestClientData::constructor_call_counter, |
| 5067 handled_client_data_instances_count); | 5075 handled_client_data_instances_count); |
| 5068 CHECK_EQ(TestClientData::constructor_call_counter, | 5076 CHECK_EQ(TestClientData::constructor_call_counter, |
| 5069 TestClientData::destructor_call_counter); | 5077 TestClientData::destructor_call_counter); |
| 5070 } | 5078 } |
| 5071 | 5079 |
| 5072 | 5080 |
| 5073 /* Test ThreadedDebugging */ | 5081 /* Test ThreadedDebugging */ |
| 5074 /* This test interrupts a running infinite loop that is | 5082 /* This test interrupts a running infinite loop that is |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5155 uint16_t buffer[kBufSize]; | 5163 uint16_t buffer[kBufSize]; |
| 5156 | 5164 |
| 5157 const char* command_1 = "{\"seq\":102," | 5165 const char* command_1 = "{\"seq\":102," |
| 5158 "\"type\":\"request\"," | 5166 "\"type\":\"request\"," |
| 5159 "\"command\":\"evaluate\"," | 5167 "\"command\":\"evaluate\"," |
| 5160 "\"arguments\":{\"expression\":\"bar(false)\"}}"; | 5168 "\"arguments\":{\"expression\":\"bar(false)\"}}"; |
| 5161 const char* command_2 = "{\"seq\":103," | 5169 const char* command_2 = "{\"seq\":103," |
| 5162 "\"type\":\"request\"," | 5170 "\"type\":\"request\"," |
| 5163 "\"command\":\"continue\"}"; | 5171 "\"command\":\"continue\"}"; |
| 5164 | 5172 |
| 5173 v8::Isolate* isolate = CcTest::isolate(); | |
| 5165 threaded_debugging_barriers.barrier_1.Wait(); | 5174 threaded_debugging_barriers.barrier_1.Wait(); |
| 5166 v8::Debug::DebugBreak(); | 5175 v8::Debug::DebugBreak(isolate); |
| 5167 threaded_debugging_barriers.barrier_2.Wait(); | 5176 threaded_debugging_barriers.barrier_2.Wait(); |
| 5168 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_1, buffer)); | 5177 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_1, buffer)); |
| 5169 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_2, buffer)); | 5178 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_2, buffer)); |
| 5170 } | 5179 } |
| 5171 | 5180 |
| 5172 | 5181 |
| 5173 TEST(ThreadedDebugging) { | 5182 UNINITIALIZED_TEST(ThreadedDebugging) { |
| 5174 DebuggerThread debugger_thread; | 5183 DebuggerThread debugger_thread; |
| 5175 V8Thread v8_thread; | 5184 V8Thread v8_thread; |
| 5176 | 5185 |
| 5177 // Create a V8 environment | 5186 // Create a V8 environment |
| 5178 v8_thread.Start(); | 5187 v8_thread.Start(); |
| 5179 debugger_thread.Start(); | 5188 debugger_thread.Start(); |
| 5180 | 5189 |
| 5181 v8_thread.Join(); | 5190 v8_thread.Join(); |
| 5182 debugger_thread.Join(); | 5191 debugger_thread.Join(); |
| 5183 } | 5192 } |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5316 command_7 = "{\"seq\":107," | 5325 command_7 = "{\"seq\":107," |
| 5317 "\"type\":\"request\"," | 5326 "\"type\":\"request\"," |
| 5318 "\"command\":\"evaluate\"," | 5327 "\"command\":\"evaluate\"," |
| 5319 "\"arguments\":{\"expression\":\"dog()\",\"disable_break\":true}}"; | 5328 "\"arguments\":{\"expression\":\"dog()\",\"disable_break\":true}}"; |
| 5320 } | 5329 } |
| 5321 const char* command_8 = "{\"seq\":108," | 5330 const char* command_8 = "{\"seq\":108," |
| 5322 "\"type\":\"request\"," | 5331 "\"type\":\"request\"," |
| 5323 "\"command\":\"continue\"}"; | 5332 "\"command\":\"continue\"}"; |
| 5324 | 5333 |
| 5325 | 5334 |
| 5335 v8::Isolate* isolate = CcTest::isolate(); | |
| 5326 // v8 thread initializes, runs source_1 | 5336 // v8 thread initializes, runs source_1 |
| 5327 breakpoints_barriers->barrier_1.Wait(); | 5337 breakpoints_barriers->barrier_1.Wait(); |
| 5328 // 1:Set breakpoint in cat() (will get id 1). | 5338 // 1:Set breakpoint in cat() (will get id 1). |
| 5329 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_1, buffer)); | 5339 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_1, buffer)); |
| 5330 // 2:Set breakpoint in dog() (will get id 2). | 5340 // 2:Set breakpoint in dog() (will get id 2). |
| 5331 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_2, buffer)); | 5341 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_2, buffer)); |
| 5332 breakpoints_barriers->barrier_2.Wait(); | 5342 breakpoints_barriers->barrier_2.Wait(); |
| 5333 // V8 thread starts compiling source_2. | 5343 // V8 thread starts compiling source_2. |
| 5334 // Automatic break happens, to run queued commands | 5344 // Automatic break happens, to run queued commands |
| 5335 // breakpoints_barriers->semaphore_1.Wait(); | 5345 // breakpoints_barriers->semaphore_1.Wait(); |
| 5336 // Commands 1 through 3 run, thread continues. | 5346 // Commands 1 through 3 run, thread continues. |
| 5337 // v8 thread runs source_2 to breakpoint in cat(). | 5347 // v8 thread runs source_2 to breakpoint in cat(). |
| 5338 // message callback receives break event. | 5348 // message callback receives break event. |
| 5339 breakpoints_barriers->semaphore_1.Wait(); | 5349 breakpoints_barriers->semaphore_1.Wait(); |
| 5340 // Must have hit breakpoint #1. | 5350 // Must have hit breakpoint #1. |
| 5341 CHECK_EQ(1, break_event_breakpoint_id); | 5351 CHECK_EQ(1, break_event_breakpoint_id); |
| 5342 // 4:Evaluate dog() (which has a breakpoint). | 5352 // 4:Evaluate dog() (which has a breakpoint). |
| 5343 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_3, buffer)); | 5353 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_3, buffer)); |
| 5344 // V8 thread hits breakpoint in dog(). | 5354 // V8 thread hits breakpoint in dog(). |
| 5345 breakpoints_barriers->semaphore_1.Wait(); // wait for break event | 5355 breakpoints_barriers->semaphore_1.Wait(); // wait for break event |
| 5346 // Must have hit breakpoint #2. | 5356 // Must have hit breakpoint #2. |
| 5347 CHECK_EQ(2, break_event_breakpoint_id); | 5357 CHECK_EQ(2, break_event_breakpoint_id); |
| 5348 // 5:Evaluate (x + 1). | 5358 // 5:Evaluate (x + 1). |
| 5349 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_4, buffer)); | 5359 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_4, buffer)); |
| 5350 // Evaluate (x + 1) finishes. | 5360 // Evaluate (x + 1) finishes. |
| 5351 breakpoints_barriers->semaphore_1.Wait(); | 5361 breakpoints_barriers->semaphore_1.Wait(); |
| 5352 // Must have result 108. | 5362 // Must have result 108. |
| 5353 CHECK_EQ(108, evaluate_int_result); | 5363 CHECK_EQ(108, evaluate_int_result); |
| 5354 // 6:Continue evaluation of dog(). | 5364 // 6:Continue evaluation of dog(). |
| 5355 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_5, buffer)); | 5365 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_5, buffer)); |
| 5356 // Evaluate dog() finishes. | 5366 // Evaluate dog() finishes. |
| 5357 breakpoints_barriers->semaphore_1.Wait(); | 5367 breakpoints_barriers->semaphore_1.Wait(); |
| 5358 // Must have result 107. | 5368 // Must have result 107. |
| 5359 CHECK_EQ(107, evaluate_int_result); | 5369 CHECK_EQ(107, evaluate_int_result); |
| 5360 // 7:Continue evaluation of source_2, finish cat(17), hit breakpoint | 5370 // 7:Continue evaluation of source_2, finish cat(17), hit breakpoint |
| 5361 // in cat(19). | 5371 // in cat(19). |
| 5362 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_6, buffer)); | 5372 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_6, buffer)); |
| 5363 // Message callback gets break event. | 5373 // Message callback gets break event. |
| 5364 breakpoints_barriers->semaphore_1.Wait(); // wait for break event | 5374 breakpoints_barriers->semaphore_1.Wait(); // wait for break event |
| 5365 // Must have hit breakpoint #1. | 5375 // Must have hit breakpoint #1. |
| 5366 CHECK_EQ(1, break_event_breakpoint_id); | 5376 CHECK_EQ(1, break_event_breakpoint_id); |
| 5367 // 8: Evaluate dog() with breaks disabled. | 5377 // 8: Evaluate dog() with breaks disabled. |
| 5368 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_7, buffer)); | 5378 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_7, buffer)); |
| 5369 // Evaluate dog() finishes. | 5379 // Evaluate dog() finishes. |
| 5370 breakpoints_barriers->semaphore_1.Wait(); | 5380 breakpoints_barriers->semaphore_1.Wait(); |
| 5371 // Must have result 116. | 5381 // Must have result 116. |
| 5372 CHECK_EQ(116, evaluate_int_result); | 5382 CHECK_EQ(116, evaluate_int_result); |
| 5373 // 9: Continue evaluation of source2, reach end. | 5383 // 9: Continue evaluation of source2, reach end. |
| 5374 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_8, buffer)); | 5384 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_8, buffer)); |
| 5375 } | 5385 } |
| 5376 | 5386 |
| 5377 | 5387 |
| 5378 void TestRecursiveBreakpointsGeneric(bool global_evaluate) { | 5388 void TestRecursiveBreakpointsGeneric(bool global_evaluate) { |
| 5379 i::FLAG_debugger_auto_break = true; | 5389 i::FLAG_debugger_auto_break = true; |
| 5380 | 5390 |
| 5381 BreakpointsDebuggerThread breakpoints_debugger_thread(global_evaluate); | 5391 BreakpointsDebuggerThread breakpoints_debugger_thread(global_evaluate); |
| 5382 BreakpointsV8Thread breakpoints_v8_thread; | 5392 BreakpointsV8Thread breakpoints_v8_thread; |
| 5383 | 5393 |
| 5384 // Create a V8 environment | 5394 // Create a V8 environment |
| 5385 Barriers stack_allocated_breakpoints_barriers; | 5395 Barriers stack_allocated_breakpoints_barriers; |
| 5386 breakpoints_barriers = &stack_allocated_breakpoints_barriers; | 5396 breakpoints_barriers = &stack_allocated_breakpoints_barriers; |
| 5387 | 5397 |
| 5388 breakpoints_v8_thread.Start(); | 5398 breakpoints_v8_thread.Start(); |
| 5389 breakpoints_debugger_thread.Start(); | 5399 breakpoints_debugger_thread.Start(); |
| 5390 | 5400 |
| 5391 breakpoints_v8_thread.Join(); | 5401 breakpoints_v8_thread.Join(); |
| 5392 breakpoints_debugger_thread.Join(); | 5402 breakpoints_debugger_thread.Join(); |
| 5393 } | 5403 } |
| 5394 | 5404 |
| 5395 | 5405 |
| 5396 TEST(RecursiveBreakpoints) { | 5406 UNINITIALIZED_TEST(RecursiveBreakpoints) { |
| 5397 TestRecursiveBreakpointsGeneric(false); | 5407 TestRecursiveBreakpointsGeneric(false); |
| 5398 } | 5408 } |
| 5399 | 5409 |
| 5400 | 5410 |
| 5401 TEST(RecursiveBreakpointsGlobal) { | 5411 UNINITIALIZED_TEST(RecursiveBreakpointsGlobal) { |
| 5402 TestRecursiveBreakpointsGeneric(true); | 5412 TestRecursiveBreakpointsGeneric(true); |
| 5403 } | 5413 } |
| 5404 | 5414 |
| 5405 | 5415 |
| 5406 static void DummyDebugEventListener( | 5416 static void DummyDebugEventListener( |
| 5407 const v8::Debug::EventDetails& event_details) { | 5417 const v8::Debug::EventDetails& event_details) { |
| 5408 } | 5418 } |
| 5409 | 5419 |
| 5410 | 5420 |
| 5411 TEST(SetDebugEventListenerOnUninitializedVM) { | 5421 TEST(SetDebugEventListenerOnUninitializedVM) { |
| 5412 v8::Debug::SetDebugEventListener2(DummyDebugEventListener); | 5422 v8::Debug::SetDebugEventListener2(DummyDebugEventListener); |
| 5413 } | 5423 } |
| 5414 | 5424 |
| 5415 | 5425 |
| 5416 static void DummyMessageHandler(const v8::Debug::Message& message) { | 5426 static void DummyMessageHandler(const v8::Debug::Message& message) { |
| 5417 } | 5427 } |
| 5418 | 5428 |
| 5419 | 5429 |
| 5420 TEST(SetMessageHandlerOnUninitializedVM) { | 5430 TEST(SetMessageHandlerOnUninitializedVM) { |
| 5421 v8::Debug::SetMessageHandler2(DummyMessageHandler); | 5431 v8::Debug::SetMessageHandler2(DummyMessageHandler); |
| 5422 } | 5432 } |
| 5423 | 5433 |
| 5424 | 5434 |
| 5425 TEST(DebugBreakOnUninitializedVM) { | |
| 5426 v8::Debug::DebugBreak(); | |
| 5427 } | |
| 5428 | |
| 5429 | |
| 5430 TEST(SendCommandToUninitializedVM) { | |
| 5431 const char* dummy_command = "{}"; | |
| 5432 uint16_t dummy_buffer[80]; | |
| 5433 int dummy_length = AsciiToUtf16(dummy_command, dummy_buffer); | |
| 5434 v8::Debug::SendCommand(dummy_buffer, dummy_length); | |
| 5435 } | |
| 5436 | |
| 5437 | |
| 5438 // Source for a JavaScript function which returns the data parameter of a | 5435 // Source for a JavaScript function which returns the data parameter of a |
| 5439 // function called in the context of the debugger. If no data parameter is | 5436 // function called in the context of the debugger. If no data parameter is |
| 5440 // passed it throws an exception. | 5437 // passed it throws an exception. |
| 5441 static const char* debugger_call_with_data_source = | 5438 static const char* debugger_call_with_data_source = |
| 5442 "function debugger_call_with_data(exec_state, data) {" | 5439 "function debugger_call_with_data(exec_state, data) {" |
| 5443 " if (data) return data;" | 5440 " if (data) return data;" |
| 5444 " throw 'No data!'" | 5441 " throw 'No data!'" |
| 5445 "}"; | 5442 "}"; |
| 5446 v8::Handle<v8::Function> debugger_call_with_data; | 5443 v8::Handle<v8::Function> debugger_call_with_data; |
| 5447 | 5444 |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5657 | 5654 |
| 5658 // Sends continue command to the debugger. | 5655 // Sends continue command to the debugger. |
| 5659 static void SendContinueCommand() { | 5656 static void SendContinueCommand() { |
| 5660 const int kBufferSize = 1000; | 5657 const int kBufferSize = 1000; |
| 5661 uint16_t buffer[kBufferSize]; | 5658 uint16_t buffer[kBufferSize]; |
| 5662 const char* command_continue = | 5659 const char* command_continue = |
| 5663 "{\"seq\":0," | 5660 "{\"seq\":0," |
| 5664 "\"type\":\"request\"," | 5661 "\"type\":\"request\"," |
| 5665 "\"command\":\"continue\"}"; | 5662 "\"command\":\"continue\"}"; |
| 5666 | 5663 |
| 5667 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_continue, buffer)); | 5664 v8::Debug::SendCommand( |
| 5665 CcTest::isolate(), buffer, AsciiToUtf16(command_continue, buffer)); | |
| 5668 } | 5666 } |
| 5669 | 5667 |
| 5670 | 5668 |
| 5671 // Debugger message handler which counts the number of times it is called. | 5669 // Debugger message handler which counts the number of times it is called. |
| 5672 static int message_handler_hit_count = 0; | 5670 static int message_handler_hit_count = 0; |
| 5673 static void MessageHandlerHitCount(const v8::Debug::Message& message) { | 5671 static void MessageHandlerHitCount(const v8::Debug::Message& message) { |
| 5674 message_handler_hit_count++; | 5672 message_handler_hit_count++; |
| 5675 | 5673 |
| 5676 static char print_buffer[1000]; | 5674 static char print_buffer[1000]; |
| 5677 v8::String::Value json(message.GetJSON()); | 5675 v8::String::Value json(message.GetJSON()); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5811 uint16_t buffer[kBufSize]; | 5809 uint16_t buffer[kBufSize]; |
| 5812 | 5810 |
| 5813 const char* command_1 = "{\"seq\":101," | 5811 const char* command_1 = "{\"seq\":101," |
| 5814 "\"type\":\"request\"," | 5812 "\"type\":\"request\"," |
| 5815 "\"command\":\"setbreakpoint\"," | 5813 "\"command\":\"setbreakpoint\"," |
| 5816 "\"arguments\":{\"type\":\"function\",\"target\":\"cat\",\"line\":3}}"; | 5814 "\"arguments\":{\"type\":\"function\",\"target\":\"cat\",\"line\":3}}"; |
| 5817 const char* command_2 = "{\"seq\":102," | 5815 const char* command_2 = "{\"seq\":102," |
| 5818 "\"type\":\"request\"," | 5816 "\"type\":\"request\"," |
| 5819 "\"command\":\"continue\"}"; | 5817 "\"command\":\"continue\"}"; |
| 5820 | 5818 |
| 5819 v8::Isolate* isolate = CcTest::isolate(); | |
| 5821 // v8 thread initializes, runs source_1 | 5820 // v8 thread initializes, runs source_1 |
| 5822 host_dispatch_barriers->barrier_1.Wait(); | 5821 host_dispatch_barriers->barrier_1.Wait(); |
| 5823 // 1: Set breakpoint in cat(). | 5822 // 1: Set breakpoint in cat(). |
| 5824 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_1, buffer)); | 5823 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_1, buffer)); |
| 5825 | 5824 |
| 5826 host_dispatch_barriers->barrier_2.Wait(); | 5825 host_dispatch_barriers->barrier_2.Wait(); |
| 5827 // v8 thread starts compiling source_2. | 5826 // v8 thread starts compiling source_2. |
| 5828 // Break happens, to run queued commands and host dispatches. | 5827 // Break happens, to run queued commands and host dispatches. |
| 5829 // Wait for host dispatch to be processed. | 5828 // Wait for host dispatch to be processed. |
| 5830 host_dispatch_barriers->semaphore_1.Wait(); | 5829 host_dispatch_barriers->semaphore_1.Wait(); |
| 5831 // 2: Continue evaluation | 5830 // 2: Continue evaluation |
| 5832 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_2, buffer)); | 5831 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_2, buffer)); |
| 5833 } | 5832 } |
| 5834 | 5833 |
| 5835 | 5834 |
| 5836 TEST(DebuggerHostDispatch) { | 5835 UNINITIALIZED_TEST(DebuggerHostDispatch) { |
| 5837 HostDispatchDebuggerThread host_dispatch_debugger_thread; | 5836 HostDispatchDebuggerThread host_dispatch_debugger_thread; |
| 5838 HostDispatchV8Thread host_dispatch_v8_thread; | 5837 HostDispatchV8Thread host_dispatch_v8_thread; |
| 5839 i::FLAG_debugger_auto_break = true; | 5838 i::FLAG_debugger_auto_break = true; |
| 5840 | 5839 |
| 5841 // Create a V8 environment | 5840 // Create a V8 environment |
| 5842 Barriers stack_allocated_host_dispatch_barriers; | 5841 Barriers stack_allocated_host_dispatch_barriers; |
| 5843 host_dispatch_barriers = &stack_allocated_host_dispatch_barriers; | 5842 host_dispatch_barriers = &stack_allocated_host_dispatch_barriers; |
| 5844 | 5843 |
| 5845 host_dispatch_v8_thread.Start(); | 5844 host_dispatch_v8_thread.Start(); |
| 5846 host_dispatch_debugger_thread.Start(); | 5845 host_dispatch_debugger_thread.Start(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5892 } | 5891 } |
| 5893 | 5892 |
| 5894 | 5893 |
| 5895 void DebugMessageDispatchDebuggerThread::Run() { | 5894 void DebugMessageDispatchDebuggerThread::Run() { |
| 5896 debug_message_dispatch_barriers->barrier_1.Wait(); | 5895 debug_message_dispatch_barriers->barrier_1.Wait(); |
| 5897 SendContinueCommand(); | 5896 SendContinueCommand(); |
| 5898 debug_message_dispatch_barriers->barrier_2.Wait(); | 5897 debug_message_dispatch_barriers->barrier_2.Wait(); |
| 5899 } | 5898 } |
| 5900 | 5899 |
| 5901 | 5900 |
| 5902 TEST(DebuggerDebugMessageDispatch) { | 5901 UNINITIALIZED_TEST(DebuggerDebugMessageDispatch) { |
| 5903 DebugMessageDispatchDebuggerThread debug_message_dispatch_debugger_thread; | 5902 DebugMessageDispatchDebuggerThread debug_message_dispatch_debugger_thread; |
| 5904 DebugMessageDispatchV8Thread debug_message_dispatch_v8_thread; | 5903 DebugMessageDispatchV8Thread debug_message_dispatch_v8_thread; |
| 5905 | 5904 |
| 5906 i::FLAG_debugger_auto_break = true; | 5905 i::FLAG_debugger_auto_break = true; |
| 5907 | 5906 |
| 5908 // Create a V8 environment | 5907 // Create a V8 environment |
| 5909 Barriers stack_allocated_debug_message_dispatch_barriers; | 5908 Barriers stack_allocated_debug_message_dispatch_barriers; |
| 5910 debug_message_dispatch_barriers = | 5909 debug_message_dispatch_barriers = |
| 5911 &stack_allocated_debug_message_dispatch_barriers; | 5910 &stack_allocated_debug_message_dispatch_barriers; |
| 5912 | 5911 |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6291 } | 6290 } |
| 6292 | 6291 |
| 6293 | 6292 |
| 6294 // Debug message handler which issues a debug break when it hits a break event. | 6293 // Debug message handler which issues a debug break when it hits a break event. |
| 6295 static int message_handler_break_hit_count = 0; | 6294 static int message_handler_break_hit_count = 0; |
| 6296 static void DebugBreakMessageHandler(const v8::Debug::Message& message) { | 6295 static void DebugBreakMessageHandler(const v8::Debug::Message& message) { |
| 6297 // Schedule a debug break for break events. | 6296 // Schedule a debug break for break events. |
| 6298 if (message.IsEvent() && message.GetEvent() == v8::Break) { | 6297 if (message.IsEvent() && message.GetEvent() == v8::Break) { |
| 6299 message_handler_break_hit_count++; | 6298 message_handler_break_hit_count++; |
| 6300 if (message_handler_break_hit_count == 1) { | 6299 if (message_handler_break_hit_count == 1) { |
| 6301 v8::Debug::DebugBreak(); | 6300 v8::Debug::DebugBreak(message.GetIsolate()); |
| 6302 } | 6301 } |
| 6303 } | 6302 } |
| 6304 | 6303 |
| 6305 // Issue a continue command if this event will not cause the VM to start | 6304 // Issue a continue command if this event will not cause the VM to start |
| 6306 // running. | 6305 // running. |
| 6307 if (!message.WillStartRunning()) { | 6306 if (!message.WillStartRunning()) { |
| 6308 SendContinueCommand(); | 6307 SendContinueCommand(); |
| 6309 } | 6308 } |
| 6310 } | 6309 } |
| 6311 | 6310 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6363 } | 6362 } |
| 6364 | 6363 |
| 6365 // Keep forcing breaks. | 6364 // Keep forcing breaks. |
| 6366 if (break_point_hit_count < 20) { | 6365 if (break_point_hit_count < 20) { |
| 6367 v8::Debug::DebugBreak(); | 6366 v8::Debug::DebugBreak(); |
| 6368 } | 6367 } |
| 6369 } | 6368 } |
| 6370 } | 6369 } |
| 6371 | 6370 |
| 6372 | 6371 |
| 6373 TEST(RegExpDebugBreak) { | 6372 UNINITIALIZED_TEST(RegExpDebugBreak) { |
| 6374 // This test only applies to native regexps. | 6373 // This test only applies to native regexps. |
| 6375 DebugLocalContext env; | 6374 DebugLocalContext env; |
| 6376 v8::HandleScope scope(env->GetIsolate()); | 6375 v8::HandleScope scope(env->GetIsolate()); |
| 6377 | 6376 |
| 6378 // Create a function for checking the function when hitting a break point. | 6377 // Create a function for checking the function when hitting a break point. |
| 6379 frame_function_name = CompileFunction(&env, | 6378 frame_function_name = CompileFunction(&env, |
| 6380 frame_function_name_source, | 6379 frame_function_name_source, |
| 6381 "frame_function_name"); | 6380 "frame_function_name"); |
| 6382 | 6381 |
| 6383 // Test RegExp which matches white spaces and comments at the begining of a | 6382 // Test RegExp which matches white spaces and comments at the begining of a |
| 6384 // source line. | 6383 // source line. |
| 6385 const char* script = | 6384 const char* script = |
| 6386 "var sourceLineBeginningSkip = /^(?:[ \\v\\h]*(?:\\/\\*.*?\\*\\/)*)*/;\n" | 6385 "var sourceLineBeginningSkip = /^(?:[ \\v\\h]*(?:\\/\\*.*?\\*\\/)*)*/;\n" |
| 6387 "function f(s) { return s.match(sourceLineBeginningSkip)[0].length; }"; | 6386 "function f(s) { return s.match(sourceLineBeginningSkip)[0].length; }"; |
| 6388 | 6387 |
| 6389 v8::Local<v8::Function> f = CompileFunction(script, "f"); | 6388 v8::Local<v8::Function> f = CompileFunction(script, "f"); |
| 6390 const int argc = 1; | 6389 const int argc = 1; |
| 6391 v8::Handle<v8::Value> argv[argc] = { v8::String::New(" /* xxx */ a=0;") }; | 6390 v8::Handle<v8::Value> argv[argc] = { v8::String::New(" /* xxx */ a=0;") }; |
| 6392 v8::Local<v8::Value> result = f->Call(env->Global(), argc, argv); | 6391 v8::Local<v8::Value> result = f->Call(env->Global(), argc, argv); |
| 6393 CHECK_EQ(12, result->Int32Value()); | 6392 CHECK_EQ(12, result->Int32Value()); |
| 6394 | 6393 |
| 6395 v8::Debug::SetDebugEventListener2(DebugEventDebugBreak); | 6394 v8::Debug::SetDebugEventListener2(DebugEventDebugBreak); |
| 6396 v8::Debug::DebugBreak(); | 6395 v8::Debug::DebugBreak(env->GetIsolate()); |
| 6397 result = f->Call(env->Global(), argc, argv); | 6396 result = f->Call(env->Global(), argc, argv); |
| 6398 | 6397 |
| 6399 // Check that there was only one break event. Matching RegExp should not | 6398 // Check that there was only one break event. Matching RegExp should not |
| 6400 // cause Break events. | 6399 // cause Break events. |
| 6401 CHECK_EQ(1, break_point_hit_count); | 6400 CHECK_EQ(1, break_point_hit_count); |
| 6402 CHECK_EQ("f", last_function_hit); | 6401 CHECK_EQ("f", last_function_hit); |
| 6403 } | 6402 } |
| 6404 #endif // V8_INTERPRETED_REGEXP | 6403 #endif // V8_INTERPRETED_REGEXP |
| 6405 | 6404 |
| 6406 | 6405 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6464 const v8::Debug::Message& message) { | 6463 const v8::Debug::Message& message) { |
| 6465 CHECK(message.GetEventContext() == expected_context); | 6464 CHECK(message.GetEventContext() == expected_context); |
| 6466 CHECK(message.GetEventContext()->GetEmbedderData(0)->StrictEquals( | 6465 CHECK(message.GetEventContext()->GetEmbedderData(0)->StrictEquals( |
| 6467 expected_context_data)); | 6466 expected_context_data)); |
| 6468 message_handler_hit_count++; | 6467 message_handler_hit_count++; |
| 6469 | 6468 |
| 6470 static char print_buffer[1000]; | 6469 static char print_buffer[1000]; |
| 6471 v8::String::Value json(message.GetJSON()); | 6470 v8::String::Value json(message.GetJSON()); |
| 6472 Utf16ToAscii(*json, json.length(), print_buffer); | 6471 Utf16ToAscii(*json, json.length(), print_buffer); |
| 6473 | 6472 |
| 6473 v8::Isolate* isolate = message.GetIsolate(); | |
| 6474 if (IsBreakEventMessage(print_buffer)) { | 6474 if (IsBreakEventMessage(print_buffer)) { |
| 6475 break_count++; | 6475 break_count++; |
| 6476 if (!sent_eval) { | 6476 if (!sent_eval) { |
| 6477 sent_eval = true; | 6477 sent_eval = true; |
| 6478 | 6478 |
| 6479 const int kBufferSize = 1000; | 6479 const int kBufferSize = 1000; |
| 6480 uint16_t buffer[kBufferSize]; | 6480 uint16_t buffer[kBufferSize]; |
| 6481 const char* eval_command = | 6481 const char* eval_command = |
| 6482 "{\"seq\":0," | 6482 "{\"seq\":0," |
| 6483 "\"type\":\"request\"," | 6483 "\"type\":\"request\"," |
| 6484 "\"command\":\"evaluate\"," | 6484 "\"command\":\"evaluate\"," |
| 6485 "\"arguments\":{\"expression\":\"debugger;\"," | 6485 "\"arguments\":{\"expression\":\"debugger;\"," |
| 6486 "\"global\":true,\"disable_break\":false}}"; | 6486 "\"global\":true,\"disable_break\":false}}"; |
| 6487 | 6487 |
| 6488 // Send evaluate command. | 6488 // Send evaluate command. |
| 6489 v8::Debug::SendCommand(buffer, AsciiToUtf16(eval_command, buffer)); | 6489 v8::Debug::SendCommand( |
| 6490 isolate, buffer, AsciiToUtf16(eval_command, buffer)); | |
| 6490 return; | 6491 return; |
| 6491 } else { | 6492 } else { |
| 6492 // It's a break event caused by the evaluation request above. | 6493 // It's a break event caused by the evaluation request above. |
| 6493 SendContinueCommand(); | 6494 SendContinueCommand(); |
| 6494 continue_command_send_count++; | 6495 continue_command_send_count++; |
| 6495 } | 6496 } |
| 6496 } else if (IsEvaluateResponseMessage(print_buffer) && | 6497 } else if (IsEvaluateResponseMessage(print_buffer) && |
| 6497 continue_command_send_count < 2) { | 6498 continue_command_send_count < 2) { |
| 6498 // Response to the evaluation request. We're still on the breakpoint so | 6499 // Response to the evaluation request. We're still on the breakpoint so |
| 6499 // send continue. | 6500 // send continue. |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6653 DebugLocalContext env; | 6654 DebugLocalContext env; |
| 6654 v8::HandleScope scope(env->GetIsolate()); | 6655 v8::HandleScope scope(env->GetIsolate()); |
| 6655 after_compile_message_count = 0; | 6656 after_compile_message_count = 0; |
| 6656 const char* script = "var a=1"; | 6657 const char* script = "var a=1"; |
| 6657 | 6658 |
| 6658 v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); | 6659 v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); |
| 6659 v8::Script::Compile(v8::String::New(script))->Run(); | 6660 v8::Script::Compile(v8::String::New(script))->Run(); |
| 6660 v8::Debug::SetMessageHandler2(NULL); | 6661 v8::Debug::SetMessageHandler2(NULL); |
| 6661 | 6662 |
| 6662 v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); | 6663 v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); |
| 6663 v8::Debug::DebugBreak(); | 6664 v8::Debug::DebugBreak(env->GetIsolate()); |
| 6664 v8::Script::Compile(v8::String::New(script))->Run(); | 6665 v8::Script::Compile(v8::String::New(script))->Run(); |
| 6665 | 6666 |
| 6666 // Setting listener to NULL should cause debugger unload. | 6667 // Setting listener to NULL should cause debugger unload. |
| 6667 v8::Debug::SetMessageHandler2(NULL); | 6668 v8::Debug::SetMessageHandler2(NULL); |
| 6668 CheckDebuggerUnloaded(); | 6669 CheckDebuggerUnloaded(); |
| 6669 | 6670 |
| 6670 // Compilation cache should be disabled when debugger is active. | 6671 // Compilation cache should be disabled when debugger is active. |
| 6671 CHECK_EQ(2, after_compile_message_count); | 6672 CHECK_EQ(2, after_compile_message_count); |
| 6672 } | 6673 } |
| 6673 | 6674 |
| 6674 | 6675 |
| 6675 // Tests that break event is sent when message handler is reset. | 6676 // Tests that break event is sent when message handler is reset. |
| 6676 TEST(BreakMessageWhenMessageHandlerIsReset) { | 6677 TEST(BreakMessageWhenMessageHandlerIsReset) { |
| 6677 DebugLocalContext env; | 6678 DebugLocalContext env; |
| 6678 v8::HandleScope scope(env->GetIsolate()); | 6679 v8::HandleScope scope(env->GetIsolate()); |
| 6679 after_compile_message_count = 0; | 6680 after_compile_message_count = 0; |
| 6680 const char* script = "function f() {};"; | 6681 const char* script = "function f() {};"; |
| 6681 | 6682 |
| 6682 v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); | 6683 v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); |
| 6683 v8::Script::Compile(v8::String::New(script))->Run(); | 6684 v8::Script::Compile(v8::String::New(script))->Run(); |
| 6684 v8::Debug::SetMessageHandler2(NULL); | 6685 v8::Debug::SetMessageHandler2(NULL); |
| 6685 | 6686 |
| 6686 v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); | 6687 v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); |
| 6687 v8::Debug::DebugBreak(); | 6688 v8::Debug::DebugBreak(env->GetIsolate()); |
| 6688 v8::Local<v8::Function> f = | 6689 v8::Local<v8::Function> f = |
| 6689 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); | 6690 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); |
| 6690 f->Call(env->Global(), 0, NULL); | 6691 f->Call(env->Global(), 0, NULL); |
| 6691 | 6692 |
| 6692 // Setting message handler to NULL should cause debugger unload. | 6693 // Setting message handler to NULL should cause debugger unload. |
| 6693 v8::Debug::SetMessageHandler2(NULL); | 6694 v8::Debug::SetMessageHandler2(NULL); |
| 6694 CheckDebuggerUnloaded(); | 6695 CheckDebuggerUnloaded(); |
| 6695 | 6696 |
| 6696 // Compilation cache should be disabled when debugger is active. | 6697 // Compilation cache should be disabled when debugger is active. |
| 6697 CHECK_EQ(1, after_compile_message_count); | 6698 CHECK_EQ(1, after_compile_message_count); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6797 isolate->stack_guard()->DebugBreak(); | 6798 isolate->stack_guard()->DebugBreak(); |
| 6798 } else { | 6799 } else { |
| 6799 isolate->stack_guard()->Continue(i::DEBUGBREAK); | 6800 isolate->stack_guard()->Continue(i::DEBUGBREAK); |
| 6800 } | 6801 } |
| 6801 } | 6802 } |
| 6802 } | 6803 } |
| 6803 | 6804 |
| 6804 | 6805 |
| 6805 // Test that if DebugBreak is forced it is ignored when code from | 6806 // Test that if DebugBreak is forced it is ignored when code from |
| 6806 // debug-delay.js is executed. | 6807 // debug-delay.js is executed. |
| 6807 TEST(NoDebugBreakInAfterCompileMessageHandler) { | 6808 UNINITIALIZED_TEST(NoDebugBreakInAfterCompileMessageHandler) { |
| 6808 DebugLocalContext env; | 6809 DebugLocalContext env; |
| 6809 v8::HandleScope scope(env->GetIsolate()); | 6810 v8::HandleScope scope(env->GetIsolate()); |
| 6810 | 6811 |
| 6811 // Register a debug event listener which sets the break flag and counts. | 6812 // Register a debug event listener which sets the break flag and counts. |
| 6812 v8::Debug::SetMessageHandler2(BreakMessageHandler); | 6813 v8::Debug::SetMessageHandler2(BreakMessageHandler); |
| 6813 | 6814 |
| 6814 // Set the debug break flag. | 6815 // Set the debug break flag. |
| 6815 v8::Debug::DebugBreak(); | 6816 v8::Debug::DebugBreak(); |
| 6816 | 6817 |
| 6817 // Create a function for testing stepping. | 6818 // Create a function for testing stepping. |
| 6818 const char* src = "function f() { eval('var x = 10;'); } "; | 6819 const char* src = "function f() { eval('var x = 10;'); } "; |
| 6819 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); | 6820 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); |
| 6820 | 6821 |
| 6821 // There should be only one break event. | 6822 // There should be only one break event. |
| 6822 CHECK_EQ(1, break_point_hit_count); | 6823 CHECK_EQ(1, break_point_hit_count); |
| 6823 | 6824 |
| 6824 // Set the debug break flag again. | 6825 // Set the debug break flag again. |
| 6825 v8::Debug::DebugBreak(); | 6826 v8::Debug::DebugBreak(env->GetIsolate()); |
| 6826 f->Call(env->Global(), 0, NULL); | 6827 f->Call(env->Global(), 0, NULL); |
| 6827 // There should be one more break event when the script is evaluated in 'f'. | 6828 // There should be one more break event when the script is evaluated in 'f'. |
| 6828 CHECK_EQ(2, break_point_hit_count); | 6829 CHECK_EQ(2, break_point_hit_count); |
| 6829 | 6830 |
| 6830 // Get rid of the debug message handler. | 6831 // Get rid of the debug message handler. |
| 6831 v8::Debug::SetMessageHandler2(NULL); | 6832 v8::Debug::SetMessageHandler2(NULL); |
| 6832 CheckDebuggerUnloaded(); | 6833 CheckDebuggerUnloaded(); |
| 6833 } | 6834 } |
| 6834 | 6835 |
| 6835 | 6836 |
| 6836 static int counting_message_handler_counter; | 6837 static int counting_message_handler_counter; |
| 6837 | 6838 |
| 6838 static void CountingMessageHandler(const v8::Debug::Message& message) { | 6839 static void CountingMessageHandler(const v8::Debug::Message& message) { |
| 6839 counting_message_handler_counter++; | 6840 counting_message_handler_counter++; |
| 6840 } | 6841 } |
| 6841 | 6842 |
| 6842 | 6843 |
| 6843 // Test that debug messages get processed when ProcessDebugMessages is called. | 6844 // Test that debug messages get processed when ProcessDebugMessages is called. |
| 6844 TEST(ProcessDebugMessages) { | 6845 TEST(ProcessDebugMessages) { |
| 6845 DebugLocalContext env; | 6846 DebugLocalContext env; |
| 6846 v8::HandleScope scope(env->GetIsolate()); | 6847 v8::Isolate* isolate = env->GetIsolate(); |
| 6848 v8::HandleScope scope(isolate); | |
| 6847 | 6849 |
| 6848 counting_message_handler_counter = 0; | 6850 counting_message_handler_counter = 0; |
| 6849 | 6851 |
| 6850 v8::Debug::SetMessageHandler2(CountingMessageHandler); | 6852 v8::Debug::SetMessageHandler2(CountingMessageHandler); |
| 6851 | 6853 |
| 6852 const int kBufferSize = 1000; | 6854 const int kBufferSize = 1000; |
| 6853 uint16_t buffer[kBufferSize]; | 6855 uint16_t buffer[kBufferSize]; |
| 6854 const char* scripts_command = | 6856 const char* scripts_command = |
| 6855 "{\"seq\":0," | 6857 "{\"seq\":0," |
| 6856 "\"type\":\"request\"," | 6858 "\"type\":\"request\"," |
| 6857 "\"command\":\"scripts\"}"; | 6859 "\"command\":\"scripts\"}"; |
| 6858 | 6860 |
| 6859 // Send scripts command. | 6861 // Send scripts command. |
| 6860 v8::Debug::SendCommand(buffer, AsciiToUtf16(scripts_command, buffer)); | 6862 v8::Debug::SendCommand( |
| 6863 isolate, buffer, AsciiToUtf16(scripts_command, buffer)); | |
| 6861 | 6864 |
| 6862 CHECK_EQ(0, counting_message_handler_counter); | 6865 CHECK_EQ(0, counting_message_handler_counter); |
| 6863 v8::Debug::ProcessDebugMessages(); | 6866 v8::Debug::ProcessDebugMessages(); |
| 6864 // At least one message should come | 6867 // At least one message should come |
| 6865 CHECK_GE(counting_message_handler_counter, 1); | 6868 CHECK_GE(counting_message_handler_counter, 1); |
| 6866 | 6869 |
| 6867 counting_message_handler_counter = 0; | 6870 counting_message_handler_counter = 0; |
| 6868 | 6871 |
| 6869 v8::Debug::SendCommand(buffer, AsciiToUtf16(scripts_command, buffer)); | 6872 v8::Debug::SendCommand( |
| 6870 v8::Debug::SendCommand(buffer, AsciiToUtf16(scripts_command, buffer)); | 6873 isolate, buffer, AsciiToUtf16(scripts_command, buffer)); |
| 6874 v8::Debug::SendCommand( | |
| 6875 isolate, buffer, AsciiToUtf16(scripts_command, buffer)); | |
| 6871 CHECK_EQ(0, counting_message_handler_counter); | 6876 CHECK_EQ(0, counting_message_handler_counter); |
| 6872 v8::Debug::ProcessDebugMessages(); | 6877 v8::Debug::ProcessDebugMessages(); |
| 6873 // At least two messages should come | 6878 // At least two messages should come |
| 6874 CHECK_GE(counting_message_handler_counter, 2); | 6879 CHECK_GE(counting_message_handler_counter, 2); |
| 6875 | 6880 |
| 6876 // Get rid of the debug message handler. | 6881 // Get rid of the debug message handler. |
| 6877 v8::Debug::SetMessageHandler2(NULL); | 6882 v8::Debug::SetMessageHandler2(NULL); |
| 6878 CheckDebuggerUnloaded(); | 6883 CheckDebuggerUnloaded(); |
| 6879 } | 6884 } |
| 6880 | 6885 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 6892 frame_counter = GetTotalFramesInt(print_buffer); | 6897 frame_counter = GetTotalFramesInt(print_buffer); |
| 6893 } | 6898 } |
| 6894 }; | 6899 }; |
| 6895 | 6900 |
| 6896 int BacktraceData::frame_counter; | 6901 int BacktraceData::frame_counter; |
| 6897 | 6902 |
| 6898 | 6903 |
| 6899 // Test that debug messages get processed when ProcessDebugMessages is called. | 6904 // Test that debug messages get processed when ProcessDebugMessages is called. |
| 6900 TEST(Backtrace) { | 6905 TEST(Backtrace) { |
| 6901 DebugLocalContext env; | 6906 DebugLocalContext env; |
| 6902 v8::HandleScope scope(env->GetIsolate()); | 6907 v8::Isolate* isolate = env->GetIsolate(); |
| 6908 v8::HandleScope scope(isolate); | |
| 6903 | 6909 |
| 6904 v8::Debug::SetMessageHandler2(BacktraceData::MessageHandler); | 6910 v8::Debug::SetMessageHandler2(BacktraceData::MessageHandler); |
| 6905 | 6911 |
| 6906 const int kBufferSize = 1000; | 6912 const int kBufferSize = 1000; |
| 6907 uint16_t buffer[kBufferSize]; | 6913 uint16_t buffer[kBufferSize]; |
| 6908 const char* scripts_command = | 6914 const char* scripts_command = |
| 6909 "{\"seq\":0," | 6915 "{\"seq\":0," |
| 6910 "\"type\":\"request\"," | 6916 "\"type\":\"request\"," |
| 6911 "\"command\":\"backtrace\"}"; | 6917 "\"command\":\"backtrace\"}"; |
| 6912 | 6918 |
| 6913 // Check backtrace from ProcessDebugMessages. | 6919 // Check backtrace from ProcessDebugMessages. |
| 6914 BacktraceData::frame_counter = -10; | 6920 BacktraceData::frame_counter = -10; |
| 6915 v8::Debug::SendCommand(buffer, AsciiToUtf16(scripts_command, buffer)); | 6921 v8::Debug::SendCommand( |
| 6922 isolate, | |
| 6923 buffer, | |
| 6924 AsciiToUtf16(scripts_command, buffer), | |
| 6925 NULL); | |
| 6916 v8::Debug::ProcessDebugMessages(); | 6926 v8::Debug::ProcessDebugMessages(); |
| 6917 CHECK_EQ(BacktraceData::frame_counter, 0); | 6927 CHECK_EQ(BacktraceData::frame_counter, 0); |
| 6918 | 6928 |
| 6919 v8::Handle<v8::String> void0 = v8::String::New("void(0)"); | 6929 v8::Handle<v8::String> void0 = v8::String::New("void(0)"); |
| 6920 v8::Handle<v8::Script> script = v8::Script::Compile(void0, void0); | 6930 v8::Handle<v8::Script> script = v8::Script::Compile(void0, void0); |
| 6921 | 6931 |
| 6922 // Check backtrace from "void(0)" script. | 6932 // Check backtrace from "void(0)" script. |
| 6923 BacktraceData::frame_counter = -10; | 6933 BacktraceData::frame_counter = -10; |
| 6924 v8::Debug::SendCommand(buffer, AsciiToUtf16(scripts_command, buffer)); | 6934 v8::Debug::SendCommand( |
| 6935 isolate, | |
| 6936 buffer, | |
| 6937 AsciiToUtf16(scripts_command, buffer), | |
| 6938 NULL); | |
| 6925 script->Run(); | 6939 script->Run(); |
| 6926 CHECK_EQ(BacktraceData::frame_counter, 1); | 6940 CHECK_EQ(BacktraceData::frame_counter, 1); |
| 6927 | 6941 |
| 6928 // Get rid of the debug message handler. | 6942 // Get rid of the debug message handler. |
| 6929 v8::Debug::SetMessageHandler2(NULL); | 6943 v8::Debug::SetMessageHandler2(NULL); |
| 6930 CheckDebuggerUnloaded(); | 6944 CheckDebuggerUnloaded(); |
| 6931 } | 6945 } |
| 6932 | 6946 |
| 6933 | 6947 |
| 6934 TEST(GetMirror) { | 6948 TEST(GetMirror) { |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 6958 &env, | 6972 &env, |
| 6959 "function baz(x) { }" | 6973 "function baz(x) { }" |
| 6960 "function bar(x) { baz(); }" | 6974 "function bar(x) { baz(); }" |
| 6961 "function foo(){ bar.apply(this, [1]); }", | 6975 "function foo(){ bar.apply(this, [1]); }", |
| 6962 "foo"); | 6976 "foo"); |
| 6963 | 6977 |
| 6964 // Register a debug event listener which steps and counts. | 6978 // Register a debug event listener which steps and counts. |
| 6965 v8::Debug::SetDebugEventListener2(DebugEventBreakMax); | 6979 v8::Debug::SetDebugEventListener2(DebugEventBreakMax); |
| 6966 | 6980 |
| 6967 // Set the debug break flag before calling the code using function.apply. | 6981 // Set the debug break flag before calling the code using function.apply. |
| 6968 v8::Debug::DebugBreak(); | 6982 v8::Debug::DebugBreak(env->GetIsolate()); |
| 6969 | 6983 |
| 6970 // Limit the number of debug breaks. This is a regression test for issue 493 | 6984 // Limit the number of debug breaks. This is a regression test for issue 493 |
| 6971 // where this test would enter an infinite loop. | 6985 // where this test would enter an infinite loop. |
| 6972 break_point_hit_count = 0; | 6986 break_point_hit_count = 0; |
| 6973 max_break_point_hit_count = 10000; // 10000 => infinite loop. | 6987 max_break_point_hit_count = 10000; // 10000 => infinite loop. |
| 6974 foo->Call(env->Global(), 0, NULL); | 6988 foo->Call(env->Global(), 0, NULL); |
| 6975 | 6989 |
| 6976 // When keeping the debug break several break will happen. | 6990 // When keeping the debug break several break will happen. |
| 6977 CHECK_GT(break_point_hit_count, 1); | 6991 CHECK_GT(break_point_hit_count, 1); |
| 6978 | 6992 |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7105 was_debug_event_called = true; | 7119 was_debug_event_called = true; |
| 7106 } else if (details.GetEvent() == v8::Break) { | 7120 } else if (details.GetEvent() == v8::Break) { |
| 7107 was_debug_break_called = true; | 7121 was_debug_break_called = true; |
| 7108 } | 7122 } |
| 7109 } | 7123 } |
| 7110 | 7124 |
| 7111 | 7125 |
| 7112 // Check that event details contain context where debug event occured. | 7126 // Check that event details contain context where debug event occured. |
| 7113 TEST(DebugEventBreakData) { | 7127 TEST(DebugEventBreakData) { |
| 7114 DebugLocalContext env; | 7128 DebugLocalContext env; |
| 7115 v8::HandleScope scope(env->GetIsolate()); | 7129 v8::Isolate* isolate = env->GetIsolate(); |
| 7130 v8::HandleScope scope(isolate); | |
| 7116 v8::Debug::SetDebugEventListener2(DebugEventBreakDataChecker); | 7131 v8::Debug::SetDebugEventListener2(DebugEventBreakDataChecker); |
| 7117 | 7132 |
| 7118 TestClientData::constructor_call_counter = 0; | 7133 TestClientData::constructor_call_counter = 0; |
| 7119 TestClientData::destructor_call_counter = 0; | 7134 TestClientData::destructor_call_counter = 0; |
| 7120 | 7135 |
| 7121 expected_break_data = NULL; | 7136 expected_break_data = NULL; |
| 7122 was_debug_event_called = false; | 7137 was_debug_event_called = false; |
| 7123 was_debug_break_called = false; | 7138 was_debug_break_called = false; |
| 7124 v8::Debug::DebugBreakForCommand(); | 7139 v8::Debug::DebugBreakForCommand(NULL, isolate); |
| 7125 v8::Script::Compile(v8::String::New("(function(x){return x;})(1);"))->Run(); | 7140 v8::Script::Compile(v8::String::New("(function(x){return x;})(1);"))->Run(); |
| 7126 CHECK(was_debug_event_called); | 7141 CHECK(was_debug_event_called); |
| 7127 CHECK(!was_debug_break_called); | 7142 CHECK(!was_debug_break_called); |
| 7128 | 7143 |
| 7129 TestClientData* data1 = new TestClientData(); | 7144 TestClientData* data1 = new TestClientData(); |
| 7130 expected_break_data = data1; | 7145 expected_break_data = data1; |
| 7131 was_debug_event_called = false; | 7146 was_debug_event_called = false; |
| 7132 was_debug_break_called = false; | 7147 was_debug_break_called = false; |
| 7133 v8::Debug::DebugBreakForCommand(data1); | 7148 v8::Debug::DebugBreakForCommand(data1, isolate); |
| 7134 v8::Script::Compile(v8::String::New("(function(x){return x+1;})(1);"))->Run(); | 7149 v8::Script::Compile(v8::String::New("(function(x){return x+1;})(1);"))->Run(); |
| 7135 CHECK(was_debug_event_called); | 7150 CHECK(was_debug_event_called); |
| 7136 CHECK(!was_debug_break_called); | 7151 CHECK(!was_debug_break_called); |
| 7137 | 7152 |
| 7138 expected_break_data = NULL; | 7153 expected_break_data = NULL; |
| 7139 was_debug_event_called = false; | 7154 was_debug_event_called = false; |
| 7140 was_debug_break_called = false; | 7155 was_debug_break_called = false; |
| 7141 v8::Debug::DebugBreak(); | 7156 v8::Debug::DebugBreak(isolate); |
| 7142 v8::Script::Compile(v8::String::New("(function(x){return x+2;})(1);"))->Run(); | 7157 v8::Script::Compile(v8::String::New("(function(x){return x+2;})(1);"))->Run(); |
| 7143 CHECK(!was_debug_event_called); | 7158 CHECK(!was_debug_event_called); |
| 7144 CHECK(was_debug_break_called); | 7159 CHECK(was_debug_break_called); |
| 7145 | 7160 |
| 7146 TestClientData* data2 = new TestClientData(); | 7161 TestClientData* data2 = new TestClientData(); |
| 7147 expected_break_data = data2; | 7162 expected_break_data = data2; |
| 7148 was_debug_event_called = false; | 7163 was_debug_event_called = false; |
| 7149 was_debug_break_called = false; | 7164 was_debug_break_called = false; |
| 7150 v8::Debug::DebugBreak(); | 7165 v8::Debug::DebugBreak(isolate); |
| 7151 v8::Debug::DebugBreakForCommand(data2); | 7166 v8::Debug::DebugBreakForCommand(data2, isolate); |
| 7152 v8::Script::Compile(v8::String::New("(function(x){return x+3;})(1);"))->Run(); | 7167 v8::Script::Compile(v8::String::New("(function(x){return x+3;})(1);"))->Run(); |
| 7153 CHECK(was_debug_event_called); | 7168 CHECK(was_debug_event_called); |
| 7154 CHECK(was_debug_break_called); | 7169 CHECK(was_debug_break_called); |
| 7155 | 7170 |
| 7156 CHECK_EQ(2, TestClientData::constructor_call_counter); | 7171 CHECK_EQ(2, TestClientData::constructor_call_counter); |
| 7157 CHECK_EQ(TestClientData::constructor_call_counter, | 7172 CHECK_EQ(TestClientData::constructor_call_counter, |
| 7158 TestClientData::destructor_call_counter); | 7173 TestClientData::destructor_call_counter); |
| 7159 | 7174 |
| 7160 v8::Debug::SetDebugEventListener2(NULL); | 7175 v8::Debug::SetDebugEventListener2(NULL); |
| 7161 CheckDebuggerUnloaded(); | 7176 CheckDebuggerUnloaded(); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 7179 CHECK(result->IsString()); | 7194 CHECK(result->IsString()); |
| 7180 v8::Handle<v8::String> function_name(result->ToString()); | 7195 v8::Handle<v8::String> function_name(result->ToString()); |
| 7181 function_name->WriteUtf8(fn); | 7196 function_name->WriteUtf8(fn); |
| 7182 if (strcmp(fn, "bar") == 0) { | 7197 if (strcmp(fn, "bar") == 0) { |
| 7183 i::Deoptimizer::DeoptimizeAll(v8::internal::Isolate::Current()); | 7198 i::Deoptimizer::DeoptimizeAll(v8::internal::Isolate::Current()); |
| 7184 debug_event_break_deoptimize_done = true; | 7199 debug_event_break_deoptimize_done = true; |
| 7185 } | 7200 } |
| 7186 } | 7201 } |
| 7187 } | 7202 } |
| 7188 | 7203 |
| 7189 v8::Debug::DebugBreak(); | 7204 v8::Debug::DebugBreak(v8::Isolate::GetCurrent()); |
| 7190 } | 7205 } |
| 7191 } | 7206 } |
| 7192 | 7207 |
| 7193 | 7208 |
| 7194 // Test deoptimization when execution is broken using the debug break stack | 7209 // Test deoptimization when execution is broken using the debug break stack |
| 7195 // check interrupt. | 7210 // check interrupt. |
| 7196 TEST(DeoptimizeDuringDebugBreak) { | 7211 TEST(DeoptimizeDuringDebugBreak) { |
| 7197 DebugLocalContext env; | 7212 DebugLocalContext env; |
| 7198 v8::HandleScope scope(env->GetIsolate()); | 7213 v8::HandleScope scope(env->GetIsolate()); |
| 7199 env.ExposeDebug(); | 7214 env.ExposeDebug(); |
| 7200 | 7215 |
| 7201 // Create a function for checking the function when hitting a break point. | 7216 // Create a function for checking the function when hitting a break point. |
| 7202 frame_function_name = CompileFunction(&env, | 7217 frame_function_name = CompileFunction(&env, |
| 7203 frame_function_name_source, | 7218 frame_function_name_source, |
| 7204 "frame_function_name"); | 7219 "frame_function_name"); |
| 7205 | 7220 |
| 7206 | 7221 |
| 7207 // Set a debug event listener which will keep interrupting execution until | 7222 // Set a debug event listener which will keep interrupting execution until |
| 7208 // debug break. When inside function bar it will deoptimize all functions. | 7223 // debug break. When inside function bar it will deoptimize all functions. |
| 7209 // This tests lazy deoptimization bailout for the stack check, as the first | 7224 // This tests lazy deoptimization bailout for the stack check, as the first |
| 7210 // time in function bar when using debug break and no break points will be at | 7225 // time in function bar when using debug break and no break points will be at |
| 7211 // the initial stack check. | 7226 // the initial stack check. |
| 7212 v8::Debug::SetDebugEventListener2(DebugEventBreakDeoptimize); | 7227 v8::Debug::SetDebugEventListener2(DebugEventBreakDeoptimize); |
| 7213 | 7228 |
| 7214 // Compile and run function bar which will optimize it for some flag settings. | 7229 // Compile and run function bar which will optimize it for some flag settings. |
| 7215 v8::Script::Compile(v8::String::New("function bar(){}; bar()"))->Run(); | 7230 v8::Script::Compile(v8::String::New("function bar(){}; bar()"))->Run(); |
| 7216 | 7231 |
| 7217 // Set debug break and call bar again. | 7232 // Set debug break and call bar again. |
| 7218 v8::Debug::DebugBreak(); | 7233 v8::Debug::DebugBreak(env->GetIsolate()); |
| 7219 v8::Script::Compile(v8::String::New("bar()"))->Run(); | 7234 v8::Script::Compile(v8::String::New("bar()"))->Run(); |
| 7220 | 7235 |
| 7221 CHECK(debug_event_break_deoptimize_done); | 7236 CHECK(debug_event_break_deoptimize_done); |
| 7222 | 7237 |
| 7223 v8::Debug::SetDebugEventListener2(NULL); | 7238 v8::Debug::SetDebugEventListener2(NULL); |
| 7224 } | 7239 } |
| 7225 | 7240 |
| 7226 | 7241 |
| 7227 static void DebugEventBreakWithOptimizedStack( | 7242 static void DebugEventBreakWithOptimizedStack( |
| 7228 const v8::Debug::EventDetails& event_details) { | 7243 const v8::Debug::EventDetails& event_details) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7266 result = frame_local_value->Call(exec_state, argc, argv); | 7281 result = frame_local_value->Call(exec_state, argc, argv); |
| 7267 CHECK(result->IsUndefined() || (result->Int32Value() == 42)); | 7282 CHECK(result->IsUndefined() || (result->Int32Value() == 42)); |
| 7268 } | 7283 } |
| 7269 } | 7284 } |
| 7270 } | 7285 } |
| 7271 } | 7286 } |
| 7272 | 7287 |
| 7273 | 7288 |
| 7274 static void ScheduleBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { | 7289 static void ScheduleBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 7275 v8::Debug::SetDebugEventListener2(DebugEventBreakWithOptimizedStack); | 7290 v8::Debug::SetDebugEventListener2(DebugEventBreakWithOptimizedStack); |
| 7276 v8::Debug::DebugBreak(); | 7291 v8::Debug::DebugBreak(args.GetIsolate()); |
| 7277 } | 7292 } |
| 7278 | 7293 |
| 7279 | 7294 |
| 7280 TEST(DebugBreakStackInspection) { | 7295 TEST(DebugBreakStackInspection) { |
| 7281 DebugLocalContext env; | 7296 DebugLocalContext env; |
| 7282 v8::HandleScope scope(env->GetIsolate()); | 7297 v8::HandleScope scope(env->GetIsolate()); |
| 7283 | 7298 |
| 7284 frame_function_name = | 7299 frame_function_name = |
| 7285 CompileFunction(&env, frame_function_name_source, "frame_function_name"); | 7300 CompileFunction(&env, frame_function_name_source, "frame_function_name"); |
| 7286 frame_argument_name = | 7301 frame_argument_name = |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7331 | 7346 |
| 7332 EmbeddedVector<char, 1024> buffer; | 7347 EmbeddedVector<char, 1024> buffer; |
| 7333 OS::SNPrintF(buffer, | 7348 OS::SNPrintF(buffer, |
| 7334 "function f() {%s%s%s}", | 7349 "function f() {%s%s%s}", |
| 7335 loop_head, loop_bodies[i], loop_tail); | 7350 loop_head, loop_bodies[i], loop_tail); |
| 7336 | 7351 |
| 7337 // Function with infinite loop. | 7352 // Function with infinite loop. |
| 7338 CompileRun(buffer.start()); | 7353 CompileRun(buffer.start()); |
| 7339 | 7354 |
| 7340 // Set the debug break to enter the debugger as soon as possible. | 7355 // Set the debug break to enter the debugger as soon as possible. |
| 7341 v8::Debug::DebugBreak(); | 7356 v8::Debug::DebugBreak(CcTest::isolate()); |
| 7342 | 7357 |
| 7343 // Call function with infinite loop. | 7358 // Call function with infinite loop. |
| 7344 CompileRun("f();"); | 7359 CompileRun("f();"); |
| 7345 CHECK_EQ(kBreaksPerTest, break_point_hit_count); | 7360 CHECK_EQ(kBreaksPerTest, break_point_hit_count); |
| 7346 | 7361 |
| 7347 CHECK(!v8::V8::IsExecutionTerminating()); | 7362 CHECK(!v8::V8::IsExecutionTerminating()); |
| 7348 } | 7363 } |
| 7349 } | 7364 } |
| 7350 } | 7365 } |
| 7351 | 7366 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7401 v8::DebugEvent event = event_details.GetEvent(); | 7416 v8::DebugEvent event = event_details.GetEvent(); |
| 7402 if (event != v8::Break) return; | 7417 if (event != v8::Break) return; |
| 7403 | 7418 |
| 7404 int expected_frame_count = 4; | 7419 int expected_frame_count = 4; |
| 7405 int expected_line_number[] = {1, 4, 7, 12}; | 7420 int expected_line_number[] = {1, 4, 7, 12}; |
| 7406 | 7421 |
| 7407 i::Handle<i::Object> compiled_script = v8::Utils::OpenHandle(*inline_script); | 7422 i::Handle<i::Object> compiled_script = v8::Utils::OpenHandle(*inline_script); |
| 7408 i::Handle<i::Script> source_script = i::Handle<i::Script>(i::Script::cast( | 7423 i::Handle<i::Script> source_script = i::Handle<i::Script>(i::Script::cast( |
| 7409 i::JSFunction::cast(*compiled_script)->shared()->script())); | 7424 i::JSFunction::cast(*compiled_script)->shared()->script())); |
| 7410 | 7425 |
| 7411 int break_id = v8::internal::Isolate::Current()->debug()->break_id(); | 7426 int break_id = CcTest::i_isolate()->debug()->break_id(); |
| 7412 char script[128]; | 7427 char script[128]; |
| 7413 i::Vector<char> script_vector(script, sizeof(script)); | 7428 i::Vector<char> script_vector(script, sizeof(script)); |
| 7414 OS::SNPrintF(script_vector, "%%GetFrameCount(%d)", break_id); | 7429 OS::SNPrintF(script_vector, "%%GetFrameCount(%d)", break_id); |
| 7415 v8::Local<v8::Value> result = CompileRun(script); | 7430 v8::Local<v8::Value> result = CompileRun(script); |
| 7416 | 7431 |
| 7417 int frame_count = result->Int32Value(); | 7432 int frame_count = result->Int32Value(); |
| 7418 CHECK_EQ(expected_frame_count, frame_count); | 7433 CHECK_EQ(expected_frame_count, frame_count); |
| 7419 | 7434 |
| 7420 for (int i = 0; i < frame_count; i++) { | 7435 for (int i = 0; i < frame_count; i++) { |
| 7421 // The 5. element in the returned array of GetFrameDetails contains the | 7436 // The 5. element in the returned array of GetFrameDetails contains the |
| 7422 // source position of that frame. | 7437 // source position of that frame. |
| 7423 OS::SNPrintF(script_vector, "%%GetFrameDetails(%d, %d)[5]", break_id, i); | 7438 OS::SNPrintF(script_vector, "%%GetFrameDetails(%d, %d)[5]", break_id, i); |
| 7424 v8::Local<v8::Value> result = CompileRun(script); | 7439 v8::Local<v8::Value> result = CompileRun(script); |
| 7425 CHECK_EQ(expected_line_number[i], | 7440 CHECK_EQ(expected_line_number[i], |
| 7426 i::GetScriptLineNumber(source_script, result->Int32Value())); | 7441 i::GetScriptLineNumber(source_script, result->Int32Value())); |
| 7427 } | 7442 } |
| 7428 v8::Debug::SetDebugEventListener2(NULL); | 7443 v8::Debug::SetDebugEventListener2(NULL); |
| 7429 v8::V8::TerminateExecution(); | 7444 v8::V8::TerminateExecution(CcTest::isolate()); |
| 7430 } | 7445 } |
| 7431 | 7446 |
| 7432 | 7447 |
| 7433 TEST(DebugBreakInline) { | 7448 TEST(DebugBreakInline) { |
| 7434 i::FLAG_allow_natives_syntax = true; | 7449 i::FLAG_allow_natives_syntax = true; |
| 7435 DebugLocalContext env; | 7450 DebugLocalContext env; |
| 7436 v8::HandleScope scope(env->GetIsolate()); | 7451 v8::HandleScope scope(env->GetIsolate()); |
| 7437 const char* source = | 7452 const char* source = |
| 7438 "function debug(b) { \n" | 7453 "function debug(b) { \n" |
| 7439 " if (b) debugger; \n" | 7454 " if (b) debugger; \n" |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7519 CHECK_EQ(2, CountNativeContexts()); | 7534 CHECK_EQ(2, CountNativeContexts()); |
| 7520 | 7535 |
| 7521 v8::Debug::SetDebugEventListener2(NULL); | 7536 v8::Debug::SetDebugEventListener2(NULL); |
| 7522 } | 7537 } |
| 7523 | 7538 |
| 7524 | 7539 |
| 7525 TEST(LiveEditEnabled) { | 7540 TEST(LiveEditEnabled) { |
| 7526 v8::internal::FLAG_allow_natives_syntax = true; | 7541 v8::internal::FLAG_allow_natives_syntax = true; |
| 7527 LocalContext env; | 7542 LocalContext env; |
| 7528 v8::HandleScope scope(env->GetIsolate()); | 7543 v8::HandleScope scope(env->GetIsolate()); |
| 7529 v8::Debug::SetLiveEditEnabled(true); | 7544 v8::Debug::SetLiveEditEnabled(true, env->GetIsolate()); |
| 7530 CompileRun("%LiveEditCompareStrings('', '')"); | 7545 CompileRun("%LiveEditCompareStrings('', '')"); |
| 7531 } | 7546 } |
| 7532 | 7547 |
| 7533 | 7548 |
| 7534 TEST(LiveEditDisabled) { | 7549 TEST(LiveEditDisabled) { |
| 7535 v8::internal::FLAG_allow_natives_syntax = true; | 7550 v8::internal::FLAG_allow_natives_syntax = true; |
| 7536 LocalContext env; | 7551 LocalContext env; |
| 7537 v8::HandleScope scope(env->GetIsolate()); | 7552 v8::HandleScope scope(env->GetIsolate()); |
| 7538 v8::Debug::SetLiveEditEnabled(false); | 7553 v8::Debug::SetLiveEditEnabled(false), env->GetIsolate(); |
|
marja
2013/12/02 15:40:45
FYI, I'm fixing the C++ misuse of this old CL here
| |
| 7539 CompileRun("%LiveEditCompareStrings('', '')"); | 7554 CompileRun("%LiveEditCompareStrings('', '')"); |
| 7540 } | 7555 } |
| 7541 | 7556 |
| 7542 | 7557 |
| 7543 #endif // ENABLE_DEBUGGER_SUPPORT | 7558 #endif // ENABLE_DEBUGGER_SUPPORT |
| OLD | NEW |