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

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

Issue 23576002: Remove deprecated methods from debugger API (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 3 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/isolate.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 char last_script_name_hit[80]; 654 char last_script_name_hit[80];
655 char last_script_data_hit[80]; 655 char last_script_data_hit[80];
656 656
657 // Global variables to store the last source position - used by some tests. 657 // Global variables to store the last source position - used by some tests.
658 int last_source_line = -1; 658 int last_source_line = -1;
659 int last_source_column = -1; 659 int last_source_column = -1;
660 660
661 // Debug event handler which counts the break points which have been hit. 661 // Debug event handler which counts the break points which have been hit.
662 int break_point_hit_count = 0; 662 int break_point_hit_count = 0;
663 int break_point_hit_count_deoptimize = 0; 663 int break_point_hit_count_deoptimize = 0;
664 static void DebugEventBreakPointHitCount(v8::DebugEvent event, 664 static void DebugEventBreakPointHitCount(
665 v8::Handle<v8::Object> exec_state, 665 const v8::Debug::EventDetails& event_details) {
666 v8::Handle<v8::Object> event_data, 666 v8::DebugEvent event = event_details.GetEvent();
667 v8::Handle<v8::Value> data) { 667 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
668 v8::Handle<v8::Object> event_data = event_details.GetEventData();
668 v8::internal::Isolate* isolate = v8::internal::Isolate::Current(); 669 v8::internal::Isolate* isolate = v8::internal::Isolate::Current();
669 Debug* debug = isolate->debug(); 670 Debug* debug = isolate->debug();
670 // When hitting a debug event listener there must be a break set. 671 // When hitting a debug event listener there must be a break set.
671 CHECK_NE(debug->break_id(), 0); 672 CHECK_NE(debug->break_id(), 0);
672 673
673 // Count the number of breaks. 674 // Count the number of breaks.
674 if (event == v8::Break) { 675 if (event == v8::Break) {
675 break_point_hit_count++; 676 break_point_hit_count++;
676 if (!frame_function_name.IsEmpty()) { 677 if (!frame_function_name.IsEmpty()) {
677 // Get the name of the function. 678 // Get the name of the function.
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 int exception_hit_count = 0; 767 int exception_hit_count = 0;
767 int uncaught_exception_hit_count = 0; 768 int uncaught_exception_hit_count = 0;
768 int last_js_stack_height = -1; 769 int last_js_stack_height = -1;
769 770
770 static void DebugEventCounterClear() { 771 static void DebugEventCounterClear() {
771 break_point_hit_count = 0; 772 break_point_hit_count = 0;
772 exception_hit_count = 0; 773 exception_hit_count = 0;
773 uncaught_exception_hit_count = 0; 774 uncaught_exception_hit_count = 0;
774 } 775 }
775 776
776 static void DebugEventCounter(v8::DebugEvent event, 777 static void DebugEventCounter(
777 v8::Handle<v8::Object> exec_state, 778 const v8::Debug::EventDetails& event_details) {
778 v8::Handle<v8::Object> event_data, 779 v8::DebugEvent event = event_details.GetEvent();
779 v8::Handle<v8::Value> data) { 780 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
781 v8::Handle<v8::Object> event_data = event_details.GetEventData();
780 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug(); 782 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug();
781 783
782 // When hitting a debug event listener there must be a break set. 784 // When hitting a debug event listener there must be a break set.
783 CHECK_NE(debug->break_id(), 0); 785 CHECK_NE(debug->break_id(), 0);
784 786
785 // Count the number of breaks. 787 // Count the number of breaks.
786 if (event == v8::Break) { 788 if (event == v8::Break) {
787 break_point_hit_count++; 789 break_point_hit_count++;
788 } else if (event == v8::Exception) { 790 } else if (event == v8::Exception) {
789 exception_hit_count++; 791 exception_hit_count++;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
828 struct EvaluateCheck* checks = NULL; 830 struct EvaluateCheck* checks = NULL;
829 // Source for The JavaScript function which can do the evaluation when a break 831 // Source for The JavaScript function which can do the evaluation when a break
830 // point is hit. 832 // point is hit.
831 const char* evaluate_check_source = 833 const char* evaluate_check_source =
832 "function evaluate_check(exec_state, expr, expected) {" 834 "function evaluate_check(exec_state, expr, expected) {"
833 " return exec_state.frame(0).evaluate(expr).value() === expected;" 835 " return exec_state.frame(0).evaluate(expr).value() === expected;"
834 "}"; 836 "}";
835 v8::Local<v8::Function> evaluate_check_function; 837 v8::Local<v8::Function> evaluate_check_function;
836 838
837 // The actual debug event described by the longer comment above. 839 // The actual debug event described by the longer comment above.
838 static void DebugEventEvaluate(v8::DebugEvent event, 840 static void DebugEventEvaluate(
839 v8::Handle<v8::Object> exec_state, 841 const v8::Debug::EventDetails& event_details) {
840 v8::Handle<v8::Object> event_data, 842 v8::DebugEvent event = event_details.GetEvent();
841 v8::Handle<v8::Value> data) { 843 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
842 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug(); 844 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug();
843 // When hitting a debug event listener there must be a break set. 845 // When hitting a debug event listener there must be a break set.
844 CHECK_NE(debug->break_id(), 0); 846 CHECK_NE(debug->break_id(), 0);
845 847
846 if (event == v8::Break) { 848 if (event == v8::Break) {
847 for (int i = 0; checks[i].expr != NULL; i++) { 849 for (int i = 0; checks[i].expr != NULL; i++) {
848 const int argc = 3; 850 const int argc = 3;
849 v8::Handle<v8::Value> argv[argc] = { exec_state, 851 v8::Handle<v8::Value> argv[argc] = { exec_state,
850 v8::String::New(checks[i].expr), 852 v8::String::New(checks[i].expr),
851 checks[i].expected }; 853 checks[i].expected };
852 v8::Handle<v8::Value> result = 854 v8::Handle<v8::Value> result =
853 evaluate_check_function->Call(exec_state, argc, argv); 855 evaluate_check_function->Call(exec_state, argc, argv);
854 if (!result->IsTrue()) { 856 if (!result->IsTrue()) {
855 v8::String::Utf8Value utf8(checks[i].expected->ToString()); 857 v8::String::Utf8Value utf8(checks[i].expected->ToString());
856 V8_Fatal(__FILE__, __LINE__, "%s != %s", checks[i].expr, *utf8); 858 V8_Fatal(__FILE__, __LINE__, "%s != %s", checks[i].expr, *utf8);
857 } 859 }
858 } 860 }
859 } 861 }
860 } 862 }
861 863
862 864
863 // This debug event listener removes a breakpoint in a function 865 // This debug event listener removes a breakpoint in a function
864 int debug_event_remove_break_point = 0; 866 int debug_event_remove_break_point = 0;
865 static void DebugEventRemoveBreakPoint(v8::DebugEvent event, 867 static void DebugEventRemoveBreakPoint(
866 v8::Handle<v8::Object> exec_state, 868 const v8::Debug::EventDetails& event_details) {
867 v8::Handle<v8::Object> event_data, 869 v8::DebugEvent event = event_details.GetEvent();
868 v8::Handle<v8::Value> data) { 870 v8::Handle<v8::Value> data = event_details.GetCallbackData();
869 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug(); 871 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug();
870 // When hitting a debug event listener there must be a break set. 872 // When hitting a debug event listener there must be a break set.
871 CHECK_NE(debug->break_id(), 0); 873 CHECK_NE(debug->break_id(), 0);
872 874
873 if (event == v8::Break) { 875 if (event == v8::Break) {
874 break_point_hit_count++; 876 break_point_hit_count++;
875 CHECK(data->IsFunction()); 877 CHECK(data->IsFunction());
876 ClearBreakPoint(debug_event_remove_break_point); 878 ClearBreakPoint(debug_event_remove_break_point);
877 } 879 }
878 } 880 }
879 881
880 882
881 // Debug event handler which counts break points hit and performs a step 883 // Debug event handler which counts break points hit and performs a step
882 // afterwards. 884 // afterwards.
883 StepAction step_action = StepIn; // Step action to perform when stepping. 885 StepAction step_action = StepIn; // Step action to perform when stepping.
884 static void DebugEventStep(v8::DebugEvent event, 886 static void DebugEventStep(
885 v8::Handle<v8::Object> exec_state, 887 const v8::Debug::EventDetails& event_details) {
886 v8::Handle<v8::Object> event_data, 888 v8::DebugEvent event = event_details.GetEvent();
887 v8::Handle<v8::Value> data) {
888 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug(); 889 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug();
889 // When hitting a debug event listener there must be a break set. 890 // When hitting a debug event listener there must be a break set.
890 CHECK_NE(debug->break_id(), 0); 891 CHECK_NE(debug->break_id(), 0);
891 892
892 if (event == v8::Break) { 893 if (event == v8::Break) {
893 break_point_hit_count++; 894 break_point_hit_count++;
894 PrepareStep(step_action); 895 PrepareStep(step_action);
895 } 896 }
896 } 897 }
897 898
898 899
899 // Debug event handler which counts break points hit and performs a step 900 // Debug event handler which counts break points hit and performs a step
900 // afterwards. For each call the expected function is checked. 901 // afterwards. For each call the expected function is checked.
901 // For this debug event handler to work the following two global varaibles 902 // For this debug event handler to work the following two global varaibles
902 // must be initialized. 903 // must be initialized.
903 // expected_step_sequence: An array of the expected function call sequence. 904 // expected_step_sequence: An array of the expected function call sequence.
904 // frame_function_name: A JavaScript function (see below). 905 // frame_function_name: A JavaScript function (see below).
905 906
906 // String containing the expected function call sequence. Note: this only works 907 // String containing the expected function call sequence. Note: this only works
907 // if functions have name length of one. 908 // if functions have name length of one.
908 const char* expected_step_sequence = NULL; 909 const char* expected_step_sequence = NULL;
909 910
910 // The actual debug event described by the longer comment above. 911 // The actual debug event described by the longer comment above.
911 static void DebugEventStepSequence(v8::DebugEvent event, 912 static void DebugEventStepSequence(
912 v8::Handle<v8::Object> exec_state, 913 const v8::Debug::EventDetails& event_details) {
913 v8::Handle<v8::Object> event_data, 914 v8::DebugEvent event = event_details.GetEvent();
914 v8::Handle<v8::Value> data) { 915 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
915 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug(); 916 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug();
916 // When hitting a debug event listener there must be a break set. 917 // When hitting a debug event listener there must be a break set.
917 CHECK_NE(debug->break_id(), 0); 918 CHECK_NE(debug->break_id(), 0);
918 919
919 if (event == v8::Break || event == v8::Exception) { 920 if (event == v8::Break || event == v8::Exception) {
920 // Check that the current function is the expected. 921 // Check that the current function is the expected.
921 CHECK(break_point_hit_count < 922 CHECK(break_point_hit_count <
922 StrLength(expected_step_sequence)); 923 StrLength(expected_step_sequence));
923 const int argc = 2; 924 const int argc = 2;
924 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) }; 925 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) };
925 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, 926 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state,
926 argc, argv); 927 argc, argv);
927 CHECK(result->IsString()); 928 CHECK(result->IsString());
928 v8::String::Utf8Value function_name(result->ToString()); 929 v8::String::Utf8Value function_name(result->ToString());
929 CHECK_EQ(1, StrLength(*function_name)); 930 CHECK_EQ(1, StrLength(*function_name));
930 CHECK_EQ((*function_name)[0], 931 CHECK_EQ((*function_name)[0],
931 expected_step_sequence[break_point_hit_count]); 932 expected_step_sequence[break_point_hit_count]);
932 933
933 // Perform step. 934 // Perform step.
934 break_point_hit_count++; 935 break_point_hit_count++;
935 PrepareStep(step_action); 936 PrepareStep(step_action);
936 } 937 }
937 } 938 }
938 939
939 940
940 // Debug event handler which performs a garbage collection. 941 // Debug event handler which performs a garbage collection.
941 static void DebugEventBreakPointCollectGarbage( 942 static void DebugEventBreakPointCollectGarbage(
942 v8::DebugEvent event, 943 const v8::Debug::EventDetails& event_details) {
943 v8::Handle<v8::Object> exec_state, 944 v8::DebugEvent event = event_details.GetEvent();
944 v8::Handle<v8::Object> event_data,
945 v8::Handle<v8::Value> data) {
946 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug(); 945 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug();
947 // When hitting a debug event listener there must be a break set. 946 // When hitting a debug event listener there must be a break set.
948 CHECK_NE(debug->break_id(), 0); 947 CHECK_NE(debug->break_id(), 0);
949 948
950 // Perform a garbage collection when break point is hit and continue. Based 949 // Perform a garbage collection when break point is hit and continue. Based
951 // on the number of break points hit either scavenge or mark compact 950 // on the number of break points hit either scavenge or mark compact
952 // collector is used. 951 // collector is used.
953 if (event == v8::Break) { 952 if (event == v8::Break) {
954 break_point_hit_count++; 953 break_point_hit_count++;
955 if (break_point_hit_count % 2 == 0) { 954 if (break_point_hit_count % 2 == 0) {
956 // Scavenge. 955 // Scavenge.
957 HEAP->CollectGarbage(v8::internal::NEW_SPACE); 956 HEAP->CollectGarbage(v8::internal::NEW_SPACE);
958 } else { 957 } else {
959 // Mark sweep compact. 958 // Mark sweep compact.
960 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 959 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
961 } 960 }
962 } 961 }
963 } 962 }
964 963
965 964
966 // Debug event handler which re-issues a debug break and calls the garbage 965 // Debug event handler which re-issues a debug break and calls the garbage
967 // collector to have the heap verified. 966 // collector to have the heap verified.
968 static void DebugEventBreak(v8::DebugEvent event, 967 static void DebugEventBreak(
969 v8::Handle<v8::Object> exec_state, 968 const v8::Debug::EventDetails& event_details) {
970 v8::Handle<v8::Object> event_data, 969 v8::DebugEvent event = event_details.GetEvent();
971 v8::Handle<v8::Value> data) {
972 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug(); 970 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug();
973 // When hitting a debug event listener there must be a break set. 971 // When hitting a debug event listener there must be a break set.
974 CHECK_NE(debug->break_id(), 0); 972 CHECK_NE(debug->break_id(), 0);
975 973
976 if (event == v8::Break) { 974 if (event == v8::Break) {
977 // Count the number of breaks. 975 // Count the number of breaks.
978 break_point_hit_count++; 976 break_point_hit_count++;
979 977
980 // Run the garbage collector to enforce heap verification if option 978 // Run the garbage collector to enforce heap verification if option
981 // --verify-heap is set. 979 // --verify-heap is set.
982 HEAP->CollectGarbage(v8::internal::NEW_SPACE); 980 HEAP->CollectGarbage(v8::internal::NEW_SPACE);
983 981
984 // Set the break flag again to come back here as soon as possible. 982 // Set the break flag again to come back here as soon as possible.
985 v8::Debug::DebugBreak(); 983 v8::Debug::DebugBreak();
986 } 984 }
987 } 985 }
988 986
989 987
990 // Debug event handler which re-issues a debug break until a limit has been 988 // Debug event handler which re-issues a debug break until a limit has been
991 // reached. 989 // reached.
992 int max_break_point_hit_count = 0; 990 int max_break_point_hit_count = 0;
993 bool terminate_after_max_break_point_hit = false; 991 bool terminate_after_max_break_point_hit = false;
994 static void DebugEventBreakMax(v8::DebugEvent event, 992 static void DebugEventBreakMax(
995 v8::Handle<v8::Object> exec_state, 993 const v8::Debug::EventDetails& event_details) {
996 v8::Handle<v8::Object> event_data, 994 v8::DebugEvent event = event_details.GetEvent();
997 v8::Handle<v8::Value> data) { 995 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
998 v8::internal::Isolate* isolate = v8::internal::Isolate::Current(); 996 v8::internal::Isolate* isolate = v8::internal::Isolate::Current();
999 v8::internal::Debug* debug = isolate->debug(); 997 v8::internal::Debug* debug = isolate->debug();
1000 // When hitting a debug event listener there must be a break set. 998 // When hitting a debug event listener there must be a break set.
1001 CHECK_NE(debug->break_id(), 0); 999 CHECK_NE(debug->break_id(), 0);
1002 1000
1003 if (event == v8::Break) { 1001 if (event == v8::Break) {
1004 if (break_point_hit_count < max_break_point_hit_count) { 1002 if (break_point_hit_count < max_break_point_hit_count) {
1005 // Count the number of breaks. 1003 // Count the number of breaks.
1006 break_point_hit_count++; 1004 break_point_hit_count++;
1007 1005
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1172 CHECK(!HasDebugInfo(bar)); 1170 CHECK(!HasDebugInfo(bar));
1173 } 1171 }
1174 1172
1175 1173
1176 // Test that a break point can be set at an IC store location. 1174 // Test that a break point can be set at an IC store location.
1177 TEST(BreakPointICStore) { 1175 TEST(BreakPointICStore) {
1178 break_point_hit_count = 0; 1176 break_point_hit_count = 0;
1179 DebugLocalContext env; 1177 DebugLocalContext env;
1180 v8::HandleScope scope(env->GetIsolate()); 1178 v8::HandleScope scope(env->GetIsolate());
1181 1179
1182 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1180 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
1183 v8::Undefined());
1184 v8::Script::Compile(v8::String::New("function foo(){bar=0;}"))->Run(); 1181 v8::Script::Compile(v8::String::New("function foo(){bar=0;}"))->Run();
1185 v8::Local<v8::Function> foo = 1182 v8::Local<v8::Function> foo =
1186 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 1183 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
1187 1184
1188 // Run without breakpoints. 1185 // Run without breakpoints.
1189 foo->Call(env->Global(), 0, NULL); 1186 foo->Call(env->Global(), 0, NULL);
1190 CHECK_EQ(0, break_point_hit_count); 1187 CHECK_EQ(0, break_point_hit_count);
1191 1188
1192 // Run with breakpoint 1189 // Run with breakpoint
1193 int bp = SetBreakPoint(foo, 0); 1190 int bp = SetBreakPoint(foo, 0);
1194 foo->Call(env->Global(), 0, NULL); 1191 foo->Call(env->Global(), 0, NULL);
1195 CHECK_EQ(1, break_point_hit_count); 1192 CHECK_EQ(1, break_point_hit_count);
1196 foo->Call(env->Global(), 0, NULL); 1193 foo->Call(env->Global(), 0, NULL);
1197 CHECK_EQ(2, break_point_hit_count); 1194 CHECK_EQ(2, break_point_hit_count);
1198 1195
1199 // Run without breakpoints. 1196 // Run without breakpoints.
1200 ClearBreakPoint(bp); 1197 ClearBreakPoint(bp);
1201 foo->Call(env->Global(), 0, NULL); 1198 foo->Call(env->Global(), 0, NULL);
1202 CHECK_EQ(2, break_point_hit_count); 1199 CHECK_EQ(2, break_point_hit_count);
1203 1200
1204 v8::Debug::SetDebugEventListener(NULL); 1201 v8::Debug::SetDebugEventListener2(NULL);
1205 CheckDebuggerUnloaded(); 1202 CheckDebuggerUnloaded();
1206 } 1203 }
1207 1204
1208 1205
1209 // Test that a break point can be set at an IC load location. 1206 // Test that a break point can be set at an IC load location.
1210 TEST(BreakPointICLoad) { 1207 TEST(BreakPointICLoad) {
1211 break_point_hit_count = 0; 1208 break_point_hit_count = 0;
1212 DebugLocalContext env; 1209 DebugLocalContext env;
1213 v8::HandleScope scope(env->GetIsolate()); 1210 v8::HandleScope scope(env->GetIsolate());
1214 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1211 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
1215 v8::Undefined());
1216 v8::Script::Compile(v8::String::New("bar=1"))->Run(); 1212 v8::Script::Compile(v8::String::New("bar=1"))->Run();
1217 v8::Script::Compile(v8::String::New("function foo(){var x=bar;}"))->Run(); 1213 v8::Script::Compile(v8::String::New("function foo(){var x=bar;}"))->Run();
1218 v8::Local<v8::Function> foo = 1214 v8::Local<v8::Function> foo =
1219 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 1215 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
1220 1216
1221 // Run without breakpoints. 1217 // Run without breakpoints.
1222 foo->Call(env->Global(), 0, NULL); 1218 foo->Call(env->Global(), 0, NULL);
1223 CHECK_EQ(0, break_point_hit_count); 1219 CHECK_EQ(0, break_point_hit_count);
1224 1220
1225 // Run with breakpoint. 1221 // Run with breakpoint.
1226 int bp = SetBreakPoint(foo, 0); 1222 int bp = SetBreakPoint(foo, 0);
1227 foo->Call(env->Global(), 0, NULL); 1223 foo->Call(env->Global(), 0, NULL);
1228 CHECK_EQ(1, break_point_hit_count); 1224 CHECK_EQ(1, break_point_hit_count);
1229 foo->Call(env->Global(), 0, NULL); 1225 foo->Call(env->Global(), 0, NULL);
1230 CHECK_EQ(2, break_point_hit_count); 1226 CHECK_EQ(2, break_point_hit_count);
1231 1227
1232 // Run without breakpoints. 1228 // Run without breakpoints.
1233 ClearBreakPoint(bp); 1229 ClearBreakPoint(bp);
1234 foo->Call(env->Global(), 0, NULL); 1230 foo->Call(env->Global(), 0, NULL);
1235 CHECK_EQ(2, break_point_hit_count); 1231 CHECK_EQ(2, break_point_hit_count);
1236 1232
1237 v8::Debug::SetDebugEventListener(NULL); 1233 v8::Debug::SetDebugEventListener2(NULL);
1238 CheckDebuggerUnloaded(); 1234 CheckDebuggerUnloaded();
1239 } 1235 }
1240 1236
1241 1237
1242 // Test that a break point can be set at an IC call location. 1238 // Test that a break point can be set at an IC call location.
1243 TEST(BreakPointICCall) { 1239 TEST(BreakPointICCall) {
1244 break_point_hit_count = 0; 1240 break_point_hit_count = 0;
1245 DebugLocalContext env; 1241 DebugLocalContext env;
1246 v8::HandleScope scope(env->GetIsolate()); 1242 v8::HandleScope scope(env->GetIsolate());
1247 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1243 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
1248 v8::Undefined());
1249 v8::Script::Compile(v8::String::New("function bar(){}"))->Run(); 1244 v8::Script::Compile(v8::String::New("function bar(){}"))->Run();
1250 v8::Script::Compile(v8::String::New("function foo(){bar();}"))->Run(); 1245 v8::Script::Compile(v8::String::New("function foo(){bar();}"))->Run();
1251 v8::Local<v8::Function> foo = 1246 v8::Local<v8::Function> foo =
1252 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 1247 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
1253 1248
1254 // Run without breakpoints. 1249 // Run without breakpoints.
1255 foo->Call(env->Global(), 0, NULL); 1250 foo->Call(env->Global(), 0, NULL);
1256 CHECK_EQ(0, break_point_hit_count); 1251 CHECK_EQ(0, break_point_hit_count);
1257 1252
1258 // Run with breakpoint 1253 // Run with breakpoint
1259 int bp = SetBreakPoint(foo, 0); 1254 int bp = SetBreakPoint(foo, 0);
1260 foo->Call(env->Global(), 0, NULL); 1255 foo->Call(env->Global(), 0, NULL);
1261 CHECK_EQ(1, break_point_hit_count); 1256 CHECK_EQ(1, break_point_hit_count);
1262 foo->Call(env->Global(), 0, NULL); 1257 foo->Call(env->Global(), 0, NULL);
1263 CHECK_EQ(2, break_point_hit_count); 1258 CHECK_EQ(2, break_point_hit_count);
1264 1259
1265 // Run without breakpoints. 1260 // Run without breakpoints.
1266 ClearBreakPoint(bp); 1261 ClearBreakPoint(bp);
1267 foo->Call(env->Global(), 0, NULL); 1262 foo->Call(env->Global(), 0, NULL);
1268 CHECK_EQ(2, break_point_hit_count); 1263 CHECK_EQ(2, break_point_hit_count);
1269 1264
1270 v8::Debug::SetDebugEventListener(NULL); 1265 v8::Debug::SetDebugEventListener2(NULL);
1271 CheckDebuggerUnloaded(); 1266 CheckDebuggerUnloaded();
1272 } 1267 }
1273 1268
1274 1269
1275 // Test that a break point can be set at an IC call location and survive a GC. 1270 // Test that a break point can be set at an IC call location and survive a GC.
1276 TEST(BreakPointICCallWithGC) { 1271 TEST(BreakPointICCallWithGC) {
1277 break_point_hit_count = 0; 1272 break_point_hit_count = 0;
1278 DebugLocalContext env; 1273 DebugLocalContext env;
1279 v8::HandleScope scope(env->GetIsolate()); 1274 v8::HandleScope scope(env->GetIsolate());
1280 v8::Debug::SetDebugEventListener(DebugEventBreakPointCollectGarbage, 1275 v8::Debug::SetDebugEventListener2(DebugEventBreakPointCollectGarbage);
1281 v8::Undefined());
1282 v8::Script::Compile(v8::String::New("function bar(){return 1;}"))->Run(); 1276 v8::Script::Compile(v8::String::New("function bar(){return 1;}"))->Run();
1283 v8::Script::Compile(v8::String::New("function foo(){return bar();}"))->Run(); 1277 v8::Script::Compile(v8::String::New("function foo(){return bar();}"))->Run();
1284 v8::Local<v8::Function> foo = 1278 v8::Local<v8::Function> foo =
1285 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 1279 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
1286 1280
1287 // Run without breakpoints. 1281 // Run without breakpoints.
1288 CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); 1282 CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value());
1289 CHECK_EQ(0, break_point_hit_count); 1283 CHECK_EQ(0, break_point_hit_count);
1290 1284
1291 // Run with breakpoint. 1285 // Run with breakpoint.
1292 int bp = SetBreakPoint(foo, 0); 1286 int bp = SetBreakPoint(foo, 0);
1293 CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); 1287 CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value());
1294 CHECK_EQ(1, break_point_hit_count); 1288 CHECK_EQ(1, break_point_hit_count);
1295 CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); 1289 CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value());
1296 CHECK_EQ(2, break_point_hit_count); 1290 CHECK_EQ(2, break_point_hit_count);
1297 1291
1298 // Run without breakpoints. 1292 // Run without breakpoints.
1299 ClearBreakPoint(bp); 1293 ClearBreakPoint(bp);
1300 foo->Call(env->Global(), 0, NULL); 1294 foo->Call(env->Global(), 0, NULL);
1301 CHECK_EQ(2, break_point_hit_count); 1295 CHECK_EQ(2, break_point_hit_count);
1302 1296
1303 v8::Debug::SetDebugEventListener(NULL); 1297 v8::Debug::SetDebugEventListener2(NULL);
1304 CheckDebuggerUnloaded(); 1298 CheckDebuggerUnloaded();
1305 } 1299 }
1306 1300
1307 1301
1308 // Test that a break point can be set at an IC call location and survive a GC. 1302 // Test that a break point can be set at an IC call location and survive a GC.
1309 TEST(BreakPointConstructCallWithGC) { 1303 TEST(BreakPointConstructCallWithGC) {
1310 break_point_hit_count = 0; 1304 break_point_hit_count = 0;
1311 DebugLocalContext env; 1305 DebugLocalContext env;
1312 v8::HandleScope scope(env->GetIsolate()); 1306 v8::HandleScope scope(env->GetIsolate());
1313 v8::Debug::SetDebugEventListener(DebugEventBreakPointCollectGarbage, 1307 v8::Debug::SetDebugEventListener2(DebugEventBreakPointCollectGarbage);
1314 v8::Undefined());
1315 v8::Script::Compile(v8::String::New("function bar(){ this.x = 1;}"))->Run(); 1308 v8::Script::Compile(v8::String::New("function bar(){ this.x = 1;}"))->Run();
1316 v8::Script::Compile(v8::String::New( 1309 v8::Script::Compile(v8::String::New(
1317 "function foo(){return new bar(1).x;}"))->Run(); 1310 "function foo(){return new bar(1).x;}"))->Run();
1318 v8::Local<v8::Function> foo = 1311 v8::Local<v8::Function> foo =
1319 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 1312 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
1320 1313
1321 // Run without breakpoints. 1314 // Run without breakpoints.
1322 CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); 1315 CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value());
1323 CHECK_EQ(0, break_point_hit_count); 1316 CHECK_EQ(0, break_point_hit_count);
1324 1317
1325 // Run with breakpoint. 1318 // Run with breakpoint.
1326 int bp = SetBreakPoint(foo, 0); 1319 int bp = SetBreakPoint(foo, 0);
1327 CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); 1320 CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value());
1328 CHECK_EQ(1, break_point_hit_count); 1321 CHECK_EQ(1, break_point_hit_count);
1329 CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); 1322 CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value());
1330 CHECK_EQ(2, break_point_hit_count); 1323 CHECK_EQ(2, break_point_hit_count);
1331 1324
1332 // Run without breakpoints. 1325 // Run without breakpoints.
1333 ClearBreakPoint(bp); 1326 ClearBreakPoint(bp);
1334 foo->Call(env->Global(), 0, NULL); 1327 foo->Call(env->Global(), 0, NULL);
1335 CHECK_EQ(2, break_point_hit_count); 1328 CHECK_EQ(2, break_point_hit_count);
1336 1329
1337 v8::Debug::SetDebugEventListener(NULL); 1330 v8::Debug::SetDebugEventListener2(NULL);
1338 CheckDebuggerUnloaded(); 1331 CheckDebuggerUnloaded();
1339 } 1332 }
1340 1333
1341 1334
1342 // Test that a break point can be set at a return store location. 1335 // Test that a break point can be set at a return store location.
1343 TEST(BreakPointReturn) { 1336 TEST(BreakPointReturn) {
1344 break_point_hit_count = 0; 1337 break_point_hit_count = 0;
1345 DebugLocalContext env; 1338 DebugLocalContext env;
1346 v8::HandleScope scope(env->GetIsolate()); 1339 v8::HandleScope scope(env->GetIsolate());
1347 1340
1348 // Create a functions for checking the source line and column when hitting 1341 // Create a functions for checking the source line and column when hitting
1349 // a break point. 1342 // a break point.
1350 frame_source_line = CompileFunction(&env, 1343 frame_source_line = CompileFunction(&env,
1351 frame_source_line_source, 1344 frame_source_line_source,
1352 "frame_source_line"); 1345 "frame_source_line");
1353 frame_source_column = CompileFunction(&env, 1346 frame_source_column = CompileFunction(&env,
1354 frame_source_column_source, 1347 frame_source_column_source,
1355 "frame_source_column"); 1348 "frame_source_column");
1356 1349
1357 1350
1358 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1351 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
1359 v8::Undefined());
1360 v8::Script::Compile(v8::String::New("function foo(){}"))->Run(); 1352 v8::Script::Compile(v8::String::New("function foo(){}"))->Run();
1361 v8::Local<v8::Function> foo = 1353 v8::Local<v8::Function> foo =
1362 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 1354 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
1363 1355
1364 // Run without breakpoints. 1356 // Run without breakpoints.
1365 foo->Call(env->Global(), 0, NULL); 1357 foo->Call(env->Global(), 0, NULL);
1366 CHECK_EQ(0, break_point_hit_count); 1358 CHECK_EQ(0, break_point_hit_count);
1367 1359
1368 // Run with breakpoint 1360 // Run with breakpoint
1369 int bp = SetBreakPoint(foo, 0); 1361 int bp = SetBreakPoint(foo, 0);
1370 foo->Call(env->Global(), 0, NULL); 1362 foo->Call(env->Global(), 0, NULL);
1371 CHECK_EQ(1, break_point_hit_count); 1363 CHECK_EQ(1, break_point_hit_count);
1372 CHECK_EQ(0, last_source_line); 1364 CHECK_EQ(0, last_source_line);
1373 CHECK_EQ(15, last_source_column); 1365 CHECK_EQ(15, last_source_column);
1374 foo->Call(env->Global(), 0, NULL); 1366 foo->Call(env->Global(), 0, NULL);
1375 CHECK_EQ(2, break_point_hit_count); 1367 CHECK_EQ(2, break_point_hit_count);
1376 CHECK_EQ(0, last_source_line); 1368 CHECK_EQ(0, last_source_line);
1377 CHECK_EQ(15, last_source_column); 1369 CHECK_EQ(15, last_source_column);
1378 1370
1379 // Run without breakpoints. 1371 // Run without breakpoints.
1380 ClearBreakPoint(bp); 1372 ClearBreakPoint(bp);
1381 foo->Call(env->Global(), 0, NULL); 1373 foo->Call(env->Global(), 0, NULL);
1382 CHECK_EQ(2, break_point_hit_count); 1374 CHECK_EQ(2, break_point_hit_count);
1383 1375
1384 v8::Debug::SetDebugEventListener(NULL); 1376 v8::Debug::SetDebugEventListener2(NULL);
1385 CheckDebuggerUnloaded(); 1377 CheckDebuggerUnloaded();
1386 } 1378 }
1387 1379
1388 1380
1389 static void CallWithBreakPoints(v8::Local<v8::Object> recv, 1381 static void CallWithBreakPoints(v8::Local<v8::Object> recv,
1390 v8::Local<v8::Function> f, 1382 v8::Local<v8::Function> f,
1391 int break_point_count, 1383 int break_point_count,
1392 int call_count) { 1384 int call_count) {
1393 break_point_hit_count = 0; 1385 break_point_hit_count = 0;
1394 for (int i = 0; i < call_count; i++) { 1386 for (int i = 0; i < call_count; i++) {
1395 f->Call(recv, 0, NULL); 1387 f->Call(recv, 0, NULL);
1396 CHECK_EQ((i + 1) * break_point_count, break_point_hit_count); 1388 CHECK_EQ((i + 1) * break_point_count, break_point_hit_count);
1397 } 1389 }
1398 } 1390 }
1399 1391
1400 1392
1401 // Test GC during break point processing. 1393 // Test GC during break point processing.
1402 TEST(GCDuringBreakPointProcessing) { 1394 TEST(GCDuringBreakPointProcessing) {
1403 break_point_hit_count = 0; 1395 break_point_hit_count = 0;
1404 DebugLocalContext env; 1396 DebugLocalContext env;
1405 v8::HandleScope scope(env->GetIsolate()); 1397 v8::HandleScope scope(env->GetIsolate());
1406 1398
1407 v8::Debug::SetDebugEventListener(DebugEventBreakPointCollectGarbage, 1399 v8::Debug::SetDebugEventListener2(DebugEventBreakPointCollectGarbage);
1408 v8::Undefined());
1409 v8::Local<v8::Function> foo; 1400 v8::Local<v8::Function> foo;
1410 1401
1411 // Test IC store break point with garbage collection. 1402 // Test IC store break point with garbage collection.
1412 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); 1403 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo");
1413 SetBreakPoint(foo, 0); 1404 SetBreakPoint(foo, 0);
1414 CallWithBreakPoints(env->Global(), foo, 1, 10); 1405 CallWithBreakPoints(env->Global(), foo, 1, 10);
1415 1406
1416 // Test IC load break point with garbage collection. 1407 // Test IC load break point with garbage collection.
1417 foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo"); 1408 foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo");
1418 SetBreakPoint(foo, 0); 1409 SetBreakPoint(foo, 0);
1419 CallWithBreakPoints(env->Global(), foo, 1, 10); 1410 CallWithBreakPoints(env->Global(), foo, 1, 10);
1420 1411
1421 // Test IC call break point with garbage collection. 1412 // Test IC call break point with garbage collection.
1422 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo"); 1413 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo");
1423 SetBreakPoint(foo, 0); 1414 SetBreakPoint(foo, 0);
1424 CallWithBreakPoints(env->Global(), foo, 1, 10); 1415 CallWithBreakPoints(env->Global(), foo, 1, 10);
1425 1416
1426 // Test return break point with garbage collection. 1417 // Test return break point with garbage collection.
1427 foo = CompileFunction(&env, "function foo(){}", "foo"); 1418 foo = CompileFunction(&env, "function foo(){}", "foo");
1428 SetBreakPoint(foo, 0); 1419 SetBreakPoint(foo, 0);
1429 CallWithBreakPoints(env->Global(), foo, 1, 25); 1420 CallWithBreakPoints(env->Global(), foo, 1, 25);
1430 1421
1431 // Test debug break slot break point with garbage collection. 1422 // Test debug break slot break point with garbage collection.
1432 foo = CompileFunction(&env, "function foo(){var a;}", "foo"); 1423 foo = CompileFunction(&env, "function foo(){var a;}", "foo");
1433 SetBreakPoint(foo, 0); 1424 SetBreakPoint(foo, 0);
1434 CallWithBreakPoints(env->Global(), foo, 1, 25); 1425 CallWithBreakPoints(env->Global(), foo, 1, 25);
1435 1426
1436 v8::Debug::SetDebugEventListener(NULL); 1427 v8::Debug::SetDebugEventListener2(NULL);
1437 CheckDebuggerUnloaded(); 1428 CheckDebuggerUnloaded();
1438 } 1429 }
1439 1430
1440 1431
1441 // Call the function three times with different garbage collections in between 1432 // Call the function three times with different garbage collections in between
1442 // and make sure that the break point survives. 1433 // and make sure that the break point survives.
1443 static void CallAndGC(v8::Local<v8::Object> recv, 1434 static void CallAndGC(v8::Local<v8::Object> recv,
1444 v8::Local<v8::Function> f) { 1435 v8::Local<v8::Function> f) {
1445 break_point_hit_count = 0; 1436 break_point_hit_count = 0;
1446 1437
(...skipping 14 matching lines...) Expand all
1461 } 1452 }
1462 } 1453 }
1463 1454
1464 1455
1465 // Test that a break point can be set at a return store location. 1456 // Test that a break point can be set at a return store location.
1466 TEST(BreakPointSurviveGC) { 1457 TEST(BreakPointSurviveGC) {
1467 break_point_hit_count = 0; 1458 break_point_hit_count = 0;
1468 DebugLocalContext env; 1459 DebugLocalContext env;
1469 v8::HandleScope scope(env->GetIsolate()); 1460 v8::HandleScope scope(env->GetIsolate());
1470 1461
1471 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1462 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
1472 v8::Undefined());
1473 v8::Local<v8::Function> foo; 1463 v8::Local<v8::Function> foo;
1474 1464
1475 // Test IC store break point with garbage collection. 1465 // Test IC store break point with garbage collection.
1476 { 1466 {
1477 CompileFunction(&env, "function foo(){}", "foo"); 1467 CompileFunction(&env, "function foo(){}", "foo");
1478 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); 1468 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo");
1479 SetBreakPoint(foo, 0); 1469 SetBreakPoint(foo, 0);
1480 } 1470 }
1481 CallAndGC(env->Global(), foo); 1471 CallAndGC(env->Global(), foo);
1482 1472
(...skipping 25 matching lines...) Expand all
1508 1498
1509 // Test non IC break point with garbage collection. 1499 // Test non IC break point with garbage collection.
1510 { 1500 {
1511 CompileFunction(&env, "function foo(){}", "foo"); 1501 CompileFunction(&env, "function foo(){}", "foo");
1512 foo = CompileFunction(&env, "function foo(){var bar=0;}", "foo"); 1502 foo = CompileFunction(&env, "function foo(){var bar=0;}", "foo");
1513 SetBreakPoint(foo, 0); 1503 SetBreakPoint(foo, 0);
1514 } 1504 }
1515 CallAndGC(env->Global(), foo); 1505 CallAndGC(env->Global(), foo);
1516 1506
1517 1507
1518 v8::Debug::SetDebugEventListener(NULL); 1508 v8::Debug::SetDebugEventListener2(NULL);
1519 CheckDebuggerUnloaded(); 1509 CheckDebuggerUnloaded();
1520 } 1510 }
1521 1511
1522 1512
1523 // Test that break points can be set using the global Debug object. 1513 // Test that break points can be set using the global Debug object.
1524 TEST(BreakPointThroughJavaScript) { 1514 TEST(BreakPointThroughJavaScript) {
1525 break_point_hit_count = 0; 1515 break_point_hit_count = 0;
1526 DebugLocalContext env; 1516 DebugLocalContext env;
1527 v8::HandleScope scope(env->GetIsolate()); 1517 v8::HandleScope scope(env->GetIsolate());
1528 env.ExposeDebug(); 1518 env.ExposeDebug();
1529 1519
1530 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1520 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
1531 v8::Undefined());
1532 v8::Script::Compile(v8::String::New("function bar(){}"))->Run(); 1521 v8::Script::Compile(v8::String::New("function bar(){}"))->Run();
1533 v8::Script::Compile(v8::String::New("function foo(){bar();bar();}"))->Run(); 1522 v8::Script::Compile(v8::String::New("function foo(){bar();bar();}"))->Run();
1534 // 012345678901234567890 1523 // 012345678901234567890
1535 // 1 2 1524 // 1 2
1536 // Break points are set at position 3 and 9 1525 // Break points are set at position 3 and 9
1537 v8::Local<v8::Script> foo = v8::Script::Compile(v8::String::New("foo()")); 1526 v8::Local<v8::Script> foo = v8::Script::Compile(v8::String::New("foo()"));
1538 1527
1539 // Run without breakpoints. 1528 // Run without breakpoints.
1540 foo->Run(); 1529 foo->Run();
1541 CHECK_EQ(0, break_point_hit_count); 1530 CHECK_EQ(0, break_point_hit_count);
(...skipping 17 matching lines...) Expand all
1559 foo->Run(); 1548 foo->Run();
1560 CHECK_EQ(7, break_point_hit_count); 1549 CHECK_EQ(7, break_point_hit_count);
1561 foo->Run(); 1550 foo->Run();
1562 CHECK_EQ(8, break_point_hit_count); 1551 CHECK_EQ(8, break_point_hit_count);
1563 1552
1564 // Run without breakpoints. 1553 // Run without breakpoints.
1565 ClearBreakPointFromJS(bp1); 1554 ClearBreakPointFromJS(bp1);
1566 foo->Run(); 1555 foo->Run();
1567 CHECK_EQ(8, break_point_hit_count); 1556 CHECK_EQ(8, break_point_hit_count);
1568 1557
1569 v8::Debug::SetDebugEventListener(NULL); 1558 v8::Debug::SetDebugEventListener2(NULL);
1570 CheckDebuggerUnloaded(); 1559 CheckDebuggerUnloaded();
1571 1560
1572 // Make sure that the break point numbers are consecutive. 1561 // Make sure that the break point numbers are consecutive.
1573 CHECK_EQ(1, bp1); 1562 CHECK_EQ(1, bp1);
1574 CHECK_EQ(2, bp2); 1563 CHECK_EQ(2, bp2);
1575 } 1564 }
1576 1565
1577 1566
1578 // Test that break points on scripts identified by name can be set using the 1567 // Test that break points on scripts identified by name can be set using the
1579 // global Debug object. 1568 // global Debug object.
1580 TEST(ScriptBreakPointByNameThroughJavaScript) { 1569 TEST(ScriptBreakPointByNameThroughJavaScript) {
1581 break_point_hit_count = 0; 1570 break_point_hit_count = 0;
1582 DebugLocalContext env; 1571 DebugLocalContext env;
1583 v8::HandleScope scope(env->GetIsolate()); 1572 v8::HandleScope scope(env->GetIsolate());
1584 env.ExposeDebug(); 1573 env.ExposeDebug();
1585 1574
1586 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1575 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
1587 v8::Undefined());
1588 1576
1589 v8::Local<v8::String> script = v8::String::New( 1577 v8::Local<v8::String> script = v8::String::New(
1590 "function f() {\n" 1578 "function f() {\n"
1591 " function h() {\n" 1579 " function h() {\n"
1592 " a = 0; // line 2\n" 1580 " a = 0; // line 2\n"
1593 " }\n" 1581 " }\n"
1594 " b = 1; // line 4\n" 1582 " b = 1; // line 4\n"
1595 " return h();\n" 1583 " return h();\n"
1596 "}\n" 1584 "}\n"
1597 "\n" 1585 "\n"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1661 ClearBreakPointFromJS(sbp2); 1649 ClearBreakPointFromJS(sbp2);
1662 ClearBreakPointFromJS(sbp3); 1650 ClearBreakPointFromJS(sbp3);
1663 ClearBreakPointFromJS(sbp4); 1651 ClearBreakPointFromJS(sbp4);
1664 ClearBreakPointFromJS(sbp5); 1652 ClearBreakPointFromJS(sbp5);
1665 ClearBreakPointFromJS(sbp6); 1653 ClearBreakPointFromJS(sbp6);
1666 f->Call(env->Global(), 0, NULL); 1654 f->Call(env->Global(), 0, NULL);
1667 CHECK_EQ(0, break_point_hit_count); 1655 CHECK_EQ(0, break_point_hit_count);
1668 g->Call(env->Global(), 0, NULL); 1656 g->Call(env->Global(), 0, NULL);
1669 CHECK_EQ(0, break_point_hit_count); 1657 CHECK_EQ(0, break_point_hit_count);
1670 1658
1671 v8::Debug::SetDebugEventListener(NULL); 1659 v8::Debug::SetDebugEventListener2(NULL);
1672 CheckDebuggerUnloaded(); 1660 CheckDebuggerUnloaded();
1673 1661
1674 // Make sure that the break point numbers are consecutive. 1662 // Make sure that the break point numbers are consecutive.
1675 CHECK_EQ(1, sbp1); 1663 CHECK_EQ(1, sbp1);
1676 CHECK_EQ(2, sbp2); 1664 CHECK_EQ(2, sbp2);
1677 CHECK_EQ(3, sbp3); 1665 CHECK_EQ(3, sbp3);
1678 CHECK_EQ(4, sbp4); 1666 CHECK_EQ(4, sbp4);
1679 CHECK_EQ(5, sbp5); 1667 CHECK_EQ(5, sbp5);
1680 CHECK_EQ(6, sbp6); 1668 CHECK_EQ(6, sbp6);
1681 } 1669 }
1682 1670
1683 1671
1684 TEST(ScriptBreakPointByIdThroughJavaScript) { 1672 TEST(ScriptBreakPointByIdThroughJavaScript) {
1685 break_point_hit_count = 0; 1673 break_point_hit_count = 0;
1686 DebugLocalContext env; 1674 DebugLocalContext env;
1687 v8::HandleScope scope(env->GetIsolate()); 1675 v8::HandleScope scope(env->GetIsolate());
1688 env.ExposeDebug(); 1676 env.ExposeDebug();
1689 1677
1690 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1678 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
1691 v8::Undefined());
1692 1679
1693 v8::Local<v8::String> source = v8::String::New( 1680 v8::Local<v8::String> source = v8::String::New(
1694 "function f() {\n" 1681 "function f() {\n"
1695 " function h() {\n" 1682 " function h() {\n"
1696 " a = 0; // line 2\n" 1683 " a = 0; // line 2\n"
1697 " }\n" 1684 " }\n"
1698 " b = 1; // line 4\n" 1685 " b = 1; // line 4\n"
1699 " return h();\n" 1686 " return h();\n"
1700 "}\n" 1687 "}\n"
1701 "\n" 1688 "\n"
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1769 ClearBreakPointFromJS(sbp2); 1756 ClearBreakPointFromJS(sbp2);
1770 ClearBreakPointFromJS(sbp3); 1757 ClearBreakPointFromJS(sbp3);
1771 ClearBreakPointFromJS(sbp4); 1758 ClearBreakPointFromJS(sbp4);
1772 ClearBreakPointFromJS(sbp5); 1759 ClearBreakPointFromJS(sbp5);
1773 ClearBreakPointFromJS(sbp6); 1760 ClearBreakPointFromJS(sbp6);
1774 f->Call(env->Global(), 0, NULL); 1761 f->Call(env->Global(), 0, NULL);
1775 CHECK_EQ(0, break_point_hit_count); 1762 CHECK_EQ(0, break_point_hit_count);
1776 g->Call(env->Global(), 0, NULL); 1763 g->Call(env->Global(), 0, NULL);
1777 CHECK_EQ(0, break_point_hit_count); 1764 CHECK_EQ(0, break_point_hit_count);
1778 1765
1779 v8::Debug::SetDebugEventListener(NULL); 1766 v8::Debug::SetDebugEventListener2(NULL);
1780 CheckDebuggerUnloaded(); 1767 CheckDebuggerUnloaded();
1781 1768
1782 // Make sure that the break point numbers are consecutive. 1769 // Make sure that the break point numbers are consecutive.
1783 CHECK_EQ(1, sbp1); 1770 CHECK_EQ(1, sbp1);
1784 CHECK_EQ(2, sbp2); 1771 CHECK_EQ(2, sbp2);
1785 CHECK_EQ(3, sbp3); 1772 CHECK_EQ(3, sbp3);
1786 CHECK_EQ(4, sbp4); 1773 CHECK_EQ(4, sbp4);
1787 CHECK_EQ(5, sbp5); 1774 CHECK_EQ(5, sbp5);
1788 CHECK_EQ(6, sbp6); 1775 CHECK_EQ(6, sbp6);
1789 } 1776 }
1790 1777
1791 1778
1792 // Test conditional script break points. 1779 // Test conditional script break points.
1793 TEST(EnableDisableScriptBreakPoint) { 1780 TEST(EnableDisableScriptBreakPoint) {
1794 break_point_hit_count = 0; 1781 break_point_hit_count = 0;
1795 DebugLocalContext env; 1782 DebugLocalContext env;
1796 v8::HandleScope scope(env->GetIsolate()); 1783 v8::HandleScope scope(env->GetIsolate());
1797 env.ExposeDebug(); 1784 env.ExposeDebug();
1798 1785
1799 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1786 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
1800 v8::Undefined());
1801 1787
1802 v8::Local<v8::String> script = v8::String::New( 1788 v8::Local<v8::String> script = v8::String::New(
1803 "function f() {\n" 1789 "function f() {\n"
1804 " a = 0; // line 1\n" 1790 " a = 0; // line 1\n"
1805 "};"); 1791 "};");
1806 1792
1807 // Compile the script and get function f. 1793 // Compile the script and get function f.
1808 v8::ScriptOrigin origin = 1794 v8::ScriptOrigin origin =
1809 v8::ScriptOrigin(v8::String::New("test")); 1795 v8::ScriptOrigin(v8::String::New("test"));
1810 v8::Script::Compile(script, &origin)->Run(); 1796 v8::Script::Compile(script, &origin)->Run();
(...skipping 23 matching lines...) Expand all
1834 // Reload the script and get f again checking that the disabeling survives. 1820 // Reload the script and get f again checking that the disabeling survives.
1835 v8::Script::Compile(script, &origin)->Run(); 1821 v8::Script::Compile(script, &origin)->Run();
1836 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 1822 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
1837 f->Call(env->Global(), 0, NULL); 1823 f->Call(env->Global(), 0, NULL);
1838 CHECK_EQ(2, break_point_hit_count); 1824 CHECK_EQ(2, break_point_hit_count);
1839 1825
1840 EnableScriptBreakPointFromJS(sbp); 1826 EnableScriptBreakPointFromJS(sbp);
1841 f->Call(env->Global(), 0, NULL); 1827 f->Call(env->Global(), 0, NULL);
1842 CHECK_EQ(3, break_point_hit_count); 1828 CHECK_EQ(3, break_point_hit_count);
1843 1829
1844 v8::Debug::SetDebugEventListener(NULL); 1830 v8::Debug::SetDebugEventListener2(NULL);
1845 CheckDebuggerUnloaded(); 1831 CheckDebuggerUnloaded();
1846 } 1832 }
1847 1833
1848 1834
1849 // Test conditional script break points. 1835 // Test conditional script break points.
1850 TEST(ConditionalScriptBreakPoint) { 1836 TEST(ConditionalScriptBreakPoint) {
1851 break_point_hit_count = 0; 1837 break_point_hit_count = 0;
1852 DebugLocalContext env; 1838 DebugLocalContext env;
1853 v8::HandleScope scope(env->GetIsolate()); 1839 v8::HandleScope scope(env->GetIsolate());
1854 env.ExposeDebug(); 1840 env.ExposeDebug();
1855 1841
1856 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1842 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
1857 v8::Undefined());
1858 1843
1859 v8::Local<v8::String> script = v8::String::New( 1844 v8::Local<v8::String> script = v8::String::New(
1860 "count = 0;\n" 1845 "count = 0;\n"
1861 "function f() {\n" 1846 "function f() {\n"
1862 " g(count++); // line 2\n" 1847 " g(count++); // line 2\n"
1863 "};\n" 1848 "};\n"
1864 "function g(x) {\n" 1849 "function g(x) {\n"
1865 " var a=x; // line 5\n" 1850 " var a=x; // line 5\n"
1866 "};"); 1851 "};");
1867 1852
(...skipping 28 matching lines...) Expand all
1896 // Reload the script and get f again checking that the condition survives. 1881 // Reload the script and get f again checking that the condition survives.
1897 v8::Script::Compile(script, &origin)->Run(); 1882 v8::Script::Compile(script, &origin)->Run();
1898 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 1883 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
1899 1884
1900 break_point_hit_count = 0; 1885 break_point_hit_count = 0;
1901 for (int i = 0; i < 10; i++) { 1886 for (int i = 0; i < 10; i++) {
1902 f->Call(env->Global(), 0, NULL); 1887 f->Call(env->Global(), 0, NULL);
1903 } 1888 }
1904 CHECK_EQ(5, break_point_hit_count); 1889 CHECK_EQ(5, break_point_hit_count);
1905 1890
1906 v8::Debug::SetDebugEventListener(NULL); 1891 v8::Debug::SetDebugEventListener2(NULL);
1907 CheckDebuggerUnloaded(); 1892 CheckDebuggerUnloaded();
1908 } 1893 }
1909 1894
1910 1895
1911 // Test ignore count on script break points. 1896 // Test ignore count on script break points.
1912 TEST(ScriptBreakPointIgnoreCount) { 1897 TEST(ScriptBreakPointIgnoreCount) {
1913 break_point_hit_count = 0; 1898 break_point_hit_count = 0;
1914 DebugLocalContext env; 1899 DebugLocalContext env;
1915 v8::HandleScope scope(env->GetIsolate()); 1900 v8::HandleScope scope(env->GetIsolate());
1916 env.ExposeDebug(); 1901 env.ExposeDebug();
1917 1902
1918 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1903 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
1919 v8::Undefined());
1920 1904
1921 v8::Local<v8::String> script = v8::String::New( 1905 v8::Local<v8::String> script = v8::String::New(
1922 "function f() {\n" 1906 "function f() {\n"
1923 " a = 0; // line 1\n" 1907 " a = 0; // line 1\n"
1924 "};"); 1908 "};");
1925 1909
1926 // Compile the script and get function f. 1910 // Compile the script and get function f.
1927 v8::ScriptOrigin origin = 1911 v8::ScriptOrigin origin =
1928 v8::ScriptOrigin(v8::String::New("test")); 1912 v8::ScriptOrigin(v8::String::New("test"));
1929 v8::Script::Compile(script, &origin)->Run(); 1913 v8::Script::Compile(script, &origin)->Run();
(...skipping 21 matching lines...) Expand all
1951 // Reload the script and get f again checking that the ignore survives. 1935 // Reload the script and get f again checking that the ignore survives.
1952 v8::Script::Compile(script, &origin)->Run(); 1936 v8::Script::Compile(script, &origin)->Run();
1953 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 1937 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
1954 1938
1955 break_point_hit_count = 0; 1939 break_point_hit_count = 0;
1956 for (int i = 0; i < 10; i++) { 1940 for (int i = 0; i < 10; i++) {
1957 f->Call(env->Global(), 0, NULL); 1941 f->Call(env->Global(), 0, NULL);
1958 } 1942 }
1959 CHECK_EQ(5, break_point_hit_count); 1943 CHECK_EQ(5, break_point_hit_count);
1960 1944
1961 v8::Debug::SetDebugEventListener(NULL); 1945 v8::Debug::SetDebugEventListener2(NULL);
1962 CheckDebuggerUnloaded(); 1946 CheckDebuggerUnloaded();
1963 } 1947 }
1964 1948
1965 1949
1966 // Test that script break points survive when a script is reloaded. 1950 // Test that script break points survive when a script is reloaded.
1967 TEST(ScriptBreakPointReload) { 1951 TEST(ScriptBreakPointReload) {
1968 break_point_hit_count = 0; 1952 break_point_hit_count = 0;
1969 DebugLocalContext env; 1953 DebugLocalContext env;
1970 v8::HandleScope scope(env->GetIsolate()); 1954 v8::HandleScope scope(env->GetIsolate());
1971 env.ExposeDebug(); 1955 env.ExposeDebug();
1972 1956
1973 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 1957 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
1974 v8::Undefined());
1975 1958
1976 v8::Local<v8::Function> f; 1959 v8::Local<v8::Function> f;
1977 v8::Local<v8::String> script = v8::String::New( 1960 v8::Local<v8::String> script = v8::String::New(
1978 "function f() {\n" 1961 "function f() {\n"
1979 " function h() {\n" 1962 " function h() {\n"
1980 " a = 0; // line 2\n" 1963 " a = 0; // line 2\n"
1981 " }\n" 1964 " }\n"
1982 " b = 1; // line 4\n" 1965 " b = 1; // line 4\n"
1983 " return h();\n" 1966 " return h();\n"
1984 "}"); 1967 "}");
(...skipping 25 matching lines...) Expand all
2010 1993
2011 // Compile the script again and get the function. 1994 // Compile the script again and get the function.
2012 v8::Script::Compile(script, &origin_1)->Run(); 1995 v8::Script::Compile(script, &origin_1)->Run();
2013 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 1996 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
2014 1997
2015 // Call f and check that the script break point is active. 1998 // Call f and check that the script break point is active.
2016 break_point_hit_count = 0; 1999 break_point_hit_count = 0;
2017 f->Call(env->Global(), 0, NULL); 2000 f->Call(env->Global(), 0, NULL);
2018 CHECK_EQ(1, break_point_hit_count); 2001 CHECK_EQ(1, break_point_hit_count);
2019 2002
2020 v8::Debug::SetDebugEventListener(NULL); 2003 v8::Debug::SetDebugEventListener2(NULL);
2021 CheckDebuggerUnloaded(); 2004 CheckDebuggerUnloaded();
2022 } 2005 }
2023 2006
2024 2007
2025 // Test when several scripts has the same script data 2008 // Test when several scripts has the same script data
2026 TEST(ScriptBreakPointMultiple) { 2009 TEST(ScriptBreakPointMultiple) {
2027 break_point_hit_count = 0; 2010 break_point_hit_count = 0;
2028 DebugLocalContext env; 2011 DebugLocalContext env;
2029 v8::HandleScope scope(env->GetIsolate()); 2012 v8::HandleScope scope(env->GetIsolate());
2030 env.ExposeDebug(); 2013 env.ExposeDebug();
2031 2014
2032 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 2015 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
2033 v8::Undefined());
2034 2016
2035 v8::Local<v8::Function> f; 2017 v8::Local<v8::Function> f;
2036 v8::Local<v8::String> script_f = v8::String::New( 2018 v8::Local<v8::String> script_f = v8::String::New(
2037 "function f() {\n" 2019 "function f() {\n"
2038 " a = 0; // line 1\n" 2020 " a = 0; // line 1\n"
2039 "}"); 2021 "}");
2040 2022
2041 v8::Local<v8::Function> g; 2023 v8::Local<v8::Function> g;
2042 v8::Local<v8::String> script_g = v8::String::New( 2024 v8::Local<v8::String> script_g = v8::String::New(
2043 "function g() {\n" 2025 "function g() {\n"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2076 // Set script break point with the scripts loaded. 2058 // Set script break point with the scripts loaded.
2077 sbp = SetScriptBreakPointByNameFromJS("test", 1, 0); 2059 sbp = SetScriptBreakPointByNameFromJS("test", 1, 0);
2078 2060
2079 // Call f and g and check that the script break point is active. 2061 // Call f and g and check that the script break point is active.
2080 break_point_hit_count = 0; 2062 break_point_hit_count = 0;
2081 f->Call(env->Global(), 0, NULL); 2063 f->Call(env->Global(), 0, NULL);
2082 CHECK_EQ(1, break_point_hit_count); 2064 CHECK_EQ(1, break_point_hit_count);
2083 g->Call(env->Global(), 0, NULL); 2065 g->Call(env->Global(), 0, NULL);
2084 CHECK_EQ(2, break_point_hit_count); 2066 CHECK_EQ(2, break_point_hit_count);
2085 2067
2086 v8::Debug::SetDebugEventListener(NULL); 2068 v8::Debug::SetDebugEventListener2(NULL);
2087 CheckDebuggerUnloaded(); 2069 CheckDebuggerUnloaded();
2088 } 2070 }
2089 2071
2090 2072
2091 // Test the script origin which has both name and line offset. 2073 // Test the script origin which has both name and line offset.
2092 TEST(ScriptBreakPointLineOffset) { 2074 TEST(ScriptBreakPointLineOffset) {
2093 break_point_hit_count = 0; 2075 break_point_hit_count = 0;
2094 DebugLocalContext env; 2076 DebugLocalContext env;
2095 v8::HandleScope scope(env->GetIsolate()); 2077 v8::HandleScope scope(env->GetIsolate());
2096 env.ExposeDebug(); 2078 env.ExposeDebug();
2097 2079
2098 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 2080 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
2099 v8::Undefined());
2100 2081
2101 v8::Local<v8::Function> f; 2082 v8::Local<v8::Function> f;
2102 v8::Local<v8::String> script = v8::String::New( 2083 v8::Local<v8::String> script = v8::String::New(
2103 "function f() {\n" 2084 "function f() {\n"
2104 " a = 0; // line 8 as this script has line offset 7\n" 2085 " a = 0; // line 8 as this script has line offset 7\n"
2105 " b = 0; // line 9 as this script has line offset 7\n" 2086 " b = 0; // line 9 as this script has line offset 7\n"
2106 "}"); 2087 "}");
2107 2088
2108 // Create script origin both name and line offset. 2089 // Create script origin both name and line offset.
2109 v8::ScriptOrigin origin(v8::String::New("test.html"), 2090 v8::ScriptOrigin origin(v8::String::New("test.html"),
(...skipping 22 matching lines...) Expand all
2132 CHECK_EQ(0, break_point_hit_count); 2113 CHECK_EQ(0, break_point_hit_count);
2133 2114
2134 // Set a script break point with the script loaded. 2115 // Set a script break point with the script loaded.
2135 sbp1 = SetScriptBreakPointByNameFromJS("test.html", 9, 0); 2116 sbp1 = SetScriptBreakPointByNameFromJS("test.html", 9, 0);
2136 2117
2137 // Call f and check that the script break point is active. 2118 // Call f and check that the script break point is active.
2138 break_point_hit_count = 0; 2119 break_point_hit_count = 0;
2139 f->Call(env->Global(), 0, NULL); 2120 f->Call(env->Global(), 0, NULL);
2140 CHECK_EQ(1, break_point_hit_count); 2121 CHECK_EQ(1, break_point_hit_count);
2141 2122
2142 v8::Debug::SetDebugEventListener(NULL); 2123 v8::Debug::SetDebugEventListener2(NULL);
2143 CheckDebuggerUnloaded(); 2124 CheckDebuggerUnloaded();
2144 } 2125 }
2145 2126
2146 2127
2147 // Test script break points set on lines. 2128 // Test script break points set on lines.
2148 TEST(ScriptBreakPointLine) { 2129 TEST(ScriptBreakPointLine) {
2149 DebugLocalContext env; 2130 DebugLocalContext env;
2150 v8::HandleScope scope(env->GetIsolate()); 2131 v8::HandleScope scope(env->GetIsolate());
2151 env.ExposeDebug(); 2132 env.ExposeDebug();
2152 2133
2153 // Create a function for checking the function when hitting a break point. 2134 // Create a function for checking the function when hitting a break point.
2154 frame_function_name = CompileFunction(&env, 2135 frame_function_name = CompileFunction(&env,
2155 frame_function_name_source, 2136 frame_function_name_source,
2156 "frame_function_name"); 2137 "frame_function_name");
2157 2138
2158 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 2139 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
2159 v8::Undefined());
2160 2140
2161 v8::Local<v8::Function> f; 2141 v8::Local<v8::Function> f;
2162 v8::Local<v8::Function> g; 2142 v8::Local<v8::Function> g;
2163 v8::Local<v8::String> script = v8::String::New( 2143 v8::Local<v8::String> script = v8::String::New(
2164 "a = 0 // line 0\n" 2144 "a = 0 // line 0\n"
2165 "function f() {\n" 2145 "function f() {\n"
2166 " a = 1; // line 2\n" 2146 " a = 1; // line 2\n"
2167 "}\n" 2147 "}\n"
2168 " a = 2; // line 4\n" 2148 " a = 2; // line 4\n"
2169 " /* xx */ function g() { // line 5\n" 2149 " /* xx */ function g() { // line 5\n"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2238 2218
2239 // Clear the last break points, and reload the script which should not hit any 2219 // Clear the last break points, and reload the script which should not hit any
2240 // break points. 2220 // break points.
2241 ClearBreakPointFromJS(sbp1); 2221 ClearBreakPointFromJS(sbp1);
2242 ClearBreakPointFromJS(sbp5); 2222 ClearBreakPointFromJS(sbp5);
2243 ClearBreakPointFromJS(sbp6); 2223 ClearBreakPointFromJS(sbp6);
2244 break_point_hit_count = 0; 2224 break_point_hit_count = 0;
2245 v8::Script::Compile(script, &origin)->Run(); 2225 v8::Script::Compile(script, &origin)->Run();
2246 CHECK_EQ(0, break_point_hit_count); 2226 CHECK_EQ(0, break_point_hit_count);
2247 2227
2248 v8::Debug::SetDebugEventListener(NULL); 2228 v8::Debug::SetDebugEventListener2(NULL);
2249 CheckDebuggerUnloaded(); 2229 CheckDebuggerUnloaded();
2250 } 2230 }
2251 2231
2252 2232
2253 // Test top level script break points set on lines. 2233 // Test top level script break points set on lines.
2254 TEST(ScriptBreakPointLineTopLevel) { 2234 TEST(ScriptBreakPointLineTopLevel) {
2255 DebugLocalContext env; 2235 DebugLocalContext env;
2256 v8::HandleScope scope(env->GetIsolate()); 2236 v8::HandleScope scope(env->GetIsolate());
2257 env.ExposeDebug(); 2237 env.ExposeDebug();
2258 2238
2259 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 2239 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
2260 v8::Undefined());
2261 2240
2262 v8::Local<v8::String> script = v8::String::New( 2241 v8::Local<v8::String> script = v8::String::New(
2263 "function f() {\n" 2242 "function f() {\n"
2264 " a = 1; // line 1\n" 2243 " a = 1; // line 1\n"
2265 "}\n" 2244 "}\n"
2266 "a = 2; // line 3\n"); 2245 "a = 2; // line 3\n");
2267 v8::Local<v8::Function> f; 2246 v8::Local<v8::Function> f;
2268 { 2247 {
2269 v8::HandleScope scope(env->GetIsolate()); 2248 v8::HandleScope scope(env->GetIsolate());
2270 v8::Script::Compile(script, v8::String::New("test.html"))->Run(); 2249 v8::Script::Compile(script, v8::String::New("test.html"))->Run();
(...skipping 12 matching lines...) Expand all
2283 // Recompile and run script and check that break point was hit. 2262 // Recompile and run script and check that break point was hit.
2284 break_point_hit_count = 0; 2263 break_point_hit_count = 0;
2285 v8::Script::Compile(script, v8::String::New("test.html"))->Run(); 2264 v8::Script::Compile(script, v8::String::New("test.html"))->Run();
2286 CHECK_EQ(1, break_point_hit_count); 2265 CHECK_EQ(1, break_point_hit_count);
2287 2266
2288 // Call f and check that there are still no break points. 2267 // Call f and check that there are still no break points.
2289 break_point_hit_count = 0; 2268 break_point_hit_count = 0;
2290 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 2269 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
2291 CHECK_EQ(0, break_point_hit_count); 2270 CHECK_EQ(0, break_point_hit_count);
2292 2271
2293 v8::Debug::SetDebugEventListener(NULL); 2272 v8::Debug::SetDebugEventListener2(NULL);
2294 CheckDebuggerUnloaded(); 2273 CheckDebuggerUnloaded();
2295 } 2274 }
2296 2275
2297 2276
2298 // Test that it is possible to add and remove break points in a top level 2277 // Test that it is possible to add and remove break points in a top level
2299 // function which has no references but has not been collected yet. 2278 // function which has no references but has not been collected yet.
2300 TEST(ScriptBreakPointTopLevelCrash) { 2279 TEST(ScriptBreakPointTopLevelCrash) {
2301 DebugLocalContext env; 2280 DebugLocalContext env;
2302 v8::HandleScope scope(env->GetIsolate()); 2281 v8::HandleScope scope(env->GetIsolate());
2303 env.ExposeDebug(); 2282 env.ExposeDebug();
2304 2283
2305 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 2284 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
2306 v8::Undefined());
2307 2285
2308 v8::Local<v8::String> script_source = v8::String::New( 2286 v8::Local<v8::String> script_source = v8::String::New(
2309 "function f() {\n" 2287 "function f() {\n"
2310 " return 0;\n" 2288 " return 0;\n"
2311 "}\n" 2289 "}\n"
2312 "f()"); 2290 "f()");
2313 2291
2314 int sbp1 = SetScriptBreakPointByNameFromJS("test.html", 3, -1); 2292 int sbp1 = SetScriptBreakPointByNameFromJS("test.html", 3, -1);
2315 { 2293 {
2316 v8::HandleScope scope(env->GetIsolate()); 2294 v8::HandleScope scope(env->GetIsolate());
2317 break_point_hit_count = 0; 2295 break_point_hit_count = 0;
2318 v8::Script::Compile(script_source, v8::String::New("test.html"))->Run(); 2296 v8::Script::Compile(script_source, v8::String::New("test.html"))->Run();
2319 CHECK_EQ(1, break_point_hit_count); 2297 CHECK_EQ(1, break_point_hit_count);
2320 } 2298 }
2321 2299
2322 int sbp2 = SetScriptBreakPointByNameFromJS("test.html", 3, -1); 2300 int sbp2 = SetScriptBreakPointByNameFromJS("test.html", 3, -1);
2323 ClearBreakPointFromJS(sbp1); 2301 ClearBreakPointFromJS(sbp1);
2324 ClearBreakPointFromJS(sbp2); 2302 ClearBreakPointFromJS(sbp2);
2325 2303
2326 v8::Debug::SetDebugEventListener(NULL); 2304 v8::Debug::SetDebugEventListener2(NULL);
2327 CheckDebuggerUnloaded(); 2305 CheckDebuggerUnloaded();
2328 } 2306 }
2329 2307
2330 2308
2331 // Test that it is possible to remove the last break point for a function 2309 // Test that it is possible to remove the last break point for a function
2332 // inside the break handling of that break point. 2310 // inside the break handling of that break point.
2333 TEST(RemoveBreakPointInBreak) { 2311 TEST(RemoveBreakPointInBreak) {
2334 DebugLocalContext env; 2312 DebugLocalContext env;
2335 v8::HandleScope scope(env->GetIsolate()); 2313 v8::HandleScope scope(env->GetIsolate());
2336 2314
2337 v8::Local<v8::Function> foo = 2315 v8::Local<v8::Function> foo =
2338 CompileFunction(&env, "function foo(){a=1;}", "foo"); 2316 CompileFunction(&env, "function foo(){a=1;}", "foo");
2339 debug_event_remove_break_point = SetBreakPoint(foo, 0); 2317 debug_event_remove_break_point = SetBreakPoint(foo, 0);
2340 2318
2341 // Register the debug event listener pasing the function 2319 // Register the debug event listener pasing the function
2342 v8::Debug::SetDebugEventListener(DebugEventRemoveBreakPoint, foo); 2320 v8::Debug::SetDebugEventListener2(DebugEventRemoveBreakPoint, foo);
2343 2321
2344 break_point_hit_count = 0; 2322 break_point_hit_count = 0;
2345 foo->Call(env->Global(), 0, NULL); 2323 foo->Call(env->Global(), 0, NULL);
2346 CHECK_EQ(1, break_point_hit_count); 2324 CHECK_EQ(1, break_point_hit_count);
2347 2325
2348 break_point_hit_count = 0; 2326 break_point_hit_count = 0;
2349 foo->Call(env->Global(), 0, NULL); 2327 foo->Call(env->Global(), 0, NULL);
2350 CHECK_EQ(0, break_point_hit_count); 2328 CHECK_EQ(0, break_point_hit_count);
2351 2329
2352 v8::Debug::SetDebugEventListener(NULL); 2330 v8::Debug::SetDebugEventListener2(NULL);
2353 CheckDebuggerUnloaded(); 2331 CheckDebuggerUnloaded();
2354 } 2332 }
2355 2333
2356 2334
2357 // Test that the debugger statement causes a break. 2335 // Test that the debugger statement causes a break.
2358 TEST(DebuggerStatement) { 2336 TEST(DebuggerStatement) {
2359 break_point_hit_count = 0; 2337 break_point_hit_count = 0;
2360 DebugLocalContext env; 2338 DebugLocalContext env;
2361 v8::HandleScope scope(env->GetIsolate()); 2339 v8::HandleScope scope(env->GetIsolate());
2362 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 2340 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
2363 v8::Undefined());
2364 v8::Script::Compile(v8::String::New("function bar(){debugger}"))->Run(); 2341 v8::Script::Compile(v8::String::New("function bar(){debugger}"))->Run();
2365 v8::Script::Compile(v8::String::New( 2342 v8::Script::Compile(v8::String::New(
2366 "function foo(){debugger;debugger;}"))->Run(); 2343 "function foo(){debugger;debugger;}"))->Run();
2367 v8::Local<v8::Function> foo = 2344 v8::Local<v8::Function> foo =
2368 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 2345 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
2369 v8::Local<v8::Function> bar = 2346 v8::Local<v8::Function> bar =
2370 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("bar"))); 2347 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("bar")));
2371 2348
2372 // Run function with debugger statement 2349 // Run function with debugger statement
2373 bar->Call(env->Global(), 0, NULL); 2350 bar->Call(env->Global(), 0, NULL);
2374 CHECK_EQ(1, break_point_hit_count); 2351 CHECK_EQ(1, break_point_hit_count);
2375 2352
2376 // Run function with two debugger statement 2353 // Run function with two debugger statement
2377 foo->Call(env->Global(), 0, NULL); 2354 foo->Call(env->Global(), 0, NULL);
2378 CHECK_EQ(3, break_point_hit_count); 2355 CHECK_EQ(3, break_point_hit_count);
2379 2356
2380 v8::Debug::SetDebugEventListener(NULL); 2357 v8::Debug::SetDebugEventListener2(NULL);
2381 CheckDebuggerUnloaded(); 2358 CheckDebuggerUnloaded();
2382 } 2359 }
2383 2360
2384 2361
2385 // Test setting a breakpoint on the debugger statement. 2362 // Test setting a breakpoint on the debugger statement.
2386 TEST(DebuggerStatementBreakpoint) { 2363 TEST(DebuggerStatementBreakpoint) {
2387 break_point_hit_count = 0; 2364 break_point_hit_count = 0;
2388 DebugLocalContext env; 2365 DebugLocalContext env;
2389 v8::HandleScope scope(env->GetIsolate()); 2366 v8::HandleScope scope(env->GetIsolate());
2390 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 2367 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
2391 v8::Undefined());
2392 v8::Script::Compile(v8::String::New("function foo(){debugger;}"))->Run(); 2368 v8::Script::Compile(v8::String::New("function foo(){debugger;}"))->Run();
2393 v8::Local<v8::Function> foo = 2369 v8::Local<v8::Function> foo =
2394 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 2370 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
2395 2371
2396 // The debugger statement triggers breakpint hit 2372 // The debugger statement triggers breakpint hit
2397 foo->Call(env->Global(), 0, NULL); 2373 foo->Call(env->Global(), 0, NULL);
2398 CHECK_EQ(1, break_point_hit_count); 2374 CHECK_EQ(1, break_point_hit_count);
2399 2375
2400 int bp = SetBreakPoint(foo, 0); 2376 int bp = SetBreakPoint(foo, 0);
2401 2377
2402 // Set breakpoint does not duplicate hits 2378 // Set breakpoint does not duplicate hits
2403 foo->Call(env->Global(), 0, NULL); 2379 foo->Call(env->Global(), 0, NULL);
2404 CHECK_EQ(2, break_point_hit_count); 2380 CHECK_EQ(2, break_point_hit_count);
2405 2381
2406 ClearBreakPoint(bp); 2382 ClearBreakPoint(bp);
2407 v8::Debug::SetDebugEventListener(NULL); 2383 v8::Debug::SetDebugEventListener2(NULL);
2408 CheckDebuggerUnloaded(); 2384 CheckDebuggerUnloaded();
2409 } 2385 }
2410 2386
2411 2387
2412 // Test that the evaluation of expressions when a break point is hit generates 2388 // Test that the evaluation of expressions when a break point is hit generates
2413 // the correct results. 2389 // the correct results.
2414 TEST(DebugEvaluate) { 2390 TEST(DebugEvaluate) {
2415 DebugLocalContext env; 2391 DebugLocalContext env;
2416 v8::HandleScope scope(env->GetIsolate()); 2392 v8::HandleScope scope(env->GetIsolate());
2417 env.ExposeDebug(); 2393 env.ExposeDebug();
2418 2394
2419 // Create a function for checking the evaluation when hitting a break point. 2395 // Create a function for checking the evaluation when hitting a break point.
2420 evaluate_check_function = CompileFunction(&env, 2396 evaluate_check_function = CompileFunction(&env,
2421 evaluate_check_source, 2397 evaluate_check_source,
2422 "evaluate_check"); 2398 "evaluate_check");
2423 // Register the debug event listener 2399 // Register the debug event listener
2424 v8::Debug::SetDebugEventListener(DebugEventEvaluate); 2400 v8::Debug::SetDebugEventListener2(DebugEventEvaluate);
2425 2401
2426 // Different expected vaules of x and a when in a break point (u = undefined, 2402 // Different expected vaules of x and a when in a break point (u = undefined,
2427 // d = Hello, world!). 2403 // d = Hello, world!).
2428 struct EvaluateCheck checks_uu[] = { 2404 struct EvaluateCheck checks_uu[] = {
2429 {"x", v8::Undefined()}, 2405 {"x", v8::Undefined()},
2430 {"a", v8::Undefined()}, 2406 {"a", v8::Undefined()},
2431 {NULL, v8::Handle<v8::Value>()} 2407 {NULL, v8::Handle<v8::Value>()}
2432 }; 2408 };
2433 struct EvaluateCheck checks_hu[] = { 2409 struct EvaluateCheck checks_hu[] = {
2434 {"x", v8::String::New("Hello, world!")}, 2410 {"x", v8::String::New("Hello, world!")},
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
2514 2490
2515 // Call bar setting breakpoint after a=x in barbar and parameter 2491 // Call bar setting breakpoint after a=x in barbar and parameter
2516 // "Hello, world!". 2492 // "Hello, world!".
2517 checks = checks_hh; 2493 checks = checks_hh;
2518 v8::Handle<v8::Value> argv_bar_3[2] = { 2494 v8::Handle<v8::Value> argv_bar_3[2] = {
2519 v8::String::New("Hello, world!"), 2495 v8::String::New("Hello, world!"),
2520 v8::Number::New(barbar_break_position + 1) 2496 v8::Number::New(barbar_break_position + 1)
2521 }; 2497 };
2522 bar->Call(env->Global(), 2, argv_bar_3); 2498 bar->Call(env->Global(), 2, argv_bar_3);
2523 2499
2524 v8::Debug::SetDebugEventListener(NULL); 2500 v8::Debug::SetDebugEventListener2(NULL);
2525 CheckDebuggerUnloaded(); 2501 CheckDebuggerUnloaded();
2526 } 2502 }
2527 2503
2528 2504
2529 int debugEventCount = 0; 2505 int debugEventCount = 0;
2530 static void CheckDebugEvent(const v8::Debug::EventDetails& eventDetails) { 2506 static void CheckDebugEvent(const v8::Debug::EventDetails& eventDetails) {
2531 if (eventDetails.GetEvent() == v8::Break) ++debugEventCount; 2507 if (eventDetails.GetEvent() == v8::Break) ++debugEventCount;
2532 } 2508 }
2533 2509
2534 2510
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
2695 return &results[counter % kArraySize]; 2671 return &results[counter % kArraySize];
2696 } 2672 }
2697 void next() { 2673 void next() {
2698 counter++; 2674 counter++;
2699 } 2675 }
2700 }; 2676 };
2701 2677
2702 DebugProcessDebugMessagesData process_debug_messages_data; 2678 DebugProcessDebugMessagesData process_debug_messages_data;
2703 2679
2704 static void DebugProcessDebugMessagesHandler( 2680 static void DebugProcessDebugMessagesHandler(
2705 const uint16_t* message, 2681 const v8::Debug::Message& message) {
2706 int length, 2682 v8::Handle<v8::String> json = message.GetJSON();
2707 v8::Debug::ClientData* client_data) { 2683 v8::String::AsciiValue ascii(json);
2708
2709 const int kBufferSize = 100000;
2710 char print_buffer[kBufferSize];
2711 Utf16ToAscii(message, length, print_buffer, kBufferSize);
2712
2713 EvaluateResult* array_item = process_debug_messages_data.current(); 2684 EvaluateResult* array_item = process_debug_messages_data.current();
2714 2685
2715 bool res = GetEvaluateStringResult(print_buffer, 2686 bool res = GetEvaluateStringResult(*ascii,
2716 array_item->buffer, 2687 array_item->buffer,
2717 EvaluateResult::kBufferSize); 2688 EvaluateResult::kBufferSize);
2718 if (res) { 2689 if (res) {
2719 process_debug_messages_data.next(); 2690 process_debug_messages_data.next();
2720 } 2691 }
2721 } 2692 }
2722 2693
2723 2694
2724 // Test that the evaluation of expressions works even from ProcessDebugMessages 2695 // Test that the evaluation of expressions works even from ProcessDebugMessages
2725 // i.e. with empty stack. 2696 // i.e. with empty stack.
2726 TEST(DebugEvaluateWithoutStack) { 2697 TEST(DebugEvaluateWithoutStack) {
2727 v8::Debug::SetMessageHandler(DebugProcessDebugMessagesHandler); 2698 v8::Debug::SetMessageHandler2(DebugProcessDebugMessagesHandler);
2728 2699
2729 DebugLocalContext env; 2700 DebugLocalContext env;
2730 v8::HandleScope scope(env->GetIsolate()); 2701 v8::HandleScope scope(env->GetIsolate());
2731 2702
2732 const char* source = 2703 const char* source =
2733 "var v1 = 'Pinguin';\n function getAnimal() { return 'Capy' + 'bara'; }"; 2704 "var v1 = 'Pinguin';\n function getAnimal() { return 'Capy' + 'bara'; }";
2734 2705
2735 v8::Script::Compile(v8::String::New(source))->Run(); 2706 v8::Script::Compile(v8::String::New(source))->Run();
2736 2707
2737 v8::Debug::ProcessDebugMessages(); 2708 v8::Debug::ProcessDebugMessages();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2771 2742
2772 v8::Debug::ProcessDebugMessages(); 2743 v8::Debug::ProcessDebugMessages();
2773 2744
2774 CHECK_EQ(3, process_debug_messages_data.counter); 2745 CHECK_EQ(3, process_debug_messages_data.counter);
2775 2746
2776 CHECK_EQ(strcmp("Pinguin", process_debug_messages_data.results[0].buffer), 0); 2747 CHECK_EQ(strcmp("Pinguin", process_debug_messages_data.results[0].buffer), 0);
2777 CHECK_EQ(strcmp("Capybara", process_debug_messages_data.results[1].buffer), 2748 CHECK_EQ(strcmp("Capybara", process_debug_messages_data.results[1].buffer),
2778 0); 2749 0);
2779 CHECK_EQ(strcmp("805", process_debug_messages_data.results[2].buffer), 0); 2750 CHECK_EQ(strcmp("805", process_debug_messages_data.results[2].buffer), 0);
2780 2751
2781 v8::Debug::SetMessageHandler(NULL); 2752 v8::Debug::SetMessageHandler2(NULL);
2782 v8::Debug::SetDebugEventListener(NULL); 2753 v8::Debug::SetDebugEventListener2(NULL);
2783 CheckDebuggerUnloaded(); 2754 CheckDebuggerUnloaded();
2784 } 2755 }
2785 2756
2786 2757
2787 // Simple test of the stepping mechanism using only store ICs. 2758 // Simple test of the stepping mechanism using only store ICs.
2788 TEST(DebugStepLinear) { 2759 TEST(DebugStepLinear) {
2789 DebugLocalContext env; 2760 DebugLocalContext env;
2790 v8::HandleScope scope(env->GetIsolate()); 2761 v8::HandleScope scope(env->GetIsolate());
2791 2762
2792 // Create a function for testing stepping. 2763 // Create a function for testing stepping.
2793 v8::Local<v8::Function> foo = CompileFunction(&env, 2764 v8::Local<v8::Function> foo = CompileFunction(&env,
2794 "function foo(){a=1;b=1;c=1;}", 2765 "function foo(){a=1;b=1;c=1;}",
2795 "foo"); 2766 "foo");
2796 2767
2797 // Run foo to allow it to get optimized. 2768 // Run foo to allow it to get optimized.
2798 CompileRun("a=0; b=0; c=0; foo();"); 2769 CompileRun("a=0; b=0; c=0; foo();");
2799 2770
2800 SetBreakPoint(foo, 3); 2771 SetBreakPoint(foo, 3);
2801 2772
2802 // Register a debug event listener which steps and counts. 2773 // Register a debug event listener which steps and counts.
2803 v8::Debug::SetDebugEventListener(DebugEventStep); 2774 v8::Debug::SetDebugEventListener2(DebugEventStep);
2804 2775
2805 step_action = StepIn; 2776 step_action = StepIn;
2806 break_point_hit_count = 0; 2777 break_point_hit_count = 0;
2807 foo->Call(env->Global(), 0, NULL); 2778 foo->Call(env->Global(), 0, NULL);
2808 2779
2809 // With stepping all break locations are hit. 2780 // With stepping all break locations are hit.
2810 CHECK_EQ(4, break_point_hit_count); 2781 CHECK_EQ(4, break_point_hit_count);
2811 2782
2812 v8::Debug::SetDebugEventListener(NULL); 2783 v8::Debug::SetDebugEventListener2(NULL);
2813 CheckDebuggerUnloaded(); 2784 CheckDebuggerUnloaded();
2814 2785
2815 // Register a debug event listener which just counts. 2786 // Register a debug event listener which just counts.
2816 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); 2787 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
2817 2788
2818 SetBreakPoint(foo, 3); 2789 SetBreakPoint(foo, 3);
2819 break_point_hit_count = 0; 2790 break_point_hit_count = 0;
2820 foo->Call(env->Global(), 0, NULL); 2791 foo->Call(env->Global(), 0, NULL);
2821 2792
2822 // Without stepping only active break points are hit. 2793 // Without stepping only active break points are hit.
2823 CHECK_EQ(1, break_point_hit_count); 2794 CHECK_EQ(1, break_point_hit_count);
2824 2795
2825 v8::Debug::SetDebugEventListener(NULL); 2796 v8::Debug::SetDebugEventListener2(NULL);
2826 CheckDebuggerUnloaded(); 2797 CheckDebuggerUnloaded();
2827 } 2798 }
2828 2799
2829 2800
2830 // Test of the stepping mechanism for keyed load in a loop. 2801 // Test of the stepping mechanism for keyed load in a loop.
2831 TEST(DebugStepKeyedLoadLoop) { 2802 TEST(DebugStepKeyedLoadLoop) {
2832 DebugLocalContext env; 2803 DebugLocalContext env;
2833 v8::HandleScope scope(env->GetIsolate()); 2804 v8::HandleScope scope(env->GetIsolate());
2834 2805
2835 // Register a debug event listener which steps and counts. 2806 // Register a debug event listener which steps and counts.
2836 v8::Debug::SetDebugEventListener(DebugEventStep); 2807 v8::Debug::SetDebugEventListener2(DebugEventStep);
2837 2808
2838 // Create a function for testing stepping of keyed load. The statement 'y=1' 2809 // Create a function for testing stepping of keyed load. The statement 'y=1'
2839 // is there to have more than one breakable statement in the loop, TODO(315). 2810 // is there to have more than one breakable statement in the loop, TODO(315).
2840 v8::Local<v8::Function> foo = CompileFunction( 2811 v8::Local<v8::Function> foo = CompileFunction(
2841 &env, 2812 &env,
2842 "function foo(a) {\n" 2813 "function foo(a) {\n"
2843 " var x;\n" 2814 " var x;\n"
2844 " var len = a.length;\n" 2815 " var len = a.length;\n"
2845 " for (var i = 0; i < len; i++) {\n" 2816 " for (var i = 0; i < len; i++) {\n"
2846 " y = 1;\n" 2817 " y = 1;\n"
(...skipping 16 matching lines...) Expand all
2863 2834
2864 // Set up break point and step through the function. 2835 // Set up break point and step through the function.
2865 SetBreakPoint(foo, 3); 2836 SetBreakPoint(foo, 3);
2866 step_action = StepNext; 2837 step_action = StepNext;
2867 break_point_hit_count = 0; 2838 break_point_hit_count = 0;
2868 foo->Call(env->Global(), kArgc, args); 2839 foo->Call(env->Global(), kArgc, args);
2869 2840
2870 // With stepping all break locations are hit. 2841 // With stepping all break locations are hit.
2871 CHECK_EQ(34, break_point_hit_count); 2842 CHECK_EQ(34, break_point_hit_count);
2872 2843
2873 v8::Debug::SetDebugEventListener(NULL); 2844 v8::Debug::SetDebugEventListener2(NULL);
2874 CheckDebuggerUnloaded(); 2845 CheckDebuggerUnloaded();
2875 } 2846 }
2876 2847
2877 2848
2878 // Test of the stepping mechanism for keyed store in a loop. 2849 // Test of the stepping mechanism for keyed store in a loop.
2879 TEST(DebugStepKeyedStoreLoop) { 2850 TEST(DebugStepKeyedStoreLoop) {
2880 DebugLocalContext env; 2851 DebugLocalContext env;
2881 v8::HandleScope scope(env->GetIsolate()); 2852 v8::HandleScope scope(env->GetIsolate());
2882 2853
2883 // Register a debug event listener which steps and counts. 2854 // Register a debug event listener which steps and counts.
2884 v8::Debug::SetDebugEventListener(DebugEventStep); 2855 v8::Debug::SetDebugEventListener2(DebugEventStep);
2885 2856
2886 // Create a function for testing stepping of keyed store. The statement 'y=1' 2857 // Create a function for testing stepping of keyed store. The statement 'y=1'
2887 // is there to have more than one breakable statement in the loop, TODO(315). 2858 // is there to have more than one breakable statement in the loop, TODO(315).
2888 v8::Local<v8::Function> foo = CompileFunction( 2859 v8::Local<v8::Function> foo = CompileFunction(
2889 &env, 2860 &env,
2890 "function foo(a) {\n" 2861 "function foo(a) {\n"
2891 " var len = a.length;\n" 2862 " var len = a.length;\n"
2892 " for (var i = 0; i < len; i++) {\n" 2863 " for (var i = 0; i < len; i++) {\n"
2893 " y = 1;\n" 2864 " y = 1;\n"
2894 " a[i] = 42;\n" 2865 " a[i] = 42;\n"
(...skipping 15 matching lines...) Expand all
2910 2881
2911 // Set up break point and step through the function. 2882 // Set up break point and step through the function.
2912 SetBreakPoint(foo, 3); 2883 SetBreakPoint(foo, 3);
2913 step_action = StepNext; 2884 step_action = StepNext;
2914 break_point_hit_count = 0; 2885 break_point_hit_count = 0;
2915 foo->Call(env->Global(), kArgc, args); 2886 foo->Call(env->Global(), kArgc, args);
2916 2887
2917 // With stepping all break locations are hit. 2888 // With stepping all break locations are hit.
2918 CHECK_EQ(33, break_point_hit_count); 2889 CHECK_EQ(33, break_point_hit_count);
2919 2890
2920 v8::Debug::SetDebugEventListener(NULL); 2891 v8::Debug::SetDebugEventListener2(NULL);
2921 CheckDebuggerUnloaded(); 2892 CheckDebuggerUnloaded();
2922 } 2893 }
2923 2894
2924 2895
2925 // Test of the stepping mechanism for named load in a loop. 2896 // Test of the stepping mechanism for named load in a loop.
2926 TEST(DebugStepNamedLoadLoop) { 2897 TEST(DebugStepNamedLoadLoop) {
2927 DebugLocalContext env; 2898 DebugLocalContext env;
2928 v8::HandleScope scope(env->GetIsolate()); 2899 v8::HandleScope scope(env->GetIsolate());
2929 2900
2930 // Register a debug event listener which steps and counts. 2901 // Register a debug event listener which steps and counts.
2931 v8::Debug::SetDebugEventListener(DebugEventStep); 2902 v8::Debug::SetDebugEventListener2(DebugEventStep);
2932 2903
2933 // Create a function for testing stepping of named load. 2904 // Create a function for testing stepping of named load.
2934 v8::Local<v8::Function> foo = CompileFunction( 2905 v8::Local<v8::Function> foo = CompileFunction(
2935 &env, 2906 &env,
2936 "function foo() {\n" 2907 "function foo() {\n"
2937 " var a = [];\n" 2908 " var a = [];\n"
2938 " var s = \"\";\n" 2909 " var s = \"\";\n"
2939 " for (var i = 0; i < 10; i++) {\n" 2910 " for (var i = 0; i < 10; i++) {\n"
2940 " var v = new V(i, i + 1);\n" 2911 " var v = new V(i, i + 1);\n"
2941 " v.y;\n" 2912 " v.y;\n"
(...skipping 12 matching lines...) Expand all
2954 2925
2955 // Set up break point and step through the function. 2926 // Set up break point and step through the function.
2956 SetBreakPoint(foo, 4); 2927 SetBreakPoint(foo, 4);
2957 step_action = StepNext; 2928 step_action = StepNext;
2958 break_point_hit_count = 0; 2929 break_point_hit_count = 0;
2959 foo->Call(env->Global(), 0, NULL); 2930 foo->Call(env->Global(), 0, NULL);
2960 2931
2961 // With stepping all break locations are hit. 2932 // With stepping all break locations are hit.
2962 CHECK_EQ(54, break_point_hit_count); 2933 CHECK_EQ(54, break_point_hit_count);
2963 2934
2964 v8::Debug::SetDebugEventListener(NULL); 2935 v8::Debug::SetDebugEventListener2(NULL);
2965 CheckDebuggerUnloaded(); 2936 CheckDebuggerUnloaded();
2966 } 2937 }
2967 2938
2968 2939
2969 static void DoDebugStepNamedStoreLoop(int expected) { 2940 static void DoDebugStepNamedStoreLoop(int expected) {
2970 DebugLocalContext env; 2941 DebugLocalContext env;
2971 v8::HandleScope scope(env->GetIsolate()); 2942 v8::HandleScope scope(env->GetIsolate());
2972 2943
2973 // Register a debug event listener which steps and counts. 2944 // Register a debug event listener which steps and counts.
2974 v8::Debug::SetDebugEventListener(DebugEventStep); 2945 v8::Debug::SetDebugEventListener2(DebugEventStep);
2975 2946
2976 // Create a function for testing stepping of named store. 2947 // Create a function for testing stepping of named store.
2977 v8::Local<v8::Function> foo = CompileFunction( 2948 v8::Local<v8::Function> foo = CompileFunction(
2978 &env, 2949 &env,
2979 "function foo() {\n" 2950 "function foo() {\n"
2980 " var a = {a:1};\n" 2951 " var a = {a:1};\n"
2981 " for (var i = 0; i < 10; i++) {\n" 2952 " for (var i = 0; i < 10; i++) {\n"
2982 " a.a = 2\n" 2953 " a.a = 2\n"
2983 " }\n" 2954 " }\n"
2984 "}\n", 2955 "}\n",
2985 "foo"); 2956 "foo");
2986 2957
2987 // Call function without any break points to ensure inlining is in place. 2958 // Call function without any break points to ensure inlining is in place.
2988 foo->Call(env->Global(), 0, NULL); 2959 foo->Call(env->Global(), 0, NULL);
2989 2960
2990 // Set up break point and step through the function. 2961 // Set up break point and step through the function.
2991 SetBreakPoint(foo, 3); 2962 SetBreakPoint(foo, 3);
2992 step_action = StepNext; 2963 step_action = StepNext;
2993 break_point_hit_count = 0; 2964 break_point_hit_count = 0;
2994 foo->Call(env->Global(), 0, NULL); 2965 foo->Call(env->Global(), 0, NULL);
2995 2966
2996 // With stepping all expected break locations are hit. 2967 // With stepping all expected break locations are hit.
2997 CHECK_EQ(expected, break_point_hit_count); 2968 CHECK_EQ(expected, break_point_hit_count);
2998 2969
2999 v8::Debug::SetDebugEventListener(NULL); 2970 v8::Debug::SetDebugEventListener2(NULL);
3000 CheckDebuggerUnloaded(); 2971 CheckDebuggerUnloaded();
3001 } 2972 }
3002 2973
3003 2974
3004 // Test of the stepping mechanism for named load in a loop. 2975 // Test of the stepping mechanism for named load in a loop.
3005 TEST(DebugStepNamedStoreLoop) { 2976 TEST(DebugStepNamedStoreLoop) {
3006 DoDebugStepNamedStoreLoop(23); 2977 DoDebugStepNamedStoreLoop(23);
3007 } 2978 }
3008 2979
3009 2980
3010 // Test the stepping mechanism with different ICs. 2981 // Test the stepping mechanism with different ICs.
3011 TEST(DebugStepLinearMixedICs) { 2982 TEST(DebugStepLinearMixedICs) {
3012 DebugLocalContext env; 2983 DebugLocalContext env;
3013 v8::HandleScope scope(env->GetIsolate()); 2984 v8::HandleScope scope(env->GetIsolate());
3014 2985
3015 // Register a debug event listener which steps and counts. 2986 // Register a debug event listener which steps and counts.
3016 v8::Debug::SetDebugEventListener(DebugEventStep); 2987 v8::Debug::SetDebugEventListener2(DebugEventStep);
3017 2988
3018 // Create a function for testing stepping. 2989 // Create a function for testing stepping.
3019 v8::Local<v8::Function> foo = CompileFunction(&env, 2990 v8::Local<v8::Function> foo = CompileFunction(&env,
3020 "function bar() {};" 2991 "function bar() {};"
3021 "function foo() {" 2992 "function foo() {"
3022 " var x;" 2993 " var x;"
3023 " var index='name';" 2994 " var index='name';"
3024 " var y = {};" 2995 " var y = {};"
3025 " a=1;b=2;x=a;y[index]=3;x=y[index];bar();}", "foo"); 2996 " a=1;b=2;x=a;y[index]=3;x=y[index];bar();}", "foo");
3026 2997
3027 // Run functions to allow them to get optimized. 2998 // Run functions to allow them to get optimized.
3028 CompileRun("a=0; b=0; bar(); foo();"); 2999 CompileRun("a=0; b=0; bar(); foo();");
3029 3000
3030 SetBreakPoint(foo, 0); 3001 SetBreakPoint(foo, 0);
3031 3002
3032 step_action = StepIn; 3003 step_action = StepIn;
3033 break_point_hit_count = 0; 3004 break_point_hit_count = 0;
3034 foo->Call(env->Global(), 0, NULL); 3005 foo->Call(env->Global(), 0, NULL);
3035 3006
3036 // With stepping all break locations are hit. 3007 // With stepping all break locations are hit.
3037 CHECK_EQ(11, break_point_hit_count); 3008 CHECK_EQ(11, break_point_hit_count);
3038 3009
3039 v8::Debug::SetDebugEventListener(NULL); 3010 v8::Debug::SetDebugEventListener2(NULL);
3040 CheckDebuggerUnloaded(); 3011 CheckDebuggerUnloaded();
3041 3012
3042 // Register a debug event listener which just counts. 3013 // Register a debug event listener which just counts.
3043 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); 3014 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
3044 3015
3045 SetBreakPoint(foo, 0); 3016 SetBreakPoint(foo, 0);
3046 break_point_hit_count = 0; 3017 break_point_hit_count = 0;
3047 foo->Call(env->Global(), 0, NULL); 3018 foo->Call(env->Global(), 0, NULL);
3048 3019
3049 // Without stepping only active break points are hit. 3020 // Without stepping only active break points are hit.
3050 CHECK_EQ(1, break_point_hit_count); 3021 CHECK_EQ(1, break_point_hit_count);
3051 3022
3052 v8::Debug::SetDebugEventListener(NULL); 3023 v8::Debug::SetDebugEventListener2(NULL);
3053 CheckDebuggerUnloaded(); 3024 CheckDebuggerUnloaded();
3054 } 3025 }
3055 3026
3056 3027
3057 TEST(DebugStepDeclarations) { 3028 TEST(DebugStepDeclarations) {
3058 DebugLocalContext env; 3029 DebugLocalContext env;
3059 v8::HandleScope scope(env->GetIsolate()); 3030 v8::HandleScope scope(env->GetIsolate());
3060 3031
3061 // Register a debug event listener which steps and counts. 3032 // Register a debug event listener which steps and counts.
3062 v8::Debug::SetDebugEventListener(DebugEventStep); 3033 v8::Debug::SetDebugEventListener2(DebugEventStep);
3063 3034
3064 // Create a function for testing stepping. Run it to allow it to get 3035 // Create a function for testing stepping. Run it to allow it to get
3065 // optimized. 3036 // optimized.
3066 const char* src = "function foo() { " 3037 const char* src = "function foo() { "
3067 " var a;" 3038 " var a;"
3068 " var b = 1;" 3039 " var b = 1;"
3069 " var c = foo;" 3040 " var c = foo;"
3070 " var d = Math.floor;" 3041 " var d = Math.floor;"
3071 " var e = b + d(1.2);" 3042 " var e = b + d(1.2);"
3072 "}" 3043 "}"
3073 "foo()"; 3044 "foo()";
3074 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 3045 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo");
3075 3046
3076 SetBreakPoint(foo, 0); 3047 SetBreakPoint(foo, 0);
3077 3048
3078 // Stepping through the declarations. 3049 // Stepping through the declarations.
3079 step_action = StepIn; 3050 step_action = StepIn;
3080 break_point_hit_count = 0; 3051 break_point_hit_count = 0;
3081 foo->Call(env->Global(), 0, NULL); 3052 foo->Call(env->Global(), 0, NULL);
3082 CHECK_EQ(6, break_point_hit_count); 3053 CHECK_EQ(6, break_point_hit_count);
3083 3054
3084 // Get rid of the debug event listener. 3055 // Get rid of the debug event listener.
3085 v8::Debug::SetDebugEventListener(NULL); 3056 v8::Debug::SetDebugEventListener2(NULL);
3086 CheckDebuggerUnloaded(); 3057 CheckDebuggerUnloaded();
3087 } 3058 }
3088 3059
3089 3060
3090 TEST(DebugStepLocals) { 3061 TEST(DebugStepLocals) {
3091 DebugLocalContext env; 3062 DebugLocalContext env;
3092 v8::HandleScope scope(env->GetIsolate()); 3063 v8::HandleScope scope(env->GetIsolate());
3093 3064
3094 // Register a debug event listener which steps and counts. 3065 // Register a debug event listener which steps and counts.
3095 v8::Debug::SetDebugEventListener(DebugEventStep); 3066 v8::Debug::SetDebugEventListener2(DebugEventStep);
3096 3067
3097 // Create a function for testing stepping. Run it to allow it to get 3068 // Create a function for testing stepping. Run it to allow it to get
3098 // optimized. 3069 // optimized.
3099 const char* src = "function foo() { " 3070 const char* src = "function foo() { "
3100 " var a,b;" 3071 " var a,b;"
3101 " a = 1;" 3072 " a = 1;"
3102 " b = a + 2;" 3073 " b = a + 2;"
3103 " b = 1 + 2 + 3;" 3074 " b = 1 + 2 + 3;"
3104 " a = Math.floor(b);" 3075 " a = Math.floor(b);"
3105 "}" 3076 "}"
3106 "foo()"; 3077 "foo()";
3107 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 3078 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo");
3108 3079
3109 SetBreakPoint(foo, 0); 3080 SetBreakPoint(foo, 0);
3110 3081
3111 // Stepping through the declarations. 3082 // Stepping through the declarations.
3112 step_action = StepIn; 3083 step_action = StepIn;
3113 break_point_hit_count = 0; 3084 break_point_hit_count = 0;
3114 foo->Call(env->Global(), 0, NULL); 3085 foo->Call(env->Global(), 0, NULL);
3115 CHECK_EQ(6, break_point_hit_count); 3086 CHECK_EQ(6, break_point_hit_count);
3116 3087
3117 // Get rid of the debug event listener. 3088 // Get rid of the debug event listener.
3118 v8::Debug::SetDebugEventListener(NULL); 3089 v8::Debug::SetDebugEventListener2(NULL);
3119 CheckDebuggerUnloaded(); 3090 CheckDebuggerUnloaded();
3120 } 3091 }
3121 3092
3122 3093
3123 TEST(DebugStepIf) { 3094 TEST(DebugStepIf) {
3124 DebugLocalContext env; 3095 DebugLocalContext env;
3125 v8::HandleScope scope(env->GetIsolate()); 3096 v8::HandleScope scope(env->GetIsolate());
3126 3097
3127 // Register a debug event listener which steps and counts. 3098 // Register a debug event listener which steps and counts.
3128 v8::Debug::SetDebugEventListener(DebugEventStep); 3099 v8::Debug::SetDebugEventListener2(DebugEventStep);
3129 3100
3130 // Create a function for testing stepping. Run it to allow it to get 3101 // Create a function for testing stepping. Run it to allow it to get
3131 // optimized. 3102 // optimized.
3132 const int argc = 1; 3103 const int argc = 1;
3133 const char* src = "function foo(x) { " 3104 const char* src = "function foo(x) { "
3134 " a = 1;" 3105 " a = 1;"
3135 " if (x) {" 3106 " if (x) {"
3136 " b = 1;" 3107 " b = 1;"
3137 " } else {" 3108 " } else {"
3138 " c = 1;" 3109 " c = 1;"
(...skipping 12 matching lines...) Expand all
3151 CHECK_EQ(4, break_point_hit_count); 3122 CHECK_EQ(4, break_point_hit_count);
3152 3123
3153 // Stepping through the false part. 3124 // Stepping through the false part.
3154 step_action = StepIn; 3125 step_action = StepIn;
3155 break_point_hit_count = 0; 3126 break_point_hit_count = 0;
3156 v8::Handle<v8::Value> argv_false[argc] = { v8::False() }; 3127 v8::Handle<v8::Value> argv_false[argc] = { v8::False() };
3157 foo->Call(env->Global(), argc, argv_false); 3128 foo->Call(env->Global(), argc, argv_false);
3158 CHECK_EQ(5, break_point_hit_count); 3129 CHECK_EQ(5, break_point_hit_count);
3159 3130
3160 // Get rid of the debug event listener. 3131 // Get rid of the debug event listener.
3161 v8::Debug::SetDebugEventListener(NULL); 3132 v8::Debug::SetDebugEventListener2(NULL);
3162 CheckDebuggerUnloaded(); 3133 CheckDebuggerUnloaded();
3163 } 3134 }
3164 3135
3165 3136
3166 TEST(DebugStepSwitch) { 3137 TEST(DebugStepSwitch) {
3167 DebugLocalContext env; 3138 DebugLocalContext env;
3168 v8::HandleScope scope(env->GetIsolate()); 3139 v8::HandleScope scope(env->GetIsolate());
3169 3140
3170 // Register a debug event listener which steps and counts. 3141 // Register a debug event listener which steps and counts.
3171 v8::Debug::SetDebugEventListener(DebugEventStep); 3142 v8::Debug::SetDebugEventListener2(DebugEventStep);
3172 3143
3173 // Create a function for testing stepping. Run it to allow it to get 3144 // Create a function for testing stepping. Run it to allow it to get
3174 // optimized. 3145 // optimized.
3175 const int argc = 1; 3146 const int argc = 1;
3176 const char* src = "function foo(x) { " 3147 const char* src = "function foo(x) { "
3177 " a = 1;" 3148 " a = 1;"
3178 " switch (x) {" 3149 " switch (x) {"
3179 " case 1:" 3150 " case 1:"
3180 " b = 1;" 3151 " b = 1;"
3181 " case 2:" 3152 " case 2:"
(...skipping 25 matching lines...) Expand all
3207 CHECK_EQ(5, break_point_hit_count); 3178 CHECK_EQ(5, break_point_hit_count);
3208 3179
3209 // Last case. 3180 // Last case.
3210 step_action = StepIn; 3181 step_action = StepIn;
3211 break_point_hit_count = 0; 3182 break_point_hit_count = 0;
3212 v8::Handle<v8::Value> argv_3[argc] = { v8::Number::New(3) }; 3183 v8::Handle<v8::Value> argv_3[argc] = { v8::Number::New(3) };
3213 foo->Call(env->Global(), argc, argv_3); 3184 foo->Call(env->Global(), argc, argv_3);
3214 CHECK_EQ(7, break_point_hit_count); 3185 CHECK_EQ(7, break_point_hit_count);
3215 3186
3216 // Get rid of the debug event listener. 3187 // Get rid of the debug event listener.
3217 v8::Debug::SetDebugEventListener(NULL); 3188 v8::Debug::SetDebugEventListener2(NULL);
3218 CheckDebuggerUnloaded(); 3189 CheckDebuggerUnloaded();
3219 } 3190 }
3220 3191
3221 3192
3222 TEST(DebugStepWhile) { 3193 TEST(DebugStepWhile) {
3223 DebugLocalContext env; 3194 DebugLocalContext env;
3224 v8::HandleScope scope(env->GetIsolate()); 3195 v8::HandleScope scope(env->GetIsolate());
3225 3196
3226 // Register a debug event listener which steps and counts. 3197 // Register a debug event listener which steps and counts.
3227 v8::Debug::SetDebugEventListener(DebugEventStep); 3198 v8::Debug::SetDebugEventListener2(DebugEventStep);
3228 3199
3229 // Create a function for testing stepping. Run it to allow it to get 3200 // Create a function for testing stepping. Run it to allow it to get
3230 // optimized. 3201 // optimized.
3231 const int argc = 1; 3202 const int argc = 1;
3232 const char* src = "function foo(x) { " 3203 const char* src = "function foo(x) { "
3233 " var a = 0;" 3204 " var a = 0;"
3234 " while (a < x) {" 3205 " while (a < x) {"
3235 " a++;" 3206 " a++;"
3236 " }" 3207 " }"
3237 "}" 3208 "}"
3238 "foo()"; 3209 "foo()";
3239 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 3210 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo");
3240 SetBreakPoint(foo, 8); // "var a = 0;" 3211 SetBreakPoint(foo, 8); // "var a = 0;"
3241 3212
3242 // Looping 10 times. 3213 // Looping 10 times.
3243 step_action = StepIn; 3214 step_action = StepIn;
3244 break_point_hit_count = 0; 3215 break_point_hit_count = 0;
3245 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; 3216 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) };
3246 foo->Call(env->Global(), argc, argv_10); 3217 foo->Call(env->Global(), argc, argv_10);
3247 CHECK_EQ(22, break_point_hit_count); 3218 CHECK_EQ(22, break_point_hit_count);
3248 3219
3249 // Looping 100 times. 3220 // Looping 100 times.
3250 step_action = StepIn; 3221 step_action = StepIn;
3251 break_point_hit_count = 0; 3222 break_point_hit_count = 0;
3252 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; 3223 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) };
3253 foo->Call(env->Global(), argc, argv_100); 3224 foo->Call(env->Global(), argc, argv_100);
3254 CHECK_EQ(202, break_point_hit_count); 3225 CHECK_EQ(202, break_point_hit_count);
3255 3226
3256 // Get rid of the debug event listener. 3227 // Get rid of the debug event listener.
3257 v8::Debug::SetDebugEventListener(NULL); 3228 v8::Debug::SetDebugEventListener2(NULL);
3258 CheckDebuggerUnloaded(); 3229 CheckDebuggerUnloaded();
3259 } 3230 }
3260 3231
3261 3232
3262 TEST(DebugStepDoWhile) { 3233 TEST(DebugStepDoWhile) {
3263 DebugLocalContext env; 3234 DebugLocalContext env;
3264 v8::HandleScope scope(env->GetIsolate()); 3235 v8::HandleScope scope(env->GetIsolate());
3265 3236
3266 // Register a debug event listener which steps and counts. 3237 // Register a debug event listener which steps and counts.
3267 v8::Debug::SetDebugEventListener(DebugEventStep); 3238 v8::Debug::SetDebugEventListener2(DebugEventStep);
3268 3239
3269 // Create a function for testing stepping. Run it to allow it to get 3240 // Create a function for testing stepping. Run it to allow it to get
3270 // optimized. 3241 // optimized.
3271 const int argc = 1; 3242 const int argc = 1;
3272 const char* src = "function foo(x) { " 3243 const char* src = "function foo(x) { "
3273 " var a = 0;" 3244 " var a = 0;"
3274 " do {" 3245 " do {"
3275 " a++;" 3246 " a++;"
3276 " } while (a < x)" 3247 " } while (a < x)"
3277 "}" 3248 "}"
3278 "foo()"; 3249 "foo()";
3279 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 3250 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo");
3280 SetBreakPoint(foo, 8); // "var a = 0;" 3251 SetBreakPoint(foo, 8); // "var a = 0;"
3281 3252
3282 // Looping 10 times. 3253 // Looping 10 times.
3283 step_action = StepIn; 3254 step_action = StepIn;
3284 break_point_hit_count = 0; 3255 break_point_hit_count = 0;
3285 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; 3256 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) };
3286 foo->Call(env->Global(), argc, argv_10); 3257 foo->Call(env->Global(), argc, argv_10);
3287 CHECK_EQ(22, break_point_hit_count); 3258 CHECK_EQ(22, break_point_hit_count);
3288 3259
3289 // Looping 100 times. 3260 // Looping 100 times.
3290 step_action = StepIn; 3261 step_action = StepIn;
3291 break_point_hit_count = 0; 3262 break_point_hit_count = 0;
3292 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; 3263 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) };
3293 foo->Call(env->Global(), argc, argv_100); 3264 foo->Call(env->Global(), argc, argv_100);
3294 CHECK_EQ(202, break_point_hit_count); 3265 CHECK_EQ(202, break_point_hit_count);
3295 3266
3296 // Get rid of the debug event listener. 3267 // Get rid of the debug event listener.
3297 v8::Debug::SetDebugEventListener(NULL); 3268 v8::Debug::SetDebugEventListener2(NULL);
3298 CheckDebuggerUnloaded(); 3269 CheckDebuggerUnloaded();
3299 } 3270 }
3300 3271
3301 3272
3302 TEST(DebugStepFor) { 3273 TEST(DebugStepFor) {
3303 DebugLocalContext env; 3274 DebugLocalContext env;
3304 v8::HandleScope scope(env->GetIsolate()); 3275 v8::HandleScope scope(env->GetIsolate());
3305 3276
3306 // Register a debug event listener which steps and counts. 3277 // Register a debug event listener which steps and counts.
3307 v8::Debug::SetDebugEventListener(DebugEventStep); 3278 v8::Debug::SetDebugEventListener2(DebugEventStep);
3308 3279
3309 // Create a function for testing stepping. Run it to allow it to get 3280 // Create a function for testing stepping. Run it to allow it to get
3310 // optimized. 3281 // optimized.
3311 const int argc = 1; 3282 const int argc = 1;
3312 const char* src = "function foo(x) { " 3283 const char* src = "function foo(x) { "
3313 " a = 1;" 3284 " a = 1;"
3314 " for (i = 0; i < x; i++) {" 3285 " for (i = 0; i < x; i++) {"
3315 " b = 1;" 3286 " b = 1;"
3316 " }" 3287 " }"
3317 "}" 3288 "}"
(...skipping 10 matching lines...) Expand all
3328 CHECK_EQ(23, break_point_hit_count); 3299 CHECK_EQ(23, break_point_hit_count);
3329 3300
3330 // Looping 100 times. 3301 // Looping 100 times.
3331 step_action = StepIn; 3302 step_action = StepIn;
3332 break_point_hit_count = 0; 3303 break_point_hit_count = 0;
3333 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; 3304 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) };
3334 foo->Call(env->Global(), argc, argv_100); 3305 foo->Call(env->Global(), argc, argv_100);
3335 CHECK_EQ(203, break_point_hit_count); 3306 CHECK_EQ(203, break_point_hit_count);
3336 3307
3337 // Get rid of the debug event listener. 3308 // Get rid of the debug event listener.
3338 v8::Debug::SetDebugEventListener(NULL); 3309 v8::Debug::SetDebugEventListener2(NULL);
3339 CheckDebuggerUnloaded(); 3310 CheckDebuggerUnloaded();
3340 } 3311 }
3341 3312
3342 3313
3343 TEST(DebugStepForContinue) { 3314 TEST(DebugStepForContinue) {
3344 DebugLocalContext env; 3315 DebugLocalContext env;
3345 v8::HandleScope scope(env->GetIsolate()); 3316 v8::HandleScope scope(env->GetIsolate());
3346 3317
3347 // Register a debug event listener which steps and counts. 3318 // Register a debug event listener which steps and counts.
3348 v8::Debug::SetDebugEventListener(DebugEventStep); 3319 v8::Debug::SetDebugEventListener2(DebugEventStep);
3349 3320
3350 // Create a function for testing stepping. Run it to allow it to get 3321 // Create a function for testing stepping. Run it to allow it to get
3351 // optimized. 3322 // optimized.
3352 const int argc = 1; 3323 const int argc = 1;
3353 const char* src = "function foo(x) { " 3324 const char* src = "function foo(x) { "
3354 " var a = 0;" 3325 " var a = 0;"
3355 " var b = 0;" 3326 " var b = 0;"
3356 " var c = 0;" 3327 " var c = 0;"
3357 " for (var i = 0; i < x; i++) {" 3328 " for (var i = 0; i < x; i++) {"
3358 " a++;" 3329 " a++;"
(...skipping 20 matching lines...) Expand all
3379 3350
3380 // Looping 100 times. 3351 // Looping 100 times.
3381 step_action = StepIn; 3352 step_action = StepIn;
3382 break_point_hit_count = 0; 3353 break_point_hit_count = 0;
3383 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; 3354 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) };
3384 result = foo->Call(env->Global(), argc, argv_100); 3355 result = foo->Call(env->Global(), argc, argv_100);
3385 CHECK_EQ(50, result->Int32Value()); 3356 CHECK_EQ(50, result->Int32Value());
3386 CHECK_EQ(456, break_point_hit_count); 3357 CHECK_EQ(456, break_point_hit_count);
3387 3358
3388 // Get rid of the debug event listener. 3359 // Get rid of the debug event listener.
3389 v8::Debug::SetDebugEventListener(NULL); 3360 v8::Debug::SetDebugEventListener2(NULL);
3390 CheckDebuggerUnloaded(); 3361 CheckDebuggerUnloaded();
3391 } 3362 }
3392 3363
3393 3364
3394 TEST(DebugStepForBreak) { 3365 TEST(DebugStepForBreak) {
3395 DebugLocalContext env; 3366 DebugLocalContext env;
3396 v8::HandleScope scope(env->GetIsolate()); 3367 v8::HandleScope scope(env->GetIsolate());
3397 3368
3398 // Register a debug event listener which steps and counts. 3369 // Register a debug event listener which steps and counts.
3399 v8::Debug::SetDebugEventListener(DebugEventStep); 3370 v8::Debug::SetDebugEventListener2(DebugEventStep);
3400 3371
3401 // Create a function for testing stepping. Run it to allow it to get 3372 // Create a function for testing stepping. Run it to allow it to get
3402 // optimized. 3373 // optimized.
3403 const int argc = 1; 3374 const int argc = 1;
3404 const char* src = "function foo(x) { " 3375 const char* src = "function foo(x) { "
3405 " var a = 0;" 3376 " var a = 0;"
3406 " var b = 0;" 3377 " var b = 0;"
3407 " var c = 0;" 3378 " var c = 0;"
3408 " for (var i = 0; i < 1000; i++) {" 3379 " for (var i = 0; i < 1000; i++) {"
3409 " a++;" 3380 " a++;"
(...skipping 21 matching lines...) Expand all
3431 3402
3432 // Looping 100 times. 3403 // Looping 100 times.
3433 step_action = StepIn; 3404 step_action = StepIn;
3434 break_point_hit_count = 0; 3405 break_point_hit_count = 0;
3435 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; 3406 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) };
3436 result = foo->Call(env->Global(), argc, argv_100); 3407 result = foo->Call(env->Global(), argc, argv_100);
3437 CHECK_EQ(99, result->Int32Value()); 3408 CHECK_EQ(99, result->Int32Value());
3438 CHECK_EQ(504, break_point_hit_count); 3409 CHECK_EQ(504, break_point_hit_count);
3439 3410
3440 // Get rid of the debug event listener. 3411 // Get rid of the debug event listener.
3441 v8::Debug::SetDebugEventListener(NULL); 3412 v8::Debug::SetDebugEventListener2(NULL);
3442 CheckDebuggerUnloaded(); 3413 CheckDebuggerUnloaded();
3443 } 3414 }
3444 3415
3445 3416
3446 TEST(DebugStepForIn) { 3417 TEST(DebugStepForIn) {
3447 DebugLocalContext env; 3418 DebugLocalContext env;
3448 v8::HandleScope scope(env->GetIsolate()); 3419 v8::HandleScope scope(env->GetIsolate());
3449 3420
3450 // Register a debug event listener which steps and counts. 3421 // Register a debug event listener which steps and counts.
3451 v8::Debug::SetDebugEventListener(DebugEventStep); 3422 v8::Debug::SetDebugEventListener2(DebugEventStep);
3452 3423
3453 // Create a function for testing stepping. Run it to allow it to get 3424 // Create a function for testing stepping. Run it to allow it to get
3454 // optimized. 3425 // optimized.
3455 v8::Local<v8::Function> foo; 3426 v8::Local<v8::Function> foo;
3456 const char* src_1 = "function foo() { " 3427 const char* src_1 = "function foo() { "
3457 " var a = [1, 2];" 3428 " var a = [1, 2];"
3458 " for (x in a) {" 3429 " for (x in a) {"
3459 " b = 0;" 3430 " b = 0;"
3460 " }" 3431 " }"
3461 "}" 3432 "}"
(...skipping 17 matching lines...) Expand all
3479 "foo()"; 3450 "foo()";
3480 foo = CompileFunction(&env, src_2, "foo"); 3451 foo = CompileFunction(&env, src_2, "foo");
3481 SetBreakPoint(foo, 0); // "var a = ..." 3452 SetBreakPoint(foo, 0); // "var a = ..."
3482 3453
3483 step_action = StepIn; 3454 step_action = StepIn;
3484 break_point_hit_count = 0; 3455 break_point_hit_count = 0;
3485 foo->Call(env->Global(), 0, NULL); 3456 foo->Call(env->Global(), 0, NULL);
3486 CHECK_EQ(8, break_point_hit_count); 3457 CHECK_EQ(8, break_point_hit_count);
3487 3458
3488 // Get rid of the debug event listener. 3459 // Get rid of the debug event listener.
3489 v8::Debug::SetDebugEventListener(NULL); 3460 v8::Debug::SetDebugEventListener2(NULL);
3490 CheckDebuggerUnloaded(); 3461 CheckDebuggerUnloaded();
3491 } 3462 }
3492 3463
3493 3464
3494 TEST(DebugStepWith) { 3465 TEST(DebugStepWith) {
3495 DebugLocalContext env; 3466 DebugLocalContext env;
3496 v8::HandleScope scope(env->GetIsolate()); 3467 v8::HandleScope scope(env->GetIsolate());
3497 3468
3498 // Register a debug event listener which steps and counts. 3469 // Register a debug event listener which steps and counts.
3499 v8::Debug::SetDebugEventListener(DebugEventStep); 3470 v8::Debug::SetDebugEventListener2(DebugEventStep);
3500 3471
3501 // Create a function for testing stepping. Run it to allow it to get 3472 // Create a function for testing stepping. Run it to allow it to get
3502 // optimized. 3473 // optimized.
3503 const char* src = "function foo(x) { " 3474 const char* src = "function foo(x) { "
3504 " var a = {};" 3475 " var a = {};"
3505 " with (a) {}" 3476 " with (a) {}"
3506 " with (b) {}" 3477 " with (b) {}"
3507 "}" 3478 "}"
3508 "foo()"; 3479 "foo()";
3509 env->Global()->Set(v8::String::New("b"), v8::Object::New()); 3480 env->Global()->Set(v8::String::New("b"), v8::Object::New());
3510 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 3481 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo");
3511 v8::Handle<v8::Value> result; 3482 v8::Handle<v8::Value> result;
3512 SetBreakPoint(foo, 8); // "var a = {};" 3483 SetBreakPoint(foo, 8); // "var a = {};"
3513 3484
3514 step_action = StepIn; 3485 step_action = StepIn;
3515 break_point_hit_count = 0; 3486 break_point_hit_count = 0;
3516 foo->Call(env->Global(), 0, NULL); 3487 foo->Call(env->Global(), 0, NULL);
3517 CHECK_EQ(4, break_point_hit_count); 3488 CHECK_EQ(4, break_point_hit_count);
3518 3489
3519 // Get rid of the debug event listener. 3490 // Get rid of the debug event listener.
3520 v8::Debug::SetDebugEventListener(NULL); 3491 v8::Debug::SetDebugEventListener2(NULL);
3521 CheckDebuggerUnloaded(); 3492 CheckDebuggerUnloaded();
3522 } 3493 }
3523 3494
3524 3495
3525 TEST(DebugConditional) { 3496 TEST(DebugConditional) {
3526 DebugLocalContext env; 3497 DebugLocalContext env;
3527 v8::HandleScope scope(env->GetIsolate()); 3498 v8::HandleScope scope(env->GetIsolate());
3528 3499
3529 // Register a debug event listener which steps and counts. 3500 // Register a debug event listener which steps and counts.
3530 v8::Debug::SetDebugEventListener(DebugEventStep); 3501 v8::Debug::SetDebugEventListener2(DebugEventStep);
3531 3502
3532 // Create a function for testing stepping. Run it to allow it to get 3503 // Create a function for testing stepping. Run it to allow it to get
3533 // optimized. 3504 // optimized.
3534 const char* src = "function foo(x) { " 3505 const char* src = "function foo(x) { "
3535 " var a;" 3506 " var a;"
3536 " a = x ? 1 : 2;" 3507 " a = x ? 1 : 2;"
3537 " return a;" 3508 " return a;"
3538 "}" 3509 "}"
3539 "foo()"; 3510 "foo()";
3540 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 3511 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo");
3541 SetBreakPoint(foo, 0); // "var a;" 3512 SetBreakPoint(foo, 0); // "var a;"
3542 3513
3543 step_action = StepIn; 3514 step_action = StepIn;
3544 break_point_hit_count = 0; 3515 break_point_hit_count = 0;
3545 foo->Call(env->Global(), 0, NULL); 3516 foo->Call(env->Global(), 0, NULL);
3546 CHECK_EQ(5, break_point_hit_count); 3517 CHECK_EQ(5, break_point_hit_count);
3547 3518
3548 step_action = StepIn; 3519 step_action = StepIn;
3549 break_point_hit_count = 0; 3520 break_point_hit_count = 0;
3550 const int argc = 1; 3521 const int argc = 1;
3551 v8::Handle<v8::Value> argv_true[argc] = { v8::True() }; 3522 v8::Handle<v8::Value> argv_true[argc] = { v8::True() };
3552 foo->Call(env->Global(), argc, argv_true); 3523 foo->Call(env->Global(), argc, argv_true);
3553 CHECK_EQ(5, break_point_hit_count); 3524 CHECK_EQ(5, break_point_hit_count);
3554 3525
3555 // Get rid of the debug event listener. 3526 // Get rid of the debug event listener.
3556 v8::Debug::SetDebugEventListener(NULL); 3527 v8::Debug::SetDebugEventListener2(NULL);
3557 CheckDebuggerUnloaded(); 3528 CheckDebuggerUnloaded();
3558 } 3529 }
3559 3530
3560 3531
3561 TEST(StepInOutSimple) { 3532 TEST(StepInOutSimple) {
3562 DebugLocalContext env; 3533 DebugLocalContext env;
3563 v8::HandleScope scope(env->GetIsolate()); 3534 v8::HandleScope scope(env->GetIsolate());
3564 3535
3565 // Create a function for checking the function when hitting a break point. 3536 // Create a function for checking the function when hitting a break point.
3566 frame_function_name = CompileFunction(&env, 3537 frame_function_name = CompileFunction(&env,
3567 frame_function_name_source, 3538 frame_function_name_source,
3568 "frame_function_name"); 3539 "frame_function_name");
3569 3540
3570 // Register a debug event listener which steps and counts. 3541 // Register a debug event listener which steps and counts.
3571 v8::Debug::SetDebugEventListener(DebugEventStepSequence); 3542 v8::Debug::SetDebugEventListener2(DebugEventStepSequence);
3572 3543
3573 // Create a function for testing stepping. Run it to allow it to get 3544 // Create a function for testing stepping. Run it to allow it to get
3574 // optimized. 3545 // optimized.
3575 const char* src = "function a() {b();c();}; " 3546 const char* src = "function a() {b();c();}; "
3576 "function b() {c();}; " 3547 "function b() {c();}; "
3577 "function c() {}; " 3548 "function c() {}; "
3578 "a(); b(); c()"; 3549 "a(); b(); c()";
3579 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); 3550 v8::Local<v8::Function> a = CompileFunction(&env, src, "a");
3580 SetBreakPoint(a, 0); 3551 SetBreakPoint(a, 0);
3581 3552
(...skipping 15 matching lines...) Expand all
3597 3568
3598 // Step through invocation of a with step out. 3569 // Step through invocation of a with step out.
3599 step_action = StepOut; 3570 step_action = StepOut;
3600 break_point_hit_count = 0; 3571 break_point_hit_count = 0;
3601 expected_step_sequence = "a"; 3572 expected_step_sequence = "a";
3602 a->Call(env->Global(), 0, NULL); 3573 a->Call(env->Global(), 0, NULL);
3603 CHECK_EQ(StrLength(expected_step_sequence), 3574 CHECK_EQ(StrLength(expected_step_sequence),
3604 break_point_hit_count); 3575 break_point_hit_count);
3605 3576
3606 // Get rid of the debug event listener. 3577 // Get rid of the debug event listener.
3607 v8::Debug::SetDebugEventListener(NULL); 3578 v8::Debug::SetDebugEventListener2(NULL);
3608 CheckDebuggerUnloaded(); 3579 CheckDebuggerUnloaded();
3609 } 3580 }
3610 3581
3611 3582
3612 TEST(StepInOutTree) { 3583 TEST(StepInOutTree) {
3613 DebugLocalContext env; 3584 DebugLocalContext env;
3614 v8::HandleScope scope(env->GetIsolate()); 3585 v8::HandleScope scope(env->GetIsolate());
3615 3586
3616 // Create a function for checking the function when hitting a break point. 3587 // Create a function for checking the function when hitting a break point.
3617 frame_function_name = CompileFunction(&env, 3588 frame_function_name = CompileFunction(&env,
3618 frame_function_name_source, 3589 frame_function_name_source,
3619 "frame_function_name"); 3590 "frame_function_name");
3620 3591
3621 // Register a debug event listener which steps and counts. 3592 // Register a debug event listener which steps and counts.
3622 v8::Debug::SetDebugEventListener(DebugEventStepSequence); 3593 v8::Debug::SetDebugEventListener2(DebugEventStepSequence);
3623 3594
3624 // Create a function for testing stepping. Run it to allow it to get 3595 // Create a function for testing stepping. Run it to allow it to get
3625 // optimized. 3596 // optimized.
3626 const char* src = "function a() {b(c(d()),d());c(d());d()}; " 3597 const char* src = "function a() {b(c(d()),d());c(d());d()}; "
3627 "function b(x,y) {c();}; " 3598 "function b(x,y) {c();}; "
3628 "function c(x) {}; " 3599 "function c(x) {}; "
3629 "function d() {}; " 3600 "function d() {}; "
3630 "a(); b(); c(); d()"; 3601 "a(); b(); c(); d()";
3631 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); 3602 v8::Local<v8::Function> a = CompileFunction(&env, src, "a");
3632 SetBreakPoint(a, 0); 3603 SetBreakPoint(a, 0);
(...skipping 16 matching lines...) Expand all
3649 3620
3650 // Step through invocation of a with step out. 3621 // Step through invocation of a with step out.
3651 step_action = StepOut; 3622 step_action = StepOut;
3652 break_point_hit_count = 0; 3623 break_point_hit_count = 0;
3653 expected_step_sequence = "a"; 3624 expected_step_sequence = "a";
3654 a->Call(env->Global(), 0, NULL); 3625 a->Call(env->Global(), 0, NULL);
3655 CHECK_EQ(StrLength(expected_step_sequence), 3626 CHECK_EQ(StrLength(expected_step_sequence),
3656 break_point_hit_count); 3627 break_point_hit_count);
3657 3628
3658 // Get rid of the debug event listener. 3629 // Get rid of the debug event listener.
3659 v8::Debug::SetDebugEventListener(NULL); 3630 v8::Debug::SetDebugEventListener2(NULL);
3660 CheckDebuggerUnloaded(true); 3631 CheckDebuggerUnloaded(true);
3661 } 3632 }
3662 3633
3663 3634
3664 TEST(StepInOutBranch) { 3635 TEST(StepInOutBranch) {
3665 DebugLocalContext env; 3636 DebugLocalContext env;
3666 v8::HandleScope scope(env->GetIsolate()); 3637 v8::HandleScope scope(env->GetIsolate());
3667 3638
3668 // Create a function for checking the function when hitting a break point. 3639 // Create a function for checking the function when hitting a break point.
3669 frame_function_name = CompileFunction(&env, 3640 frame_function_name = CompileFunction(&env,
3670 frame_function_name_source, 3641 frame_function_name_source,
3671 "frame_function_name"); 3642 "frame_function_name");
3672 3643
3673 // Register a debug event listener which steps and counts. 3644 // Register a debug event listener which steps and counts.
3674 v8::Debug::SetDebugEventListener(DebugEventStepSequence); 3645 v8::Debug::SetDebugEventListener2(DebugEventStepSequence);
3675 3646
3676 // Create a function for testing stepping. Run it to allow it to get 3647 // Create a function for testing stepping. Run it to allow it to get
3677 // optimized. 3648 // optimized.
3678 const char* src = "function a() {b(false);c();}; " 3649 const char* src = "function a() {b(false);c();}; "
3679 "function b(x) {if(x){c();};}; " 3650 "function b(x) {if(x){c();};}; "
3680 "function c() {}; " 3651 "function c() {}; "
3681 "a(); b(); c()"; 3652 "a(); b(); c()";
3682 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); 3653 v8::Local<v8::Function> a = CompileFunction(&env, src, "a");
3683 SetBreakPoint(a, 0); 3654 SetBreakPoint(a, 0);
3684 3655
3685 // Step through invocation of a. 3656 // Step through invocation of a.
3686 step_action = StepIn; 3657 step_action = StepIn;
3687 break_point_hit_count = 0; 3658 break_point_hit_count = 0;
3688 expected_step_sequence = "abbaca"; 3659 expected_step_sequence = "abbaca";
3689 a->Call(env->Global(), 0, NULL); 3660 a->Call(env->Global(), 0, NULL);
3690 CHECK_EQ(StrLength(expected_step_sequence), 3661 CHECK_EQ(StrLength(expected_step_sequence),
3691 break_point_hit_count); 3662 break_point_hit_count);
3692 3663
3693 // Get rid of the debug event listener. 3664 // Get rid of the debug event listener.
3694 v8::Debug::SetDebugEventListener(NULL); 3665 v8::Debug::SetDebugEventListener2(NULL);
3695 CheckDebuggerUnloaded(); 3666 CheckDebuggerUnloaded();
3696 } 3667 }
3697 3668
3698 3669
3699 // Test that step in does not step into native functions. 3670 // Test that step in does not step into native functions.
3700 TEST(DebugStepNatives) { 3671 TEST(DebugStepNatives) {
3701 DebugLocalContext env; 3672 DebugLocalContext env;
3702 v8::HandleScope scope(env->GetIsolate()); 3673 v8::HandleScope scope(env->GetIsolate());
3703 3674
3704 // Create a function for testing stepping. 3675 // Create a function for testing stepping.
3705 v8::Local<v8::Function> foo = CompileFunction( 3676 v8::Local<v8::Function> foo = CompileFunction(
3706 &env, 3677 &env,
3707 "function foo(){debugger;Math.sin(1);}", 3678 "function foo(){debugger;Math.sin(1);}",
3708 "foo"); 3679 "foo");
3709 3680
3710 // Register a debug event listener which steps and counts. 3681 // Register a debug event listener which steps and counts.
3711 v8::Debug::SetDebugEventListener(DebugEventStep); 3682 v8::Debug::SetDebugEventListener2(DebugEventStep);
3712 3683
3713 step_action = StepIn; 3684 step_action = StepIn;
3714 break_point_hit_count = 0; 3685 break_point_hit_count = 0;
3715 foo->Call(env->Global(), 0, NULL); 3686 foo->Call(env->Global(), 0, NULL);
3716 3687
3717 // With stepping all break locations are hit. 3688 // With stepping all break locations are hit.
3718 CHECK_EQ(3, break_point_hit_count); 3689 CHECK_EQ(3, break_point_hit_count);
3719 3690
3720 v8::Debug::SetDebugEventListener(NULL); 3691 v8::Debug::SetDebugEventListener2(NULL);
3721 CheckDebuggerUnloaded(); 3692 CheckDebuggerUnloaded();
3722 3693
3723 // Register a debug event listener which just counts. 3694 // Register a debug event listener which just counts.
3724 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); 3695 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
3725 3696
3726 break_point_hit_count = 0; 3697 break_point_hit_count = 0;
3727 foo->Call(env->Global(), 0, NULL); 3698 foo->Call(env->Global(), 0, NULL);
3728 3699
3729 // Without stepping only active break points are hit. 3700 // Without stepping only active break points are hit.
3730 CHECK_EQ(1, break_point_hit_count); 3701 CHECK_EQ(1, break_point_hit_count);
3731 3702
3732 v8::Debug::SetDebugEventListener(NULL); 3703 v8::Debug::SetDebugEventListener2(NULL);
3733 CheckDebuggerUnloaded(); 3704 CheckDebuggerUnloaded();
3734 } 3705 }
3735 3706
3736 3707
3737 // Test that step in works with function.apply. 3708 // Test that step in works with function.apply.
3738 TEST(DebugStepFunctionApply) { 3709 TEST(DebugStepFunctionApply) {
3739 DebugLocalContext env; 3710 DebugLocalContext env;
3740 v8::HandleScope scope(env->GetIsolate()); 3711 v8::HandleScope scope(env->GetIsolate());
3741 3712
3742 // Create a function for testing stepping. 3713 // Create a function for testing stepping.
3743 v8::Local<v8::Function> foo = CompileFunction( 3714 v8::Local<v8::Function> foo = CompileFunction(
3744 &env, 3715 &env,
3745 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" 3716 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }"
3746 "function foo(){ debugger; bar.apply(this, [1,2,3]); }", 3717 "function foo(){ debugger; bar.apply(this, [1,2,3]); }",
3747 "foo"); 3718 "foo");
3748 3719
3749 // Register a debug event listener which steps and counts. 3720 // Register a debug event listener which steps and counts.
3750 v8::Debug::SetDebugEventListener(DebugEventStep); 3721 v8::Debug::SetDebugEventListener2(DebugEventStep);
3751 3722
3752 step_action = StepIn; 3723 step_action = StepIn;
3753 break_point_hit_count = 0; 3724 break_point_hit_count = 0;
3754 foo->Call(env->Global(), 0, NULL); 3725 foo->Call(env->Global(), 0, NULL);
3755 3726
3756 // With stepping all break locations are hit. 3727 // With stepping all break locations are hit.
3757 CHECK_EQ(7, break_point_hit_count); 3728 CHECK_EQ(7, break_point_hit_count);
3758 3729
3759 v8::Debug::SetDebugEventListener(NULL); 3730 v8::Debug::SetDebugEventListener2(NULL);
3760 CheckDebuggerUnloaded(); 3731 CheckDebuggerUnloaded();
3761 3732
3762 // Register a debug event listener which just counts. 3733 // Register a debug event listener which just counts.
3763 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); 3734 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
3764 3735
3765 break_point_hit_count = 0; 3736 break_point_hit_count = 0;
3766 foo->Call(env->Global(), 0, NULL); 3737 foo->Call(env->Global(), 0, NULL);
3767 3738
3768 // Without stepping only the debugger statement is hit. 3739 // Without stepping only the debugger statement is hit.
3769 CHECK_EQ(1, break_point_hit_count); 3740 CHECK_EQ(1, break_point_hit_count);
3770 3741
3771 v8::Debug::SetDebugEventListener(NULL); 3742 v8::Debug::SetDebugEventListener2(NULL);
3772 CheckDebuggerUnloaded(); 3743 CheckDebuggerUnloaded();
3773 } 3744 }
3774 3745
3775 3746
3776 // Test that step in works with function.call. 3747 // Test that step in works with function.call.
3777 TEST(DebugStepFunctionCall) { 3748 TEST(DebugStepFunctionCall) {
3778 DebugLocalContext env; 3749 DebugLocalContext env;
3779 v8::HandleScope scope(env->GetIsolate()); 3750 v8::HandleScope scope(env->GetIsolate());
3780 3751
3781 // Create a function for testing stepping. 3752 // Create a function for testing stepping.
3782 v8::Local<v8::Function> foo = CompileFunction( 3753 v8::Local<v8::Function> foo = CompileFunction(
3783 &env, 3754 &env,
3784 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" 3755 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }"
3785 "function foo(a){ debugger;" 3756 "function foo(a){ debugger;"
3786 " if (a) {" 3757 " if (a) {"
3787 " bar.call(this, 1, 2, 3);" 3758 " bar.call(this, 1, 2, 3);"
3788 " } else {" 3759 " } else {"
3789 " bar.call(this, 0);" 3760 " bar.call(this, 0);"
3790 " }" 3761 " }"
3791 "}", 3762 "}",
3792 "foo"); 3763 "foo");
3793 3764
3794 // Register a debug event listener which steps and counts. 3765 // Register a debug event listener which steps and counts.
3795 v8::Debug::SetDebugEventListener(DebugEventStep); 3766 v8::Debug::SetDebugEventListener2(DebugEventStep);
3796 step_action = StepIn; 3767 step_action = StepIn;
3797 3768
3798 // Check stepping where the if condition in bar is false. 3769 // Check stepping where the if condition in bar is false.
3799 break_point_hit_count = 0; 3770 break_point_hit_count = 0;
3800 foo->Call(env->Global(), 0, NULL); 3771 foo->Call(env->Global(), 0, NULL);
3801 CHECK_EQ(6, break_point_hit_count); 3772 CHECK_EQ(6, break_point_hit_count);
3802 3773
3803 // Check stepping where the if condition in bar is true. 3774 // Check stepping where the if condition in bar is true.
3804 break_point_hit_count = 0; 3775 break_point_hit_count = 0;
3805 const int argc = 1; 3776 const int argc = 1;
3806 v8::Handle<v8::Value> argv[argc] = { v8::True() }; 3777 v8::Handle<v8::Value> argv[argc] = { v8::True() };
3807 foo->Call(env->Global(), argc, argv); 3778 foo->Call(env->Global(), argc, argv);
3808 CHECK_EQ(8, break_point_hit_count); 3779 CHECK_EQ(8, break_point_hit_count);
3809 3780
3810 v8::Debug::SetDebugEventListener(NULL); 3781 v8::Debug::SetDebugEventListener2(NULL);
3811 CheckDebuggerUnloaded(); 3782 CheckDebuggerUnloaded();
3812 3783
3813 // Register a debug event listener which just counts. 3784 // Register a debug event listener which just counts.
3814 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); 3785 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
3815 3786
3816 break_point_hit_count = 0; 3787 break_point_hit_count = 0;
3817 foo->Call(env->Global(), 0, NULL); 3788 foo->Call(env->Global(), 0, NULL);
3818 3789
3819 // Without stepping only the debugger statement is hit. 3790 // Without stepping only the debugger statement is hit.
3820 CHECK_EQ(1, break_point_hit_count); 3791 CHECK_EQ(1, break_point_hit_count);
3821 3792
3822 v8::Debug::SetDebugEventListener(NULL); 3793 v8::Debug::SetDebugEventListener2(NULL);
3823 CheckDebuggerUnloaded(); 3794 CheckDebuggerUnloaded();
3824 } 3795 }
3825 3796
3826 3797
3827 // Tests that breakpoint will be hit if it's set in script. 3798 // Tests that breakpoint will be hit if it's set in script.
3828 TEST(PauseInScript) { 3799 TEST(PauseInScript) {
3829 DebugLocalContext env; 3800 DebugLocalContext env;
3830 v8::HandleScope scope(env->GetIsolate()); 3801 v8::HandleScope scope(env->GetIsolate());
3831 env.ExposeDebug(); 3802 env.ExposeDebug();
3832 3803
3833 // Register a debug event listener which counts. 3804 // Register a debug event listener which counts.
3834 v8::Debug::SetDebugEventListener(DebugEventCounter); 3805 v8::Debug::SetDebugEventListener2(DebugEventCounter);
3835 3806
3836 // Create a script that returns a function. 3807 // Create a script that returns a function.
3837 const char* src = "(function (evt) {})"; 3808 const char* src = "(function (evt) {})";
3838 const char* script_name = "StepInHandlerTest"; 3809 const char* script_name = "StepInHandlerTest";
3839 3810
3840 // Set breakpoint in the script. 3811 // Set breakpoint in the script.
3841 SetScriptBreakPointByNameFromJS(script_name, 0, -1); 3812 SetScriptBreakPointByNameFromJS(script_name, 0, -1);
3842 break_point_hit_count = 0; 3813 break_point_hit_count = 0;
3843 3814
3844 v8::ScriptOrigin origin(v8::String::New(script_name), v8::Integer::New(0)); 3815 v8::ScriptOrigin origin(v8::String::New(script_name), v8::Integer::New(0));
3845 v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::New(src), 3816 v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::New(src),
3846 &origin); 3817 &origin);
3847 v8::Local<v8::Value> r = script->Run(); 3818 v8::Local<v8::Value> r = script->Run();
3848 3819
3849 CHECK(r->IsFunction()); 3820 CHECK(r->IsFunction());
3850 CHECK_EQ(1, break_point_hit_count); 3821 CHECK_EQ(1, break_point_hit_count);
3851 3822
3852 // Get rid of the debug event listener. 3823 // Get rid of the debug event listener.
3853 v8::Debug::SetDebugEventListener(NULL); 3824 v8::Debug::SetDebugEventListener2(NULL);
3854 CheckDebuggerUnloaded(); 3825 CheckDebuggerUnloaded();
3855 } 3826 }
3856 3827
3857 3828
3858 // Test break on exceptions. For each exception break combination the number 3829 // Test break on exceptions. For each exception break combination the number
3859 // of debug event exception callbacks and message callbacks are collected. The 3830 // of debug event exception callbacks and message callbacks are collected. The
3860 // number of debug event exception callbacks are used to check that the 3831 // number of debug event exception callbacks are used to check that the
3861 // debugger is called correctly and the number of message callbacks is used to 3832 // debugger is called correctly and the number of message callbacks is used to
3862 // check that uncaught exceptions are still returned even if there is a break 3833 // check that uncaught exceptions are still returned even if there is a break
3863 // for them. 3834 // for them.
3864 TEST(BreakOnException) { 3835 TEST(BreakOnException) {
3865 DebugLocalContext env; 3836 DebugLocalContext env;
3866 v8::HandleScope scope(env->GetIsolate()); 3837 v8::HandleScope scope(env->GetIsolate());
3867 env.ExposeDebug(); 3838 env.ExposeDebug();
3868 3839
3869 v8::internal::Isolate::Current()->TraceException(false); 3840 v8::internal::Isolate::Current()->TraceException(false);
3870 3841
3871 // Create functions for testing break on exception. 3842 // Create functions for testing break on exception.
3872 CompileFunction(&env, "function throws(){throw 1;}", "throws"); 3843 CompileFunction(&env, "function throws(){throw 1;}", "throws");
3873 v8::Local<v8::Function> caught = 3844 v8::Local<v8::Function> caught =
3874 CompileFunction(&env, 3845 CompileFunction(&env,
3875 "function caught(){try {throws();} catch(e) {};}", 3846 "function caught(){try {throws();} catch(e) {};}",
3876 "caught"); 3847 "caught");
3877 v8::Local<v8::Function> notCaught = 3848 v8::Local<v8::Function> notCaught =
3878 CompileFunction(&env, "function notCaught(){throws();}", "notCaught"); 3849 CompileFunction(&env, "function notCaught(){throws();}", "notCaught");
3879 3850
3880 v8::V8::AddMessageListener(MessageCallbackCount); 3851 v8::V8::AddMessageListener(MessageCallbackCount);
3881 v8::Debug::SetDebugEventListener(DebugEventCounter); 3852 v8::Debug::SetDebugEventListener2(DebugEventCounter);
3882 3853
3883 // Initial state should be no break on exceptions. 3854 // Initial state should be no break on exceptions.
3884 DebugEventCounterClear(); 3855 DebugEventCounterClear();
3885 MessageCallbackCountClear(); 3856 MessageCallbackCountClear();
3886 caught->Call(env->Global(), 0, NULL); 3857 caught->Call(env->Global(), 0, NULL);
3887 CHECK_EQ(0, exception_hit_count); 3858 CHECK_EQ(0, exception_hit_count);
3888 CHECK_EQ(0, uncaught_exception_hit_count); 3859 CHECK_EQ(0, uncaught_exception_hit_count);
3889 CHECK_EQ(0, message_callback_count); 3860 CHECK_EQ(0, message_callback_count);
3890 notCaught->Call(env->Global(), 0, NULL); 3861 notCaught->Call(env->Global(), 0, NULL);
3891 CHECK_EQ(0, exception_hit_count); 3862 CHECK_EQ(0, exception_hit_count);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
3989 ChangeBreakOnExceptionFromJS(true, false); 3960 ChangeBreakOnExceptionFromJS(true, false);
3990 caught->Call(env->Global(), 0, NULL); 3961 caught->Call(env->Global(), 0, NULL);
3991 CHECK_EQ(1, exception_hit_count); 3962 CHECK_EQ(1, exception_hit_count);
3992 CHECK_EQ(0, uncaught_exception_hit_count); 3963 CHECK_EQ(0, uncaught_exception_hit_count);
3993 CHECK_EQ(0, message_callback_count); 3964 CHECK_EQ(0, message_callback_count);
3994 notCaught->Call(env->Global(), 0, NULL); 3965 notCaught->Call(env->Global(), 0, NULL);
3995 CHECK_EQ(2, exception_hit_count); 3966 CHECK_EQ(2, exception_hit_count);
3996 CHECK_EQ(1, uncaught_exception_hit_count); 3967 CHECK_EQ(1, uncaught_exception_hit_count);
3997 CHECK_EQ(1, message_callback_count); 3968 CHECK_EQ(1, message_callback_count);
3998 3969
3999 v8::Debug::SetDebugEventListener(NULL); 3970 v8::Debug::SetDebugEventListener2(NULL);
4000 CheckDebuggerUnloaded(); 3971 CheckDebuggerUnloaded();
4001 v8::V8::RemoveMessageListeners(MessageCallbackCount); 3972 v8::V8::RemoveMessageListeners(MessageCallbackCount);
4002 } 3973 }
4003 3974
4004 3975
4005 // Test break on exception from compiler errors. When compiling using 3976 // Test break on exception from compiler errors. When compiling using
4006 // v8::Script::Compile there is no JavaScript stack whereas when compiling using 3977 // v8::Script::Compile there is no JavaScript stack whereas when compiling using
4007 // eval there are JavaScript frames. 3978 // eval there are JavaScript frames.
4008 TEST(BreakOnCompileException) { 3979 TEST(BreakOnCompileException) {
4009 DebugLocalContext env; 3980 DebugLocalContext env;
4010 v8::HandleScope scope(env->GetIsolate()); 3981 v8::HandleScope scope(env->GetIsolate());
4011 3982
4012 // For this test, we want to break on uncaught exceptions: 3983 // For this test, we want to break on uncaught exceptions:
4013 ChangeBreakOnException(false, true); 3984 ChangeBreakOnException(false, true);
4014 3985
4015 v8::internal::Isolate::Current()->TraceException(false); 3986 v8::internal::Isolate::Current()->TraceException(false);
4016 3987
4017 // Create a function for checking the function when hitting a break point. 3988 // Create a function for checking the function when hitting a break point.
4018 frame_count = CompileFunction(&env, frame_count_source, "frame_count"); 3989 frame_count = CompileFunction(&env, frame_count_source, "frame_count");
4019 3990
4020 v8::V8::AddMessageListener(MessageCallbackCount); 3991 v8::V8::AddMessageListener(MessageCallbackCount);
4021 v8::Debug::SetDebugEventListener(DebugEventCounter); 3992 v8::Debug::SetDebugEventListener2(DebugEventCounter);
4022 3993
4023 DebugEventCounterClear(); 3994 DebugEventCounterClear();
4024 MessageCallbackCountClear(); 3995 MessageCallbackCountClear();
4025 3996
4026 // Check initial state. 3997 // Check initial state.
4027 CHECK_EQ(0, exception_hit_count); 3998 CHECK_EQ(0, exception_hit_count);
4028 CHECK_EQ(0, uncaught_exception_hit_count); 3999 CHECK_EQ(0, uncaught_exception_hit_count);
4029 CHECK_EQ(0, message_callback_count); 4000 CHECK_EQ(0, message_callback_count);
4030 CHECK_EQ(-1, last_js_stack_height); 4001 CHECK_EQ(-1, last_js_stack_height);
4031 4002
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
4065 4036
4066 // For this test, we want to break on uncaught exceptions: 4037 // For this test, we want to break on uncaught exceptions:
4067 ChangeBreakOnException(false, true); 4038 ChangeBreakOnException(false, true);
4068 4039
4069 // Create a function for checking the function when hitting a break point. 4040 // Create a function for checking the function when hitting a break point.
4070 frame_function_name = CompileFunction(&env, 4041 frame_function_name = CompileFunction(&env,
4071 frame_function_name_source, 4042 frame_function_name_source,
4072 "frame_function_name"); 4043 "frame_function_name");
4073 4044
4074 // Register a debug event listener which steps and counts. 4045 // Register a debug event listener which steps and counts.
4075 v8::Debug::SetDebugEventListener(DebugEventStepSequence); 4046 v8::Debug::SetDebugEventListener2(DebugEventStepSequence);
4076 4047
4077 // Create functions for testing stepping. 4048 // Create functions for testing stepping.
4078 const char* src = "function a() { n(); }; " 4049 const char* src = "function a() { n(); }; "
4079 "function b() { c(); }; " 4050 "function b() { c(); }; "
4080 "function c() { n(); }; " 4051 "function c() { n(); }; "
4081 "function d() { x = 1; try { e(); } catch(x) { x = 2; } }; " 4052 "function d() { x = 1; try { e(); } catch(x) { x = 2; } }; "
4082 "function e() { n(); }; " 4053 "function e() { n(); }; "
4083 "function f() { x = 1; try { g(); } catch(x) { x = 2; } }; " 4054 "function f() { x = 1; try { g(); } catch(x) { x = 2; } }; "
4084 "function g() { h(); }; " 4055 "function g() { h(); }; "
4085 "function h() { x = 1; throw 1; }; "; 4056 "function h() { x = 1; throw 1; }; ";
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
4137 // Step through invocation of f + g + h now with break on caught exceptions. 4108 // Step through invocation of f + g + h now with break on caught exceptions.
4138 ChangeBreakOnException(true, true); 4109 ChangeBreakOnException(true, true);
4139 step_action = StepIn; 4110 step_action = StepIn;
4140 break_point_hit_count = 0; 4111 break_point_hit_count = 0;
4141 expected_step_sequence = "ffghhhff"; 4112 expected_step_sequence = "ffghhhff";
4142 f->Call(env->Global(), 0, NULL); 4113 f->Call(env->Global(), 0, NULL);
4143 CHECK_EQ(StrLength(expected_step_sequence), 4114 CHECK_EQ(StrLength(expected_step_sequence),
4144 break_point_hit_count); 4115 break_point_hit_count);
4145 4116
4146 // Get rid of the debug event listener. 4117 // Get rid of the debug event listener.
4147 v8::Debug::SetDebugEventListener(NULL); 4118 v8::Debug::SetDebugEventListener2(NULL);
4148 CheckDebuggerUnloaded(); 4119 CheckDebuggerUnloaded();
4149 } 4120 }
4150 4121
4151 4122
4152 TEST(DebugBreak) { 4123 TEST(DebugBreak) {
4153 i::FLAG_stress_compaction = false; 4124 i::FLAG_stress_compaction = false;
4154 #ifdef VERIFY_HEAP 4125 #ifdef VERIFY_HEAP
4155 i::FLAG_verify_heap = true; 4126 i::FLAG_verify_heap = true;
4156 #endif 4127 #endif
4157 DebugLocalContext env; 4128 DebugLocalContext env;
4158 v8::HandleScope scope(env->GetIsolate()); 4129 v8::HandleScope scope(env->GetIsolate());
4159 4130
4160 // Register a debug event listener which sets the break flag and counts. 4131 // Register a debug event listener which sets the break flag and counts.
4161 v8::Debug::SetDebugEventListener(DebugEventBreak); 4132 v8::Debug::SetDebugEventListener2(DebugEventBreak);
4162 4133
4163 // Create a function for testing stepping. 4134 // Create a function for testing stepping.
4164 const char* src = "function f0() {}" 4135 const char* src = "function f0() {}"
4165 "function f1(x1) {}" 4136 "function f1(x1) {}"
4166 "function f2(x1,x2) {}" 4137 "function f2(x1,x2) {}"
4167 "function f3(x1,x2,x3) {}"; 4138 "function f3(x1,x2,x3) {}";
4168 v8::Local<v8::Function> f0 = CompileFunction(&env, src, "f0"); 4139 v8::Local<v8::Function> f0 = CompileFunction(&env, src, "f0");
4169 v8::Local<v8::Function> f1 = CompileFunction(&env, src, "f1"); 4140 v8::Local<v8::Function> f1 = CompileFunction(&env, src, "f1");
4170 v8::Local<v8::Function> f2 = CompileFunction(&env, src, "f2"); 4141 v8::Local<v8::Function> f2 = CompileFunction(&env, src, "f2");
4171 v8::Local<v8::Function> f3 = CompileFunction(&env, src, "f3"); 4142 v8::Local<v8::Function> f3 = CompileFunction(&env, src, "f3");
(...skipping 19 matching lines...) Expand all
4191 f0->Call(env->Global(), i, argv); 4162 f0->Call(env->Global(), i, argv);
4192 f1->Call(env->Global(), i, argv); 4163 f1->Call(env->Global(), i, argv);
4193 f2->Call(env->Global(), i, argv); 4164 f2->Call(env->Global(), i, argv);
4194 f3->Call(env->Global(), i, argv); 4165 f3->Call(env->Global(), i, argv);
4195 } 4166 }
4196 4167
4197 // One break for each function called. 4168 // One break for each function called.
4198 CHECK_EQ(4 * ARRAY_SIZE(argv), break_point_hit_count); 4169 CHECK_EQ(4 * ARRAY_SIZE(argv), break_point_hit_count);
4199 4170
4200 // Get rid of the debug event listener. 4171 // Get rid of the debug event listener.
4201 v8::Debug::SetDebugEventListener(NULL); 4172 v8::Debug::SetDebugEventListener2(NULL);
4202 CheckDebuggerUnloaded(); 4173 CheckDebuggerUnloaded();
4203 } 4174 }
4204 4175
4205 4176
4206 // Test to ensure that JavaScript code keeps running while the debug break 4177 // Test to ensure that JavaScript code keeps running while the debug break
4207 // through the stack limit flag is set but breaks are disabled. 4178 // through the stack limit flag is set but breaks are disabled.
4208 TEST(DisableBreak) { 4179 TEST(DisableBreak) {
4209 DebugLocalContext env; 4180 DebugLocalContext env;
4210 v8::HandleScope scope(env->GetIsolate()); 4181 v8::HandleScope scope(env->GetIsolate());
4211 4182
4212 // Register a debug event listener which sets the break flag and counts. 4183 // Register a debug event listener which sets the break flag and counts.
4213 v8::Debug::SetDebugEventListener(DebugEventCounter); 4184 v8::Debug::SetDebugEventListener2(DebugEventCounter);
4214 4185
4215 // Create a function for testing stepping. 4186 // Create a function for testing stepping.
4216 const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}"; 4187 const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}";
4217 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); 4188 v8::Local<v8::Function> f = CompileFunction(&env, src, "f");
4218 4189
4219 // Set the debug break flag. 4190 // Set the debug break flag.
4220 v8::Debug::DebugBreak(); 4191 v8::Debug::DebugBreak();
4221 4192
4222 // Call all functions with different argument count. 4193 // Call all functions with different argument count.
4223 break_point_hit_count = 0; 4194 break_point_hit_count = 0;
4224 f->Call(env->Global(), 0, NULL); 4195 f->Call(env->Global(), 0, NULL);
4225 CHECK_EQ(1, break_point_hit_count); 4196 CHECK_EQ(1, break_point_hit_count);
4226 4197
4227 { 4198 {
4228 v8::Debug::DebugBreak(); 4199 v8::Debug::DebugBreak();
4229 v8::internal::DisableBreak disable_break(true); 4200 v8::internal::DisableBreak disable_break(true);
4230 f->Call(env->Global(), 0, NULL); 4201 f->Call(env->Global(), 0, NULL);
4231 CHECK_EQ(1, break_point_hit_count); 4202 CHECK_EQ(1, break_point_hit_count);
4232 } 4203 }
4233 4204
4234 f->Call(env->Global(), 0, NULL); 4205 f->Call(env->Global(), 0, NULL);
4235 CHECK_EQ(2, break_point_hit_count); 4206 CHECK_EQ(2, break_point_hit_count);
4236 4207
4237 // Get rid of the debug event listener. 4208 // Get rid of the debug event listener.
4238 v8::Debug::SetDebugEventListener(NULL); 4209 v8::Debug::SetDebugEventListener2(NULL);
4239 CheckDebuggerUnloaded(); 4210 CheckDebuggerUnloaded();
4240 } 4211 }
4241 4212
4242 static const char* kSimpleExtensionSource = 4213 static const char* kSimpleExtensionSource =
4243 "(function Foo() {" 4214 "(function Foo() {"
4244 " return 4;" 4215 " return 4;"
4245 "})() "; 4216 "})() ";
4246 4217
4247 // http://crbug.com/28933 4218 // http://crbug.com/28933
4248 // Test that debug break is disabled when bootstrapper is active. 4219 // Test that debug break is disabled when bootstrapper is active.
4249 TEST(NoBreakWhenBootstrapping) { 4220 TEST(NoBreakWhenBootstrapping) {
4250 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 4221 v8::Isolate* isolate = v8::Isolate::GetCurrent();
4251 v8::HandleScope scope(isolate); 4222 v8::HandleScope scope(isolate);
4252 4223
4253 // Register a debug event listener which sets the break flag and counts. 4224 // Register a debug event listener which sets the break flag and counts.
4254 v8::Debug::SetDebugEventListener(DebugEventCounter); 4225 v8::Debug::SetDebugEventListener2(DebugEventCounter);
4255 4226
4256 // Set the debug break flag. 4227 // Set the debug break flag.
4257 v8::Debug::DebugBreak(); 4228 v8::Debug::DebugBreak();
4258 break_point_hit_count = 0; 4229 break_point_hit_count = 0;
4259 { 4230 {
4260 // Create a context with an extension to make sure that some JavaScript 4231 // Create a context with an extension to make sure that some JavaScript
4261 // code is executed during bootstrapping. 4232 // code is executed during bootstrapping.
4262 v8::RegisterExtension(new v8::Extension("simpletest", 4233 v8::RegisterExtension(new v8::Extension("simpletest",
4263 kSimpleExtensionSource)); 4234 kSimpleExtensionSource));
4264 const char* extension_names[] = { "simpletest" }; 4235 const char* extension_names[] = { "simpletest" };
4265 v8::ExtensionConfiguration extensions(1, extension_names); 4236 v8::ExtensionConfiguration extensions(1, extension_names);
4266 v8::HandleScope handle_scope(isolate); 4237 v8::HandleScope handle_scope(isolate);
4267 v8::Context::New(isolate, &extensions); 4238 v8::Context::New(isolate, &extensions);
4268 } 4239 }
4269 // Check that no DebugBreak events occured during the context creation. 4240 // Check that no DebugBreak events occured during the context creation.
4270 CHECK_EQ(0, break_point_hit_count); 4241 CHECK_EQ(0, break_point_hit_count);
4271 4242
4272 // Get rid of the debug event listener. 4243 // Get rid of the debug event listener.
4273 v8::Debug::SetDebugEventListener(NULL); 4244 v8::Debug::SetDebugEventListener2(NULL);
4274 CheckDebuggerUnloaded(); 4245 CheckDebuggerUnloaded();
4275 } 4246 }
4276 4247
4277 4248
4278 static void NamedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) { 4249 static void NamedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) {
4279 v8::Handle<v8::Array> result = v8::Array::New(3); 4250 v8::Handle<v8::Array> result = v8::Array::New(3);
4280 result->Set(v8::Integer::New(0), v8::String::New("a")); 4251 result->Set(v8::Integer::New(0), v8::String::New("a"));
4281 result->Set(v8::Integer::New(1), v8::String::New("b")); 4252 result->Set(v8::Integer::New(1), v8::String::New("b"));
4282 result->Set(v8::Integer::New(2), v8::String::New("c")); 4253 result->Set(v8::Integer::New(2), v8::String::New("c"));
4283 info.GetReturnValue().Set(result); 4254 info.GetReturnValue().Set(result);
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after
4868 4839
4869 // This is the debugger thread, that executes no v8 calls except 4840 // This is the debugger thread, that executes no v8 calls except
4870 // placing JSON debugger commands in the queue. 4841 // placing JSON debugger commands in the queue.
4871 class MessageQueueDebuggerThread : public v8::internal::Thread { 4842 class MessageQueueDebuggerThread : public v8::internal::Thread {
4872 public: 4843 public:
4873 MessageQueueDebuggerThread() 4844 MessageQueueDebuggerThread()
4874 : Thread("MessageQueueDebuggerThread") { } 4845 : Thread("MessageQueueDebuggerThread") { }
4875 void Run(); 4846 void Run();
4876 }; 4847 };
4877 4848
4878 static void MessageHandler(const uint16_t* message, int length, 4849
4879 v8::Debug::ClientData* client_data) { 4850 static void MessageHandler(const v8::Debug::Message& message) {
4880 static char print_buffer[1000]; 4851 v8::Handle<v8::String> json = message.GetJSON();
4881 Utf16ToAscii(message, length, print_buffer); 4852 v8::String::AsciiValue ascii(json);
4882 if (IsBreakEventMessage(print_buffer)) { 4853 if (IsBreakEventMessage(*ascii)) {
4883 // Lets test script wait until break occurs to send commands. 4854 // Lets test script wait until break occurs to send commands.
4884 // Signals when a break is reported. 4855 // Signals when a break is reported.
4885 message_queue_barriers.semaphore_2->Signal(); 4856 message_queue_barriers.semaphore_2->Signal();
4886 } 4857 }
4887 4858
4888 // Allow message handler to block on a semaphore, to test queueing of 4859 // Allow message handler to block on a semaphore, to test queueing of
4889 // messages while blocked. 4860 // messages while blocked.
4890 message_queue_barriers.semaphore_1->Wait(); 4861 message_queue_barriers.semaphore_1->Wait();
4891 } 4862 }
4892 4863
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
4974 4945
4975 4946
4976 // This thread runs the v8 engine. 4947 // This thread runs the v8 engine.
4977 TEST(MessageQueues) { 4948 TEST(MessageQueues) {
4978 MessageQueueDebuggerThread message_queue_debugger_thread; 4949 MessageQueueDebuggerThread message_queue_debugger_thread;
4979 4950
4980 // Create a V8 environment 4951 // Create a V8 environment
4981 DebugLocalContext env; 4952 DebugLocalContext env;
4982 v8::HandleScope scope(env->GetIsolate()); 4953 v8::HandleScope scope(env->GetIsolate());
4983 message_queue_barriers.Initialize(); 4954 message_queue_barriers.Initialize();
4984 v8::Debug::SetMessageHandler(MessageHandler); 4955 v8::Debug::SetMessageHandler2(MessageHandler);
4985 message_queue_debugger_thread.Start(); 4956 message_queue_debugger_thread.Start();
4986 4957
4987 const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;"; 4958 const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;";
4988 const char* source_2 = "e = 17;"; 4959 const char* source_2 = "e = 17;";
4989 const char* source_3 = "a = 4; debugger; a = 5; a = 6; a = 7;"; 4960 const char* source_3 = "a = 4; debugger; a = 5; a = 6; a = 7;";
4990 4961
4991 // See MessageQueueDebuggerThread::Run for interleaved sequence of 4962 // See MessageQueueDebuggerThread::Run for interleaved sequence of
4992 // API calls and events in the two threads. 4963 // API calls and events in the two threads.
4993 CompileRun(source_1); 4964 CompileRun(source_1);
4994 message_queue_barriers.barrier_1.Wait(); 4965 message_queue_barriers.barrier_1.Wait();
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
5440 TEST(RecursiveBreakpoints) { 5411 TEST(RecursiveBreakpoints) {
5441 TestRecursiveBreakpointsGeneric(false); 5412 TestRecursiveBreakpointsGeneric(false);
5442 } 5413 }
5443 5414
5444 5415
5445 TEST(RecursiveBreakpointsGlobal) { 5416 TEST(RecursiveBreakpointsGlobal) {
5446 TestRecursiveBreakpointsGeneric(true); 5417 TestRecursiveBreakpointsGeneric(true);
5447 } 5418 }
5448 5419
5449 5420
5450 static void DummyDebugEventListener(v8::DebugEvent event, 5421 static void DummyDebugEventListener(
5451 v8::Handle<v8::Object> exec_state, 5422 const v8::Debug::EventDetails& event_details) {
5452 v8::Handle<v8::Object> event_data,
5453 v8::Handle<v8::Value> data) {
5454 } 5423 }
5455 5424
5456 5425
5457 TEST(SetDebugEventListenerOnUninitializedVM) { 5426 TEST(SetDebugEventListenerOnUninitializedVM) {
5458 v8::Debug::SetDebugEventListener(DummyDebugEventListener); 5427 v8::Debug::SetDebugEventListener2(DummyDebugEventListener);
5459 } 5428 }
5460 5429
5461 5430
5462 static void DummyMessageHandler(const v8::Debug::Message& message) { 5431 static void DummyMessageHandler(const v8::Debug::Message& message) {
5463 } 5432 }
5464 5433
5465 5434
5466 TEST(SetMessageHandlerOnUninitializedVM) { 5435 TEST(SetMessageHandlerOnUninitializedVM) {
5467 v8::Debug::SetMessageHandler2(DummyMessageHandler); 5436 v8::Debug::SetMessageHandler2(DummyMessageHandler);
5468 } 5437 }
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
5639 // Test that clearing the debug event listener actually clears all break points 5608 // Test that clearing the debug event listener actually clears all break points
5640 // and related information. 5609 // and related information.
5641 TEST(DebuggerUnload) { 5610 TEST(DebuggerUnload) {
5642 DebugLocalContext env; 5611 DebugLocalContext env;
5643 5612
5644 // Check debugger is unloaded before it is used. 5613 // Check debugger is unloaded before it is used.
5645 CheckDebuggerUnloaded(); 5614 CheckDebuggerUnloaded();
5646 5615
5647 // Set a debug event listener. 5616 // Set a debug event listener.
5648 break_point_hit_count = 0; 5617 break_point_hit_count = 0;
5649 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 5618 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
5650 v8::Undefined());
5651 { 5619 {
5652 v8::HandleScope scope(env->GetIsolate()); 5620 v8::HandleScope scope(env->GetIsolate());
5653 // Create a couple of functions for the test. 5621 // Create a couple of functions for the test.
5654 v8::Local<v8::Function> foo = 5622 v8::Local<v8::Function> foo =
5655 CompileFunction(&env, "function foo(){x=1}", "foo"); 5623 CompileFunction(&env, "function foo(){x=1}", "foo");
5656 v8::Local<v8::Function> bar = 5624 v8::Local<v8::Function> bar =
5657 CompileFunction(&env, "function bar(){y=2}", "bar"); 5625 CompileFunction(&env, "function bar(){y=2}", "bar");
5658 5626
5659 // Set some break points. 5627 // Set some break points.
5660 SetBreakPoint(foo, 0); 5628 SetBreakPoint(foo, 0);
5661 SetBreakPoint(foo, 4); 5629 SetBreakPoint(foo, 4);
5662 SetBreakPoint(bar, 0); 5630 SetBreakPoint(bar, 0);
5663 SetBreakPoint(bar, 4); 5631 SetBreakPoint(bar, 4);
5664 5632
5665 // Make sure that the break points are there. 5633 // Make sure that the break points are there.
5666 break_point_hit_count = 0; 5634 break_point_hit_count = 0;
5667 foo->Call(env->Global(), 0, NULL); 5635 foo->Call(env->Global(), 0, NULL);
5668 CHECK_EQ(2, break_point_hit_count); 5636 CHECK_EQ(2, break_point_hit_count);
5669 bar->Call(env->Global(), 0, NULL); 5637 bar->Call(env->Global(), 0, NULL);
5670 CHECK_EQ(4, break_point_hit_count); 5638 CHECK_EQ(4, break_point_hit_count);
5671 } 5639 }
5672 5640
5673 // Remove the debug event listener without clearing breakpoints. Do this 5641 // Remove the debug event listener without clearing breakpoints. Do this
5674 // outside a handle scope. 5642 // outside a handle scope.
5675 v8::Debug::SetDebugEventListener(NULL); 5643 v8::Debug::SetDebugEventListener2(NULL);
5676 CheckDebuggerUnloaded(true); 5644 CheckDebuggerUnloaded(true);
5677 5645
5678 // Now set a debug message handler. 5646 // Now set a debug message handler.
5679 break_point_hit_count = 0; 5647 break_point_hit_count = 0;
5680 v8::Debug::SetMessageHandler2(MessageHandlerBreakPointHitCount); 5648 v8::Debug::SetMessageHandler2(MessageHandlerBreakPointHitCount);
5681 { 5649 {
5682 v8::HandleScope scope(env->GetIsolate()); 5650 v8::HandleScope scope(env->GetIsolate());
5683 5651
5684 // Get the test functions again. 5652 // Get the test functions again.
5685 v8::Local<v8::Function> foo(v8::Local<v8::Function>::Cast( 5653 v8::Local<v8::Function> foo(v8::Local<v8::Function>::Cast(
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
5743 5711
5744 // Run code to throw a unhandled exception. This should end up in the message 5712 // Run code to throw a unhandled exception. This should end up in the message
5745 // handler. 5713 // handler.
5746 CompileRun("throw 1"); 5714 CompileRun("throw 1");
5747 5715
5748 // The message handler should be called. 5716 // The message handler should be called.
5749 CHECK_GT(message_handler_hit_count, 0); 5717 CHECK_GT(message_handler_hit_count, 0);
5750 5718
5751 // Clear debug message handler. 5719 // Clear debug message handler.
5752 message_handler_hit_count = 0; 5720 message_handler_hit_count = 0;
5753 v8::Debug::SetMessageHandler(NULL); 5721 v8::Debug::SetMessageHandler2(NULL);
5754 5722
5755 // Run code to throw a unhandled exception. This should end up in the message 5723 // Run code to throw a unhandled exception. This should end up in the message
5756 // handler. 5724 // handler.
5757 CompileRun("throw 1"); 5725 CompileRun("throw 1");
5758 5726
5759 // The message handler should not be called more. 5727 // The message handler should not be called more.
5760 CHECK_EQ(0, message_handler_hit_count); 5728 CHECK_EQ(0, message_handler_hit_count);
5761 5729
5762 CheckDebuggerUnloaded(true); 5730 CheckDebuggerUnloaded(true);
5763 } 5731 }
5764 5732
5765 5733
5766 // Debugger message handler which clears the message handler while active. 5734 // Debugger message handler which clears the message handler while active.
5767 static void MessageHandlerClearingMessageHandler( 5735 static void MessageHandlerClearingMessageHandler(
5768 const v8::Debug::Message& message) { 5736 const v8::Debug::Message& message) {
5769 message_handler_hit_count++; 5737 message_handler_hit_count++;
5770 5738
5771 // Clear debug message handler. 5739 // Clear debug message handler.
5772 v8::Debug::SetMessageHandler(NULL); 5740 v8::Debug::SetMessageHandler2(NULL);
5773 } 5741 }
5774 5742
5775 5743
5776 // Test clearing the debug message handler while processing a debug event. 5744 // Test clearing the debug message handler while processing a debug event.
5777 TEST(DebuggerClearMessageHandlerWhileActive) { 5745 TEST(DebuggerClearMessageHandlerWhileActive) {
5778 DebugLocalContext env; 5746 DebugLocalContext env;
5779 v8::HandleScope scope(env->GetIsolate()); 5747 v8::HandleScope scope(env->GetIsolate());
5780 5748
5781 // Check debugger is unloaded before it is used. 5749 // Check debugger is unloaded before it is used.
5782 CheckDebuggerUnloaded(); 5750 CheckDebuggerUnloaded();
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
6196 frame_script_name = CompileFunction(&env, 6164 frame_script_name = CompileFunction(&env,
6197 frame_script_name_source, 6165 frame_script_name_source,
6198 "frame_script_name"); 6166 "frame_script_name");
6199 frame_script_data = CompileFunction(&env, 6167 frame_script_data = CompileFunction(&env,
6200 frame_script_data_source, 6168 frame_script_data_source,
6201 "frame_script_data"); 6169 "frame_script_data");
6202 compiled_script_data = CompileFunction(&env, 6170 compiled_script_data = CompileFunction(&env,
6203 compiled_script_data_source, 6171 compiled_script_data_source,
6204 "compiled_script_data"); 6172 "compiled_script_data");
6205 6173
6206 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, 6174 v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount);
6207 v8::Undefined());
6208 6175
6209 // Test function source. 6176 // Test function source.
6210 v8::Local<v8::String> script = v8::String::New( 6177 v8::Local<v8::String> script = v8::String::New(
6211 "function f() {\n" 6178 "function f() {\n"
6212 " debugger;\n" 6179 " debugger;\n"
6213 "}\n"); 6180 "}\n");
6214 6181
6215 v8::ScriptOrigin origin1 = v8::ScriptOrigin(v8::String::New("name")); 6182 v8::ScriptOrigin origin1 = v8::ScriptOrigin(v8::String::New("name"));
6216 v8::Handle<v8::Script> script1 = v8::Script::Compile(script, &origin1); 6183 v8::Handle<v8::Script> script1 = v8::Script::Compile(script, &origin1);
6217 script1->SetData(v8::String::New("data")); 6184 script1->SetData(v8::String::New("data"));
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
6384 // Calling g will not cause any additional breaks. 6351 // Calling g will not cause any additional breaks.
6385 g->Call(env->Global(), 0, NULL); 6352 g->Call(env->Global(), 0, NULL);
6386 CHECK_EQ(2, message_handler_break_hit_count); 6353 CHECK_EQ(2, message_handler_break_hit_count);
6387 } 6354 }
6388 6355
6389 6356
6390 #ifndef V8_INTERPRETED_REGEXP 6357 #ifndef V8_INTERPRETED_REGEXP
6391 // Debug event handler which gets the function on the top frame and schedules a 6358 // Debug event handler which gets the function on the top frame and schedules a
6392 // break a number of times. 6359 // break a number of times.
6393 static void DebugEventDebugBreak( 6360 static void DebugEventDebugBreak(
6394 v8::DebugEvent event, 6361 const v8::Debug::EventDetails& event_details) {
6395 v8::Handle<v8::Object> exec_state, 6362 v8::DebugEvent event = event_details.GetEvent();
6396 v8::Handle<v8::Object> event_data, 6363 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
6397 v8::Handle<v8::Value> data) {
6398 6364
6399 if (event == v8::Break) { 6365 if (event == v8::Break) {
6400 break_point_hit_count++; 6366 break_point_hit_count++;
6401 6367
6402 // Get the name of the top frame function. 6368 // Get the name of the top frame function.
6403 if (!frame_function_name.IsEmpty()) { 6369 if (!frame_function_name.IsEmpty()) {
6404 // Get the name of the function. 6370 // Get the name of the function.
6405 const int argc = 2; 6371 const int argc = 2;
6406 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) }; 6372 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) };
6407 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, 6373 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state,
(...skipping 30 matching lines...) Expand all
6438 const char* script = 6404 const char* script =
6439 "var sourceLineBeginningSkip = /^(?:[ \\v\\h]*(?:\\/\\*.*?\\*\\/)*)*/;\n" 6405 "var sourceLineBeginningSkip = /^(?:[ \\v\\h]*(?:\\/\\*.*?\\*\\/)*)*/;\n"
6440 "function f(s) { return s.match(sourceLineBeginningSkip)[0].length; }"; 6406 "function f(s) { return s.match(sourceLineBeginningSkip)[0].length; }";
6441 6407
6442 v8::Local<v8::Function> f = CompileFunction(script, "f"); 6408 v8::Local<v8::Function> f = CompileFunction(script, "f");
6443 const int argc = 1; 6409 const int argc = 1;
6444 v8::Handle<v8::Value> argv[argc] = { v8::String::New(" /* xxx */ a=0;") }; 6410 v8::Handle<v8::Value> argv[argc] = { v8::String::New(" /* xxx */ a=0;") };
6445 v8::Local<v8::Value> result = f->Call(env->Global(), argc, argv); 6411 v8::Local<v8::Value> result = f->Call(env->Global(), argc, argv);
6446 CHECK_EQ(12, result->Int32Value()); 6412 CHECK_EQ(12, result->Int32Value());
6447 6413
6448 v8::Debug::SetDebugEventListener(DebugEventDebugBreak); 6414 v8::Debug::SetDebugEventListener2(DebugEventDebugBreak);
6449 v8::Debug::DebugBreak(); 6415 v8::Debug::DebugBreak();
6450 result = f->Call(env->Global(), argc, argv); 6416 result = f->Call(env->Global(), argc, argv);
6451 6417
6452 // Check that there was only one break event. Matching RegExp should not 6418 // Check that there was only one break event. Matching RegExp should not
6453 // cause Break events. 6419 // cause Break events.
6454 CHECK_EQ(1, break_point_hit_count); 6420 CHECK_EQ(1, break_point_hit_count);
6455 CHECK_EQ("f", last_function_hit); 6421 CHECK_EQ("f", last_function_hit);
6456 } 6422 }
6457 #endif // V8_INTERPRETED_REGEXP 6423 #endif // V8_INTERPRETED_REGEXP
6458 6424
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
6569 CHECK_GT(message_handler_hit_count, 3); 6535 CHECK_GT(message_handler_hit_count, 3);
6570 6536
6571 // One break from the source and another from the evaluate request. 6537 // One break from the source and another from the evaluate request.
6572 CHECK_EQ(break_count, 2); 6538 CHECK_EQ(break_count, 2);
6573 CheckDebuggerUnloaded(); 6539 CheckDebuggerUnloaded();
6574 } 6540 }
6575 6541
6576 6542
6577 // Debug event listener which counts the script collected events. 6543 // Debug event listener which counts the script collected events.
6578 int script_collected_count = 0; 6544 int script_collected_count = 0;
6579 static void DebugEventScriptCollectedEvent(v8::DebugEvent event, 6545 static void DebugEventScriptCollectedEvent(
6580 v8::Handle<v8::Object> exec_state, 6546 const v8::Debug::EventDetails& event_details) {
6581 v8::Handle<v8::Object> event_data, 6547 v8::DebugEvent event = event_details.GetEvent();
6582 v8::Handle<v8::Value> data) {
6583 // Count the number of breaks. 6548 // Count the number of breaks.
6584 if (event == v8::ScriptCollected) { 6549 if (event == v8::ScriptCollected) {
6585 script_collected_count++; 6550 script_collected_count++;
6586 } 6551 }
6587 } 6552 }
6588 6553
6589 6554
6590 // Test that scripts collected are reported through the debug event listener. 6555 // Test that scripts collected are reported through the debug event listener.
6591 TEST(ScriptCollectedEvent) { 6556 TEST(ScriptCollectedEvent) {
6592 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug(); 6557 v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug();
6593 break_point_hit_count = 0; 6558 break_point_hit_count = 0;
6594 script_collected_count = 0; 6559 script_collected_count = 0;
6595 DebugLocalContext env; 6560 DebugLocalContext env;
6596 v8::HandleScope scope(env->GetIsolate()); 6561 v8::HandleScope scope(env->GetIsolate());
6597 6562
6598 // Request the loaded scripts to initialize the debugger script cache. 6563 // Request the loaded scripts to initialize the debugger script cache.
6599 debug->GetLoadedScripts(); 6564 debug->GetLoadedScripts();
6600 6565
6601 // Do garbage collection to ensure that only the script in this test will be 6566 // Do garbage collection to ensure that only the script in this test will be
6602 // collected afterwards. 6567 // collected afterwards.
6603 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 6568 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
6604 6569
6605 script_collected_count = 0; 6570 script_collected_count = 0;
6606 v8::Debug::SetDebugEventListener(DebugEventScriptCollectedEvent, 6571 v8::Debug::SetDebugEventListener2(DebugEventScriptCollectedEvent);
6607 v8::Undefined());
6608 { 6572 {
6609 v8::Script::Compile(v8::String::New("eval('a=1')"))->Run(); 6573 v8::Script::Compile(v8::String::New("eval('a=1')"))->Run();
6610 v8::Script::Compile(v8::String::New("eval('a=2')"))->Run(); 6574 v8::Script::Compile(v8::String::New("eval('a=2')"))->Run();
6611 } 6575 }
6612 6576
6613 // Do garbage collection to collect the script above which is no longer 6577 // Do garbage collection to collect the script above which is no longer
6614 // referenced. 6578 // referenced.
6615 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 6579 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
6616 6580
6617 CHECK_EQ(2, script_collected_count); 6581 CHECK_EQ(2, script_collected_count);
6618 6582
6619 v8::Debug::SetDebugEventListener(NULL); 6583 v8::Debug::SetDebugEventListener2(NULL);
6620 CheckDebuggerUnloaded(); 6584 CheckDebuggerUnloaded();
6621 } 6585 }
6622 6586
6623 6587
6624 // Debug event listener which counts the script collected events. 6588 // Debug event listener which counts the script collected events.
6625 int script_collected_message_count = 0; 6589 int script_collected_message_count = 0;
6626 static void ScriptCollectedMessageHandler(const v8::Debug::Message& message) { 6590 static void ScriptCollectedMessageHandler(const v8::Debug::Message& message) {
6627 // Count the number of scripts collected. 6591 // Count the number of scripts collected.
6628 if (message.IsEvent() && message.GetEvent() == v8::ScriptCollected) { 6592 if (message.IsEvent() && message.GetEvent() == v8::ScriptCollected) {
6629 script_collected_message_count++; 6593 script_collected_message_count++;
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
7010 6974
7011 // Create a function for testing breaking in apply. 6975 // Create a function for testing breaking in apply.
7012 v8::Local<v8::Function> foo = CompileFunction( 6976 v8::Local<v8::Function> foo = CompileFunction(
7013 &env, 6977 &env,
7014 "function baz(x) { }" 6978 "function baz(x) { }"
7015 "function bar(x) { baz(); }" 6979 "function bar(x) { baz(); }"
7016 "function foo(){ bar.apply(this, [1]); }", 6980 "function foo(){ bar.apply(this, [1]); }",
7017 "foo"); 6981 "foo");
7018 6982
7019 // Register a debug event listener which steps and counts. 6983 // Register a debug event listener which steps and counts.
7020 v8::Debug::SetDebugEventListener(DebugEventBreakMax); 6984 v8::Debug::SetDebugEventListener2(DebugEventBreakMax);
7021 6985
7022 // Set the debug break flag before calling the code using function.apply. 6986 // Set the debug break flag before calling the code using function.apply.
7023 v8::Debug::DebugBreak(); 6987 v8::Debug::DebugBreak();
7024 6988
7025 // Limit the number of debug breaks. This is a regression test for issue 493 6989 // Limit the number of debug breaks. This is a regression test for issue 493
7026 // where this test would enter an infinite loop. 6990 // where this test would enter an infinite loop.
7027 break_point_hit_count = 0; 6991 break_point_hit_count = 0;
7028 max_break_point_hit_count = 10000; // 10000 => infinite loop. 6992 max_break_point_hit_count = 10000; // 10000 => infinite loop.
7029 foo->Call(env->Global(), 0, NULL); 6993 foo->Call(env->Global(), 0, NULL);
7030 6994
7031 // When keeping the debug break several break will happen. 6995 // When keeping the debug break several break will happen.
7032 CHECK_GT(break_point_hit_count, 1); 6996 CHECK_GT(break_point_hit_count, 1);
7033 6997
7034 v8::Debug::SetDebugEventListener(NULL); 6998 v8::Debug::SetDebugEventListener2(NULL);
7035 CheckDebuggerUnloaded(); 6999 CheckDebuggerUnloaded();
7036 } 7000 }
7037 7001
7038 7002
7039 v8::Handle<v8::Context> debugee_context; 7003 v8::Handle<v8::Context> debugee_context;
7040 v8::Handle<v8::Context> debugger_context; 7004 v8::Handle<v8::Context> debugger_context;
7041 7005
7042 7006
7043 // Property getter that checks that current and calling contexts 7007 // Property getter that checks that current and calling contexts
7044 // are both the debugee contexts. 7008 // are both the debugee contexts.
7045 static void NamedGetterWithCallingContextCheck( 7009 static void NamedGetterWithCallingContextCheck(
7046 v8::Local<v8::String> name, 7010 v8::Local<v8::String> name,
7047 const v8::PropertyCallbackInfo<v8::Value>& info) { 7011 const v8::PropertyCallbackInfo<v8::Value>& info) {
7048 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(name), "a")); 7012 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(name), "a"));
7049 v8::Handle<v8::Context> current = v8::Context::GetCurrent(); 7013 v8::Handle<v8::Context> current = v8::Context::GetCurrent();
7050 CHECK(current == debugee_context); 7014 CHECK(current == debugee_context);
7051 CHECK(current != debugger_context); 7015 CHECK(current != debugger_context);
7052 v8::Handle<v8::Context> calling = v8::Context::GetCalling(); 7016 v8::Handle<v8::Context> calling = v8::Context::GetCalling();
7053 CHECK(calling == debugee_context); 7017 CHECK(calling == debugee_context);
7054 CHECK(calling != debugger_context); 7018 CHECK(calling != debugger_context);
7055 info.GetReturnValue().Set(1); 7019 info.GetReturnValue().Set(1);
7056 } 7020 }
7057 7021
7058 7022
7059 // Debug event listener that checks if the first argument of a function is 7023 // Debug event listener that checks if the first argument of a function is
7060 // an object with property 'a' == 1. If the property has custom accessor 7024 // an object with property 'a' == 1. If the property has custom accessor
7061 // this handler will eventually invoke it. 7025 // this handler will eventually invoke it.
7062 static void DebugEventGetAtgumentPropertyValue( 7026 static void DebugEventGetAtgumentPropertyValue(
7063 v8::DebugEvent event, 7027 const v8::Debug::EventDetails& event_details) {
7064 v8::Handle<v8::Object> exec_state, 7028 v8::DebugEvent event = event_details.GetEvent();
7065 v8::Handle<v8::Object> event_data, 7029 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
7066 v8::Handle<v8::Value> data) {
7067 if (event == v8::Break) { 7030 if (event == v8::Break) {
7068 break_point_hit_count++; 7031 break_point_hit_count++;
7069 CHECK(debugger_context == v8::Context::GetCurrent()); 7032 CHECK(debugger_context == v8::Context::GetCurrent());
7070 v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(CompileRun( 7033 v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(CompileRun(
7071 "(function(exec_state) {\n" 7034 "(function(exec_state) {\n"
7072 " return (exec_state.frame(0).argumentValue(0).property('a').\n" 7035 " return (exec_state.frame(0).argumentValue(0).property('a').\n"
7073 " value().value() == 1);\n" 7036 " value().value() == 1);\n"
7074 "})")); 7037 "})"));
7075 const int argc = 1; 7038 const int argc = 1;
7076 v8::Handle<v8::Value> argv[argc] = { exec_state }; 7039 v8::Handle<v8::Value> argv[argc] = { exec_state };
(...skipping 16 matching lines...) Expand all
7093 debugger_context = v8::Utils::ToLocal(debug->debug_context()); 7056 debugger_context = v8::Utils::ToLocal(debug->debug_context());
7094 7057
7095 // Create object with 'a' property accessor. 7058 // Create object with 'a' property accessor.
7096 v8::Handle<v8::ObjectTemplate> named = v8::ObjectTemplate::New(); 7059 v8::Handle<v8::ObjectTemplate> named = v8::ObjectTemplate::New();
7097 named->SetAccessor(v8::String::New("a"), 7060 named->SetAccessor(v8::String::New("a"),
7098 NamedGetterWithCallingContextCheck); 7061 NamedGetterWithCallingContextCheck);
7099 env->Global()->Set(v8::String::New("obj"), 7062 env->Global()->Set(v8::String::New("obj"),
7100 named->NewInstance()); 7063 named->NewInstance());
7101 7064
7102 // Register the debug event listener 7065 // Register the debug event listener
7103 v8::Debug::SetDebugEventListener(DebugEventGetAtgumentPropertyValue); 7066 v8::Debug::SetDebugEventListener2(DebugEventGetAtgumentPropertyValue);
7104 7067
7105 // Create a function that invokes debugger. 7068 // Create a function that invokes debugger.
7106 v8::Local<v8::Function> foo = CompileFunction( 7069 v8::Local<v8::Function> foo = CompileFunction(
7107 &env, 7070 &env,
7108 "function bar(x) { debugger; }" 7071 "function bar(x) { debugger; }"
7109 "function foo(){ bar(obj); }", 7072 "function foo(){ bar(obj); }",
7110 "foo"); 7073 "foo");
7111 7074
7112 break_point_hit_count = 0; 7075 break_point_hit_count = 0;
7113 foo->Call(env->Global(), 0, NULL); 7076 foo->Call(env->Global(), 0, NULL);
7114 CHECK_EQ(1, break_point_hit_count); 7077 CHECK_EQ(1, break_point_hit_count);
7115 7078
7116 v8::Debug::SetDebugEventListener(NULL); 7079 v8::Debug::SetDebugEventListener2(NULL);
7117 debugee_context = v8::Handle<v8::Context>(); 7080 debugee_context = v8::Handle<v8::Context>();
7118 debugger_context = v8::Handle<v8::Context>(); 7081 debugger_context = v8::Handle<v8::Context>();
7119 CheckDebuggerUnloaded(); 7082 CheckDebuggerUnloaded();
7120 } 7083 }
7121 7084
7122 7085
7123 TEST(DebugContextIsPreservedBetweenAccesses) { 7086 TEST(DebugContextIsPreservedBetweenAccesses) {
7124 v8::HandleScope scope(v8::Isolate::GetCurrent()); 7087 v8::HandleScope scope(v8::Isolate::GetCurrent());
7125 v8::Local<v8::Context> context1 = v8::Debug::GetDebugContext(); 7088 v8::Local<v8::Context> context1 = v8::Debug::GetDebugContext();
7126 v8::Local<v8::Context> context2 = v8::Debug::GetDebugContext(); 7089 v8::Local<v8::Context> context2 = v8::Debug::GetDebugContext();
(...skipping 12 matching lines...) Expand all
7139 TEST(DebugEventContext) { 7102 TEST(DebugEventContext) {
7140 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 7103 v8::Isolate* isolate = v8::Isolate::GetCurrent();
7141 v8::HandleScope scope(isolate); 7104 v8::HandleScope scope(isolate);
7142 expected_callback_data = v8::Int32::New(2010); 7105 expected_callback_data = v8::Int32::New(2010);
7143 expected_context = v8::Context::New(isolate); 7106 expected_context = v8::Context::New(isolate);
7144 v8::Debug::SetDebugEventListener2(DebugEventContextChecker, 7107 v8::Debug::SetDebugEventListener2(DebugEventContextChecker,
7145 expected_callback_data); 7108 expected_callback_data);
7146 v8::Context::Scope context_scope(expected_context); 7109 v8::Context::Scope context_scope(expected_context);
7147 v8::Script::Compile(v8::String::New("(function(){debugger;})();"))->Run(); 7110 v8::Script::Compile(v8::String::New("(function(){debugger;})();"))->Run();
7148 expected_context.Clear(); 7111 expected_context.Clear();
7149 v8::Debug::SetDebugEventListener(NULL); 7112 v8::Debug::SetDebugEventListener2(NULL);
7150 expected_context_data = v8::Handle<v8::Value>(); 7113 expected_context_data = v8::Handle<v8::Value>();
7151 CheckDebuggerUnloaded(); 7114 CheckDebuggerUnloaded();
7152 } 7115 }
7153 7116
7154 7117
7155 static void* expected_break_data; 7118 static void* expected_break_data;
7156 static bool was_debug_break_called; 7119 static bool was_debug_break_called;
7157 static bool was_debug_event_called; 7120 static bool was_debug_event_called;
7158 static void DebugEventBreakDataChecker(const v8::Debug::EventDetails& details) { 7121 static void DebugEventBreakDataChecker(const v8::Debug::EventDetails& details) {
7159 if (details.GetEvent() == v8::BreakForCommand) { 7122 if (details.GetEvent() == v8::BreakForCommand) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
7206 v8::Debug::DebugBreak(); 7169 v8::Debug::DebugBreak();
7207 v8::Debug::DebugBreakForCommand(data2); 7170 v8::Debug::DebugBreakForCommand(data2);
7208 v8::Script::Compile(v8::String::New("(function(x){return x+3;})(1);"))->Run(); 7171 v8::Script::Compile(v8::String::New("(function(x){return x+3;})(1);"))->Run();
7209 CHECK(was_debug_event_called); 7172 CHECK(was_debug_event_called);
7210 CHECK(was_debug_break_called); 7173 CHECK(was_debug_break_called);
7211 7174
7212 CHECK_EQ(2, TestClientData::constructor_call_counter); 7175 CHECK_EQ(2, TestClientData::constructor_call_counter);
7213 CHECK_EQ(TestClientData::constructor_call_counter, 7176 CHECK_EQ(TestClientData::constructor_call_counter,
7214 TestClientData::destructor_call_counter); 7177 TestClientData::destructor_call_counter);
7215 7178
7216 v8::Debug::SetDebugEventListener(NULL); 7179 v8::Debug::SetDebugEventListener2(NULL);
7217 CheckDebuggerUnloaded(); 7180 CheckDebuggerUnloaded();
7218 } 7181 }
7219 7182
7220 static bool debug_event_break_deoptimize_done = false; 7183 static bool debug_event_break_deoptimize_done = false;
7221 7184
7222 static void DebugEventBreakDeoptimize(v8::DebugEvent event, 7185 static void DebugEventBreakDeoptimize(
7223 v8::Handle<v8::Object> exec_state, 7186 const v8::Debug::EventDetails& event_details) {
7224 v8::Handle<v8::Object> event_data, 7187 v8::DebugEvent event = event_details.GetEvent();
7225 v8::Handle<v8::Value> data) { 7188 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
7226 if (event == v8::Break) { 7189 if (event == v8::Break) {
7227 if (!frame_function_name.IsEmpty()) { 7190 if (!frame_function_name.IsEmpty()) {
7228 // Get the name of the function. 7191 // Get the name of the function.
7229 const int argc = 2; 7192 const int argc = 2;
7230 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) }; 7193 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) };
7231 v8::Handle<v8::Value> result = 7194 v8::Handle<v8::Value> result =
7232 frame_function_name->Call(exec_state, argc, argv); 7195 frame_function_name->Call(exec_state, argc, argv);
7233 if (!result->IsUndefined()) { 7196 if (!result->IsUndefined()) {
7234 char fn[80]; 7197 char fn[80];
7235 CHECK(result->IsString()); 7198 CHECK(result->IsString());
(...skipping 22 matching lines...) Expand all
7258 frame_function_name = CompileFunction(&env, 7221 frame_function_name = CompileFunction(&env,
7259 frame_function_name_source, 7222 frame_function_name_source,
7260 "frame_function_name"); 7223 "frame_function_name");
7261 7224
7262 7225
7263 // Set a debug event listener which will keep interrupting execution until 7226 // Set a debug event listener which will keep interrupting execution until
7264 // debug break. When inside function bar it will deoptimize all functions. 7227 // debug break. When inside function bar it will deoptimize all functions.
7265 // This tests lazy deoptimization bailout for the stack check, as the first 7228 // This tests lazy deoptimization bailout for the stack check, as the first
7266 // time in function bar when using debug break and no break points will be at 7229 // time in function bar when using debug break and no break points will be at
7267 // the initial stack check. 7230 // the initial stack check.
7268 v8::Debug::SetDebugEventListener(DebugEventBreakDeoptimize, 7231 v8::Debug::SetDebugEventListener2(DebugEventBreakDeoptimize);
7269 v8::Undefined());
7270 7232
7271 // Compile and run function bar which will optimize it for some flag settings. 7233 // Compile and run function bar which will optimize it for some flag settings.
7272 v8::Script::Compile(v8::String::New("function bar(){}; bar()"))->Run(); 7234 v8::Script::Compile(v8::String::New("function bar(){}; bar()"))->Run();
7273 7235
7274 // Set debug break and call bar again. 7236 // Set debug break and call bar again.
7275 v8::Debug::DebugBreak(); 7237 v8::Debug::DebugBreak();
7276 v8::Script::Compile(v8::String::New("bar()"))->Run(); 7238 v8::Script::Compile(v8::String::New("bar()"))->Run();
7277 7239
7278 CHECK(debug_event_break_deoptimize_done); 7240 CHECK(debug_event_break_deoptimize_done);
7279 7241
7280 v8::Debug::SetDebugEventListener(NULL); 7242 v8::Debug::SetDebugEventListener2(NULL);
7281 } 7243 }
7282 7244
7283 7245
7284 static void DebugEventBreakWithOptimizedStack(v8::DebugEvent event, 7246 static void DebugEventBreakWithOptimizedStack(
7285 v8::Handle<v8::Object> exec_state, 7247 const v8::Debug::EventDetails& event_details) {
7286 v8::Handle<v8::Object> event_data, 7248 v8::DebugEvent event = event_details.GetEvent();
7287 v8::Handle<v8::Value> data) { 7249 v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
7288 if (event == v8::Break) { 7250 if (event == v8::Break) {
7289 if (!frame_function_name.IsEmpty()) { 7251 if (!frame_function_name.IsEmpty()) {
7290 for (int i = 0; i < 2; i++) { 7252 for (int i = 0; i < 2; i++) {
7291 const int argc = 2; 7253 const int argc = 2;
7292 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(i) }; 7254 v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(i) };
7293 // Get the name of the function in frame i. 7255 // Get the name of the function in frame i.
7294 v8::Handle<v8::Value> result = 7256 v8::Handle<v8::Value> result =
7295 frame_function_name->Call(exec_state, argc, argv); 7257 frame_function_name->Call(exec_state, argc, argv);
7296 CHECK(result->IsString()); 7258 CHECK(result->IsString());
7297 v8::Handle<v8::String> function_name(result->ToString()); 7259 v8::Handle<v8::String> function_name(result->ToString());
(...skipping 24 matching lines...) Expand all
7322 // optimized frames. 7284 // optimized frames.
7323 result = frame_local_value->Call(exec_state, argc, argv); 7285 result = frame_local_value->Call(exec_state, argc, argv);
7324 CHECK(result->IsUndefined() || (result->Int32Value() == 42)); 7286 CHECK(result->IsUndefined() || (result->Int32Value() == 42));
7325 } 7287 }
7326 } 7288 }
7327 } 7289 }
7328 } 7290 }
7329 7291
7330 7292
7331 static void ScheduleBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { 7293 static void ScheduleBreak(const v8::FunctionCallbackInfo<v8::Value>& args) {
7332 v8::Debug::SetDebugEventListener(DebugEventBreakWithOptimizedStack, 7294 v8::Debug::SetDebugEventListener2(DebugEventBreakWithOptimizedStack);
7333 v8::Undefined());
7334 v8::Debug::DebugBreak(); 7295 v8::Debug::DebugBreak();
7335 } 7296 }
7336 7297
7337 7298
7338 TEST(DebugBreakStackInspection) { 7299 TEST(DebugBreakStackInspection) {
7339 DebugLocalContext env; 7300 DebugLocalContext env;
7340 v8::HandleScope scope(env->GetIsolate()); 7301 v8::HandleScope scope(env->GetIsolate());
7341 7302
7342 frame_function_name = 7303 frame_function_name =
7343 CompileFunction(&env, frame_function_name_source, "frame_function_name"); 7304 CompileFunction(&env, frame_function_name_source, "frame_function_name");
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
7406 } 7367 }
7407 } 7368 }
7408 } 7369 }
7409 7370
7410 7371
7411 TEST(DebugBreakLoop) { 7372 TEST(DebugBreakLoop) {
7412 DebugLocalContext env; 7373 DebugLocalContext env;
7413 v8::HandleScope scope(env->GetIsolate()); 7374 v8::HandleScope scope(env->GetIsolate());
7414 7375
7415 // Register a debug event listener which sets the break flag and counts. 7376 // Register a debug event listener which sets the break flag and counts.
7416 v8::Debug::SetDebugEventListener(DebugEventBreakMax); 7377 v8::Debug::SetDebugEventListener2(DebugEventBreakMax);
7417 7378
7418 // Create a function for getting the frame count when hitting the break. 7379 // Create a function for getting the frame count when hitting the break.
7419 frame_count = CompileFunction(&env, frame_count_source, "frame_count"); 7380 frame_count = CompileFunction(&env, frame_count_source, "frame_count");
7420 7381
7421 CompileRun("var a = 1;"); 7382 CompileRun("var a = 1;");
7422 CompileRun("function g() { }"); 7383 CompileRun("function g() { }");
7423 CompileRun("function h() { }"); 7384 CompileRun("function h() { }");
7424 7385
7425 const char* loop_bodies[] = { 7386 const char* loop_bodies[] = {
7426 "", 7387 "",
(...skipping 13 matching lines...) Expand all
7440 TestDebugBreakInLoop("while (true) {", loop_bodies, "}"); 7401 TestDebugBreakInLoop("while (true) {", loop_bodies, "}");
7441 TestDebugBreakInLoop("while (a == 1) {", loop_bodies, "}"); 7402 TestDebugBreakInLoop("while (a == 1) {", loop_bodies, "}");
7442 7403
7443 TestDebugBreakInLoop("do {", loop_bodies, "} while (true)"); 7404 TestDebugBreakInLoop("do {", loop_bodies, "} while (true)");
7444 TestDebugBreakInLoop("do {", loop_bodies, "} while (a == 1)"); 7405 TestDebugBreakInLoop("do {", loop_bodies, "} while (a == 1)");
7445 7406
7446 TestDebugBreakInLoop("for (;;) {", loop_bodies, "}"); 7407 TestDebugBreakInLoop("for (;;) {", loop_bodies, "}");
7447 TestDebugBreakInLoop("for (;a == 1;) {", loop_bodies, "}"); 7408 TestDebugBreakInLoop("for (;a == 1;) {", loop_bodies, "}");
7448 7409
7449 // Get rid of the debug event listener. 7410 // Get rid of the debug event listener.
7450 v8::Debug::SetDebugEventListener(NULL); 7411 v8::Debug::SetDebugEventListener2(NULL);
7451 CheckDebuggerUnloaded(); 7412 CheckDebuggerUnloaded();
7452 } 7413 }
7453 7414
7454 7415
7455 v8::Local<v8::Script> inline_script; 7416 v8::Local<v8::Script> inline_script;
7456 7417
7457 static void DebugBreakInlineListener(v8::DebugEvent event, 7418 static void DebugBreakInlineListener(
7458 v8::Handle<v8::Object> exec_state, 7419 const v8::Debug::EventDetails& event_details) {
7459 v8::Handle<v8::Object> event_data, 7420 v8::DebugEvent event = event_details.GetEvent();
7460 v8::Handle<v8::Value> data) {
7461 if (event != v8::Break) return; 7421 if (event != v8::Break) return;
7462 7422
7463 int expected_frame_count = 4; 7423 int expected_frame_count = 4;
7464 int expected_line_number[] = {1, 4, 7, 12}; 7424 int expected_line_number[] = {1, 4, 7, 12};
7465 7425
7466 i::Handle<i::Object> compiled_script = v8::Utils::OpenHandle(*inline_script); 7426 i::Handle<i::Object> compiled_script = v8::Utils::OpenHandle(*inline_script);
7467 i::Handle<i::Script> source_script = i::Handle<i::Script>(i::Script::cast( 7427 i::Handle<i::Script> source_script = i::Handle<i::Script>(i::Script::cast(
7468 i::JSFunction::cast(*compiled_script)->shared()->script())); 7428 i::JSFunction::cast(*compiled_script)->shared()->script()));
7469 7429
7470 int break_id = v8::internal::Isolate::Current()->debug()->break_id(); 7430 int break_id = v8::internal::Isolate::Current()->debug()->break_id();
7471 char script[128]; 7431 char script[128];
7472 i::Vector<char> script_vector(script, sizeof(script)); 7432 i::Vector<char> script_vector(script, sizeof(script));
7473 OS::SNPrintF(script_vector, "%%GetFrameCount(%d)", break_id); 7433 OS::SNPrintF(script_vector, "%%GetFrameCount(%d)", break_id);
7474 v8::Local<v8::Value> result = CompileRun(script); 7434 v8::Local<v8::Value> result = CompileRun(script);
7475 7435
7476 int frame_count = result->Int32Value(); 7436 int frame_count = result->Int32Value();
7477 CHECK_EQ(expected_frame_count, frame_count); 7437 CHECK_EQ(expected_frame_count, frame_count);
7478 7438
7479 for (int i = 0; i < frame_count; i++) { 7439 for (int i = 0; i < frame_count; i++) {
7480 // The 5. element in the returned array of GetFrameDetails contains the 7440 // The 5. element in the returned array of GetFrameDetails contains the
7481 // source position of that frame. 7441 // source position of that frame.
7482 OS::SNPrintF(script_vector, "%%GetFrameDetails(%d, %d)[5]", break_id, i); 7442 OS::SNPrintF(script_vector, "%%GetFrameDetails(%d, %d)[5]", break_id, i);
7483 v8::Local<v8::Value> result = CompileRun(script); 7443 v8::Local<v8::Value> result = CompileRun(script);
7484 CHECK_EQ(expected_line_number[i], 7444 CHECK_EQ(expected_line_number[i],
7485 i::GetScriptLineNumber(source_script, result->Int32Value())); 7445 i::GetScriptLineNumber(source_script, result->Int32Value()));
7486 } 7446 }
7487 v8::Debug::SetDebugEventListener(NULL); 7447 v8::Debug::SetDebugEventListener2(NULL);
7488 v8::V8::TerminateExecution(); 7448 v8::V8::TerminateExecution();
7489 } 7449 }
7490 7450
7491 7451
7492 TEST(DebugBreakInline) { 7452 TEST(DebugBreakInline) {
7493 i::FLAG_allow_natives_syntax = true; 7453 i::FLAG_allow_natives_syntax = true;
7494 DebugLocalContext env; 7454 DebugLocalContext env;
7495 v8::HandleScope scope(env->GetIsolate()); 7455 v8::HandleScope scope(env->GetIsolate());
7496 const char* source = 7456 const char* source =
7497 "function debug(b) { \n" 7457 "function debug(b) { \n"
7498 " if (b) debugger; \n" 7458 " if (b) debugger; \n"
7499 "} \n" 7459 "} \n"
7500 "function f(b) { \n" 7460 "function f(b) { \n"
7501 " debug(b) \n" 7461 " debug(b) \n"
7502 "}; \n" 7462 "}; \n"
7503 "function g(b) { \n" 7463 "function g(b) { \n"
7504 " f(b); \n" 7464 " f(b); \n"
7505 "}; \n" 7465 "}; \n"
7506 "g(false); \n" 7466 "g(false); \n"
7507 "g(false); \n" 7467 "g(false); \n"
7508 "%OptimizeFunctionOnNextCall(g); \n" 7468 "%OptimizeFunctionOnNextCall(g); \n"
7509 "g(true);"; 7469 "g(true);";
7510 v8::Debug::SetDebugEventListener(DebugBreakInlineListener); 7470 v8::Debug::SetDebugEventListener2(DebugBreakInlineListener);
7511 inline_script = v8::Script::Compile(v8::String::New(source)); 7471 inline_script = v8::Script::Compile(v8::String::New(source));
7512 inline_script->Run(); 7472 inline_script->Run();
7513 } 7473 }
7514 7474
7515 7475
7516 static void DebugEventStepNext(v8::DebugEvent event, 7476 static void DebugEventStepNext(
7517 v8::Handle<v8::Object> exec_state, 7477 const v8::Debug::EventDetails& event_details) {
7518 v8::Handle<v8::Object> event_data, 7478 v8::DebugEvent event = event_details.GetEvent();
7519 v8::Handle<v8::Value> data) {
7520 if (event == v8::Break) { 7479 if (event == v8::Break) {
7521 PrepareStep(StepNext); 7480 PrepareStep(StepNext);
7522 } 7481 }
7523 } 7482 }
7524 7483
7525 7484
7526 static void RunScriptInANewCFrame(const char* source) { 7485 static void RunScriptInANewCFrame(const char* source) {
7527 v8::TryCatch try_catch; 7486 v8::TryCatch try_catch;
7528 CompileRun(source); 7487 CompileRun(source);
7529 CHECK(try_catch.HasCaught()); 7488 CHECK(try_catch.HasCaught());
7530 } 7489 }
7531 7490
7532 7491
7533 TEST(Regress131642) { 7492 TEST(Regress131642) {
7534 // Bug description: 7493 // Bug description:
7535 // When doing StepNext through the first script, the debugger is not reset 7494 // When doing StepNext through the first script, the debugger is not reset
7536 // after exiting through exception. A flawed implementation enabling the 7495 // after exiting through exception. A flawed implementation enabling the
7537 // debugger to step into Array.prototype.forEach breaks inside the callback 7496 // debugger to step into Array.prototype.forEach breaks inside the callback
7538 // for forEach in the second script under the assumption that we are in a 7497 // for forEach in the second script under the assumption that we are in a
7539 // recursive call. In an attempt to step out, we crawl the stack using the 7498 // recursive call. In an attempt to step out, we crawl the stack using the
7540 // recorded frame pointer from the first script and fail when not finding it 7499 // recorded frame pointer from the first script and fail when not finding it
7541 // on the stack. 7500 // on the stack.
7542 DebugLocalContext env; 7501 DebugLocalContext env;
7543 v8::HandleScope scope(env->GetIsolate()); 7502 v8::HandleScope scope(env->GetIsolate());
7544 v8::Debug::SetDebugEventListener(DebugEventStepNext); 7503 v8::Debug::SetDebugEventListener2(DebugEventStepNext);
7545 7504
7546 // We step through the first script. It exits through an exception. We run 7505 // We step through the first script. It exits through an exception. We run
7547 // this inside a new frame to record a different FP than the second script 7506 // this inside a new frame to record a different FP than the second script
7548 // would expect. 7507 // would expect.
7549 const char* script_1 = "debugger; throw new Error();"; 7508 const char* script_1 = "debugger; throw new Error();";
7550 RunScriptInANewCFrame(script_1); 7509 RunScriptInANewCFrame(script_1);
7551 7510
7552 // The second script uses forEach. 7511 // The second script uses forEach.
7553 const char* script_2 = "[0].forEach(function() { });"; 7512 const char* script_2 = "[0].forEach(function() { });";
7554 CompileRun(script_2); 7513 CompileRun(script_2);
7555 7514
7556 v8::Debug::SetDebugEventListener(NULL); 7515 v8::Debug::SetDebugEventListener2(NULL);
7557 } 7516 }
7558 7517
7559 7518
7560 // Import from test-heap.cc 7519 // Import from test-heap.cc
7561 int CountNativeContexts(); 7520 int CountNativeContexts();
7562 7521
7563 7522
7564 static void NopListener(v8::DebugEvent event, 7523 static void NopListener(const v8::Debug::EventDetails& event_details) {
7565 v8::Handle<v8::Object> exec_state,
7566 v8::Handle<v8::Object> event_data,
7567 v8::Handle<v8::Value> data) {
7568 } 7524 }
7569 7525
7570 7526
7571 TEST(DebuggerCreatesContextIffActive) { 7527 TEST(DebuggerCreatesContextIffActive) {
7572 DebugLocalContext env; 7528 DebugLocalContext env;
7573 v8::HandleScope scope(env->GetIsolate()); 7529 v8::HandleScope scope(env->GetIsolate());
7574 CHECK_EQ(1, CountNativeContexts()); 7530 CHECK_EQ(1, CountNativeContexts());
7575 7531
7576 v8::Debug::SetDebugEventListener(NULL); 7532 v8::Debug::SetDebugEventListener2(NULL);
7577 CompileRun("debugger;"); 7533 CompileRun("debugger;");
7578 CHECK_EQ(1, CountNativeContexts()); 7534 CHECK_EQ(1, CountNativeContexts());
7579 7535
7580 v8::Debug::SetDebugEventListener(NopListener); 7536 v8::Debug::SetDebugEventListener2(NopListener);
7581 CompileRun("debugger;"); 7537 CompileRun("debugger;");
7582 CHECK_EQ(2, CountNativeContexts()); 7538 CHECK_EQ(2, CountNativeContexts());
7583 7539
7584 v8::Debug::SetDebugEventListener(NULL); 7540 v8::Debug::SetDebugEventListener2(NULL);
7585 } 7541 }
7586 7542
7587 7543
7588 TEST(LiveEditEnabled) { 7544 TEST(LiveEditEnabled) {
7589 v8::internal::FLAG_allow_natives_syntax = true; 7545 v8::internal::FLAG_allow_natives_syntax = true;
7590 LocalContext env; 7546 LocalContext env;
7591 v8::HandleScope scope(env->GetIsolate()); 7547 v8::HandleScope scope(env->GetIsolate());
7592 v8::Debug::SetLiveEditEnabled(true); 7548 v8::Debug::SetLiveEditEnabled(true);
7593 CompileRun("%LiveEditCompareStrings('', '')"); 7549 CompileRun("%LiveEditCompareStrings('', '')");
7594 } 7550 }
7595 7551
7596 7552
7597 TEST(LiveEditDisabled) { 7553 TEST(LiveEditDisabled) {
7598 v8::internal::FLAG_allow_natives_syntax = true; 7554 v8::internal::FLAG_allow_natives_syntax = true;
7599 LocalContext env; 7555 LocalContext env;
7600 v8::HandleScope scope(env->GetIsolate()); 7556 v8::HandleScope scope(env->GetIsolate());
7601 v8::Debug::SetLiveEditEnabled(false); 7557 v8::Debug::SetLiveEditEnabled(false);
7602 CompileRun("%LiveEditCompareStrings('', '')"); 7558 CompileRun("%LiveEditCompareStrings('', '')");
7603 } 7559 }
7604 7560
7605 7561
7606 #endif // ENABLE_DEBUGGER_SUPPORT 7562 #endif // ENABLE_DEBUGGER_SUPPORT
OLDNEW
« no previous file with comments | « src/isolate.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698