| 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 951 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 962 } | 962 } |
| 963 | 963 |
| 964 static void MessageCallbackCount(v8::Handle<v8::Message> message, | 964 static void MessageCallbackCount(v8::Handle<v8::Message> message, |
| 965 v8::Handle<v8::Value> data) { | 965 v8::Handle<v8::Value> data) { |
| 966 message_callback_count++; | 966 message_callback_count++; |
| 967 } | 967 } |
| 968 | 968 |
| 969 | 969 |
| 970 // --- T h e A c t u a l T e s t s | 970 // --- T h e A c t u a l T e s t s |
| 971 | 971 |
| 972 | |
| 973 // Test that the debug break function is the expected one for different kinds | |
| 974 // of break locations. | |
| 975 TEST(DebugStub) { | |
| 976 using ::v8::internal::Builtins; | |
| 977 using ::v8::internal::Isolate; | |
| 978 DebugLocalContext env; | |
| 979 v8::HandleScope scope(env->GetIsolate()); | |
| 980 | |
| 981 CheckDebugBreakFunction(&env, | |
| 982 "function f1(){}", "f1", | |
| 983 0, | |
| 984 v8::internal::RelocInfo::JS_RETURN, | |
| 985 NULL); | |
| 986 CheckDebugBreakFunction(&env, | |
| 987 "function f2(){x=1;}", "f2", | |
| 988 0, | |
| 989 v8::internal::RelocInfo::CODE_TARGET, | |
| 990 CcTest::i_isolate()->builtins()->builtin( | |
| 991 Builtins::kStoreIC_DebugBreak)); | |
| 992 CheckDebugBreakFunction( | |
| 993 &env, "function f3(){x();}", "f3", 0, | |
| 994 v8::internal::RelocInfo::CODE_TARGET, | |
| 995 CcTest::i_isolate()->builtins()->builtin(Builtins::kLoadIC_DebugBreak)); | |
| 996 | |
| 997 // TODO(1240753): Make the test architecture independent or split | |
| 998 // parts of the debugger into architecture dependent files. This | |
| 999 // part currently disabled as it is not portable between IA32/ARM. | |
| 1000 // Currently on ICs for keyed store/load on ARM. | |
| 1001 #if !defined (__arm__) && !defined(__thumb__) | |
| 1002 CheckDebugBreakFunction( | |
| 1003 &env, | |
| 1004 "function f4(){var index='propertyName'; var a={}; a[index] = 'x';}", | |
| 1005 "f4", 39, v8::internal::RelocInfo::CODE_TARGET, | |
| 1006 CcTest::i_isolate()->builtins()->builtin( | |
| 1007 Builtins::kKeyedStoreIC_DebugBreak)); | |
| 1008 CheckDebugBreakFunction( | |
| 1009 &env, | |
| 1010 "function f5(){var index='propertyName'; var a={}; return a[index];}", | |
| 1011 "f5", 39, v8::internal::RelocInfo::CODE_TARGET, | |
| 1012 CcTest::i_isolate()->builtins()->builtin( | |
| 1013 Builtins::kKeyedLoadIC_DebugBreak)); | |
| 1014 #endif | |
| 1015 | |
| 1016 CheckDebugBreakFunction(&env, "function f6(){(0==null)()}", "f6", 0, | |
| 1017 v8::internal::RelocInfo::CODE_TARGET, | |
| 1018 CcTest::i_isolate()->builtins()->builtin( | |
| 1019 Builtins::kCompareNilIC_DebugBreak)); | |
| 1020 | |
| 1021 // Check the debug break code stubs for call ICs with different number of | |
| 1022 // parameters. | |
| 1023 // TODO(verwaest): XXX update test. | |
| 1024 // Handle<Code> debug_break_0 = v8::internal::ComputeCallDebugBreak(0); | |
| 1025 // Handle<Code> debug_break_1 = v8::internal::ComputeCallDebugBreak(1); | |
| 1026 // Handle<Code> debug_break_4 = v8::internal::ComputeCallDebugBreak(4); | |
| 1027 | |
| 1028 // CheckDebugBreakFunction(&env, | |
| 1029 // "function f4_0(){x();}", "f4_0", | |
| 1030 // 0, | |
| 1031 // v8::internal::RelocInfo::CODE_TARGET, | |
| 1032 // *debug_break_0); | |
| 1033 | |
| 1034 // CheckDebugBreakFunction(&env, | |
| 1035 // "function f4_1(){x(1);}", "f4_1", | |
| 1036 // 0, | |
| 1037 // v8::internal::RelocInfo::CODE_TARGET, | |
| 1038 // *debug_break_1); | |
| 1039 | |
| 1040 // CheckDebugBreakFunction(&env, | |
| 1041 // "function f4_4(){x(1,2,3,4);}", "f4_4", | |
| 1042 // 0, | |
| 1043 // v8::internal::RelocInfo::CODE_TARGET, | |
| 1044 // *debug_break_4); | |
| 1045 } | |
| 1046 | |
| 1047 | |
| 1048 // Test that the debug info in the VM is in sync with the functions being | 972 // Test that the debug info in the VM is in sync with the functions being |
| 1049 // debugged. | 973 // debugged. |
| 1050 TEST(DebugInfo) { | 974 TEST(DebugInfo) { |
| 1051 DebugLocalContext env; | 975 DebugLocalContext env; |
| 1052 v8::HandleScope scope(env->GetIsolate()); | 976 v8::HandleScope scope(env->GetIsolate()); |
| 1053 // Create a couple of functions for the test. | 977 // Create a couple of functions for the test. |
| 1054 v8::Local<v8::Function> foo = | 978 v8::Local<v8::Function> foo = |
| 1055 CompileFunction(&env, "function foo(){}", "foo"); | 979 CompileFunction(&env, "function foo(){}", "foo"); |
| 1056 v8::Local<v8::Function> bar = | 980 v8::Local<v8::Function> bar = |
| 1057 CompileFunction(&env, "function bar(){}", "bar"); | 981 CompileFunction(&env, "function bar(){}", "bar"); |
| (...skipping 1281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2339 break_point_hit_count = 0; | 2263 break_point_hit_count = 0; |
| 2340 DebugLocalContext env; | 2264 DebugLocalContext env; |
| 2341 v8::HandleScope scope(env->GetIsolate()); | 2265 v8::HandleScope scope(env->GetIsolate()); |
| 2342 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 2266 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); |
| 2343 v8::Script::Compile( | 2267 v8::Script::Compile( |
| 2344 v8::String::NewFromUtf8(env->GetIsolate(), "function foo(){debugger;}")) | 2268 v8::String::NewFromUtf8(env->GetIsolate(), "function foo(){debugger;}")) |
| 2345 ->Run(); | 2269 ->Run(); |
| 2346 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( | 2270 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( |
| 2347 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo"))); | 2271 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo"))); |
| 2348 | 2272 |
| 2349 // The debugger statement triggers breakpint hit | 2273 // The debugger statement triggers breakpoint hit |
| 2350 foo->Call(env->Global(), 0, NULL); | 2274 foo->Call(env->Global(), 0, NULL); |
| 2351 CHECK_EQ(1, break_point_hit_count); | 2275 CHECK_EQ(1, break_point_hit_count); |
| 2352 | 2276 |
| 2353 int bp = SetBreakPoint(foo, 0); | 2277 int bp = SetBreakPoint(foo, 0); |
| 2354 | 2278 |
| 2355 // Set breakpoint does not duplicate hits | 2279 // Set breakpoint does not duplicate hits |
| 2356 foo->Call(env->Global(), 0, NULL); | 2280 foo->Call(env->Global(), 0, NULL); |
| 2357 CHECK_EQ(2, break_point_hit_count); | 2281 CHECK_EQ(2, break_point_hit_count); |
| 2358 | 2282 |
| 2359 ClearBreakPoint(bp); | 2283 ClearBreakPoint(bp); |
| (...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3263 const char* src = "function foo(x) { " | 3187 const char* src = "function foo(x) { " |
| 3264 " var a = 0;" | 3188 " var a = 0;" |
| 3265 " do {" | 3189 " do {" |
| 3266 " a++;" | 3190 " a++;" |
| 3267 " } while (a < x)" | 3191 " } while (a < x)" |
| 3268 "}" | 3192 "}" |
| 3269 "foo()"; | 3193 "foo()"; |
| 3270 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3194 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3271 SetBreakPoint(foo, 8); // "var a = 0;" | 3195 SetBreakPoint(foo, 8); // "var a = 0;" |
| 3272 | 3196 |
| 3197 // Looping 0 times. |
| 3198 step_action = StepIn; |
| 3199 break_point_hit_count = 0; |
| 3200 v8::Handle<v8::Value> argv_0[argc] = {v8::Number::New(isolate, 0)}; |
| 3201 foo->Call(env->Global(), argc, argv_0); |
| 3202 CHECK_EQ(4, break_point_hit_count); |
| 3203 |
| 3273 // Looping 10 times. | 3204 // Looping 10 times. |
| 3274 step_action = StepIn; | 3205 step_action = StepIn; |
| 3275 break_point_hit_count = 0; | 3206 break_point_hit_count = 0; |
| 3276 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) }; | 3207 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) }; |
| 3277 foo->Call(env->Global(), argc, argv_10); | 3208 foo->Call(env->Global(), argc, argv_10); |
| 3278 CHECK_EQ(22, break_point_hit_count); | 3209 CHECK_EQ(22, break_point_hit_count); |
| 3279 | 3210 |
| 3280 // Looping 100 times. | 3211 // Looping 100 times. |
| 3281 step_action = StepIn; | 3212 step_action = StepIn; |
| 3282 break_point_hit_count = 0; | 3213 break_point_hit_count = 0; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3305 " a = 1;" | 3236 " a = 1;" |
| 3306 " for (i = 0; i < x; i++) {" | 3237 " for (i = 0; i < x; i++) {" |
| 3307 " b = 1;" | 3238 " b = 1;" |
| 3308 " }" | 3239 " }" |
| 3309 "}" | 3240 "}" |
| 3310 "a=0; b=0; i=0; foo()"; | 3241 "a=0; b=0; i=0; foo()"; |
| 3311 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3242 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3312 | 3243 |
| 3313 SetBreakPoint(foo, 8); // "a = 1;" | 3244 SetBreakPoint(foo, 8); // "a = 1;" |
| 3314 | 3245 |
| 3246 // Looping 0 times. |
| 3247 step_action = StepIn; |
| 3248 break_point_hit_count = 0; |
| 3249 v8::Handle<v8::Value> argv_0[argc] = {v8::Number::New(isolate, 0)}; |
| 3250 foo->Call(env->Global(), argc, argv_0); |
| 3251 CHECK_EQ(4, break_point_hit_count); |
| 3252 |
| 3315 // Looping 10 times. | 3253 // Looping 10 times. |
| 3316 step_action = StepIn; | 3254 step_action = StepIn; |
| 3317 break_point_hit_count = 0; | 3255 break_point_hit_count = 0; |
| 3318 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) }; | 3256 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) }; |
| 3319 foo->Call(env->Global(), argc, argv_10); | 3257 foo->Call(env->Global(), argc, argv_10); |
| 3320 CHECK_EQ(45, break_point_hit_count); | 3258 CHECK_EQ(34, break_point_hit_count); |
| 3321 | 3259 |
| 3322 // Looping 100 times. | 3260 // Looping 100 times. |
| 3323 step_action = StepIn; | 3261 step_action = StepIn; |
| 3324 break_point_hit_count = 0; | 3262 break_point_hit_count = 0; |
| 3325 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(isolate, 100) }; | 3263 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(isolate, 100) }; |
| 3326 foo->Call(env->Global(), argc, argv_100); | 3264 foo->Call(env->Global(), argc, argv_100); |
| 3327 CHECK_EQ(405, break_point_hit_count); | 3265 CHECK_EQ(304, break_point_hit_count); |
| 3328 | 3266 |
| 3329 // Get rid of the debug event listener. | 3267 // Get rid of the debug event listener. |
| 3330 v8::Debug::SetDebugEventListener(NULL); | 3268 v8::Debug::SetDebugEventListener(NULL); |
| 3331 CheckDebuggerUnloaded(); | 3269 CheckDebuggerUnloaded(); |
| 3332 } | 3270 } |
| 3333 | 3271 |
| 3334 | 3272 |
| 3335 TEST(DebugStepForContinue) { | 3273 TEST(DebugStepForContinue) { |
| 3336 DebugLocalContext env; | 3274 DebugLocalContext env; |
| 3337 v8::Isolate* isolate = env->GetIsolate(); | 3275 v8::Isolate* isolate = env->GetIsolate(); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3532 " a = x ? 1 : 2;" | 3470 " a = x ? 1 : 2;" |
| 3533 " return a;" | 3471 " return a;" |
| 3534 "}" | 3472 "}" |
| 3535 "foo()"; | 3473 "foo()"; |
| 3536 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3474 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3537 SetBreakPoint(foo, 0); // "var a;" | 3475 SetBreakPoint(foo, 0); // "var a;" |
| 3538 | 3476 |
| 3539 step_action = StepIn; | 3477 step_action = StepIn; |
| 3540 break_point_hit_count = 0; | 3478 break_point_hit_count = 0; |
| 3541 foo->Call(env->Global(), 0, NULL); | 3479 foo->Call(env->Global(), 0, NULL); |
| 3542 CHECK_EQ(5, break_point_hit_count); | 3480 CHECK_EQ(4, break_point_hit_count); |
| 3543 | 3481 |
| 3544 step_action = StepIn; | 3482 step_action = StepIn; |
| 3545 break_point_hit_count = 0; | 3483 break_point_hit_count = 0; |
| 3546 const int argc = 1; | 3484 const int argc = 1; |
| 3547 v8::Handle<v8::Value> argv_true[argc] = { v8::True(isolate) }; | 3485 v8::Handle<v8::Value> argv_true[argc] = { v8::True(isolate) }; |
| 3548 foo->Call(env->Global(), argc, argv_true); | 3486 foo->Call(env->Global(), argc, argv_true); |
| 3549 CHECK_EQ(5, break_point_hit_count); | 3487 CHECK_EQ(4, break_point_hit_count); |
| 3550 | 3488 |
| 3551 // Get rid of the debug event listener. | 3489 // Get rid of the debug event listener. |
| 3552 v8::Debug::SetDebugEventListener(NULL); | 3490 v8::Debug::SetDebugEventListener(NULL); |
| 3553 CheckDebuggerUnloaded(); | 3491 CheckDebuggerUnloaded(); |
| 3554 } | 3492 } |
| 3555 | 3493 |
| 3556 | 3494 |
| 3557 TEST(StepInOutSimple) { | 3495 TEST(StepInOutSimple) { |
| 3558 DebugLocalContext env; | 3496 DebugLocalContext env; |
| 3559 v8::HandleScope scope(env->GetIsolate()); | 3497 v8::HandleScope scope(env->GetIsolate()); |
| (...skipping 4132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7692 "let y = 2; \n" | 7630 "let y = 2; \n" |
| 7693 "debugger; \n" | 7631 "debugger; \n" |
| 7694 "x * y", | 7632 "x * y", |
| 7695 30); | 7633 30); |
| 7696 ExpectInt32( | 7634 ExpectInt32( |
| 7697 "x = 1; y = 2; \n" | 7635 "x = 1; y = 2; \n" |
| 7698 "debugger;" | 7636 "debugger;" |
| 7699 "x * y", | 7637 "x * y", |
| 7700 30); | 7638 30); |
| 7701 } | 7639 } |
| OLD | NEW |