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 2382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2393 ClearBreakPoint(bp); | 2393 ClearBreakPoint(bp); |
2394 v8::Debug::SetDebugEventListener2(NULL); | 2394 v8::Debug::SetDebugEventListener2(NULL); |
2395 CheckDebuggerUnloaded(); | 2395 CheckDebuggerUnloaded(); |
2396 } | 2396 } |
2397 | 2397 |
2398 | 2398 |
2399 // Test that the evaluation of expressions when a break point is hit generates | 2399 // Test that the evaluation of expressions when a break point is hit generates |
2400 // the correct results. | 2400 // the correct results. |
2401 TEST(DebugEvaluate) { | 2401 TEST(DebugEvaluate) { |
2402 DebugLocalContext env; | 2402 DebugLocalContext env; |
2403 v8::HandleScope scope(env->GetIsolate()); | 2403 v8::Isolate* isolate = env->GetIsolate(); |
| 2404 v8::HandleScope scope(isolate); |
2404 env.ExposeDebug(); | 2405 env.ExposeDebug(); |
2405 | 2406 |
2406 // Create a function for checking the evaluation when hitting a break point. | 2407 // Create a function for checking the evaluation when hitting a break point. |
2407 evaluate_check_function = CompileFunction(&env, | 2408 evaluate_check_function = CompileFunction(&env, |
2408 evaluate_check_source, | 2409 evaluate_check_source, |
2409 "evaluate_check"); | 2410 "evaluate_check"); |
2410 // Register the debug event listener | 2411 // Register the debug event listener |
2411 v8::Debug::SetDebugEventListener2(DebugEventEvaluate); | 2412 v8::Debug::SetDebugEventListener2(DebugEventEvaluate); |
2412 | 2413 |
2413 // Different expected vaules of x and a when in a break point (u = undefined, | 2414 // Different expected vaules of x and a when in a break point (u = undefined, |
2414 // d = Hello, world!). | 2415 // d = Hello, world!). |
2415 struct EvaluateCheck checks_uu[] = { | 2416 struct EvaluateCheck checks_uu[] = { |
2416 {"x", v8::Undefined()}, | 2417 {"x", v8::Undefined(isolate)}, |
2417 {"a", v8::Undefined()}, | 2418 {"a", v8::Undefined(isolate)}, |
2418 {NULL, v8::Handle<v8::Value>()} | 2419 {NULL, v8::Handle<v8::Value>()} |
2419 }; | 2420 }; |
2420 struct EvaluateCheck checks_hu[] = { | 2421 struct EvaluateCheck checks_hu[] = { |
2421 {"x", v8::String::New("Hello, world!")}, | 2422 {"x", v8::String::New("Hello, world!")}, |
2422 {"a", v8::Undefined()}, | 2423 {"a", v8::Undefined(isolate)}, |
2423 {NULL, v8::Handle<v8::Value>()} | 2424 {NULL, v8::Handle<v8::Value>()} |
2424 }; | 2425 }; |
2425 struct EvaluateCheck checks_hh[] = { | 2426 struct EvaluateCheck checks_hh[] = { |
2426 {"x", v8::String::New("Hello, world!")}, | 2427 {"x", v8::String::New("Hello, world!")}, |
2427 {"a", v8::String::New("Hello, world!")}, | 2428 {"a", v8::String::New("Hello, world!")}, |
2428 {NULL, v8::Handle<v8::Value>()} | 2429 {NULL, v8::Handle<v8::Value>()} |
2429 }; | 2430 }; |
2430 | 2431 |
2431 // Simple test function. The "y=0" is in the function foo to provide a break | 2432 // Simple test function. The "y=0" is in the function foo to provide a break |
2432 // location. For "y=0" the "y" is at position 15 in the barbar function | 2433 // location. For "y=0" the "y" is at position 15 in the barbar function |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2478 " barbar();" | 2479 " barbar();" |
2479 " y=0;a=x;" | 2480 " y=0;a=x;" |
2480 "}", | 2481 "}", |
2481 "bar"); | 2482 "bar"); |
2482 const int barbar_break_position = 8; | 2483 const int barbar_break_position = 8; |
2483 | 2484 |
2484 // Call bar setting breakpoint before a=x in barbar and undefined as | 2485 // Call bar setting breakpoint before a=x in barbar and undefined as |
2485 // parameter. | 2486 // parameter. |
2486 checks = checks_uu; | 2487 checks = checks_uu; |
2487 v8::Handle<v8::Value> argv_bar_1[2] = { | 2488 v8::Handle<v8::Value> argv_bar_1[2] = { |
2488 v8::Undefined(), | 2489 v8::Undefined(isolate), |
2489 v8::Number::New(barbar_break_position) | 2490 v8::Number::New(barbar_break_position) |
2490 }; | 2491 }; |
2491 bar->Call(env->Global(), 2, argv_bar_1); | 2492 bar->Call(env->Global(), 2, argv_bar_1); |
2492 | 2493 |
2493 // Call bar setting breakpoint before a=x in barbar and parameter | 2494 // Call bar setting breakpoint before a=x in barbar and parameter |
2494 // "Hello, world!". | 2495 // "Hello, world!". |
2495 checks = checks_hu; | 2496 checks = checks_hu; |
2496 v8::Handle<v8::Value> argv_bar_2[2] = { | 2497 v8::Handle<v8::Value> argv_bar_2[2] = { |
2497 v8::String::New("Hello, world!"), | 2498 v8::String::New("Hello, world!"), |
2498 v8::Number::New(barbar_break_position) | 2499 v8::Number::New(barbar_break_position) |
(...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3098 CHECK_EQ(6, break_point_hit_count); | 3099 CHECK_EQ(6, break_point_hit_count); |
3099 | 3100 |
3100 // Get rid of the debug event listener. | 3101 // Get rid of the debug event listener. |
3101 v8::Debug::SetDebugEventListener2(NULL); | 3102 v8::Debug::SetDebugEventListener2(NULL); |
3102 CheckDebuggerUnloaded(); | 3103 CheckDebuggerUnloaded(); |
3103 } | 3104 } |
3104 | 3105 |
3105 | 3106 |
3106 TEST(DebugStepIf) { | 3107 TEST(DebugStepIf) { |
3107 DebugLocalContext env; | 3108 DebugLocalContext env; |
3108 v8::HandleScope scope(env->GetIsolate()); | 3109 v8::Isolate* isolate = env->GetIsolate(); |
| 3110 v8::HandleScope scope(isolate); |
3109 | 3111 |
3110 // Register a debug event listener which steps and counts. | 3112 // Register a debug event listener which steps and counts. |
3111 v8::Debug::SetDebugEventListener2(DebugEventStep); | 3113 v8::Debug::SetDebugEventListener2(DebugEventStep); |
3112 | 3114 |
3113 // Create a function for testing stepping. Run it to allow it to get | 3115 // Create a function for testing stepping. Run it to allow it to get |
3114 // optimized. | 3116 // optimized. |
3115 const int argc = 1; | 3117 const int argc = 1; |
3116 const char* src = "function foo(x) { " | 3118 const char* src = "function foo(x) { " |
3117 " a = 1;" | 3119 " a = 1;" |
3118 " if (x) {" | 3120 " if (x) {" |
3119 " b = 1;" | 3121 " b = 1;" |
3120 " } else {" | 3122 " } else {" |
3121 " c = 1;" | 3123 " c = 1;" |
3122 " d = 1;" | 3124 " d = 1;" |
3123 " }" | 3125 " }" |
3124 "}" | 3126 "}" |
3125 "a=0; b=0; c=0; d=0; foo()"; | 3127 "a=0; b=0; c=0; d=0; foo()"; |
3126 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3128 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
3127 SetBreakPoint(foo, 0); | 3129 SetBreakPoint(foo, 0); |
3128 | 3130 |
3129 // Stepping through the true part. | 3131 // Stepping through the true part. |
3130 step_action = StepIn; | 3132 step_action = StepIn; |
3131 break_point_hit_count = 0; | 3133 break_point_hit_count = 0; |
3132 v8::Handle<v8::Value> argv_true[argc] = { v8::True() }; | 3134 v8::Handle<v8::Value> argv_true[argc] = { v8::True(isolate) }; |
3133 foo->Call(env->Global(), argc, argv_true); | 3135 foo->Call(env->Global(), argc, argv_true); |
3134 CHECK_EQ(4, break_point_hit_count); | 3136 CHECK_EQ(4, break_point_hit_count); |
3135 | 3137 |
3136 // Stepping through the false part. | 3138 // Stepping through the false part. |
3137 step_action = StepIn; | 3139 step_action = StepIn; |
3138 break_point_hit_count = 0; | 3140 break_point_hit_count = 0; |
3139 v8::Handle<v8::Value> argv_false[argc] = { v8::False() }; | 3141 v8::Handle<v8::Value> argv_false[argc] = { v8::False(isolate) }; |
3140 foo->Call(env->Global(), argc, argv_false); | 3142 foo->Call(env->Global(), argc, argv_false); |
3141 CHECK_EQ(5, break_point_hit_count); | 3143 CHECK_EQ(5, break_point_hit_count); |
3142 | 3144 |
3143 // Get rid of the debug event listener. | 3145 // Get rid of the debug event listener. |
3144 v8::Debug::SetDebugEventListener2(NULL); | 3146 v8::Debug::SetDebugEventListener2(NULL); |
3145 CheckDebuggerUnloaded(); | 3147 CheckDebuggerUnloaded(); |
3146 } | 3148 } |
3147 | 3149 |
3148 | 3150 |
3149 TEST(DebugStepSwitch) { | 3151 TEST(DebugStepSwitch) { |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3500 CHECK_EQ(4, break_point_hit_count); | 3502 CHECK_EQ(4, break_point_hit_count); |
3501 | 3503 |
3502 // Get rid of the debug event listener. | 3504 // Get rid of the debug event listener. |
3503 v8::Debug::SetDebugEventListener2(NULL); | 3505 v8::Debug::SetDebugEventListener2(NULL); |
3504 CheckDebuggerUnloaded(); | 3506 CheckDebuggerUnloaded(); |
3505 } | 3507 } |
3506 | 3508 |
3507 | 3509 |
3508 TEST(DebugConditional) { | 3510 TEST(DebugConditional) { |
3509 DebugLocalContext env; | 3511 DebugLocalContext env; |
3510 v8::HandleScope scope(env->GetIsolate()); | 3512 v8::Isolate* isolate = env->GetIsolate(); |
| 3513 v8::HandleScope scope(isolate); |
3511 | 3514 |
3512 // Register a debug event listener which steps and counts. | 3515 // Register a debug event listener which steps and counts. |
3513 v8::Debug::SetDebugEventListener2(DebugEventStep); | 3516 v8::Debug::SetDebugEventListener2(DebugEventStep); |
3514 | 3517 |
3515 // Create a function for testing stepping. Run it to allow it to get | 3518 // Create a function for testing stepping. Run it to allow it to get |
3516 // optimized. | 3519 // optimized. |
3517 const char* src = "function foo(x) { " | 3520 const char* src = "function foo(x) { " |
3518 " var a;" | 3521 " var a;" |
3519 " a = x ? 1 : 2;" | 3522 " a = x ? 1 : 2;" |
3520 " return a;" | 3523 " return a;" |
3521 "}" | 3524 "}" |
3522 "foo()"; | 3525 "foo()"; |
3523 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3526 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
3524 SetBreakPoint(foo, 0); // "var a;" | 3527 SetBreakPoint(foo, 0); // "var a;" |
3525 | 3528 |
3526 step_action = StepIn; | 3529 step_action = StepIn; |
3527 break_point_hit_count = 0; | 3530 break_point_hit_count = 0; |
3528 foo->Call(env->Global(), 0, NULL); | 3531 foo->Call(env->Global(), 0, NULL); |
3529 CHECK_EQ(5, break_point_hit_count); | 3532 CHECK_EQ(5, break_point_hit_count); |
3530 | 3533 |
3531 step_action = StepIn; | 3534 step_action = StepIn; |
3532 break_point_hit_count = 0; | 3535 break_point_hit_count = 0; |
3533 const int argc = 1; | 3536 const int argc = 1; |
3534 v8::Handle<v8::Value> argv_true[argc] = { v8::True() }; | 3537 v8::Handle<v8::Value> argv_true[argc] = { v8::True(isolate) }; |
3535 foo->Call(env->Global(), argc, argv_true); | 3538 foo->Call(env->Global(), argc, argv_true); |
3536 CHECK_EQ(5, break_point_hit_count); | 3539 CHECK_EQ(5, break_point_hit_count); |
3537 | 3540 |
3538 // Get rid of the debug event listener. | 3541 // Get rid of the debug event listener. |
3539 v8::Debug::SetDebugEventListener2(NULL); | 3542 v8::Debug::SetDebugEventListener2(NULL); |
3540 CheckDebuggerUnloaded(); | 3543 CheckDebuggerUnloaded(); |
3541 } | 3544 } |
3542 | 3545 |
3543 | 3546 |
3544 TEST(StepInOutSimple) { | 3547 TEST(StepInOutSimple) { |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3752 CHECK_EQ(1, break_point_hit_count); | 3755 CHECK_EQ(1, break_point_hit_count); |
3753 | 3756 |
3754 v8::Debug::SetDebugEventListener2(NULL); | 3757 v8::Debug::SetDebugEventListener2(NULL); |
3755 CheckDebuggerUnloaded(); | 3758 CheckDebuggerUnloaded(); |
3756 } | 3759 } |
3757 | 3760 |
3758 | 3761 |
3759 // Test that step in works with function.call. | 3762 // Test that step in works with function.call. |
3760 TEST(DebugStepFunctionCall) { | 3763 TEST(DebugStepFunctionCall) { |
3761 DebugLocalContext env; | 3764 DebugLocalContext env; |
3762 v8::HandleScope scope(env->GetIsolate()); | 3765 v8::Isolate* isolate = env->GetIsolate(); |
| 3766 v8::HandleScope scope(isolate); |
3763 | 3767 |
3764 // Create a function for testing stepping. | 3768 // Create a function for testing stepping. |
3765 v8::Local<v8::Function> foo = CompileFunction( | 3769 v8::Local<v8::Function> foo = CompileFunction( |
3766 &env, | 3770 &env, |
3767 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" | 3771 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" |
3768 "function foo(a){ debugger;" | 3772 "function foo(a){ debugger;" |
3769 " if (a) {" | 3773 " if (a) {" |
3770 " bar.call(this, 1, 2, 3);" | 3774 " bar.call(this, 1, 2, 3);" |
3771 " } else {" | 3775 " } else {" |
3772 " bar.call(this, 0);" | 3776 " bar.call(this, 0);" |
3773 " }" | 3777 " }" |
3774 "}", | 3778 "}", |
3775 "foo"); | 3779 "foo"); |
3776 | 3780 |
3777 // Register a debug event listener which steps and counts. | 3781 // Register a debug event listener which steps and counts. |
3778 v8::Debug::SetDebugEventListener2(DebugEventStep); | 3782 v8::Debug::SetDebugEventListener2(DebugEventStep); |
3779 step_action = StepIn; | 3783 step_action = StepIn; |
3780 | 3784 |
3781 // Check stepping where the if condition in bar is false. | 3785 // Check stepping where the if condition in bar is false. |
3782 break_point_hit_count = 0; | 3786 break_point_hit_count = 0; |
3783 foo->Call(env->Global(), 0, NULL); | 3787 foo->Call(env->Global(), 0, NULL); |
3784 CHECK_EQ(6, break_point_hit_count); | 3788 CHECK_EQ(6, break_point_hit_count); |
3785 | 3789 |
3786 // Check stepping where the if condition in bar is true. | 3790 // Check stepping where the if condition in bar is true. |
3787 break_point_hit_count = 0; | 3791 break_point_hit_count = 0; |
3788 const int argc = 1; | 3792 const int argc = 1; |
3789 v8::Handle<v8::Value> argv[argc] = { v8::True() }; | 3793 v8::Handle<v8::Value> argv[argc] = { v8::True(isolate) }; |
3790 foo->Call(env->Global(), argc, argv); | 3794 foo->Call(env->Global(), argc, argv); |
3791 CHECK_EQ(8, break_point_hit_count); | 3795 CHECK_EQ(8, break_point_hit_count); |
3792 | 3796 |
3793 v8::Debug::SetDebugEventListener2(NULL); | 3797 v8::Debug::SetDebugEventListener2(NULL); |
3794 CheckDebuggerUnloaded(); | 3798 CheckDebuggerUnloaded(); |
3795 | 3799 |
3796 // Register a debug event listener which just counts. | 3800 // Register a debug event listener which just counts. |
3797 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); | 3801 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); |
3798 | 3802 |
3799 break_point_hit_count = 0; | 3803 break_point_hit_count = 0; |
(...skipping 3753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7553 TEST(LiveEditDisabled) { | 7557 TEST(LiveEditDisabled) { |
7554 v8::internal::FLAG_allow_natives_syntax = true; | 7558 v8::internal::FLAG_allow_natives_syntax = true; |
7555 LocalContext env; | 7559 LocalContext env; |
7556 v8::HandleScope scope(env->GetIsolate()); | 7560 v8::HandleScope scope(env->GetIsolate()); |
7557 v8::Debug::SetLiveEditEnabled(false), env->GetIsolate(); | 7561 v8::Debug::SetLiveEditEnabled(false), env->GetIsolate(); |
7558 CompileRun("%LiveEditCompareStrings('', '')"); | 7562 CompileRun("%LiveEditCompareStrings('', '')"); |
7559 } | 7563 } |
7560 | 7564 |
7561 | 7565 |
7562 #endif // ENABLE_DEBUGGER_SUPPORT | 7566 #endif // ENABLE_DEBUGGER_SUPPORT |
OLD | NEW |