| 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 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 Debug* debug = isolate->debug(); | 637 Debug* debug = isolate->debug(); |
| 638 // When hitting a debug event listener there must be a break set. | 638 // When hitting a debug event listener there must be a break set. |
| 639 CHECK_NE(debug->break_id(), 0); | 639 CHECK_NE(debug->break_id(), 0); |
| 640 | 640 |
| 641 // Count the number of breaks. | 641 // Count the number of breaks. |
| 642 if (event == v8::Break) { | 642 if (event == v8::Break) { |
| 643 break_point_hit_count++; | 643 break_point_hit_count++; |
| 644 if (!frame_function_name.IsEmpty()) { | 644 if (!frame_function_name.IsEmpty()) { |
| 645 // Get the name of the function. | 645 // Get the name of the function. |
| 646 const int argc = 2; | 646 const int argc = 2; |
| 647 v8::Handle<v8::Value> argv[argc] = { | 647 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) }; |
| 648 exec_state, v8::Integer::New(CcTest::isolate(), 0) | |
| 649 }; | |
| 650 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, | 648 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, |
| 651 argc, argv); | 649 argc, argv); |
| 652 if (result->IsUndefined()) { | 650 if (result->IsUndefined()) { |
| 653 last_function_hit[0] = '\0'; | 651 last_function_hit[0] = '\0'; |
| 654 } else { | 652 } else { |
| 655 CHECK(result->IsString()); | 653 CHECK(result->IsString()); |
| 656 v8::Handle<v8::String> function_name(result->ToString()); | 654 v8::Handle<v8::String> function_name(result->ToString()); |
| 657 function_name->WriteUtf8(last_function_hit); | 655 function_name->WriteUtf8(last_function_hit); |
| 658 } | 656 } |
| 659 } | 657 } |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 886 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); | 884 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); |
| 887 v8::internal::Debug* debug = CcTest::i_isolate()->debug(); | 885 v8::internal::Debug* debug = CcTest::i_isolate()->debug(); |
| 888 // When hitting a debug event listener there must be a break set. | 886 // When hitting a debug event listener there must be a break set. |
| 889 CHECK_NE(debug->break_id(), 0); | 887 CHECK_NE(debug->break_id(), 0); |
| 890 | 888 |
| 891 if (event == v8::Break || event == v8::Exception) { | 889 if (event == v8::Break || event == v8::Exception) { |
| 892 // Check that the current function is the expected. | 890 // Check that the current function is the expected. |
| 893 CHECK(break_point_hit_count < | 891 CHECK(break_point_hit_count < |
| 894 StrLength(expected_step_sequence)); | 892 StrLength(expected_step_sequence)); |
| 895 const int argc = 2; | 893 const int argc = 2; |
| 896 v8::Handle<v8::Value> argv[argc] = { | 894 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) }; |
| 897 exec_state, v8::Integer::New(CcTest::isolate(), 0) | |
| 898 }; | |
| 899 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, | 895 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, |
| 900 argc, argv); | 896 argc, argv); |
| 901 CHECK(result->IsString()); | 897 CHECK(result->IsString()); |
| 902 v8::String::Utf8Value function_name(result->ToString()); | 898 v8::String::Utf8Value function_name(result->ToString()); |
| 903 CHECK_EQ(1, StrLength(*function_name)); | 899 CHECK_EQ(1, StrLength(*function_name)); |
| 904 CHECK_EQ((*function_name)[0], | 900 CHECK_EQ((*function_name)[0], |
| 905 expected_step_sequence[break_point_hit_count]); | 901 expected_step_sequence[break_point_hit_count]); |
| 906 | 902 |
| 907 // Perform step. | 903 // Perform step. |
| 908 break_point_hit_count++; | 904 break_point_hit_count++; |
| (...skipping 1184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2093 v8::Local<v8::String> script = v8::String::NewFromUtf8( | 2089 v8::Local<v8::String> script = v8::String::NewFromUtf8( |
| 2094 env->GetIsolate(), | 2090 env->GetIsolate(), |
| 2095 "function f() {\n" | 2091 "function f() {\n" |
| 2096 " a = 0; // line 8 as this script has line offset 7\n" | 2092 " a = 0; // line 8 as this script has line offset 7\n" |
| 2097 " b = 0; // line 9 as this script has line offset 7\n" | 2093 " b = 0; // line 9 as this script has line offset 7\n" |
| 2098 "}"); | 2094 "}"); |
| 2099 | 2095 |
| 2100 // Create script origin both name and line offset. | 2096 // Create script origin both name and line offset. |
| 2101 v8::ScriptOrigin origin( | 2097 v8::ScriptOrigin origin( |
| 2102 v8::String::NewFromUtf8(env->GetIsolate(), "test.html"), | 2098 v8::String::NewFromUtf8(env->GetIsolate(), "test.html"), |
| 2103 v8::Integer::New(env->GetIsolate(), 7)); | 2099 v8::Integer::New(7)); |
| 2104 | 2100 |
| 2105 // Set two script break points before the script is loaded. | 2101 // Set two script break points before the script is loaded. |
| 2106 int sbp1 = | 2102 int sbp1 = |
| 2107 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 8, 0); | 2103 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 8, 0); |
| 2108 int sbp2 = | 2104 int sbp2 = |
| 2109 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 9, 0); | 2105 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 9, 0); |
| 2110 | 2106 |
| 2111 // Compile the script and get the function. | 2107 // Compile the script and get the function. |
| 2112 v8::Script::Compile(script, &origin)->Run(); | 2108 v8::Script::Compile(script, &origin)->Run(); |
| 2113 f = v8::Local<v8::Function>::Cast( | 2109 f = v8::Local<v8::Function>::Cast( |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2176 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 0, -1); | 2172 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 0, -1); |
| 2177 int sbp2 = | 2173 int sbp2 = |
| 2178 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 1, -1); | 2174 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 1, -1); |
| 2179 int sbp3 = | 2175 int sbp3 = |
| 2180 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 5, -1); | 2176 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 5, -1); |
| 2181 | 2177 |
| 2182 // Compile the script and get the function. | 2178 // Compile the script and get the function. |
| 2183 break_point_hit_count = 0; | 2179 break_point_hit_count = 0; |
| 2184 v8::ScriptOrigin origin( | 2180 v8::ScriptOrigin origin( |
| 2185 v8::String::NewFromUtf8(env->GetIsolate(), "test.html"), | 2181 v8::String::NewFromUtf8(env->GetIsolate(), "test.html"), |
| 2186 v8::Integer::New(env->GetIsolate(), 0)); | 2182 v8::Integer::New(0)); |
| 2187 v8::Script::Compile(script, &origin)->Run(); | 2183 v8::Script::Compile(script, &origin)->Run(); |
| 2188 f = v8::Local<v8::Function>::Cast( | 2184 f = v8::Local<v8::Function>::Cast( |
| 2189 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); | 2185 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); |
| 2190 g = v8::Local<v8::Function>::Cast( | 2186 g = v8::Local<v8::Function>::Cast( |
| 2191 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); | 2187 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); |
| 2192 | 2188 |
| 2193 // Check that a break point was hit when the script was run. | 2189 // Check that a break point was hit when the script was run. |
| 2194 CHECK_EQ(1, break_point_hit_count); | 2190 CHECK_EQ(1, break_point_hit_count); |
| 2195 CHECK_EQ(0, StrLength(last_function_hit)); | 2191 CHECK_EQ(0, StrLength(last_function_hit)); |
| 2196 | 2192 |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2511 " y=0;a=x;" | 2507 " y=0;a=x;" |
| 2512 "}", | 2508 "}", |
| 2513 "bar"); | 2509 "bar"); |
| 2514 const int barbar_break_position = 8; | 2510 const int barbar_break_position = 8; |
| 2515 | 2511 |
| 2516 // Call bar setting breakpoint before a=x in barbar and undefined as | 2512 // Call bar setting breakpoint before a=x in barbar and undefined as |
| 2517 // parameter. | 2513 // parameter. |
| 2518 checks = checks_uu; | 2514 checks = checks_uu; |
| 2519 v8::Handle<v8::Value> argv_bar_1[2] = { | 2515 v8::Handle<v8::Value> argv_bar_1[2] = { |
| 2520 v8::Undefined(isolate), | 2516 v8::Undefined(isolate), |
| 2521 v8::Number::New(isolate, barbar_break_position) | 2517 v8::Number::New(barbar_break_position) |
| 2522 }; | 2518 }; |
| 2523 bar->Call(env->Global(), 2, argv_bar_1); | 2519 bar->Call(env->Global(), 2, argv_bar_1); |
| 2524 | 2520 |
| 2525 // Call bar setting breakpoint before a=x in barbar and parameter | 2521 // Call bar setting breakpoint before a=x in barbar and parameter |
| 2526 // "Hello, world!". | 2522 // "Hello, world!". |
| 2527 checks = checks_hu; | 2523 checks = checks_hu; |
| 2528 v8::Handle<v8::Value> argv_bar_2[2] = { | 2524 v8::Handle<v8::Value> argv_bar_2[2] = { |
| 2529 v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!"), | 2525 v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!"), |
| 2530 v8::Number::New(env->GetIsolate(), barbar_break_position) | 2526 v8::Number::New(barbar_break_position) |
| 2531 }; | 2527 }; |
| 2532 bar->Call(env->Global(), 2, argv_bar_2); | 2528 bar->Call(env->Global(), 2, argv_bar_2); |
| 2533 | 2529 |
| 2534 // Call bar setting breakpoint after a=x in barbar and parameter | 2530 // Call bar setting breakpoint after a=x in barbar and parameter |
| 2535 // "Hello, world!". | 2531 // "Hello, world!". |
| 2536 checks = checks_hh; | 2532 checks = checks_hh; |
| 2537 v8::Handle<v8::Value> argv_bar_3[2] = { | 2533 v8::Handle<v8::Value> argv_bar_3[2] = { |
| 2538 v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!"), | 2534 v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!"), |
| 2539 v8::Number::New(env->GetIsolate(), barbar_break_position + 1) | 2535 v8::Number::New(barbar_break_position + 1) |
| 2540 }; | 2536 }; |
| 2541 bar->Call(env->Global(), 2, argv_bar_3); | 2537 bar->Call(env->Global(), 2, argv_bar_3); |
| 2542 | 2538 |
| 2543 v8::Debug::SetDebugEventListener2(NULL); | 2539 v8::Debug::SetDebugEventListener2(NULL); |
| 2544 CheckDebuggerUnloaded(); | 2540 CheckDebuggerUnloaded(); |
| 2545 } | 2541 } |
| 2546 | 2542 |
| 2547 | 2543 |
| 2548 int debugEventCount = 0; | 2544 int debugEventCount = 0; |
| 2549 static void CheckDebugEvent(const v8::Debug::EventDetails& eventDetails) { | 2545 static void CheckDebugEvent(const v8::Debug::EventDetails& eventDetails) { |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2862 " y = 1;\n" | 2858 " y = 1;\n" |
| 2863 " x = a[i];\n" | 2859 " x = a[i];\n" |
| 2864 " }\n" | 2860 " }\n" |
| 2865 "}\n" | 2861 "}\n" |
| 2866 "y=0\n", | 2862 "y=0\n", |
| 2867 "foo"); | 2863 "foo"); |
| 2868 | 2864 |
| 2869 // Create array [0,1,2,3,4,5,6,7,8,9] | 2865 // Create array [0,1,2,3,4,5,6,7,8,9] |
| 2870 v8::Local<v8::Array> a = v8::Array::New(env->GetIsolate(), 10); | 2866 v8::Local<v8::Array> a = v8::Array::New(env->GetIsolate(), 10); |
| 2871 for (int i = 0; i < 10; i++) { | 2867 for (int i = 0; i < 10; i++) { |
| 2872 a->Set(v8::Number::New(env->GetIsolate(), i), | 2868 a->Set(v8::Number::New(i), v8::Number::New(i)); |
| 2873 v8::Number::New(env->GetIsolate(), i)); | |
| 2874 } | 2869 } |
| 2875 | 2870 |
| 2876 // Call function without any break points to ensure inlining is in place. | 2871 // Call function without any break points to ensure inlining is in place. |
| 2877 const int kArgc = 1; | 2872 const int kArgc = 1; |
| 2878 v8::Handle<v8::Value> args[kArgc] = { a }; | 2873 v8::Handle<v8::Value> args[kArgc] = { a }; |
| 2879 foo->Call(env->Global(), kArgc, args); | 2874 foo->Call(env->Global(), kArgc, args); |
| 2880 | 2875 |
| 2881 // Set up break point and step through the function. | 2876 // Set up break point and step through the function. |
| 2882 SetBreakPoint(foo, 3); | 2877 SetBreakPoint(foo, 3); |
| 2883 step_action = StepNext; | 2878 step_action = StepNext; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2910 " y = 1;\n" | 2905 " y = 1;\n" |
| 2911 " a[i] = 42;\n" | 2906 " a[i] = 42;\n" |
| 2912 " }\n" | 2907 " }\n" |
| 2913 "}\n" | 2908 "}\n" |
| 2914 "y=0\n", | 2909 "y=0\n", |
| 2915 "foo"); | 2910 "foo"); |
| 2916 | 2911 |
| 2917 // Create array [0,1,2,3,4,5,6,7,8,9] | 2912 // Create array [0,1,2,3,4,5,6,7,8,9] |
| 2918 v8::Local<v8::Array> a = v8::Array::New(env->GetIsolate(), 10); | 2913 v8::Local<v8::Array> a = v8::Array::New(env->GetIsolate(), 10); |
| 2919 for (int i = 0; i < 10; i++) { | 2914 for (int i = 0; i < 10; i++) { |
| 2920 a->Set(v8::Number::New(env->GetIsolate(), i), | 2915 a->Set(v8::Number::New(i), v8::Number::New(i)); |
| 2921 v8::Number::New(env->GetIsolate(), i)); | |
| 2922 } | 2916 } |
| 2923 | 2917 |
| 2924 // Call function without any break points to ensure inlining is in place. | 2918 // Call function without any break points to ensure inlining is in place. |
| 2925 const int kArgc = 1; | 2919 const int kArgc = 1; |
| 2926 v8::Handle<v8::Value> args[kArgc] = { a }; | 2920 v8::Handle<v8::Value> args[kArgc] = { a }; |
| 2927 foo->Call(env->Global(), kArgc, args); | 2921 foo->Call(env->Global(), kArgc, args); |
| 2928 | 2922 |
| 2929 // Set up break point and step through the function. | 2923 // Set up break point and step through the function. |
| 2930 SetBreakPoint(foo, 3); | 2924 SetBreakPoint(foo, 3); |
| 2931 step_action = StepNext; | 2925 step_action = StepNext; |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3177 CHECK_EQ(5, break_point_hit_count); | 3171 CHECK_EQ(5, break_point_hit_count); |
| 3178 | 3172 |
| 3179 // Get rid of the debug event listener. | 3173 // Get rid of the debug event listener. |
| 3180 v8::Debug::SetDebugEventListener2(NULL); | 3174 v8::Debug::SetDebugEventListener2(NULL); |
| 3181 CheckDebuggerUnloaded(); | 3175 CheckDebuggerUnloaded(); |
| 3182 } | 3176 } |
| 3183 | 3177 |
| 3184 | 3178 |
| 3185 TEST(DebugStepSwitch) { | 3179 TEST(DebugStepSwitch) { |
| 3186 DebugLocalContext env; | 3180 DebugLocalContext env; |
| 3187 v8::Isolate* isolate = env->GetIsolate(); | 3181 v8::HandleScope scope(env->GetIsolate()); |
| 3188 v8::HandleScope scope(isolate); | |
| 3189 | 3182 |
| 3190 // Register a debug event listener which steps and counts. | 3183 // Register a debug event listener which steps and counts. |
| 3191 v8::Debug::SetDebugEventListener2(DebugEventStep); | 3184 v8::Debug::SetDebugEventListener2(DebugEventStep); |
| 3192 | 3185 |
| 3193 // Create a function for testing stepping. Run it to allow it to get | 3186 // Create a function for testing stepping. Run it to allow it to get |
| 3194 // optimized. | 3187 // optimized. |
| 3195 const int argc = 1; | 3188 const int argc = 1; |
| 3196 const char* src = "function foo(x) { " | 3189 const char* src = "function foo(x) { " |
| 3197 " a = 1;" | 3190 " a = 1;" |
| 3198 " switch (x) {" | 3191 " switch (x) {" |
| 3199 " case 1:" | 3192 " case 1:" |
| 3200 " b = 1;" | 3193 " b = 1;" |
| 3201 " case 2:" | 3194 " case 2:" |
| 3202 " c = 1;" | 3195 " c = 1;" |
| 3203 " break;" | 3196 " break;" |
| 3204 " case 3:" | 3197 " case 3:" |
| 3205 " d = 1;" | 3198 " d = 1;" |
| 3206 " e = 1;" | 3199 " e = 1;" |
| 3207 " f = 1;" | 3200 " f = 1;" |
| 3208 " break;" | 3201 " break;" |
| 3209 " }" | 3202 " }" |
| 3210 "}" | 3203 "}" |
| 3211 "a=0; b=0; c=0; d=0; e=0; f=0; foo()"; | 3204 "a=0; b=0; c=0; d=0; e=0; f=0; foo()"; |
| 3212 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3205 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3213 SetBreakPoint(foo, 0); | 3206 SetBreakPoint(foo, 0); |
| 3214 | 3207 |
| 3215 // One case with fall-through. | 3208 // One case with fall-through. |
| 3216 step_action = StepIn; | 3209 step_action = StepIn; |
| 3217 break_point_hit_count = 0; | 3210 break_point_hit_count = 0; |
| 3218 v8::Handle<v8::Value> argv_1[argc] = { v8::Number::New(isolate, 1) }; | 3211 v8::Handle<v8::Value> argv_1[argc] = { v8::Number::New(1) }; |
| 3219 foo->Call(env->Global(), argc, argv_1); | 3212 foo->Call(env->Global(), argc, argv_1); |
| 3220 CHECK_EQ(6, break_point_hit_count); | 3213 CHECK_EQ(6, break_point_hit_count); |
| 3221 | 3214 |
| 3222 // Another case. | 3215 // Another case. |
| 3223 step_action = StepIn; | 3216 step_action = StepIn; |
| 3224 break_point_hit_count = 0; | 3217 break_point_hit_count = 0; |
| 3225 v8::Handle<v8::Value> argv_2[argc] = { v8::Number::New(isolate, 2) }; | 3218 v8::Handle<v8::Value> argv_2[argc] = { v8::Number::New(2) }; |
| 3226 foo->Call(env->Global(), argc, argv_2); | 3219 foo->Call(env->Global(), argc, argv_2); |
| 3227 CHECK_EQ(5, break_point_hit_count); | 3220 CHECK_EQ(5, break_point_hit_count); |
| 3228 | 3221 |
| 3229 // Last case. | 3222 // Last case. |
| 3230 step_action = StepIn; | 3223 step_action = StepIn; |
| 3231 break_point_hit_count = 0; | 3224 break_point_hit_count = 0; |
| 3232 v8::Handle<v8::Value> argv_3[argc] = { v8::Number::New(isolate, 3) }; | 3225 v8::Handle<v8::Value> argv_3[argc] = { v8::Number::New(3) }; |
| 3233 foo->Call(env->Global(), argc, argv_3); | 3226 foo->Call(env->Global(), argc, argv_3); |
| 3234 CHECK_EQ(7, break_point_hit_count); | 3227 CHECK_EQ(7, break_point_hit_count); |
| 3235 | 3228 |
| 3236 // Get rid of the debug event listener. | 3229 // Get rid of the debug event listener. |
| 3237 v8::Debug::SetDebugEventListener2(NULL); | 3230 v8::Debug::SetDebugEventListener2(NULL); |
| 3238 CheckDebuggerUnloaded(); | 3231 CheckDebuggerUnloaded(); |
| 3239 } | 3232 } |
| 3240 | 3233 |
| 3241 | 3234 |
| 3242 TEST(DebugStepWhile) { | 3235 TEST(DebugStepWhile) { |
| 3243 DebugLocalContext env; | 3236 DebugLocalContext env; |
| 3244 v8::Isolate* isolate = env->GetIsolate(); | 3237 v8::HandleScope scope(env->GetIsolate()); |
| 3245 v8::HandleScope scope(isolate); | |
| 3246 | 3238 |
| 3247 // Register a debug event listener which steps and counts. | 3239 // Register a debug event listener which steps and counts. |
| 3248 v8::Debug::SetDebugEventListener2(DebugEventStep); | 3240 v8::Debug::SetDebugEventListener2(DebugEventStep); |
| 3249 | 3241 |
| 3250 // Create a function for testing stepping. Run it to allow it to get | 3242 // Create a function for testing stepping. Run it to allow it to get |
| 3251 // optimized. | 3243 // optimized. |
| 3252 const int argc = 1; | 3244 const int argc = 1; |
| 3253 const char* src = "function foo(x) { " | 3245 const char* src = "function foo(x) { " |
| 3254 " var a = 0;" | 3246 " var a = 0;" |
| 3255 " while (a < x) {" | 3247 " while (a < x) {" |
| 3256 " a++;" | 3248 " a++;" |
| 3257 " }" | 3249 " }" |
| 3258 "}" | 3250 "}" |
| 3259 "foo()"; | 3251 "foo()"; |
| 3260 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3252 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3261 SetBreakPoint(foo, 8); // "var a = 0;" | 3253 SetBreakPoint(foo, 8); // "var a = 0;" |
| 3262 | 3254 |
| 3263 // Looping 10 times. | 3255 // Looping 10 times. |
| 3264 step_action = StepIn; | 3256 step_action = StepIn; |
| 3265 break_point_hit_count = 0; | 3257 break_point_hit_count = 0; |
| 3266 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) }; | 3258 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; |
| 3267 foo->Call(env->Global(), argc, argv_10); | 3259 foo->Call(env->Global(), argc, argv_10); |
| 3268 CHECK_EQ(22, break_point_hit_count); | 3260 CHECK_EQ(22, break_point_hit_count); |
| 3269 | 3261 |
| 3270 // Looping 100 times. | 3262 // Looping 100 times. |
| 3271 step_action = StepIn; | 3263 step_action = StepIn; |
| 3272 break_point_hit_count = 0; | 3264 break_point_hit_count = 0; |
| 3273 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(isolate, 100) }; | 3265 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; |
| 3274 foo->Call(env->Global(), argc, argv_100); | 3266 foo->Call(env->Global(), argc, argv_100); |
| 3275 CHECK_EQ(202, break_point_hit_count); | 3267 CHECK_EQ(202, break_point_hit_count); |
| 3276 | 3268 |
| 3277 // Get rid of the debug event listener. | 3269 // Get rid of the debug event listener. |
| 3278 v8::Debug::SetDebugEventListener2(NULL); | 3270 v8::Debug::SetDebugEventListener2(NULL); |
| 3279 CheckDebuggerUnloaded(); | 3271 CheckDebuggerUnloaded(); |
| 3280 } | 3272 } |
| 3281 | 3273 |
| 3282 | 3274 |
| 3283 TEST(DebugStepDoWhile) { | 3275 TEST(DebugStepDoWhile) { |
| 3284 DebugLocalContext env; | 3276 DebugLocalContext env; |
| 3285 v8::Isolate* isolate = env->GetIsolate(); | 3277 v8::HandleScope scope(env->GetIsolate()); |
| 3286 v8::HandleScope scope(isolate); | |
| 3287 | 3278 |
| 3288 // Register a debug event listener which steps and counts. | 3279 // Register a debug event listener which steps and counts. |
| 3289 v8::Debug::SetDebugEventListener2(DebugEventStep); | 3280 v8::Debug::SetDebugEventListener2(DebugEventStep); |
| 3290 | 3281 |
| 3291 // Create a function for testing stepping. Run it to allow it to get | 3282 // Create a function for testing stepping. Run it to allow it to get |
| 3292 // optimized. | 3283 // optimized. |
| 3293 const int argc = 1; | 3284 const int argc = 1; |
| 3294 const char* src = "function foo(x) { " | 3285 const char* src = "function foo(x) { " |
| 3295 " var a = 0;" | 3286 " var a = 0;" |
| 3296 " do {" | 3287 " do {" |
| 3297 " a++;" | 3288 " a++;" |
| 3298 " } while (a < x)" | 3289 " } while (a < x)" |
| 3299 "}" | 3290 "}" |
| 3300 "foo()"; | 3291 "foo()"; |
| 3301 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3292 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3302 SetBreakPoint(foo, 8); // "var a = 0;" | 3293 SetBreakPoint(foo, 8); // "var a = 0;" |
| 3303 | 3294 |
| 3304 // Looping 10 times. | 3295 // Looping 10 times. |
| 3305 step_action = StepIn; | 3296 step_action = StepIn; |
| 3306 break_point_hit_count = 0; | 3297 break_point_hit_count = 0; |
| 3307 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) }; | 3298 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; |
| 3308 foo->Call(env->Global(), argc, argv_10); | 3299 foo->Call(env->Global(), argc, argv_10); |
| 3309 CHECK_EQ(22, break_point_hit_count); | 3300 CHECK_EQ(22, break_point_hit_count); |
| 3310 | 3301 |
| 3311 // Looping 100 times. | 3302 // Looping 100 times. |
| 3312 step_action = StepIn; | 3303 step_action = StepIn; |
| 3313 break_point_hit_count = 0; | 3304 break_point_hit_count = 0; |
| 3314 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(isolate, 100) }; | 3305 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; |
| 3315 foo->Call(env->Global(), argc, argv_100); | 3306 foo->Call(env->Global(), argc, argv_100); |
| 3316 CHECK_EQ(202, break_point_hit_count); | 3307 CHECK_EQ(202, break_point_hit_count); |
| 3317 | 3308 |
| 3318 // Get rid of the debug event listener. | 3309 // Get rid of the debug event listener. |
| 3319 v8::Debug::SetDebugEventListener2(NULL); | 3310 v8::Debug::SetDebugEventListener2(NULL); |
| 3320 CheckDebuggerUnloaded(); | 3311 CheckDebuggerUnloaded(); |
| 3321 } | 3312 } |
| 3322 | 3313 |
| 3323 | 3314 |
| 3324 TEST(DebugStepFor) { | 3315 TEST(DebugStepFor) { |
| 3325 DebugLocalContext env; | 3316 DebugLocalContext env; |
| 3326 v8::Isolate* isolate = env->GetIsolate(); | 3317 v8::HandleScope scope(env->GetIsolate()); |
| 3327 v8::HandleScope scope(isolate); | |
| 3328 | 3318 |
| 3329 // Register a debug event listener which steps and counts. | 3319 // Register a debug event listener which steps and counts. |
| 3330 v8::Debug::SetDebugEventListener2(DebugEventStep); | 3320 v8::Debug::SetDebugEventListener2(DebugEventStep); |
| 3331 | 3321 |
| 3332 // Create a function for testing stepping. Run it to allow it to get | 3322 // Create a function for testing stepping. Run it to allow it to get |
| 3333 // optimized. | 3323 // optimized. |
| 3334 const int argc = 1; | 3324 const int argc = 1; |
| 3335 const char* src = "function foo(x) { " | 3325 const char* src = "function foo(x) { " |
| 3336 " a = 1;" | 3326 " a = 1;" |
| 3337 " for (i = 0; i < x; i++) {" | 3327 " for (i = 0; i < x; i++) {" |
| 3338 " b = 1;" | 3328 " b = 1;" |
| 3339 " }" | 3329 " }" |
| 3340 "}" | 3330 "}" |
| 3341 "a=0; b=0; i=0; foo()"; | 3331 "a=0; b=0; i=0; foo()"; |
| 3342 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3332 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3343 | 3333 |
| 3344 SetBreakPoint(foo, 8); // "a = 1;" | 3334 SetBreakPoint(foo, 8); // "a = 1;" |
| 3345 | 3335 |
| 3346 // Looping 10 times. | 3336 // Looping 10 times. |
| 3347 step_action = StepIn; | 3337 step_action = StepIn; |
| 3348 break_point_hit_count = 0; | 3338 break_point_hit_count = 0; |
| 3349 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) }; | 3339 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; |
| 3350 foo->Call(env->Global(), argc, argv_10); | 3340 foo->Call(env->Global(), argc, argv_10); |
| 3351 CHECK_EQ(23, break_point_hit_count); | 3341 CHECK_EQ(23, break_point_hit_count); |
| 3352 | 3342 |
| 3353 // Looping 100 times. | 3343 // Looping 100 times. |
| 3354 step_action = StepIn; | 3344 step_action = StepIn; |
| 3355 break_point_hit_count = 0; | 3345 break_point_hit_count = 0; |
| 3356 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(isolate, 100) }; | 3346 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; |
| 3357 foo->Call(env->Global(), argc, argv_100); | 3347 foo->Call(env->Global(), argc, argv_100); |
| 3358 CHECK_EQ(203, break_point_hit_count); | 3348 CHECK_EQ(203, break_point_hit_count); |
| 3359 | 3349 |
| 3360 // Get rid of the debug event listener. | 3350 // Get rid of the debug event listener. |
| 3361 v8::Debug::SetDebugEventListener2(NULL); | 3351 v8::Debug::SetDebugEventListener2(NULL); |
| 3362 CheckDebuggerUnloaded(); | 3352 CheckDebuggerUnloaded(); |
| 3363 } | 3353 } |
| 3364 | 3354 |
| 3365 | 3355 |
| 3366 TEST(DebugStepForContinue) { | 3356 TEST(DebugStepForContinue) { |
| 3367 DebugLocalContext env; | 3357 DebugLocalContext env; |
| 3368 v8::Isolate* isolate = env->GetIsolate(); | 3358 v8::HandleScope scope(env->GetIsolate()); |
| 3369 v8::HandleScope scope(isolate); | |
| 3370 | 3359 |
| 3371 // Register a debug event listener which steps and counts. | 3360 // Register a debug event listener which steps and counts. |
| 3372 v8::Debug::SetDebugEventListener2(DebugEventStep); | 3361 v8::Debug::SetDebugEventListener2(DebugEventStep); |
| 3373 | 3362 |
| 3374 // Create a function for testing stepping. Run it to allow it to get | 3363 // Create a function for testing stepping. Run it to allow it to get |
| 3375 // optimized. | 3364 // optimized. |
| 3376 const int argc = 1; | 3365 const int argc = 1; |
| 3377 const char* src = "function foo(x) { " | 3366 const char* src = "function foo(x) { " |
| 3378 " var a = 0;" | 3367 " var a = 0;" |
| 3379 " var b = 0;" | 3368 " var b = 0;" |
| 3380 " var c = 0;" | 3369 " var c = 0;" |
| 3381 " for (var i = 0; i < x; i++) {" | 3370 " for (var i = 0; i < x; i++) {" |
| 3382 " a++;" | 3371 " a++;" |
| 3383 " if (a % 2 == 0) continue;" | 3372 " if (a % 2 == 0) continue;" |
| 3384 " b++;" | 3373 " b++;" |
| 3385 " c++;" | 3374 " c++;" |
| 3386 " }" | 3375 " }" |
| 3387 " return b;" | 3376 " return b;" |
| 3388 "}" | 3377 "}" |
| 3389 "foo()"; | 3378 "foo()"; |
| 3390 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3379 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3391 v8::Handle<v8::Value> result; | 3380 v8::Handle<v8::Value> result; |
| 3392 SetBreakPoint(foo, 8); // "var a = 0;" | 3381 SetBreakPoint(foo, 8); // "var a = 0;" |
| 3393 | 3382 |
| 3394 // Each loop generates 4 or 5 steps depending on whether a is equal. | 3383 // Each loop generates 4 or 5 steps depending on whether a is equal. |
| 3395 | 3384 |
| 3396 // Looping 10 times. | 3385 // Looping 10 times. |
| 3397 step_action = StepIn; | 3386 step_action = StepIn; |
| 3398 break_point_hit_count = 0; | 3387 break_point_hit_count = 0; |
| 3399 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) }; | 3388 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; |
| 3400 result = foo->Call(env->Global(), argc, argv_10); | 3389 result = foo->Call(env->Global(), argc, argv_10); |
| 3401 CHECK_EQ(5, result->Int32Value()); | 3390 CHECK_EQ(5, result->Int32Value()); |
| 3402 CHECK_EQ(52, break_point_hit_count); | 3391 CHECK_EQ(52, break_point_hit_count); |
| 3403 | 3392 |
| 3404 // Looping 100 times. | 3393 // Looping 100 times. |
| 3405 step_action = StepIn; | 3394 step_action = StepIn; |
| 3406 break_point_hit_count = 0; | 3395 break_point_hit_count = 0; |
| 3407 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(isolate, 100) }; | 3396 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; |
| 3408 result = foo->Call(env->Global(), argc, argv_100); | 3397 result = foo->Call(env->Global(), argc, argv_100); |
| 3409 CHECK_EQ(50, result->Int32Value()); | 3398 CHECK_EQ(50, result->Int32Value()); |
| 3410 CHECK_EQ(457, break_point_hit_count); | 3399 CHECK_EQ(457, break_point_hit_count); |
| 3411 | 3400 |
| 3412 // Get rid of the debug event listener. | 3401 // Get rid of the debug event listener. |
| 3413 v8::Debug::SetDebugEventListener2(NULL); | 3402 v8::Debug::SetDebugEventListener2(NULL); |
| 3414 CheckDebuggerUnloaded(); | 3403 CheckDebuggerUnloaded(); |
| 3415 } | 3404 } |
| 3416 | 3405 |
| 3417 | 3406 |
| 3418 TEST(DebugStepForBreak) { | 3407 TEST(DebugStepForBreak) { |
| 3419 DebugLocalContext env; | 3408 DebugLocalContext env; |
| 3420 v8::Isolate* isolate = env->GetIsolate(); | 3409 v8::HandleScope scope(env->GetIsolate()); |
| 3421 v8::HandleScope scope(isolate); | |
| 3422 | 3410 |
| 3423 // Register a debug event listener which steps and counts. | 3411 // Register a debug event listener which steps and counts. |
| 3424 v8::Debug::SetDebugEventListener2(DebugEventStep); | 3412 v8::Debug::SetDebugEventListener2(DebugEventStep); |
| 3425 | 3413 |
| 3426 // Create a function for testing stepping. Run it to allow it to get | 3414 // Create a function for testing stepping. Run it to allow it to get |
| 3427 // optimized. | 3415 // optimized. |
| 3428 const int argc = 1; | 3416 const int argc = 1; |
| 3429 const char* src = "function foo(x) { " | 3417 const char* src = "function foo(x) { " |
| 3430 " var a = 0;" | 3418 " var a = 0;" |
| 3431 " var b = 0;" | 3419 " var b = 0;" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3442 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3430 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3443 v8::Handle<v8::Value> result; | 3431 v8::Handle<v8::Value> result; |
| 3444 SetBreakPoint(foo, 8); // "var a = 0;" | 3432 SetBreakPoint(foo, 8); // "var a = 0;" |
| 3445 | 3433 |
| 3446 // Each loop generates 5 steps except for the last (when break is executed) | 3434 // Each loop generates 5 steps except for the last (when break is executed) |
| 3447 // which only generates 4. | 3435 // which only generates 4. |
| 3448 | 3436 |
| 3449 // Looping 10 times. | 3437 // Looping 10 times. |
| 3450 step_action = StepIn; | 3438 step_action = StepIn; |
| 3451 break_point_hit_count = 0; | 3439 break_point_hit_count = 0; |
| 3452 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) }; | 3440 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; |
| 3453 result = foo->Call(env->Global(), argc, argv_10); | 3441 result = foo->Call(env->Global(), argc, argv_10); |
| 3454 CHECK_EQ(9, result->Int32Value()); | 3442 CHECK_EQ(9, result->Int32Value()); |
| 3455 CHECK_EQ(55, break_point_hit_count); | 3443 CHECK_EQ(55, break_point_hit_count); |
| 3456 | 3444 |
| 3457 // Looping 100 times. | 3445 // Looping 100 times. |
| 3458 step_action = StepIn; | 3446 step_action = StepIn; |
| 3459 break_point_hit_count = 0; | 3447 break_point_hit_count = 0; |
| 3460 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(isolate, 100) }; | 3448 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; |
| 3461 result = foo->Call(env->Global(), argc, argv_100); | 3449 result = foo->Call(env->Global(), argc, argv_100); |
| 3462 CHECK_EQ(99, result->Int32Value()); | 3450 CHECK_EQ(99, result->Int32Value()); |
| 3463 CHECK_EQ(505, break_point_hit_count); | 3451 CHECK_EQ(505, break_point_hit_count); |
| 3464 | 3452 |
| 3465 // Get rid of the debug event listener. | 3453 // Get rid of the debug event listener. |
| 3466 v8::Debug::SetDebugEventListener2(NULL); | 3454 v8::Debug::SetDebugEventListener2(NULL); |
| 3467 CheckDebuggerUnloaded(); | 3455 CheckDebuggerUnloaded(); |
| 3468 } | 3456 } |
| 3469 | 3457 |
| 3470 | 3458 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3525 | 3513 |
| 3526 // Create a function for testing stepping. Run it to allow it to get | 3514 // Create a function for testing stepping. Run it to allow it to get |
| 3527 // optimized. | 3515 // optimized. |
| 3528 const char* src = "function foo(x) { " | 3516 const char* src = "function foo(x) { " |
| 3529 " var a = {};" | 3517 " var a = {};" |
| 3530 " with (a) {}" | 3518 " with (a) {}" |
| 3531 " with (b) {}" | 3519 " with (b) {}" |
| 3532 "}" | 3520 "}" |
| 3533 "foo()"; | 3521 "foo()"; |
| 3534 env->Global()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "b"), | 3522 env->Global()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "b"), |
| 3535 v8::Object::New(env->GetIsolate())); | 3523 v8::Object::New()); |
| 3536 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3524 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3537 v8::Handle<v8::Value> result; | 3525 v8::Handle<v8::Value> result; |
| 3538 SetBreakPoint(foo, 8); // "var a = {};" | 3526 SetBreakPoint(foo, 8); // "var a = {};" |
| 3539 | 3527 |
| 3540 step_action = StepIn; | 3528 step_action = StepIn; |
| 3541 break_point_hit_count = 0; | 3529 break_point_hit_count = 0; |
| 3542 foo->Call(env->Global(), 0, NULL); | 3530 foo->Call(env->Global(), 0, NULL); |
| 3543 CHECK_EQ(4, break_point_hit_count); | 3531 CHECK_EQ(4, break_point_hit_count); |
| 3544 | 3532 |
| 3545 // Get rid of the debug event listener. | 3533 // Get rid of the debug event listener. |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3864 // Create a script that returns a function. | 3852 // Create a script that returns a function. |
| 3865 const char* src = "(function (evt) {})"; | 3853 const char* src = "(function (evt) {})"; |
| 3866 const char* script_name = "StepInHandlerTest"; | 3854 const char* script_name = "StepInHandlerTest"; |
| 3867 | 3855 |
| 3868 // Set breakpoint in the script. | 3856 // Set breakpoint in the script. |
| 3869 SetScriptBreakPointByNameFromJS(env->GetIsolate(), script_name, 0, -1); | 3857 SetScriptBreakPointByNameFromJS(env->GetIsolate(), script_name, 0, -1); |
| 3870 break_point_hit_count = 0; | 3858 break_point_hit_count = 0; |
| 3871 | 3859 |
| 3872 v8::ScriptOrigin origin( | 3860 v8::ScriptOrigin origin( |
| 3873 v8::String::NewFromUtf8(env->GetIsolate(), script_name), | 3861 v8::String::NewFromUtf8(env->GetIsolate(), script_name), |
| 3874 v8::Integer::New(env->GetIsolate(), 0)); | 3862 v8::Integer::New(0)); |
| 3875 v8::Handle<v8::Script> script = v8::Script::Compile( | 3863 v8::Handle<v8::Script> script = v8::Script::Compile( |
| 3876 v8::String::NewFromUtf8(env->GetIsolate(), src), &origin); | 3864 v8::String::NewFromUtf8(env->GetIsolate(), src), &origin); |
| 3877 v8::Local<v8::Value> r = script->Run(); | 3865 v8::Local<v8::Value> r = script->Run(); |
| 3878 | 3866 |
| 3879 CHECK(r->IsFunction()); | 3867 CHECK(r->IsFunction()); |
| 3880 CHECK_EQ(1, break_point_hit_count); | 3868 CHECK_EQ(1, break_point_hit_count); |
| 3881 | 3869 |
| 3882 // Get rid of the debug event listener. | 3870 // Get rid of the debug event listener. |
| 3883 v8::Debug::SetDebugEventListener2(NULL); | 3871 v8::Debug::SetDebugEventListener2(NULL); |
| 3884 CheckDebuggerUnloaded(); | 3872 CheckDebuggerUnloaded(); |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4176 CheckDebuggerUnloaded(); | 4164 CheckDebuggerUnloaded(); |
| 4177 } | 4165 } |
| 4178 | 4166 |
| 4179 | 4167 |
| 4180 TEST(DebugBreak) { | 4168 TEST(DebugBreak) { |
| 4181 i::FLAG_stress_compaction = false; | 4169 i::FLAG_stress_compaction = false; |
| 4182 #ifdef VERIFY_HEAP | 4170 #ifdef VERIFY_HEAP |
| 4183 i::FLAG_verify_heap = true; | 4171 i::FLAG_verify_heap = true; |
| 4184 #endif | 4172 #endif |
| 4185 DebugLocalContext env; | 4173 DebugLocalContext env; |
| 4186 v8::Isolate* isolate = env->GetIsolate(); | 4174 v8::HandleScope scope(env->GetIsolate()); |
| 4187 v8::HandleScope scope(isolate); | |
| 4188 | 4175 |
| 4189 // Register a debug event listener which sets the break flag and counts. | 4176 // Register a debug event listener which sets the break flag and counts. |
| 4190 v8::Debug::SetDebugEventListener2(DebugEventBreak); | 4177 v8::Debug::SetDebugEventListener2(DebugEventBreak); |
| 4191 | 4178 |
| 4192 // Create a function for testing stepping. | 4179 // Create a function for testing stepping. |
| 4193 const char* src = "function f0() {}" | 4180 const char* src = "function f0() {}" |
| 4194 "function f1(x1) {}" | 4181 "function f1(x1) {}" |
| 4195 "function f2(x1,x2) {}" | 4182 "function f2(x1,x2) {}" |
| 4196 "function f3(x1,x2,x3) {}"; | 4183 "function f3(x1,x2,x3) {}"; |
| 4197 v8::Local<v8::Function> f0 = CompileFunction(&env, src, "f0"); | 4184 v8::Local<v8::Function> f0 = CompileFunction(&env, src, "f0"); |
| 4198 v8::Local<v8::Function> f1 = CompileFunction(&env, src, "f1"); | 4185 v8::Local<v8::Function> f1 = CompileFunction(&env, src, "f1"); |
| 4199 v8::Local<v8::Function> f2 = CompileFunction(&env, src, "f2"); | 4186 v8::Local<v8::Function> f2 = CompileFunction(&env, src, "f2"); |
| 4200 v8::Local<v8::Function> f3 = CompileFunction(&env, src, "f3"); | 4187 v8::Local<v8::Function> f3 = CompileFunction(&env, src, "f3"); |
| 4201 | 4188 |
| 4202 // Call the function to make sure it is compiled. | 4189 // Call the function to make sure it is compiled. |
| 4203 v8::Handle<v8::Value> argv[] = { v8::Number::New(isolate, 1), | 4190 v8::Handle<v8::Value> argv[] = { v8::Number::New(1), |
| 4204 v8::Number::New(isolate, 1), | 4191 v8::Number::New(1), |
| 4205 v8::Number::New(isolate, 1), | 4192 v8::Number::New(1), |
| 4206 v8::Number::New(isolate, 1) }; | 4193 v8::Number::New(1) }; |
| 4207 | 4194 |
| 4208 // Call all functions to make sure that they are compiled. | 4195 // Call all functions to make sure that they are compiled. |
| 4209 f0->Call(env->Global(), 0, NULL); | 4196 f0->Call(env->Global(), 0, NULL); |
| 4210 f1->Call(env->Global(), 0, NULL); | 4197 f1->Call(env->Global(), 0, NULL); |
| 4211 f2->Call(env->Global(), 0, NULL); | 4198 f2->Call(env->Global(), 0, NULL); |
| 4212 f3->Call(env->Global(), 0, NULL); | 4199 f3->Call(env->Global(), 0, NULL); |
| 4213 | 4200 |
| 4214 // Set the debug break flag. | 4201 // Set the debug break flag. |
| 4215 v8::Debug::DebugBreak(env->GetIsolate()); | 4202 v8::Debug::DebugBreak(env->GetIsolate()); |
| 4216 | 4203 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4300 CHECK_EQ(0, break_point_hit_count); | 4287 CHECK_EQ(0, break_point_hit_count); |
| 4301 | 4288 |
| 4302 // Get rid of the debug event listener. | 4289 // Get rid of the debug event listener. |
| 4303 v8::Debug::SetDebugEventListener2(NULL); | 4290 v8::Debug::SetDebugEventListener2(NULL); |
| 4304 CheckDebuggerUnloaded(); | 4291 CheckDebuggerUnloaded(); |
| 4305 } | 4292 } |
| 4306 | 4293 |
| 4307 | 4294 |
| 4308 static void NamedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) { | 4295 static void NamedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) { |
| 4309 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 3); | 4296 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 3); |
| 4310 result->Set(v8::Integer::New(info.GetIsolate(), 0), | 4297 result->Set(v8::Integer::New(0), |
| 4311 v8::String::NewFromUtf8(info.GetIsolate(), "a")); | 4298 v8::String::NewFromUtf8(info.GetIsolate(), "a")); |
| 4312 result->Set(v8::Integer::New(info.GetIsolate(), 1), | 4299 result->Set(v8::Integer::New(1), |
| 4313 v8::String::NewFromUtf8(info.GetIsolate(), "b")); | 4300 v8::String::NewFromUtf8(info.GetIsolate(), "b")); |
| 4314 result->Set(v8::Integer::New(info.GetIsolate(), 2), | 4301 result->Set(v8::Integer::New(2), |
| 4315 v8::String::NewFromUtf8(info.GetIsolate(), "c")); | 4302 v8::String::NewFromUtf8(info.GetIsolate(), "c")); |
| 4316 info.GetReturnValue().Set(result); | 4303 info.GetReturnValue().Set(result); |
| 4317 } | 4304 } |
| 4318 | 4305 |
| 4319 | 4306 |
| 4320 static void IndexedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) { | 4307 static void IndexedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) { |
| 4321 v8::Isolate* isolate = info.GetIsolate(); | 4308 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 2); |
| 4322 v8::Handle<v8::Array> result = v8::Array::New(isolate, 2); | 4309 result->Set(v8::Integer::New(0), v8::Number::New(1)); |
| 4323 result->Set(v8::Integer::New(isolate, 0), v8::Number::New(isolate, 1)); | 4310 result->Set(v8::Integer::New(1), v8::Number::New(10)); |
| 4324 result->Set(v8::Integer::New(isolate, 1), v8::Number::New(isolate, 10)); | |
| 4325 info.GetReturnValue().Set(result); | 4311 info.GetReturnValue().Set(result); |
| 4326 } | 4312 } |
| 4327 | 4313 |
| 4328 | 4314 |
| 4329 static void NamedGetter(v8::Local<v8::String> name, | 4315 static void NamedGetter(v8::Local<v8::String> name, |
| 4330 const v8::PropertyCallbackInfo<v8::Value>& info) { | 4316 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 4331 v8::String::Utf8Value n(name); | 4317 v8::String::Utf8Value n(name); |
| 4332 if (strcmp(*n, "a") == 0) { | 4318 if (strcmp(*n, "a") == 0) { |
| 4333 info.GetReturnValue().Set(v8::String::NewFromUtf8(info.GetIsolate(), "AA")); | 4319 info.GetReturnValue().Set(v8::String::NewFromUtf8(info.GetIsolate(), "AA")); |
| 4334 return; | 4320 return; |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4489 | 4475 |
| 4490 TEST(HiddenPrototypePropertyMirror) { | 4476 TEST(HiddenPrototypePropertyMirror) { |
| 4491 // Create a V8 environment with debug access. | 4477 // Create a V8 environment with debug access. |
| 4492 DebugLocalContext env; | 4478 DebugLocalContext env; |
| 4493 v8::Isolate* isolate = env->GetIsolate(); | 4479 v8::Isolate* isolate = env->GetIsolate(); |
| 4494 v8::HandleScope scope(isolate); | 4480 v8::HandleScope scope(isolate); |
| 4495 env.ExposeDebug(); | 4481 env.ExposeDebug(); |
| 4496 | 4482 |
| 4497 v8::Handle<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); | 4483 v8::Handle<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); |
| 4498 t0->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "x"), | 4484 t0->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "x"), |
| 4499 v8::Number::New(isolate, 0)); | 4485 v8::Number::New(0)); |
| 4500 v8::Handle<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); | 4486 v8::Handle<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); |
| 4501 t1->SetHiddenPrototype(true); | 4487 t1->SetHiddenPrototype(true); |
| 4502 t1->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "y"), | 4488 t1->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "y"), |
| 4503 v8::Number::New(isolate, 1)); | 4489 v8::Number::New(1)); |
| 4504 v8::Handle<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); | 4490 v8::Handle<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); |
| 4505 t2->SetHiddenPrototype(true); | 4491 t2->SetHiddenPrototype(true); |
| 4506 t2->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "z"), | 4492 t2->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "z"), |
| 4507 v8::Number::New(isolate, 2)); | 4493 v8::Number::New(2)); |
| 4508 v8::Handle<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); | 4494 v8::Handle<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); |
| 4509 t3->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "u"), | 4495 t3->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "u"), |
| 4510 v8::Number::New(isolate, 3)); | 4496 v8::Number::New(3)); |
| 4511 | 4497 |
| 4512 // Create object and set them on the global object. | 4498 // Create object and set them on the global object. |
| 4513 v8::Handle<v8::Object> o0 = t0->GetFunction()->NewInstance(); | 4499 v8::Handle<v8::Object> o0 = t0->GetFunction()->NewInstance(); |
| 4514 env->Global()->Set(v8::String::NewFromUtf8(isolate, "o0"), o0); | 4500 env->Global()->Set(v8::String::NewFromUtf8(isolate, "o0"), o0); |
| 4515 v8::Handle<v8::Object> o1 = t1->GetFunction()->NewInstance(); | 4501 v8::Handle<v8::Object> o1 = t1->GetFunction()->NewInstance(); |
| 4516 env->Global()->Set(v8::String::NewFromUtf8(isolate, "o1"), o1); | 4502 env->Global()->Set(v8::String::NewFromUtf8(isolate, "o1"), o1); |
| 4517 v8::Handle<v8::Object> o2 = t2->GetFunction()->NewInstance(); | 4503 v8::Handle<v8::Object> o2 = t2->GetFunction()->NewInstance(); |
| 4518 env->Global()->Set(v8::String::NewFromUtf8(isolate, "o2"), o2); | 4504 env->Global()->Set(v8::String::NewFromUtf8(isolate, "o2"), o2); |
| 4519 v8::Handle<v8::Object> o3 = t3->GetFunction()->NewInstance(); | 4505 v8::Handle<v8::Object> o3 = t3->GetFunction()->NewInstance(); |
| 4520 env->Global()->Set(v8::String::NewFromUtf8(isolate, "o3"), o3); | 4506 env->Global()->Set(v8::String::NewFromUtf8(isolate, "o3"), o3); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4678 | 4664 |
| 4679 // Create an object in the global scope. | 4665 // Create an object in the global scope. |
| 4680 const char* source = "var obj = {a: 1};"; | 4666 const char* source = "var obj = {a: 1};"; |
| 4681 v8::Script::Compile(v8::String::NewFromUtf8(isolate, source)) | 4667 v8::Script::Compile(v8::String::NewFromUtf8(isolate, source)) |
| 4682 ->Run(); | 4668 ->Run(); |
| 4683 v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast( | 4669 v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast( |
| 4684 env->Global()->Get(v8::String::NewFromUtf8(isolate, "obj"))); | 4670 env->Global()->Get(v8::String::NewFromUtf8(isolate, "obj"))); |
| 4685 // Set a hidden property on the object. | 4671 // Set a hidden property on the object. |
| 4686 obj->SetHiddenValue( | 4672 obj->SetHiddenValue( |
| 4687 v8::String::NewFromUtf8(isolate, "v8::test-debug::a"), | 4673 v8::String::NewFromUtf8(isolate, "v8::test-debug::a"), |
| 4688 v8::Int32::New(isolate, 11)); | 4674 v8::Int32::New(11)); |
| 4689 | 4675 |
| 4690 // Get mirror for the object with property getter. | 4676 // Get mirror for the object with property getter. |
| 4691 CompileRun("var obj_mirror = debug.MakeMirror(obj);"); | 4677 CompileRun("var obj_mirror = debug.MakeMirror(obj);"); |
| 4692 CHECK(CompileRun( | 4678 CHECK(CompileRun( |
| 4693 "obj_mirror instanceof debug.ObjectMirror")->BooleanValue()); | 4679 "obj_mirror instanceof debug.ObjectMirror")->BooleanValue()); |
| 4694 CompileRun("var named_names = obj_mirror.propertyNames();"); | 4680 CompileRun("var named_names = obj_mirror.propertyNames();"); |
| 4695 // There should be exactly one property. But there is also an unnamed | 4681 // There should be exactly one property. But there is also an unnamed |
| 4696 // property whose value is hidden properties dictionary. The latter | 4682 // property whose value is hidden properties dictionary. The latter |
| 4697 // property should not be in the list of reguar properties. | 4683 // property should not be in the list of reguar properties. |
| 4698 CHECK_EQ(1, CompileRun("named_names.length")->Int32Value()); | 4684 CHECK_EQ(1, CompileRun("named_names.length")->Int32Value()); |
| 4699 CHECK(CompileRun("named_names[0] == 'a'")->BooleanValue()); | 4685 CHECK(CompileRun("named_names[0] == 'a'")->BooleanValue()); |
| 4700 CHECK(CompileRun( | 4686 CHECK(CompileRun( |
| 4701 "obj_mirror.property('a').value().value() == 1")->BooleanValue()); | 4687 "obj_mirror.property('a').value().value() == 1")->BooleanValue()); |
| 4702 | 4688 |
| 4703 // Object created by t0 will become hidden prototype of object 'obj'. | 4689 // Object created by t0 will become hidden prototype of object 'obj'. |
| 4704 v8::Handle<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); | 4690 v8::Handle<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); |
| 4705 t0->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "b"), | 4691 t0->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "b"), |
| 4706 v8::Number::New(isolate, 2)); | 4692 v8::Number::New(2)); |
| 4707 t0->SetHiddenPrototype(true); | 4693 t0->SetHiddenPrototype(true); |
| 4708 v8::Handle<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); | 4694 v8::Handle<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); |
| 4709 t1->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "c"), | 4695 t1->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "c"), |
| 4710 v8::Number::New(isolate, 3)); | 4696 v8::Number::New(3)); |
| 4711 | 4697 |
| 4712 // Create proto objects, add hidden properties to them and set them on | 4698 // Create proto objects, add hidden properties to them and set them on |
| 4713 // the global object. | 4699 // the global object. |
| 4714 v8::Handle<v8::Object> protoObj = t0->GetFunction()->NewInstance(); | 4700 v8::Handle<v8::Object> protoObj = t0->GetFunction()->NewInstance(); |
| 4715 protoObj->SetHiddenValue( | 4701 protoObj->SetHiddenValue( |
| 4716 v8::String::NewFromUtf8(isolate, "v8::test-debug::b"), | 4702 v8::String::NewFromUtf8(isolate, "v8::test-debug::b"), |
| 4717 v8::Int32::New(isolate, 12)); | 4703 v8::Int32::New(12)); |
| 4718 env->Global()->Set(v8::String::NewFromUtf8(isolate, "protoObj"), | 4704 env->Global()->Set(v8::String::NewFromUtf8(isolate, "protoObj"), |
| 4719 protoObj); | 4705 protoObj); |
| 4720 v8::Handle<v8::Object> grandProtoObj = t1->GetFunction()->NewInstance(); | 4706 v8::Handle<v8::Object> grandProtoObj = t1->GetFunction()->NewInstance(); |
| 4721 grandProtoObj->SetHiddenValue( | 4707 grandProtoObj->SetHiddenValue( |
| 4722 v8::String::NewFromUtf8(isolate, "v8::test-debug::c"), | 4708 v8::String::NewFromUtf8(isolate, "v8::test-debug::c"), |
| 4723 v8::Int32::New(isolate, 13)); | 4709 v8::Int32::New(13)); |
| 4724 env->Global()->Set( | 4710 env->Global()->Set( |
| 4725 v8::String::NewFromUtf8(isolate, "grandProtoObj"), | 4711 v8::String::NewFromUtf8(isolate, "grandProtoObj"), |
| 4726 grandProtoObj); | 4712 grandProtoObj); |
| 4727 | 4713 |
| 4728 // Setting prototypes: obj->protoObj->grandProtoObj | 4714 // Setting prototypes: obj->protoObj->grandProtoObj |
| 4729 protoObj->Set(v8::String::NewFromUtf8(isolate, "__proto__"), | 4715 protoObj->Set(v8::String::NewFromUtf8(isolate, "__proto__"), |
| 4730 grandProtoObj); | 4716 grandProtoObj); |
| 4731 obj->Set(v8::String::NewFromUtf8(isolate, "__proto__"), protoObj); | 4717 obj->Set(v8::String::NewFromUtf8(isolate, "__proto__"), protoObj); |
| 4732 | 4718 |
| 4733 // Get mirror for the object with property getter. | 4719 // Get mirror for the object with property getter. |
| (...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5620 CcTest::isolate(), "debugger_call_with_data"))); | 5606 CcTest::isolate(), "debugger_call_with_data"))); |
| 5621 | 5607 |
| 5622 // Compile a function capturing closure. | 5608 // Compile a function capturing closure. |
| 5623 debugger_call_with_closure = | 5609 debugger_call_with_closure = |
| 5624 v8::Local<v8::Function>::Cast(v8::Script::Compile( | 5610 v8::Local<v8::Function>::Cast(v8::Script::Compile( |
| 5625 v8::String::NewFromUtf8(CcTest::isolate(), | 5611 v8::String::NewFromUtf8(CcTest::isolate(), |
| 5626 debugger_call_with_closure_source))->Run()); | 5612 debugger_call_with_closure_source))->Run()); |
| 5627 | 5613 |
| 5628 // Calling a function through the debugger returns 0 frames if there are | 5614 // Calling a function through the debugger returns 0 frames if there are |
| 5629 // no JavaScript frames. | 5615 // no JavaScript frames. |
| 5630 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 0), | 5616 CHECK_EQ(v8::Integer::New(0), v8::Debug::Call(frame_count)); |
| 5631 v8::Debug::Call(frame_count)); | |
| 5632 | 5617 |
| 5633 // Test that the number of frames can be retrieved. | 5618 // Test that the number of frames can be retrieved. |
| 5634 v8::Script::Compile( | 5619 v8::Script::Compile( |
| 5635 v8::String::NewFromUtf8(CcTest::isolate(), "CheckFrameCount(1)"))->Run(); | 5620 v8::String::NewFromUtf8(CcTest::isolate(), "CheckFrameCount(1)"))->Run(); |
| 5636 v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), | 5621 v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), |
| 5637 "function f() {" | 5622 "function f() {" |
| 5638 " CheckFrameCount(2);" | 5623 " CheckFrameCount(2);" |
| 5639 "}; f()"))->Run(); | 5624 "}; f()"))->Run(); |
| 5640 | 5625 |
| 5641 // Test that the source line can be retrieved. | 5626 // Test that the source line can be retrieved. |
| 5642 v8::Script::Compile( | 5627 v8::Script::Compile( |
| 5643 v8::String::NewFromUtf8(CcTest::isolate(), "CheckSourceLine(0)"))->Run(); | 5628 v8::String::NewFromUtf8(CcTest::isolate(), "CheckSourceLine(0)"))->Run(); |
| 5644 v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), | 5629 v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), |
| 5645 "function f() {\n" | 5630 "function f() {\n" |
| 5646 " CheckSourceLine(1)\n" | 5631 " CheckSourceLine(1)\n" |
| 5647 " CheckSourceLine(2)\n" | 5632 " CheckSourceLine(2)\n" |
| 5648 " CheckSourceLine(3)\n" | 5633 " CheckSourceLine(3)\n" |
| 5649 "}; f()"))->Run(); | 5634 "}; f()"))->Run(); |
| 5650 | 5635 |
| 5651 // Test that a parameter can be passed to a function called in the debugger. | 5636 // Test that a parameter can be passed to a function called in the debugger. |
| 5652 v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), | 5637 v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), |
| 5653 "CheckDataParameter()"))->Run(); | 5638 "CheckDataParameter()"))->Run(); |
| 5654 | 5639 |
| 5655 // Test that a function with closure can be run in the debugger. | 5640 // Test that a function with closure can be run in the debugger. |
| 5656 v8::Script::Compile( | 5641 v8::Script::Compile( |
| 5657 v8::String::NewFromUtf8(CcTest::isolate(), "CheckClosure()"))->Run(); | 5642 v8::String::NewFromUtf8(CcTest::isolate(), "CheckClosure()"))->Run(); |
| 5658 | 5643 |
| 5659 // Test that the source line is correct when there is a line offset. | 5644 // Test that the source line is correct when there is a line offset. |
| 5660 v8::ScriptOrigin origin(v8::String::NewFromUtf8(CcTest::isolate(), "test"), | 5645 v8::ScriptOrigin origin(v8::String::NewFromUtf8(CcTest::isolate(), "test"), |
| 5661 v8::Integer::New(CcTest::isolate(), 7)); | 5646 v8::Integer::New(7)); |
| 5662 v8::Script::Compile( | 5647 v8::Script::Compile( |
| 5663 v8::String::NewFromUtf8(CcTest::isolate(), "CheckSourceLine(7)"), &origin) | 5648 v8::String::NewFromUtf8(CcTest::isolate(), "CheckSourceLine(7)"), &origin) |
| 5664 ->Run(); | 5649 ->Run(); |
| 5665 v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), | 5650 v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), |
| 5666 "function f() {\n" | 5651 "function f() {\n" |
| 5667 " CheckSourceLine(8)\n" | 5652 " CheckSourceLine(8)\n" |
| 5668 " CheckSourceLine(9)\n" | 5653 " CheckSourceLine(9)\n" |
| 5669 " CheckSourceLine(10)\n" | 5654 " CheckSourceLine(10)\n" |
| 5670 "}; f()"), | 5655 "}; f()"), |
| 5671 &origin)->Run(); | 5656 &origin)->Run(); |
| (...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6452 v8::DebugEvent event = event_details.GetEvent(); | 6437 v8::DebugEvent event = event_details.GetEvent(); |
| 6453 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); | 6438 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); |
| 6454 | 6439 |
| 6455 if (event == v8::Break) { | 6440 if (event == v8::Break) { |
| 6456 break_point_hit_count++; | 6441 break_point_hit_count++; |
| 6457 | 6442 |
| 6458 // Get the name of the top frame function. | 6443 // Get the name of the top frame function. |
| 6459 if (!frame_function_name.IsEmpty()) { | 6444 if (!frame_function_name.IsEmpty()) { |
| 6460 // Get the name of the function. | 6445 // Get the name of the function. |
| 6461 const int argc = 2; | 6446 const int argc = 2; |
| 6462 v8::Handle<v8::Value> argv[argc] = { | 6447 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) }; |
| 6463 exec_state, v8::Integer::New(CcTest::isolate(), 0) | |
| 6464 }; | |
| 6465 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, | 6448 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, |
| 6466 argc, argv); | 6449 argc, argv); |
| 6467 if (result->IsUndefined()) { | 6450 if (result->IsUndefined()) { |
| 6468 last_function_hit[0] = '\0'; | 6451 last_function_hit[0] = '\0'; |
| 6469 } else { | 6452 } else { |
| 6470 CHECK(result->IsString()); | 6453 CHECK(result->IsString()); |
| 6471 v8::Handle<v8::String> function_name(result->ToString()); | 6454 v8::Handle<v8::String> function_name(result->ToString()); |
| 6472 function_name->WriteUtf8(last_function_hit); | 6455 function_name->WriteUtf8(last_function_hit); |
| 6473 } | 6456 } |
| 6474 } | 6457 } |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6870 int sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, | 6853 int sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, |
| 6871 3, -1 /* no column */); | 6854 3, -1 /* no column */); |
| 6872 int sbp2 = | 6855 int sbp2 = |
| 6873 SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, 5, 5); | 6856 SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, 5, 5); |
| 6874 | 6857 |
| 6875 after_compile_message_count = 0; | 6858 after_compile_message_count = 0; |
| 6876 v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); | 6859 v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); |
| 6877 | 6860 |
| 6878 v8::ScriptOrigin origin( | 6861 v8::ScriptOrigin origin( |
| 6879 v8::String::NewFromUtf8(env->GetIsolate(), resource_name), | 6862 v8::String::NewFromUtf8(env->GetIsolate(), resource_name), |
| 6880 v8::Integer::New(env->GetIsolate(), 10), | 6863 v8::Integer::New(10), |
| 6881 v8::Integer::New(env->GetIsolate(), 1)); | 6864 v8::Integer::New(1)); |
| 6882 // Compile a script whose first line number is greater than the breakpoints' | 6865 // Compile a script whose first line number is greater than the breakpoints' |
| 6883 // lines. | 6866 // lines. |
| 6884 v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), script), | 6867 v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), script), |
| 6885 &origin)->Run(); | 6868 &origin)->Run(); |
| 6886 | 6869 |
| 6887 // If the script is compiled successfully there is exactly one after compile | 6870 // If the script is compiled successfully there is exactly one after compile |
| 6888 // event. In case of an exception in debugger code after compile event is not | 6871 // event. In case of an exception in debugger code after compile event is not |
| 6889 // sent. | 6872 // sent. |
| 6890 CHECK_EQ(1, after_compile_message_count); | 6873 CHECK_EQ(1, after_compile_message_count); |
| 6891 | 6874 |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7215 static void DebugEventContextChecker(const v8::Debug::EventDetails& details) { | 7198 static void DebugEventContextChecker(const v8::Debug::EventDetails& details) { |
| 7216 CHECK(details.GetEventContext() == expected_context); | 7199 CHECK(details.GetEventContext() == expected_context); |
| 7217 CHECK_EQ(expected_callback_data, details.GetCallbackData()); | 7200 CHECK_EQ(expected_callback_data, details.GetCallbackData()); |
| 7218 } | 7201 } |
| 7219 | 7202 |
| 7220 | 7203 |
| 7221 // Check that event details contain context where debug event occured. | 7204 // Check that event details contain context where debug event occured. |
| 7222 TEST(DebugEventContext) { | 7205 TEST(DebugEventContext) { |
| 7223 v8::Isolate* isolate = CcTest::isolate(); | 7206 v8::Isolate* isolate = CcTest::isolate(); |
| 7224 v8::HandleScope scope(isolate); | 7207 v8::HandleScope scope(isolate); |
| 7208 expected_callback_data = v8::Int32::New(2010); |
| 7225 expected_context = v8::Context::New(isolate); | 7209 expected_context = v8::Context::New(isolate); |
| 7226 expected_callback_data = v8::Int32::New(isolate, 2010); | |
| 7227 v8::Debug::SetDebugEventListener2(DebugEventContextChecker, | 7210 v8::Debug::SetDebugEventListener2(DebugEventContextChecker, |
| 7228 expected_callback_data); | 7211 expected_callback_data); |
| 7229 v8::Context::Scope context_scope(expected_context); | 7212 v8::Context::Scope context_scope(expected_context); |
| 7230 v8::Script::Compile( | 7213 v8::Script::Compile( |
| 7231 v8::String::NewFromUtf8(isolate, "(function(){debugger;})();"))->Run(); | 7214 v8::String::NewFromUtf8(isolate, "(function(){debugger;})();"))->Run(); |
| 7232 expected_context.Clear(); | 7215 expected_context.Clear(); |
| 7233 v8::Debug::SetDebugEventListener2(NULL); | 7216 v8::Debug::SetDebugEventListener2(NULL); |
| 7234 expected_context_data = v8::Handle<v8::Value>(); | 7217 expected_context_data = v8::Handle<v8::Value>(); |
| 7235 CheckDebuggerUnloaded(); | 7218 CheckDebuggerUnloaded(); |
| 7236 } | 7219 } |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7313 static bool debug_event_break_deoptimize_done = false; | 7296 static bool debug_event_break_deoptimize_done = false; |
| 7314 | 7297 |
| 7315 static void DebugEventBreakDeoptimize( | 7298 static void DebugEventBreakDeoptimize( |
| 7316 const v8::Debug::EventDetails& event_details) { | 7299 const v8::Debug::EventDetails& event_details) { |
| 7317 v8::DebugEvent event = event_details.GetEvent(); | 7300 v8::DebugEvent event = event_details.GetEvent(); |
| 7318 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); | 7301 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); |
| 7319 if (event == v8::Break) { | 7302 if (event == v8::Break) { |
| 7320 if (!frame_function_name.IsEmpty()) { | 7303 if (!frame_function_name.IsEmpty()) { |
| 7321 // Get the name of the function. | 7304 // Get the name of the function. |
| 7322 const int argc = 2; | 7305 const int argc = 2; |
| 7323 v8::Handle<v8::Value> argv[argc] = { | 7306 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) }; |
| 7324 exec_state, v8::Integer::New(CcTest::isolate(), 0) | |
| 7325 }; | |
| 7326 v8::Handle<v8::Value> result = | 7307 v8::Handle<v8::Value> result = |
| 7327 frame_function_name->Call(exec_state, argc, argv); | 7308 frame_function_name->Call(exec_state, argc, argv); |
| 7328 if (!result->IsUndefined()) { | 7309 if (!result->IsUndefined()) { |
| 7329 char fn[80]; | 7310 char fn[80]; |
| 7330 CHECK(result->IsString()); | 7311 CHECK(result->IsString()); |
| 7331 v8::Handle<v8::String> function_name(result->ToString()); | 7312 v8::Handle<v8::String> function_name(result->ToString()); |
| 7332 function_name->WriteUtf8(fn); | 7313 function_name->WriteUtf8(fn); |
| 7333 if (strcmp(fn, "bar") == 0) { | 7314 if (strcmp(fn, "bar") == 0) { |
| 7334 i::Deoptimizer::DeoptimizeAll(CcTest::i_isolate()); | 7315 i::Deoptimizer::DeoptimizeAll(CcTest::i_isolate()); |
| 7335 debug_event_break_deoptimize_done = true; | 7316 debug_event_break_deoptimize_done = true; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7379 | 7360 |
| 7380 static void DebugEventBreakWithOptimizedStack( | 7361 static void DebugEventBreakWithOptimizedStack( |
| 7381 const v8::Debug::EventDetails& event_details) { | 7362 const v8::Debug::EventDetails& event_details) { |
| 7382 v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate(); | 7363 v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate(); |
| 7383 v8::DebugEvent event = event_details.GetEvent(); | 7364 v8::DebugEvent event = event_details.GetEvent(); |
| 7384 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); | 7365 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); |
| 7385 if (event == v8::Break) { | 7366 if (event == v8::Break) { |
| 7386 if (!frame_function_name.IsEmpty()) { | 7367 if (!frame_function_name.IsEmpty()) { |
| 7387 for (int i = 0; i < 2; i++) { | 7368 for (int i = 0; i < 2; i++) { |
| 7388 const int argc = 2; | 7369 const int argc = 2; |
| 7389 v8::Handle<v8::Value> argv[argc] = { | 7370 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(i) }; |
| 7390 exec_state, v8::Integer::New(isolate, i) | |
| 7391 }; | |
| 7392 // Get the name of the function in frame i. | 7371 // Get the name of the function in frame i. |
| 7393 v8::Handle<v8::Value> result = | 7372 v8::Handle<v8::Value> result = |
| 7394 frame_function_name->Call(exec_state, argc, argv); | 7373 frame_function_name->Call(exec_state, argc, argv); |
| 7395 CHECK(result->IsString()); | 7374 CHECK(result->IsString()); |
| 7396 v8::Handle<v8::String> function_name(result->ToString()); | 7375 v8::Handle<v8::String> function_name(result->ToString()); |
| 7397 CHECK(function_name->Equals(v8::String::NewFromUtf8(isolate, "loop"))); | 7376 CHECK(function_name->Equals(v8::String::NewFromUtf8(isolate, "loop"))); |
| 7398 // Get the name of the first argument in frame i. | 7377 // Get the name of the first argument in frame i. |
| 7399 result = frame_argument_name->Call(exec_state, argc, argv); | 7378 result = frame_argument_name->Call(exec_state, argc, argv); |
| 7400 CHECK(result->IsString()); | 7379 CHECK(result->IsString()); |
| 7401 v8::Handle<v8::String> argument_name(result->ToString()); | 7380 v8::Handle<v8::String> argument_name(result->ToString()); |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7691 TEST(LiveEditDisabled) { | 7670 TEST(LiveEditDisabled) { |
| 7692 v8::internal::FLAG_allow_natives_syntax = true; | 7671 v8::internal::FLAG_allow_natives_syntax = true; |
| 7693 LocalContext env; | 7672 LocalContext env; |
| 7694 v8::HandleScope scope(env->GetIsolate()); | 7673 v8::HandleScope scope(env->GetIsolate()); |
| 7695 v8::Debug::SetLiveEditEnabled(false, env->GetIsolate()); | 7674 v8::Debug::SetLiveEditEnabled(false, env->GetIsolate()); |
| 7696 CompileRun("%LiveEditCompareStrings('', '')"); | 7675 CompileRun("%LiveEditCompareStrings('', '')"); |
| 7697 } | 7676 } |
| 7698 | 7677 |
| 7699 | 7678 |
| 7700 #endif // ENABLE_DEBUGGER_SUPPORT | 7679 #endif // ENABLE_DEBUGGER_SUPPORT |
| OLD | NEW |