OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/arguments.h" | 8 #include "src/arguments.h" |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 } | 919 } |
920 // Remove all debug info. | 920 // Remove all debug info. |
921 while (debug_info_list_ != NULL) { | 921 while (debug_info_list_ != NULL) { |
922 RemoveDebugInfoAndClearFromShared(debug_info_list_->debug_info()); | 922 RemoveDebugInfoAndClearFromShared(debug_info_list_->debug_info()); |
923 } | 923 } |
924 } | 924 } |
925 | 925 |
926 | 926 |
927 void Debug::FloodWithOneShot(Handle<JSFunction> function, | 927 void Debug::FloodWithOneShot(Handle<JSFunction> function, |
928 BreakLocatorType type) { | 928 BreakLocatorType type) { |
929 // Do not ever break in native and extension functions. | |
930 if (!function->IsSubjectToDebugging()) return; | |
931 | |
932 PrepareForBreakPoints(); | 929 PrepareForBreakPoints(); |
933 | 930 |
934 // Make sure the function is compiled and has set up the debug info. | 931 // Make sure the function is compiled and has set up the debug info. |
935 Handle<SharedFunctionInfo> shared(function->shared()); | 932 Handle<SharedFunctionInfo> shared(function->shared()); |
936 if (!EnsureDebugInfo(shared, function)) { | 933 if (!EnsureDebugInfo(shared, function)) { |
937 // Return if we failed to retrieve the debug info. | 934 // Return if we failed to retrieve the debug info. |
938 return; | 935 return; |
939 } | 936 } |
940 | 937 |
941 // Flood the function with break points. | 938 // Flood the function with break points. |
942 for (BreakLocation::Iterator it(GetDebugInfo(shared), type); !it.Done(); | 939 for (BreakLocation::Iterator it(GetDebugInfo(shared), type); !it.Done(); |
943 it.Next()) { | 940 it.Next()) { |
944 it.GetBreakLocation().SetOneShot(); | 941 it.GetBreakLocation().SetOneShot(); |
945 } | 942 } |
946 } | 943 } |
947 | 944 |
948 | 945 |
949 void Debug::FloodBoundFunctionWithOneShot(Handle<JSFunction> function) { | 946 void Debug::FloodBoundFunctionWithOneShot(Handle<JSFunction> function) { |
950 Handle<FixedArray> new_bindings(function->function_bindings()); | 947 Handle<FixedArray> new_bindings(function->function_bindings()); |
951 Handle<Object> bindee(new_bindings->get(JSFunction::kBoundFunctionIndex), | 948 Handle<Object> bindee(new_bindings->get(JSFunction::kBoundFunctionIndex), |
952 isolate_); | 949 isolate_); |
953 | 950 |
954 if (!bindee.is_null() && bindee->IsJSFunction() && | 951 if (!bindee.is_null() && bindee->IsJSFunction()) { |
955 JSFunction::cast(*bindee)->IsSubjectToDebugging()) { | |
956 Handle<JSFunction> bindee_function(JSFunction::cast(*bindee)); | 952 Handle<JSFunction> bindee_function(JSFunction::cast(*bindee)); |
957 FloodWithOneShotGeneric(bindee_function); | 953 FloodWithOneShotGeneric(bindee_function); |
958 } | 954 } |
959 } | 955 } |
960 | 956 |
961 | 957 |
962 void Debug::FloodDefaultConstructorWithOneShot(Handle<JSFunction> function) { | 958 void Debug::FloodDefaultConstructorWithOneShot(Handle<JSFunction> function) { |
963 DCHECK(function->shared()->is_default_constructor()); | 959 DCHECK(function->shared()->is_default_constructor()); |
964 // Instead of stepping into the function we directly step into the super class | 960 // Instead of stepping into the function we directly step into the super class |
965 // constructor. | 961 // constructor. |
(...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1874 break; | 1870 break; |
1875 } | 1871 } |
1876 } | 1872 } |
1877 return isolate_->factory()->undefined_value(); | 1873 return isolate_->factory()->undefined_value(); |
1878 } | 1874 } |
1879 | 1875 |
1880 | 1876 |
1881 // Ensures the debug information is present for shared. | 1877 // Ensures the debug information is present for shared. |
1882 bool Debug::EnsureDebugInfo(Handle<SharedFunctionInfo> shared, | 1878 bool Debug::EnsureDebugInfo(Handle<SharedFunctionInfo> shared, |
1883 Handle<JSFunction> function) { | 1879 Handle<JSFunction> function) { |
1884 Isolate* isolate = shared->GetIsolate(); | 1880 if (!shared->IsSubjectToDebugging()) return false; |
1885 | 1881 |
1886 // Return if we already have the debug info for shared. | 1882 // Return if we already have the debug info for shared. |
1887 if (HasDebugInfo(shared)) { | 1883 if (HasDebugInfo(shared)) { |
1888 DCHECK(shared->is_compiled()); | 1884 DCHECK(shared->is_compiled()); |
| 1885 DCHECK(shared->code()->has_debug_break_slots()); |
1889 return true; | 1886 return true; |
1890 } | 1887 } |
1891 | 1888 |
1892 // There will be at least one break point when we are done. | 1889 // There will be at least one break point when we are done. |
1893 has_break_points_ = true; | 1890 has_break_points_ = true; |
1894 | 1891 |
1895 // Ensure function is compiled. Return false if this failed. | 1892 if (function.is_null()) { |
1896 if (!function.is_null() && | 1893 DCHECK(shared->is_compiled()); |
1897 !Compiler::EnsureCompiled(function, CLEAR_EXCEPTION)) { | 1894 DCHECK(shared->code()->has_debug_break_slots()); |
| 1895 } else if (!Compiler::EnsureCompiled(function, CLEAR_EXCEPTION)) { |
1898 return false; | 1896 return false; |
1899 } | 1897 } |
1900 | 1898 |
1901 // Make sure IC state is clean. This is so that we correctly flood | 1899 // Make sure IC state is clean. This is so that we correctly flood |
1902 // accessor pairs when stepping in. | 1900 // accessor pairs when stepping in. |
1903 shared->code()->ClearInlineCaches(); | 1901 shared->code()->ClearInlineCaches(); |
1904 shared->feedback_vector()->ClearICSlots(*shared); | 1902 shared->feedback_vector()->ClearICSlots(*shared); |
1905 | 1903 |
1906 // Create the debug info object. | 1904 // Create the debug info object. |
1907 Handle<DebugInfo> debug_info = isolate->factory()->NewDebugInfo(shared); | 1905 DCHECK(shared->is_compiled()); |
| 1906 DCHECK(shared->code()->has_debug_break_slots()); |
| 1907 Handle<DebugInfo> debug_info = isolate_->factory()->NewDebugInfo(shared); |
1908 | 1908 |
1909 // Add debug info to the list. | 1909 // Add debug info to the list. |
1910 DebugInfoListNode* node = new DebugInfoListNode(*debug_info); | 1910 DebugInfoListNode* node = new DebugInfoListNode(*debug_info); |
1911 node->set_next(debug_info_list_); | 1911 node->set_next(debug_info_list_); |
1912 debug_info_list_ = node; | 1912 debug_info_list_ = node; |
1913 | 1913 |
1914 return true; | 1914 return true; |
1915 } | 1915 } |
1916 | 1916 |
1917 | 1917 |
(...skipping 1153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3071 } | 3071 } |
3072 | 3072 |
3073 | 3073 |
3074 void LockingCommandMessageQueue::Clear() { | 3074 void LockingCommandMessageQueue::Clear() { |
3075 base::LockGuard<base::Mutex> lock_guard(&mutex_); | 3075 base::LockGuard<base::Mutex> lock_guard(&mutex_); |
3076 queue_.Clear(); | 3076 queue_.Clear(); |
3077 } | 3077 } |
3078 | 3078 |
3079 } // namespace internal | 3079 } // namespace internal |
3080 } // namespace v8 | 3080 } // namespace v8 |
OLD | NEW |