Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Side by Side Diff: test/cctest/test-debug.cc

Issue 21347: Make the debugger completely unload when the debug event listener is unregist... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/debug-ia32.cc ('k') | test/mjsunit/debug-evaluate-recursive.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2007-2008 the V8 project authors. All rights reserved. 1 // Copyright 2007-2008 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 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 356
357 return debugged_functions; 357 return debugged_functions;
358 } 358 }
359 359
360 360
361 static Handle<Code> ComputeCallDebugBreak(int argc) { 361 static Handle<Code> ComputeCallDebugBreak(int argc) {
362 CALL_HEAP_FUNCTION(v8::internal::StubCache::ComputeCallDebugBreak(argc), 362 CALL_HEAP_FUNCTION(v8::internal::StubCache::ComputeCallDebugBreak(argc),
363 Code); 363 Code);
364 } 364 }
365 365
366
367 // Check that the debugger is loaded.
368 static void CheckDebuggerLoaded() {
369 CHECK(Debug::debug_context().is_null());
370 }
371
372
373 // Check that the debugger has been fully unloaded.
374 static void CheckDebuggerUnloaded(bool check_functions) {
375 // Check that the debugger context is cleared and that there is no debug
376 // information stored for the debugger.
377 CHECK(Debug::debug_context().is_null());
378 CHECK_EQ(NULL, Debug::debug_info_list_);
379
380 // Collect garbage to ensure weak handles are cleared.
381 Heap::CollectAllGarbage();
382 Heap::CollectAllGarbage();
383
384 // Iterate the head and check that there are no debugger related objects left.
385 HeapIterator iterator;
386 while (iterator.has_next()) {
387 HeapObject* obj = iterator.next();
388 CHECK(obj != NULL);
389 CHECK(!obj->IsDebugInfo());
390 CHECK(!obj->IsBreakPointInfo());
391
392 // If deep check of functions is requested check that no debug break code
393 // is left in all functions.
394 if (check_functions) {
395 if (obj->IsJSFunction()) {
396 JSFunction* fun = JSFunction::cast(obj);
397 for (RelocIterator it(fun->shared()->code()); !it.done(); it.next()) {
398 RelocInfo::Mode rmode = it.rinfo()->rmode();
399 if (RelocInfo::IsCodeTarget(rmode)) {
400 CHECK(!Debug::IsDebugBreak(it.rinfo()->target_address()));
401 } else if (RelocInfo::IsJSReturn(rmode)) {
402 CHECK(!Debug::IsDebugBreakAtReturn(it.rinfo()));
403 }
404 }
405 }
406 }
407 }
408 }
409
410
366 } } // namespace v8::internal 411 } } // namespace v8::internal
367 412
413
414 // Check that the debugger is loaded.
415 static void CheckDebuggerLoaded() {
416 v8::internal::CheckDebuggerLoaded();
417 }
418
419
420 // Check that the debugger has been fully unloaded.
421 static void CheckDebuggerUnloaded(bool check_functions = false) {
422 v8::internal::CheckDebuggerUnloaded(check_functions);
423 }
424
425
368 // Inherit from BreakLocationIterator to get access to protected parts for 426 // Inherit from BreakLocationIterator to get access to protected parts for
369 // testing. 427 // testing.
370 class TestBreakLocationIterator: public v8::internal::BreakLocationIterator { 428 class TestBreakLocationIterator: public v8::internal::BreakLocationIterator {
371 public: 429 public:
372 explicit TestBreakLocationIterator(Handle<v8::internal::DebugInfo> debug_info) 430 explicit TestBreakLocationIterator(Handle<v8::internal::DebugInfo> debug_info)
373 : BreakLocationIterator(debug_info, v8::internal::SOURCE_BREAK_LOCATIONS) {} 431 : BreakLocationIterator(debug_info, v8::internal::SOURCE_BREAK_LOCATIONS) {}
374 v8::internal::RelocIterator* it() { return reloc_iterator_; } 432 v8::internal::RelocIterator* it() { return reloc_iterator_; }
375 v8::internal::RelocIterator* it_original() { 433 v8::internal::RelocIterator* it_original() {
376 return reloc_iterator_original_; 434 return reloc_iterator_original_;
377 } 435 }
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 CHECK(!HasDebugInfo(foo)); 874 CHECK(!HasDebugInfo(foo));
817 CHECK(!HasDebugInfo(bar)); 875 CHECK(!HasDebugInfo(bar));
818 } 876 }
819 877
820 878
821 // Test that a break point can be set at an IC store location. 879 // Test that a break point can be set at an IC store location.
822 TEST(BreakPointICStore) { 880 TEST(BreakPointICStore) {
823 break_point_hit_count = 0; 881 break_point_hit_count = 0;
824 v8::HandleScope scope; 882 v8::HandleScope scope;
825 DebugLocalContext env; 883 DebugLocalContext env;
884
826 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 885 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
827 v8::Undefined()); 886 v8::Undefined());
828 v8::Script::Compile(v8::String::New("function foo(){bar=0;}"))->Run(); 887 v8::Script::Compile(v8::String::New("function foo(){bar=0;}"))->Run();
829 v8::Local<v8::Function> foo = 888 v8::Local<v8::Function> foo =
830 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 889 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
831 890
832 // Run without breakpoints. 891 // Run without breakpoints.
833 foo->Call(env->Global(), 0, NULL); 892 foo->Call(env->Global(), 0, NULL);
834 CHECK_EQ(0, break_point_hit_count); 893 CHECK_EQ(0, break_point_hit_count);
835 894
836 // Run with breakpoint 895 // Run with breakpoint
837 int bp = SetBreakPoint(foo, 0); 896 int bp = SetBreakPoint(foo, 0);
838 foo->Call(env->Global(), 0, NULL); 897 foo->Call(env->Global(), 0, NULL);
839 CHECK_EQ(1, break_point_hit_count); 898 CHECK_EQ(1, break_point_hit_count);
840 foo->Call(env->Global(), 0, NULL); 899 foo->Call(env->Global(), 0, NULL);
841 CHECK_EQ(2, break_point_hit_count); 900 CHECK_EQ(2, break_point_hit_count);
842 901
843 // Run without breakpoints. 902 // Run without breakpoints.
844 ClearBreakPoint(bp); 903 ClearBreakPoint(bp);
845 foo->Call(env->Global(), 0, NULL); 904 foo->Call(env->Global(), 0, NULL);
846 CHECK_EQ(2, break_point_hit_count); 905 CHECK_EQ(2, break_point_hit_count);
847 906
848 v8::Debug::SetDebugEventListener(NULL); 907 v8::Debug::SetDebugEventListener(NULL);
908 CheckDebuggerUnloaded();
849 } 909 }
850 910
851 911
852 // Test that a break point can be set at an IC load location. 912 // Test that a break point can be set at an IC load location.
853 TEST(BreakPointICLoad) { 913 TEST(BreakPointICLoad) {
854 break_point_hit_count = 0; 914 break_point_hit_count = 0;
855 v8::HandleScope scope; 915 v8::HandleScope scope;
856 DebugLocalContext env; 916 DebugLocalContext env;
857 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 917 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
858 v8::Undefined()); 918 v8::Undefined());
(...skipping 12 matching lines...) Expand all
871 CHECK_EQ(1, break_point_hit_count); 931 CHECK_EQ(1, break_point_hit_count);
872 foo->Call(env->Global(), 0, NULL); 932 foo->Call(env->Global(), 0, NULL);
873 CHECK_EQ(2, break_point_hit_count); 933 CHECK_EQ(2, break_point_hit_count);
874 934
875 // Run without breakpoints. 935 // Run without breakpoints.
876 ClearBreakPoint(bp); 936 ClearBreakPoint(bp);
877 foo->Call(env->Global(), 0, NULL); 937 foo->Call(env->Global(), 0, NULL);
878 CHECK_EQ(2, break_point_hit_count); 938 CHECK_EQ(2, break_point_hit_count);
879 939
880 v8::Debug::SetDebugEventListener(NULL); 940 v8::Debug::SetDebugEventListener(NULL);
941 CheckDebuggerUnloaded();
881 } 942 }
882 943
883 944
884 // Test that a break point can be set at an IC call location. 945 // Test that a break point can be set at an IC call location.
885 TEST(BreakPointICCall) { 946 TEST(BreakPointICCall) {
886 break_point_hit_count = 0; 947 break_point_hit_count = 0;
887 v8::HandleScope scope; 948 v8::HandleScope scope;
888 DebugLocalContext env; 949 DebugLocalContext env;
889 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 950 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
890 v8::Undefined()); 951 v8::Undefined());
(...skipping 12 matching lines...) Expand all
903 CHECK_EQ(1, break_point_hit_count); 964 CHECK_EQ(1, break_point_hit_count);
904 foo->Call(env->Global(), 0, NULL); 965 foo->Call(env->Global(), 0, NULL);
905 CHECK_EQ(2, break_point_hit_count); 966 CHECK_EQ(2, break_point_hit_count);
906 967
907 // Run without breakpoints. 968 // Run without breakpoints.
908 ClearBreakPoint(bp); 969 ClearBreakPoint(bp);
909 foo->Call(env->Global(), 0, NULL); 970 foo->Call(env->Global(), 0, NULL);
910 CHECK_EQ(2, break_point_hit_count); 971 CHECK_EQ(2, break_point_hit_count);
911 972
912 v8::Debug::SetDebugEventListener(NULL); 973 v8::Debug::SetDebugEventListener(NULL);
974 CheckDebuggerUnloaded();
913 } 975 }
914 976
915 977
916 // Test that a break point can be set at a return store location. 978 // Test that a break point can be set at a return store location.
917 TEST(BreakPointReturn) { 979 TEST(BreakPointReturn) {
918 break_point_hit_count = 0; 980 break_point_hit_count = 0;
919 v8::HandleScope scope; 981 v8::HandleScope scope;
920 DebugLocalContext env; 982 DebugLocalContext env;
921 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 983 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
922 v8::Undefined()); 984 v8::Undefined());
(...skipping 11 matching lines...) Expand all
934 CHECK_EQ(1, break_point_hit_count); 996 CHECK_EQ(1, break_point_hit_count);
935 foo->Call(env->Global(), 0, NULL); 997 foo->Call(env->Global(), 0, NULL);
936 CHECK_EQ(2, break_point_hit_count); 998 CHECK_EQ(2, break_point_hit_count);
937 999
938 // Run without breakpoints. 1000 // Run without breakpoints.
939 ClearBreakPoint(bp); 1001 ClearBreakPoint(bp);
940 foo->Call(env->Global(), 0, NULL); 1002 foo->Call(env->Global(), 0, NULL);
941 CHECK_EQ(2, break_point_hit_count); 1003 CHECK_EQ(2, break_point_hit_count);
942 1004
943 v8::Debug::SetDebugEventListener(NULL); 1005 v8::Debug::SetDebugEventListener(NULL);
1006 CheckDebuggerUnloaded();
944 } 1007 }
945 1008
946 1009
947 static void CallWithBreakPoints(v8::Local<v8::Object> recv, 1010 static void CallWithBreakPoints(v8::Local<v8::Object> recv,
948 v8::Local<v8::Function> f, 1011 v8::Local<v8::Function> f,
949 int break_point_count, 1012 int break_point_count,
950 int call_count) { 1013 int call_count) {
951 break_point_hit_count = 0; 1014 break_point_hit_count = 0;
952 for (int i = 0; i < call_count; i++) { 1015 for (int i = 0; i < call_count; i++) {
953 f->Call(recv, 0, NULL); 1016 f->Call(recv, 0, NULL);
(...skipping 25 matching lines...) Expand all
979 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo"); 1042 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo");
980 SetBreakPoint(foo, 0); 1043 SetBreakPoint(foo, 0);
981 CallWithBreakPoints(env->Global(), foo, 1, 10); 1044 CallWithBreakPoints(env->Global(), foo, 1, 10);
982 1045
983 // Test return break point with garbage collection. 1046 // Test return break point with garbage collection.
984 foo = CompileFunction(&env, "function foo(){}", "foo"); 1047 foo = CompileFunction(&env, "function foo(){}", "foo");
985 SetBreakPoint(foo, 0); 1048 SetBreakPoint(foo, 0);
986 CallWithBreakPoints(env->Global(), foo, 1, 25); 1049 CallWithBreakPoints(env->Global(), foo, 1, 25);
987 1050
988 v8::Debug::SetDebugEventListener(NULL); 1051 v8::Debug::SetDebugEventListener(NULL);
1052 CheckDebuggerUnloaded();
989 } 1053 }
990 1054
991 1055
992 // Call the function three times with different garbage collections in between 1056 // Call the function three times with different garbage collections in between
993 // and make sure that the break point survives. 1057 // and make sure that the break point survives.
994 static void CallAndGC(v8::Local<v8::Object> recv, v8::Local<v8::Function> f) { 1058 static void CallAndGC(v8::Local<v8::Object> recv, v8::Local<v8::Function> f) {
995 break_point_hit_count = 0; 1059 break_point_hit_count = 0;
996 1060
997 for (int i = 0; i < 3; i++) { 1061 for (int i = 0; i < 3; i++) {
998 // Call function. 1062 // Call function.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1036 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo"); 1100 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo");
1037 SetBreakPoint(foo, 0); 1101 SetBreakPoint(foo, 0);
1038 CallAndGC(env->Global(), foo); 1102 CallAndGC(env->Global(), foo);
1039 1103
1040 // Test return break point with garbage collection. 1104 // Test return break point with garbage collection.
1041 foo = CompileFunction(&env, "function foo(){}", "foo"); 1105 foo = CompileFunction(&env, "function foo(){}", "foo");
1042 SetBreakPoint(foo, 0); 1106 SetBreakPoint(foo, 0);
1043 CallAndGC(env->Global(), foo); 1107 CallAndGC(env->Global(), foo);
1044 1108
1045 v8::Debug::SetDebugEventListener(NULL); 1109 v8::Debug::SetDebugEventListener(NULL);
1110 CheckDebuggerUnloaded();
1046 } 1111 }
1047 1112
1048 1113
1049 // Test that break points can be set using the global Debug object. 1114 // Test that break points can be set using the global Debug object.
1050 TEST(BreakPointThroughJavaScript) { 1115 TEST(BreakPointThroughJavaScript) {
1051 break_point_hit_count = 0; 1116 break_point_hit_count = 0;
1052 v8::HandleScope scope; 1117 v8::HandleScope scope;
1053 DebugLocalContext env; 1118 DebugLocalContext env;
1054 env.ExposeDebug(); 1119 env.ExposeDebug();
1055 1120
(...skipping 30 matching lines...) Expand all
1086 CHECK_EQ(7, break_point_hit_count); 1151 CHECK_EQ(7, break_point_hit_count);
1087 foo->Run(); 1152 foo->Run();
1088 CHECK_EQ(8, break_point_hit_count); 1153 CHECK_EQ(8, break_point_hit_count);
1089 1154
1090 // Run without breakpoints. 1155 // Run without breakpoints.
1091 ClearBreakPointFromJS(bp1); 1156 ClearBreakPointFromJS(bp1);
1092 foo->Run(); 1157 foo->Run();
1093 CHECK_EQ(8, break_point_hit_count); 1158 CHECK_EQ(8, break_point_hit_count);
1094 1159
1095 v8::Debug::SetDebugEventListener(NULL); 1160 v8::Debug::SetDebugEventListener(NULL);
1161 CheckDebuggerUnloaded();
1096 1162
1097 // Make sure that the break point numbers are consecutive. 1163 // Make sure that the break point numbers are consecutive.
1098 CHECK_EQ(1, bp1); 1164 CHECK_EQ(1, bp1);
1099 CHECK_EQ(2, bp2); 1165 CHECK_EQ(2, bp2);
1100 } 1166 }
1101 1167
1102 1168
1103 // Test that break points can be set using the global Debug object. 1169 // Test that break points can be set using the global Debug object.
1104 TEST(ScriptBreakPointThroughJavaScript) { 1170 TEST(ScriptBreakPointThroughJavaScript) {
1105 break_point_hit_count = 0; 1171 break_point_hit_count = 0;
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1200 1266
1201 // Reload the script and get g again checking that the break point survives. 1267 // Reload the script and get g again checking that the break point survives.
1202 // This tests that the function break point was converted to a script break 1268 // This tests that the function break point was converted to a script break
1203 // point. 1269 // point.
1204 v8::Script::Compile(script, &origin)->Run(); 1270 v8::Script::Compile(script, &origin)->Run();
1205 g = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("g"))); 1271 g = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("g")));
1206 g->Call(env->Global(), 0, NULL); 1272 g->Call(env->Global(), 0, NULL);
1207 CHECK_EQ(2, break_point_hit_count); 1273 CHECK_EQ(2, break_point_hit_count);
1208 1274
1209 v8::Debug::SetDebugEventListener(NULL); 1275 v8::Debug::SetDebugEventListener(NULL);
1276 CheckDebuggerUnloaded();
1210 1277
1211 // Make sure that the break point numbers are consecutive. 1278 // Make sure that the break point numbers are consecutive.
1212 CHECK_EQ(1, sbp1); 1279 CHECK_EQ(1, sbp1);
1213 CHECK_EQ(2, sbp2); 1280 CHECK_EQ(2, sbp2);
1214 CHECK_EQ(3, sbp3); 1281 CHECK_EQ(3, sbp3);
1215 CHECK_EQ(4, sbp4); 1282 CHECK_EQ(4, sbp4);
1216 CHECK_EQ(5, sbp5); 1283 CHECK_EQ(5, sbp5);
1217 CHECK_EQ(6, sbp6); 1284 CHECK_EQ(6, sbp6);
1218 CHECK_EQ(7, bp7); 1285 CHECK_EQ(7, bp7);
1219 } 1286 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1265 v8::Script::Compile(script, &origin)->Run(); 1332 v8::Script::Compile(script, &origin)->Run();
1266 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 1333 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
1267 f->Call(env->Global(), 0, NULL); 1334 f->Call(env->Global(), 0, NULL);
1268 CHECK_EQ(2, break_point_hit_count); 1335 CHECK_EQ(2, break_point_hit_count);
1269 1336
1270 EnableScriptBreakPointFromJS(sbp); 1337 EnableScriptBreakPointFromJS(sbp);
1271 f->Call(env->Global(), 0, NULL); 1338 f->Call(env->Global(), 0, NULL);
1272 CHECK_EQ(3, break_point_hit_count); 1339 CHECK_EQ(3, break_point_hit_count);
1273 1340
1274 v8::Debug::SetDebugEventListener(NULL); 1341 v8::Debug::SetDebugEventListener(NULL);
1342 CheckDebuggerUnloaded();
1275 } 1343 }
1276 1344
1277 1345
1278 // Test conditional script break points. 1346 // Test conditional script break points.
1279 TEST(ConditionalScriptBreakPoint) { 1347 TEST(ConditionalScriptBreakPoint) {
1280 break_point_hit_count = 0; 1348 break_point_hit_count = 0;
1281 v8::HandleScope scope; 1349 v8::HandleScope scope;
1282 DebugLocalContext env; 1350 DebugLocalContext env;
1283 env.ExposeDebug(); 1351 env.ExposeDebug();
1284 1352
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 v8::Script::Compile(script, &origin)->Run(); 1394 v8::Script::Compile(script, &origin)->Run();
1327 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 1395 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
1328 1396
1329 break_point_hit_count = 0; 1397 break_point_hit_count = 0;
1330 for (int i = 0; i < 10; i++) { 1398 for (int i = 0; i < 10; i++) {
1331 f->Call(env->Global(), 0, NULL); 1399 f->Call(env->Global(), 0, NULL);
1332 } 1400 }
1333 CHECK_EQ(5, break_point_hit_count); 1401 CHECK_EQ(5, break_point_hit_count);
1334 1402
1335 v8::Debug::SetDebugEventListener(NULL); 1403 v8::Debug::SetDebugEventListener(NULL);
1404 CheckDebuggerUnloaded();
1336 } 1405 }
1337 1406
1338 1407
1339 // Test ignore count on script break points. 1408 // Test ignore count on script break points.
1340 TEST(ScriptBreakPointIgnoreCount) { 1409 TEST(ScriptBreakPointIgnoreCount) {
1341 break_point_hit_count = 0; 1410 break_point_hit_count = 0;
1342 v8::HandleScope scope; 1411 v8::HandleScope scope;
1343 DebugLocalContext env; 1412 DebugLocalContext env;
1344 env.ExposeDebug(); 1413 env.ExposeDebug();
1345 1414
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1380 v8::Script::Compile(script, &origin)->Run(); 1449 v8::Script::Compile(script, &origin)->Run();
1381 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 1450 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
1382 1451
1383 break_point_hit_count = 0; 1452 break_point_hit_count = 0;
1384 for (int i = 0; i < 10; i++) { 1453 for (int i = 0; i < 10; i++) {
1385 f->Call(env->Global(), 0, NULL); 1454 f->Call(env->Global(), 0, NULL);
1386 } 1455 }
1387 CHECK_EQ(5, break_point_hit_count); 1456 CHECK_EQ(5, break_point_hit_count);
1388 1457
1389 v8::Debug::SetDebugEventListener(NULL); 1458 v8::Debug::SetDebugEventListener(NULL);
1459 CheckDebuggerUnloaded();
1390 } 1460 }
1391 1461
1392 1462
1393 // Test that script break points survive when a script is reloaded. 1463 // Test that script break points survive when a script is reloaded.
1394 TEST(ScriptBreakPointReload) { 1464 TEST(ScriptBreakPointReload) {
1395 break_point_hit_count = 0; 1465 break_point_hit_count = 0;
1396 v8::HandleScope scope; 1466 v8::HandleScope scope;
1397 DebugLocalContext env; 1467 DebugLocalContext env;
1398 env.ExposeDebug(); 1468 env.ExposeDebug();
1399 1469
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1438 // Compile the script again and get the function. 1508 // Compile the script again and get the function.
1439 v8::Script::Compile(script, &origin_1)->Run(); 1509 v8::Script::Compile(script, &origin_1)->Run();
1440 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 1510 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
1441 1511
1442 // Call f and check that the script break point is active. 1512 // Call f and check that the script break point is active.
1443 break_point_hit_count = 0; 1513 break_point_hit_count = 0;
1444 f->Call(env->Global(), 0, NULL); 1514 f->Call(env->Global(), 0, NULL);
1445 CHECK_EQ(1, break_point_hit_count); 1515 CHECK_EQ(1, break_point_hit_count);
1446 1516
1447 v8::Debug::SetDebugEventListener(NULL); 1517 v8::Debug::SetDebugEventListener(NULL);
1518 CheckDebuggerUnloaded();
1448 } 1519 }
1449 1520
1450 1521
1451 // Test when several scripts has the same script data 1522 // Test when several scripts has the same script data
1452 TEST(ScriptBreakPointMultiple) { 1523 TEST(ScriptBreakPointMultiple) {
1453 break_point_hit_count = 0; 1524 break_point_hit_count = 0;
1454 v8::HandleScope scope; 1525 v8::HandleScope scope;
1455 DebugLocalContext env; 1526 DebugLocalContext env;
1456 env.ExposeDebug(); 1527 env.ExposeDebug();
1457 1528
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1503 sbp = SetScriptBreakPointFromJS("test", 1, 0); 1574 sbp = SetScriptBreakPointFromJS("test", 1, 0);
1504 1575
1505 // Call f and g and check that the script break point is active. 1576 // Call f and g and check that the script break point is active.
1506 break_point_hit_count = 0; 1577 break_point_hit_count = 0;
1507 f->Call(env->Global(), 0, NULL); 1578 f->Call(env->Global(), 0, NULL);
1508 CHECK_EQ(1, break_point_hit_count); 1579 CHECK_EQ(1, break_point_hit_count);
1509 g->Call(env->Global(), 0, NULL); 1580 g->Call(env->Global(), 0, NULL);
1510 CHECK_EQ(2, break_point_hit_count); 1581 CHECK_EQ(2, break_point_hit_count);
1511 1582
1512 v8::Debug::SetDebugEventListener(NULL); 1583 v8::Debug::SetDebugEventListener(NULL);
1584 CheckDebuggerUnloaded();
1513 } 1585 }
1514 1586
1515 1587
1516 // Test the script origin which has both name and line offset. 1588 // Test the script origin which has both name and line offset.
1517 TEST(ScriptBreakPointLineOffset) { 1589 TEST(ScriptBreakPointLineOffset) {
1518 break_point_hit_count = 0; 1590 break_point_hit_count = 0;
1519 v8::HandleScope scope; 1591 v8::HandleScope scope;
1520 DebugLocalContext env; 1592 DebugLocalContext env;
1521 env.ExposeDebug(); 1593 env.ExposeDebug();
1522 1594
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1558 1630
1559 // Set a script break point with the script loaded. 1631 // Set a script break point with the script loaded.
1560 sbp1 = SetScriptBreakPointFromJS("test.html", 9, 0); 1632 sbp1 = SetScriptBreakPointFromJS("test.html", 9, 0);
1561 1633
1562 // Call f and check that the script break point is active. 1634 // Call f and check that the script break point is active.
1563 break_point_hit_count = 0; 1635 break_point_hit_count = 0;
1564 f->Call(env->Global(), 0, NULL); 1636 f->Call(env->Global(), 0, NULL);
1565 CHECK_EQ(1, break_point_hit_count); 1637 CHECK_EQ(1, break_point_hit_count);
1566 1638
1567 v8::Debug::SetDebugEventListener(NULL); 1639 v8::Debug::SetDebugEventListener(NULL);
1640 CheckDebuggerUnloaded();
1568 } 1641 }
1569 1642
1570 1643
1571 // Test script break points set on lines. 1644 // Test script break points set on lines.
1572 TEST(ScriptBreakPointLine) { 1645 TEST(ScriptBreakPointLine) {
1573 v8::HandleScope scope; 1646 v8::HandleScope scope;
1574 DebugLocalContext env; 1647 DebugLocalContext env;
1575 env.ExposeDebug(); 1648 env.ExposeDebug();
1576 1649
1577 // Create a function for checking the function when hitting a break point. 1650 // Create a function for checking the function when hitting a break point.
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1663 // Clear the last break points, and reload the script which should not hit any 1736 // Clear the last break points, and reload the script which should not hit any
1664 // break points. 1737 // break points.
1665 ClearBreakPointFromJS(sbp1); 1738 ClearBreakPointFromJS(sbp1);
1666 ClearBreakPointFromJS(sbp5); 1739 ClearBreakPointFromJS(sbp5);
1667 ClearBreakPointFromJS(sbp6); 1740 ClearBreakPointFromJS(sbp6);
1668 break_point_hit_count = 0; 1741 break_point_hit_count = 0;
1669 v8::Script::Compile(script, &origin)->Run(); 1742 v8::Script::Compile(script, &origin)->Run();
1670 CHECK_EQ(0, break_point_hit_count); 1743 CHECK_EQ(0, break_point_hit_count);
1671 1744
1672 v8::Debug::SetDebugEventListener(NULL); 1745 v8::Debug::SetDebugEventListener(NULL);
1746 CheckDebuggerUnloaded();
1673 } 1747 }
1674 1748
1675 1749
1676 // Test that it is possible to remove the last break point for a function 1750 // Test that it is possible to remove the last break point for a function
1677 // inside the break handling of that break point. 1751 // inside the break handling of that break point.
1678 TEST(RemoveBreakPointInBreak) { 1752 TEST(RemoveBreakPointInBreak) {
1679 v8::HandleScope scope; 1753 v8::HandleScope scope;
1680 DebugLocalContext env; 1754 DebugLocalContext env;
1681 1755
1682 v8::Local<v8::Function> foo = 1756 v8::Local<v8::Function> foo =
1683 CompileFunction(&env, "function foo(){a=1;}", "foo"); 1757 CompileFunction(&env, "function foo(){a=1;}", "foo");
1684 debug_event_remove_break_point = SetBreakPoint(foo, 0); 1758 debug_event_remove_break_point = SetBreakPoint(foo, 0);
1685 1759
1686 // Register the debug event listener pasing the function 1760 // Register the debug event listener pasing the function
1687 v8::Debug::SetDebugEventListener(DebugEventRemoveBreakPoint, foo); 1761 v8::Debug::SetDebugEventListener(DebugEventRemoveBreakPoint, foo);
1688 1762
1689 break_point_hit_count = 0; 1763 break_point_hit_count = 0;
1690 foo->Call(env->Global(), 0, NULL); 1764 foo->Call(env->Global(), 0, NULL);
1691 CHECK_EQ(1, break_point_hit_count); 1765 CHECK_EQ(1, break_point_hit_count);
1692 1766
1693 break_point_hit_count = 0; 1767 break_point_hit_count = 0;
1694 foo->Call(env->Global(), 0, NULL); 1768 foo->Call(env->Global(), 0, NULL);
1695 CHECK_EQ(0, break_point_hit_count); 1769 CHECK_EQ(0, break_point_hit_count);
1696 1770
1697 v8::Debug::SetDebugEventListener(NULL); 1771 v8::Debug::SetDebugEventListener(NULL);
1772 CheckDebuggerUnloaded();
1698 } 1773 }
1699 1774
1700 1775
1701 // Test that the debugger statement causes a break. 1776 // Test that the debugger statement causes a break.
1702 TEST(DebuggerStatement) { 1777 TEST(DebuggerStatement) {
1703 break_point_hit_count = 0; 1778 break_point_hit_count = 0;
1704 v8::HandleScope scope; 1779 v8::HandleScope scope;
1705 DebugLocalContext env; 1780 DebugLocalContext env;
1706 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1781 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
1707 v8::Undefined()); 1782 v8::Undefined());
1708 v8::Script::Compile(v8::String::New("function bar(){debugger}"))->Run(); 1783 v8::Script::Compile(v8::String::New("function bar(){debugger}"))->Run();
1709 v8::Script::Compile(v8::String::New( 1784 v8::Script::Compile(v8::String::New(
1710 "function foo(){debugger;debugger;}"))->Run(); 1785 "function foo(){debugger;debugger;}"))->Run();
1711 v8::Local<v8::Function> foo = 1786 v8::Local<v8::Function> foo =
1712 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 1787 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
1713 v8::Local<v8::Function> bar = 1788 v8::Local<v8::Function> bar =
1714 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("bar"))); 1789 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("bar")));
1715 1790
1716 // Run function with debugger statement 1791 // Run function with debugger statement
1717 bar->Call(env->Global(), 0, NULL); 1792 bar->Call(env->Global(), 0, NULL);
1718 CHECK_EQ(1, break_point_hit_count); 1793 CHECK_EQ(1, break_point_hit_count);
1719 1794
1720 // Run function with two debugger statement 1795 // Run function with two debugger statement
1721 foo->Call(env->Global(), 0, NULL); 1796 foo->Call(env->Global(), 0, NULL);
1722 CHECK_EQ(3, break_point_hit_count); 1797 CHECK_EQ(3, break_point_hit_count);
1723 1798
1724 v8::Debug::SetDebugEventListener(NULL); 1799 v8::Debug::SetDebugEventListener(NULL);
1800 CheckDebuggerUnloaded();
1725 } 1801 }
1726 1802
1727 1803
1728 // Thest that the evaluation of expressions when a break point is hit generates 1804 // Thest that the evaluation of expressions when a break point is hit generates
1729 // the correct results. 1805 // the correct results.
1730 TEST(DebugEvaluate) { 1806 TEST(DebugEvaluate) {
1731 v8::HandleScope scope; 1807 v8::HandleScope scope;
1732 DebugLocalContext env; 1808 DebugLocalContext env;
1733 env.ExposeDebug(); 1809 env.ExposeDebug();
1734 1810
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1829 // Call bar setting breakpoint after a=x in barbar and parameter 1905 // Call bar setting breakpoint after a=x in barbar and parameter
1830 // "Hello, world!". 1906 // "Hello, world!".
1831 checks = checks_hh; 1907 checks = checks_hh;
1832 v8::Handle<v8::Value> argv_bar_3[2] = { 1908 v8::Handle<v8::Value> argv_bar_3[2] = {
1833 v8::String::New("Hello, world!"), 1909 v8::String::New("Hello, world!"),
1834 v8::Number::New(barbar_break_position + 1) 1910 v8::Number::New(barbar_break_position + 1)
1835 }; 1911 };
1836 bar->Call(env->Global(), 2, argv_bar_3); 1912 bar->Call(env->Global(), 2, argv_bar_3);
1837 1913
1838 v8::Debug::SetDebugEventListener(NULL); 1914 v8::Debug::SetDebugEventListener(NULL);
1915 CheckDebuggerUnloaded();
1839 } 1916 }
1840 1917
1841 1918
1842 // Simple test of the stepping mechanism using only store ICs. 1919 // Simple test of the stepping mechanism using only store ICs.
1843 TEST(DebugStepLinear) { 1920 TEST(DebugStepLinear) {
1844 v8::HandleScope scope; 1921 v8::HandleScope scope;
1845 DebugLocalContext env; 1922 DebugLocalContext env;
1846 1923
1847 // Create a function for testing stepping. 1924 // Create a function for testing stepping.
1848 v8::Local<v8::Function> foo = CompileFunction(&env, 1925 v8::Local<v8::Function> foo = CompileFunction(&env,
1849 "function foo(){a=1;b=1;c=1;}", 1926 "function foo(){a=1;b=1;c=1;}",
1850 "foo"); 1927 "foo");
1851 SetBreakPoint(foo, 3); 1928 SetBreakPoint(foo, 3);
1852 1929
1853 // Register a debug event listener which steps and counts. 1930 // Register a debug event listener which steps and counts.
1854 v8::Debug::SetDebugEventListener(DebugEventStep); 1931 v8::Debug::SetDebugEventListener(DebugEventStep);
1855 1932
1856 step_action = StepIn; 1933 step_action = StepIn;
1857 break_point_hit_count = 0; 1934 break_point_hit_count = 0;
1858 foo->Call(env->Global(), 0, NULL); 1935 foo->Call(env->Global(), 0, NULL);
1859 1936
1860 // With stepping all break locations are hit. 1937 // With stepping all break locations are hit.
1861 CHECK_EQ(4, break_point_hit_count); 1938 CHECK_EQ(4, break_point_hit_count);
1862 1939
1863 v8::Debug::SetDebugEventListener(NULL); 1940 v8::Debug::SetDebugEventListener(NULL);
1941 CheckDebuggerUnloaded();
1864 1942
1865 // Register a debug event listener which just counts. 1943 // Register a debug event listener which just counts.
1866 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); 1944 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
1867 1945
1946 SetBreakPoint(foo, 3);
1868 break_point_hit_count = 0; 1947 break_point_hit_count = 0;
1869 foo->Call(env->Global(), 0, NULL); 1948 foo->Call(env->Global(), 0, NULL);
1870 1949
1871 // Without stepping only active break points are hit. 1950 // Without stepping only active break points are hit.
1872 CHECK_EQ(1, break_point_hit_count); 1951 CHECK_EQ(1, break_point_hit_count);
1873 1952
1874 v8::Debug::SetDebugEventListener(NULL); 1953 v8::Debug::SetDebugEventListener(NULL);
1954 CheckDebuggerUnloaded();
1875 } 1955 }
1876 1956
1877 1957
1878 // Test the stepping mechanism with different ICs. 1958 // Test the stepping mechanism with different ICs.
1879 TEST(DebugStepLinearMixedICs) { 1959 TEST(DebugStepLinearMixedICs) {
1880 v8::HandleScope scope; 1960 v8::HandleScope scope;
1881 DebugLocalContext env; 1961 DebugLocalContext env;
1882 1962
1883 // Create a function for testing stepping. 1963 // Create a function for testing stepping.
1884 v8::Local<v8::Function> foo = CompileFunction(&env, 1964 v8::Local<v8::Function> foo = CompileFunction(&env,
(...skipping 14 matching lines...) Expand all
1899 1979
1900 // With stepping all break locations are hit. For ARM the keyed load/store 1980 // With stepping all break locations are hit. For ARM the keyed load/store
1901 // is not hit as they are not implemented as ICs. 1981 // is not hit as they are not implemented as ICs.
1902 #if defined (__arm__) || defined(__thumb__) 1982 #if defined (__arm__) || defined(__thumb__)
1903 CHECK_EQ(6, break_point_hit_count); 1983 CHECK_EQ(6, break_point_hit_count);
1904 #else 1984 #else
1905 CHECK_EQ(8, break_point_hit_count); 1985 CHECK_EQ(8, break_point_hit_count);
1906 #endif 1986 #endif
1907 1987
1908 v8::Debug::SetDebugEventListener(NULL); 1988 v8::Debug::SetDebugEventListener(NULL);
1989 CheckDebuggerUnloaded();
1909 1990
1910 // Register a debug event listener which just counts. 1991 // Register a debug event listener which just counts.
1911 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); 1992 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
1912 1993
1994 SetBreakPoint(foo, 0);
1913 break_point_hit_count = 0; 1995 break_point_hit_count = 0;
1914 foo->Call(env->Global(), 0, NULL); 1996 foo->Call(env->Global(), 0, NULL);
1915 1997
1916 // Without stepping only active break points are hit. 1998 // Without stepping only active break points are hit.
1917 CHECK_EQ(1, break_point_hit_count); 1999 CHECK_EQ(1, break_point_hit_count);
1918 2000
1919 v8::Debug::SetDebugEventListener(NULL); 2001 v8::Debug::SetDebugEventListener(NULL);
2002 CheckDebuggerUnloaded();
1920 } 2003 }
1921 2004
1922 2005
1923 TEST(DebugStepIf) { 2006 TEST(DebugStepIf) {
1924 v8::HandleScope scope; 2007 v8::HandleScope scope;
1925 DebugLocalContext env; 2008 DebugLocalContext env;
1926 2009
1927 // Register a debug event listener which steps and counts. 2010 // Register a debug event listener which steps and counts.
1928 v8::Debug::SetDebugEventListener(DebugEventStep); 2011 v8::Debug::SetDebugEventListener(DebugEventStep);
1929 2012
(...skipping 20 matching lines...) Expand all
1950 2033
1951 // Stepping through the false part. 2034 // Stepping through the false part.
1952 step_action = StepIn; 2035 step_action = StepIn;
1953 break_point_hit_count = 0; 2036 break_point_hit_count = 0;
1954 v8::Handle<v8::Value> argv_false[argc] = { v8::False() }; 2037 v8::Handle<v8::Value> argv_false[argc] = { v8::False() };
1955 foo->Call(env->Global(), argc, argv_false); 2038 foo->Call(env->Global(), argc, argv_false);
1956 CHECK_EQ(4, break_point_hit_count); 2039 CHECK_EQ(4, break_point_hit_count);
1957 2040
1958 // Get rid of the debug event listener. 2041 // Get rid of the debug event listener.
1959 v8::Debug::SetDebugEventListener(NULL); 2042 v8::Debug::SetDebugEventListener(NULL);
2043 CheckDebuggerUnloaded();
1960 } 2044 }
1961 2045
1962 2046
1963 TEST(DebugStepSwitch) { 2047 TEST(DebugStepSwitch) {
1964 v8::HandleScope scope; 2048 v8::HandleScope scope;
1965 DebugLocalContext env; 2049 DebugLocalContext env;
1966 2050
1967 // Register a debug event listener which steps and counts. 2051 // Register a debug event listener which steps and counts.
1968 v8::Debug::SetDebugEventListener(DebugEventStep); 2052 v8::Debug::SetDebugEventListener(DebugEventStep);
1969 2053
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2002 2086
2003 // Last case. 2087 // Last case.
2004 step_action = StepIn; 2088 step_action = StepIn;
2005 break_point_hit_count = 0; 2089 break_point_hit_count = 0;
2006 v8::Handle<v8::Value> argv_3[argc] = { v8::Number::New(3) }; 2090 v8::Handle<v8::Value> argv_3[argc] = { v8::Number::New(3) };
2007 foo->Call(env->Global(), argc, argv_3); 2091 foo->Call(env->Global(), argc, argv_3);
2008 CHECK_EQ(4, break_point_hit_count); 2092 CHECK_EQ(4, break_point_hit_count);
2009 2093
2010 // Get rid of the debug event listener. 2094 // Get rid of the debug event listener.
2011 v8::Debug::SetDebugEventListener(NULL); 2095 v8::Debug::SetDebugEventListener(NULL);
2096 CheckDebuggerUnloaded();
2012 } 2097 }
2013 2098
2014 2099
2015 TEST(DebugStepFor) { 2100 TEST(DebugStepFor) {
2016 v8::HandleScope scope; 2101 v8::HandleScope scope;
2017 DebugLocalContext env; 2102 DebugLocalContext env;
2018 2103
2019 // Register a debug event listener which steps and counts. 2104 // Register a debug event listener which steps and counts.
2020 v8::Debug::SetDebugEventListener(DebugEventStep); 2105 v8::Debug::SetDebugEventListener(DebugEventStep);
2021 2106
(...skipping 17 matching lines...) Expand all
2039 2124
2040 // Looping 100 times. 2125 // Looping 100 times.
2041 step_action = StepIn; 2126 step_action = StepIn;
2042 break_point_hit_count = 0; 2127 break_point_hit_count = 0;
2043 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; 2128 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) };
2044 foo->Call(env->Global(), argc, argv_100); 2129 foo->Call(env->Global(), argc, argv_100);
2045 CHECK_EQ(203, break_point_hit_count); 2130 CHECK_EQ(203, break_point_hit_count);
2046 2131
2047 // Get rid of the debug event listener. 2132 // Get rid of the debug event listener.
2048 v8::Debug::SetDebugEventListener(NULL); 2133 v8::Debug::SetDebugEventListener(NULL);
2134 CheckDebuggerUnloaded();
2049 } 2135 }
2050 2136
2051 2137
2052 TEST(StepInOutSimple) { 2138 TEST(StepInOutSimple) {
2053 v8::HandleScope scope; 2139 v8::HandleScope scope;
2054 DebugLocalContext env; 2140 DebugLocalContext env;
2055 2141
2056 // Create a function for checking the function when hitting a break point. 2142 // Create a function for checking the function when hitting a break point.
2057 frame_function_name = CompileFunction(&env, 2143 frame_function_name = CompileFunction(&env,
2058 frame_function_name_source, 2144 frame_function_name_source,
(...skipping 25 matching lines...) Expand all
2084 2170
2085 // Step through invocation of a with step out. 2171 // Step through invocation of a with step out.
2086 step_action = StepOut; 2172 step_action = StepOut;
2087 break_point_hit_count = 0; 2173 break_point_hit_count = 0;
2088 expected_step_sequence = "a"; 2174 expected_step_sequence = "a";
2089 a->Call(env->Global(), 0, NULL); 2175 a->Call(env->Global(), 0, NULL);
2090 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count); 2176 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count);
2091 2177
2092 // Get rid of the debug event listener. 2178 // Get rid of the debug event listener.
2093 v8::Debug::SetDebugEventListener(NULL); 2179 v8::Debug::SetDebugEventListener(NULL);
2180 CheckDebuggerUnloaded();
2094 } 2181 }
2095 2182
2096 2183
2097 TEST(StepInOutTree) { 2184 TEST(StepInOutTree) {
2098 v8::HandleScope scope; 2185 v8::HandleScope scope;
2099 DebugLocalContext env; 2186 DebugLocalContext env;
2100 2187
2101 // Create a function for checking the function when hitting a break point. 2188 // Create a function for checking the function when hitting a break point.
2102 frame_function_name = CompileFunction(&env, 2189 frame_function_name = CompileFunction(&env,
2103 frame_function_name_source, 2190 frame_function_name_source,
(...skipping 26 matching lines...) Expand all
2130 2217
2131 // Step through invocation of a with step out. 2218 // Step through invocation of a with step out.
2132 step_action = StepOut; 2219 step_action = StepOut;
2133 break_point_hit_count = 0; 2220 break_point_hit_count = 0;
2134 expected_step_sequence = "a"; 2221 expected_step_sequence = "a";
2135 a->Call(env->Global(), 0, NULL); 2222 a->Call(env->Global(), 0, NULL);
2136 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count); 2223 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count);
2137 2224
2138 // Get rid of the debug event listener. 2225 // Get rid of the debug event listener.
2139 v8::Debug::SetDebugEventListener(NULL); 2226 v8::Debug::SetDebugEventListener(NULL);
2227 CheckDebuggerUnloaded(true);
2140 } 2228 }
2141 2229
2142 2230
2143 TEST(StepInOutBranch) { 2231 TEST(StepInOutBranch) {
2144 v8::HandleScope scope; 2232 v8::HandleScope scope;
2145 DebugLocalContext env; 2233 DebugLocalContext env;
2146 2234
2147 // Create a function for checking the function when hitting a break point. 2235 // Create a function for checking the function when hitting a break point.
2148 frame_function_name = CompileFunction(&env, 2236 frame_function_name = CompileFunction(&env,
2149 frame_function_name_source, 2237 frame_function_name_source,
(...skipping 11 matching lines...) Expand all
2161 2249
2162 // Step through invocation of a. 2250 // Step through invocation of a.
2163 step_action = StepIn; 2251 step_action = StepIn;
2164 break_point_hit_count = 0; 2252 break_point_hit_count = 0;
2165 expected_step_sequence = "abaca"; 2253 expected_step_sequence = "abaca";
2166 a->Call(env->Global(), 0, NULL); 2254 a->Call(env->Global(), 0, NULL);
2167 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count); 2255 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count);
2168 2256
2169 // Get rid of the debug event listener. 2257 // Get rid of the debug event listener.
2170 v8::Debug::SetDebugEventListener(NULL); 2258 v8::Debug::SetDebugEventListener(NULL);
2259 CheckDebuggerUnloaded();
2171 } 2260 }
2172 2261
2173 2262
2174 // Test that step in does not step into native functions. 2263 // Test that step in does not step into native functions.
2175 TEST(DebugStepNatives) { 2264 TEST(DebugStepNatives) {
2176 v8::HandleScope scope; 2265 v8::HandleScope scope;
2177 DebugLocalContext env; 2266 DebugLocalContext env;
2178 2267
2179 // Create a function for testing stepping. 2268 // Create a function for testing stepping.
2180 v8::Local<v8::Function> foo = CompileFunction( 2269 v8::Local<v8::Function> foo = CompileFunction(
2181 &env, 2270 &env,
2182 "function foo(){debugger;Math.sin(1);}", 2271 "function foo(){debugger;Math.sin(1);}",
2183 "foo"); 2272 "foo");
2184 2273
2185 // Register a debug event listener which steps and counts. 2274 // Register a debug event listener which steps and counts.
2186 v8::Debug::SetDebugEventListener(DebugEventStep); 2275 v8::Debug::SetDebugEventListener(DebugEventStep);
2187 2276
2188 step_action = StepIn; 2277 step_action = StepIn;
2189 break_point_hit_count = 0; 2278 break_point_hit_count = 0;
2190 foo->Call(env->Global(), 0, NULL); 2279 foo->Call(env->Global(), 0, NULL);
2191 2280
2192 // With stepping all break locations are hit. 2281 // With stepping all break locations are hit.
2193 CHECK_EQ(3, break_point_hit_count); 2282 CHECK_EQ(3, break_point_hit_count);
2194 2283
2195 v8::Debug::SetDebugEventListener(NULL); 2284 v8::Debug::SetDebugEventListener(NULL);
2285 CheckDebuggerUnloaded();
2196 2286
2197 // Register a debug event listener which just counts. 2287 // Register a debug event listener which just counts.
2198 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); 2288 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
2199 2289
2200 break_point_hit_count = 0; 2290 break_point_hit_count = 0;
2201 foo->Call(env->Global(), 0, NULL); 2291 foo->Call(env->Global(), 0, NULL);
2202 2292
2203 // Without stepping only active break points are hit. 2293 // Without stepping only active break points are hit.
2204 CHECK_EQ(1, break_point_hit_count); 2294 CHECK_EQ(1, break_point_hit_count);
2205 2295
2206 v8::Debug::SetDebugEventListener(NULL); 2296 v8::Debug::SetDebugEventListener(NULL);
2297 CheckDebuggerUnloaded();
2207 } 2298 }
2208 2299
2209 2300
2210 // Test break on exceptions. For each exception break combination the number 2301 // Test break on exceptions. For each exception break combination the number
2211 // of debug event exception callbacks and message callbacks are collected. The 2302 // of debug event exception callbacks and message callbacks are collected. The
2212 // number of debug event exception callbacks are used to check that the 2303 // number of debug event exception callbacks are used to check that the
2213 // debugger is called correctly and the number of message callbacks is used to 2304 // debugger is called correctly and the number of message callbacks is used to
2214 // check that uncaught exceptions are still returned even if there is a break 2305 // check that uncaught exceptions are still returned even if there is a break
2215 // for them. 2306 // for them.
2216 TEST(BreakOnException) { 2307 TEST(BreakOnException) {
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
2343 caught->Call(env->Global(), 0, NULL); 2434 caught->Call(env->Global(), 0, NULL);
2344 CHECK_EQ(1, exception_hit_count); 2435 CHECK_EQ(1, exception_hit_count);
2345 CHECK_EQ(0, uncaught_exception_hit_count); 2436 CHECK_EQ(0, uncaught_exception_hit_count);
2346 CHECK_EQ(0, message_callback_count); 2437 CHECK_EQ(0, message_callback_count);
2347 notCaught->Call(env->Global(), 0, NULL); 2438 notCaught->Call(env->Global(), 0, NULL);
2348 CHECK_EQ(2, exception_hit_count); 2439 CHECK_EQ(2, exception_hit_count);
2349 CHECK_EQ(1, uncaught_exception_hit_count); 2440 CHECK_EQ(1, uncaught_exception_hit_count);
2350 CHECK_EQ(1, message_callback_count); 2441 CHECK_EQ(1, message_callback_count);
2351 2442
2352 v8::Debug::SetDebugEventListener(NULL); 2443 v8::Debug::SetDebugEventListener(NULL);
2444 CheckDebuggerUnloaded();
2353 v8::V8::RemoveMessageListeners(MessageCallbackCount); 2445 v8::V8::RemoveMessageListeners(MessageCallbackCount);
2354 } 2446 }
2355 2447
2356 2448
2357 // Test break on exception from compiler errors. When compiling using 2449 // Test break on exception from compiler errors. When compiling using
2358 // v8::Script::Compile there is no JavaScript stack whereas when compiling using 2450 // v8::Script::Compile there is no JavaScript stack whereas when compiling using
2359 // eval there are JavaScript frames. 2451 // eval there are JavaScript frames.
2360 TEST(BreakOnCompileException) { 2452 TEST(BreakOnCompileException) {
2361 v8::HandleScope scope; 2453 v8::HandleScope scope;
2362 DebugLocalContext env; 2454 DebugLocalContext env;
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
2479 // Step through invocation of f + g + h now with break on caught exceptions. 2571 // Step through invocation of f + g + h now with break on caught exceptions.
2480 ChangeBreakOnException(true, true); 2572 ChangeBreakOnException(true, true);
2481 step_action = StepIn; 2573 step_action = StepIn;
2482 break_point_hit_count = 0; 2574 break_point_hit_count = 0;
2483 expected_step_sequence = "ffghhf"; 2575 expected_step_sequence = "ffghhf";
2484 f->Call(env->Global(), 0, NULL); 2576 f->Call(env->Global(), 0, NULL);
2485 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count); 2577 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count);
2486 2578
2487 // Get rid of the debug event listener. 2579 // Get rid of the debug event listener.
2488 v8::Debug::SetDebugEventListener(NULL); 2580 v8::Debug::SetDebugEventListener(NULL);
2581 CheckDebuggerUnloaded();
2489 } 2582 }
2490 2583
2491 2584
2492 TEST(DebugBreak) { 2585 TEST(DebugBreak) {
2493 v8::HandleScope scope; 2586 v8::HandleScope scope;
2494 DebugLocalContext env; 2587 DebugLocalContext env;
2495 2588
2496 // This test should be run with option --verify-heap. This is an ASSERT and 2589 // This test should be run with option --verify-heap. This is an ASSERT and
2497 // not a CHECK as --verify-heap is only available in debug mode. 2590 // not a CHECK as --verify-heap is only available in debug mode.
2498 ASSERT(v8::internal::FLAG_verify_heap); 2591 ASSERT(v8::internal::FLAG_verify_heap);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2532 f1->Call(env->Global(), i, argv); 2625 f1->Call(env->Global(), i, argv);
2533 f2->Call(env->Global(), i, argv); 2626 f2->Call(env->Global(), i, argv);
2534 f3->Call(env->Global(), i, argv); 2627 f3->Call(env->Global(), i, argv);
2535 } 2628 }
2536 2629
2537 // One break for each function called. 2630 // One break for each function called.
2538 CHECK_EQ(4 * ARRAY_SIZE(argv), break_point_hit_count); 2631 CHECK_EQ(4 * ARRAY_SIZE(argv), break_point_hit_count);
2539 2632
2540 // Get rid of the debug event listener. 2633 // Get rid of the debug event listener.
2541 v8::Debug::SetDebugEventListener(NULL); 2634 v8::Debug::SetDebugEventListener(NULL);
2635 CheckDebuggerUnloaded();
2542 } 2636 }
2543 2637
2544 2638
2545 // Test to ensure that JavaScript code keeps running while the debug break 2639 // Test to ensure that JavaScript code keeps running while the debug break
2546 // through the stack limit flag is set but breaks are disabled. 2640 // through the stack limit flag is set but breaks are disabled.
2547 TEST(DisableBreak) { 2641 TEST(DisableBreak) {
2548 v8::HandleScope scope; 2642 v8::HandleScope scope;
2549 DebugLocalContext env; 2643 DebugLocalContext env;
2550 2644
2551 // Register a debug event listener which sets the break flag and counts. 2645 // Register a debug event listener which sets the break flag and counts.
(...skipping 16 matching lines...) Expand all
2568 v8::internal::DisableBreak disable_break(true); 2662 v8::internal::DisableBreak disable_break(true);
2569 f->Call(env->Global(), 0, NULL); 2663 f->Call(env->Global(), 0, NULL);
2570 CHECK_EQ(1, break_point_hit_count); 2664 CHECK_EQ(1, break_point_hit_count);
2571 } 2665 }
2572 2666
2573 f->Call(env->Global(), 0, NULL); 2667 f->Call(env->Global(), 0, NULL);
2574 CHECK_EQ(2, break_point_hit_count); 2668 CHECK_EQ(2, break_point_hit_count);
2575 2669
2576 // Get rid of the debug event listener. 2670 // Get rid of the debug event listener.
2577 v8::Debug::SetDebugEventListener(NULL); 2671 v8::Debug::SetDebugEventListener(NULL);
2672 CheckDebuggerUnloaded();
2578 } 2673 }
2579 2674
2580 2675
2581 static v8::Handle<v8::Array> NamedEnum(const v8::AccessorInfo&) { 2676 static v8::Handle<v8::Array> NamedEnum(const v8::AccessorInfo&) {
2582 v8::Handle<v8::Array> result = v8::Array::New(3); 2677 v8::Handle<v8::Array> result = v8::Array::New(3);
2583 result->Set(v8::Integer::New(0), v8::String::New("a")); 2678 result->Set(v8::Integer::New(0), v8::String::New("a"));
2584 result->Set(v8::Integer::New(1), v8::String::New("b")); 2679 result->Set(v8::Integer::New(1), v8::String::New("b"));
2585 result->Set(v8::Integer::New(2), v8::String::New("c")); 2680 result->Set(v8::Integer::New(2), v8::String::New("c"));
2586 return result; 2681 return result;
2587 } 2682 }
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after
3499 " CheckSourceLine(2)\n" 3594 " CheckSourceLine(2)\n"
3500 " CheckSourceLine(3)\n" 3595 " CheckSourceLine(3)\n"
3501 "}; f()"))->Run(); 3596 "}; f()"))->Run();
3502 3597
3503 // Test that a parameter can be passed to a function called in the debugger. 3598 // Test that a parameter can be passed to a function called in the debugger.
3504 v8::Script::Compile(v8::String::New("CheckDataParameter()"))->Run(); 3599 v8::Script::Compile(v8::String::New("CheckDataParameter()"))->Run();
3505 3600
3506 // Test that a function with closure can be run in the debugger. 3601 // Test that a function with closure can be run in the debugger.
3507 v8::Script::Compile(v8::String::New("CheckClosure()"))->Run(); 3602 v8::Script::Compile(v8::String::New("CheckClosure()"))->Run();
3508 } 3603 }
3604
3605
3606 // Test that clearing the debug event listener actually clears all break points
3607 // and related information.
3608 TEST(DebuggerUnload) {
3609 v8::HandleScope scope;
3610 DebugLocalContext env;
3611
3612 // Check debugger is unloaded before it is used.
3613 CheckDebuggerUnloaded();
3614
3615 // Add debug event listener.
3616 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
3617 v8::Undefined());
3618 CheckDebuggerLoaded();
3619
3620 // Create a couple of functions for the test.
3621 v8::Local<v8::Function> foo =
3622 CompileFunction(&env, "function foo(){x=1}", "foo");
3623 v8::Local<v8::Function> bar =
3624 CompileFunction(&env, "function bar(){y=2}", "bar");
3625
3626 // Set some break points.
3627 SetBreakPoint(foo, 0);
3628 SetBreakPoint(foo, 4);
3629 SetBreakPoint(bar, 0);
3630 SetBreakPoint(bar, 4);
3631
3632 // Make sure that the break points are there.
3633 break_point_hit_count = 0;
3634 foo->Call(env->Global(), 0, NULL);
3635 CHECK_EQ(2, break_point_hit_count);
3636 bar->Call(env->Global(), 0, NULL);
3637 CHECK_EQ(4, break_point_hit_count);
3638
3639 // Remove the debug event listener without clearing breakpoints.
3640 v8::Debug::SetDebugEventListener(NULL);
3641 CheckDebuggerUnloaded(true);
3642
3643 // Set a new debug event listener.
3644 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
3645 v8::Undefined());
3646 CheckDebuggerLoaded();
3647
3648 // Check that the break points was actually cleared.
3649 break_point_hit_count = 0;
3650 foo->Call(env->Global(), 0, NULL);
3651 CHECK_EQ(0, break_point_hit_count);
3652
3653 // Set break points and run again.
3654 SetBreakPoint(foo, 0);
3655 SetBreakPoint(foo, 4);
3656 foo->Call(env->Global(), 0, NULL);
3657 CHECK_EQ(2, break_point_hit_count);
3658
3659 // Remove the debug event listener without clearing breakpoints again.
3660 v8::Debug::SetDebugEventListener(NULL);
3661 CheckDebuggerUnloaded(true);
3662 }
OLDNEW
« no previous file with comments | « src/debug-ia32.cc ('k') | test/mjsunit/debug-evaluate-recursive.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698