| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
| 6 | 6 |
| 7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/compiler.h" | 8 #include "src/compiler.h" |
| 9 #include "src/debug/debug-coverage.h" | 9 #include "src/debug/debug-coverage.h" |
| 10 #include "src/debug/debug-evaluate.h" | 10 #include "src/debug/debug-evaluate.h" |
| 11 #include "src/debug/debug-frames.h" | 11 #include "src/debug/debug-frames.h" |
| 12 #include "src/debug/debug-scopes.h" | 12 #include "src/debug/debug-scopes.h" |
| 13 #include "src/debug/debug.h" | 13 #include "src/debug/debug.h" |
| 14 #include "src/debug/liveedit.h" | 14 #include "src/debug/liveedit.h" |
| 15 #include "src/frames-inl.h" | 15 #include "src/frames-inl.h" |
| 16 #include "src/globals.h" | 16 #include "src/globals.h" |
| 17 #include "src/interpreter/bytecodes.h" | 17 #include "src/interpreter/bytecodes.h" |
| 18 #include "src/interpreter/interpreter.h" | 18 #include "src/interpreter/interpreter.h" |
| 19 #include "src/isolate-inl.h" | 19 #include "src/isolate-inl.h" |
| 20 #include "src/objects/debug-objects-inl.h" |
| 20 #include "src/runtime/runtime.h" | 21 #include "src/runtime/runtime.h" |
| 21 #include "src/wasm/wasm-module.h" | 22 #include "src/wasm/wasm-module.h" |
| 22 #include "src/wasm/wasm-objects.h" | 23 #include "src/wasm/wasm-objects.h" |
| 23 | 24 |
| 24 namespace v8 { | 25 namespace v8 { |
| 25 namespace internal { | 26 namespace internal { |
| 26 | 27 |
| 27 RUNTIME_FUNCTION(Runtime_DebugBreak) { | 28 RUNTIME_FUNCTION(Runtime_DebugBreak) { |
| 28 SealHandleScope shs(isolate); | 29 SealHandleScope shs(isolate); |
| 29 DCHECK_EQ(1, args.length()); | 30 DCHECK_EQ(1, args.length()); |
| (...skipping 1883 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1913 RUNTIME_FUNCTION(Runtime_DebugIsActive) { | 1914 RUNTIME_FUNCTION(Runtime_DebugIsActive) { |
| 1914 SealHandleScope shs(isolate); | 1915 SealHandleScope shs(isolate); |
| 1915 return Smi::FromInt(isolate->debug()->is_active()); | 1916 return Smi::FromInt(isolate->debug()->is_active()); |
| 1916 } | 1917 } |
| 1917 | 1918 |
| 1918 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { | 1919 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { |
| 1919 UNIMPLEMENTED(); | 1920 UNIMPLEMENTED(); |
| 1920 return NULL; | 1921 return NULL; |
| 1921 } | 1922 } |
| 1922 | 1923 |
| 1924 namespace { |
| 1925 Handle<JSObject> MakeRangeObject(Isolate* isolate, const CoverageBlock& range) { |
| 1926 Factory* factory = isolate->factory(); |
| 1927 |
| 1928 Handle<String> start_string = factory->InternalizeUtf8String("start"); |
| 1929 Handle<String> end_string = factory->InternalizeUtf8String("end"); |
| 1930 Handle<String> count_string = factory->InternalizeUtf8String("count"); |
| 1931 |
| 1932 Handle<JSObject> range_obj = factory->NewJSObjectWithNullProto(); |
| 1933 JSObject::AddProperty(range_obj, start_string, |
| 1934 factory->NewNumberFromInt(range.start), NONE); |
| 1935 JSObject::AddProperty(range_obj, end_string, |
| 1936 factory->NewNumberFromInt(range.end), NONE); |
| 1937 JSObject::AddProperty(range_obj, count_string, |
| 1938 factory->NewNumberFromUint(range.count), NONE); |
| 1939 |
| 1940 return range_obj; |
| 1941 } |
| 1942 } // namespace |
| 1943 |
| 1923 RUNTIME_FUNCTION(Runtime_DebugCollectCoverage) { | 1944 RUNTIME_FUNCTION(Runtime_DebugCollectCoverage) { |
| 1924 HandleScope scope(isolate); | 1945 HandleScope scope(isolate); |
| 1925 DCHECK_EQ(0, args.length()); | 1946 DCHECK_EQ(0, args.length()); |
| 1926 // Collect coverage data. | 1947 // Collect coverage data. |
| 1927 std::unique_ptr<Coverage> coverage; | 1948 std::unique_ptr<Coverage> coverage; |
| 1928 if (isolate->is_best_effort_code_coverage()) { | 1949 if (isolate->is_best_effort_code_coverage()) { |
| 1929 coverage.reset(Coverage::CollectBestEffort(isolate)); | 1950 coverage.reset(Coverage::CollectBestEffort(isolate)); |
| 1930 } else { | 1951 } else { |
| 1931 coverage.reset(Coverage::CollectPrecise(isolate)); | 1952 coverage.reset(Coverage::CollectPrecise(isolate)); |
| 1932 } | 1953 } |
| 1933 Factory* factory = isolate->factory(); | 1954 Factory* factory = isolate->factory(); |
| 1934 // Turn the returned data structure into JavaScript. | 1955 // Turn the returned data structure into JavaScript. |
| 1935 // Create an array of scripts. | 1956 // Create an array of scripts. |
| 1936 int num_scripts = static_cast<int>(coverage->size()); | 1957 int num_scripts = static_cast<int>(coverage->size()); |
| 1937 // Prepare property keys. | 1958 // Prepare property keys. |
| 1938 Handle<FixedArray> scripts_array = factory->NewFixedArray(num_scripts); | 1959 Handle<FixedArray> scripts_array = factory->NewFixedArray(num_scripts); |
| 1939 Handle<String> script_string = factory->NewStringFromStaticChars("script"); | 1960 Handle<String> script_string = factory->NewStringFromStaticChars("script"); |
| 1940 Handle<String> start_string = factory->NewStringFromStaticChars("start"); | |
| 1941 Handle<String> end_string = factory->NewStringFromStaticChars("end"); | |
| 1942 Handle<String> count_string = factory->NewStringFromStaticChars("count"); | |
| 1943 for (int i = 0; i < num_scripts; i++) { | 1961 for (int i = 0; i < num_scripts; i++) { |
| 1944 const auto& script_data = coverage->at(i); | 1962 const auto& script_data = coverage->at(i); |
| 1945 HandleScope inner_scope(isolate); | 1963 HandleScope inner_scope(isolate); |
| 1964 |
| 1965 std::vector<CoverageBlock> ranges; |
| 1946 int num_functions = static_cast<int>(script_data.functions.size()); | 1966 int num_functions = static_cast<int>(script_data.functions.size()); |
| 1947 Handle<FixedArray> functions_array = factory->NewFixedArray(num_functions); | |
| 1948 for (int j = 0; j < num_functions; j++) { | 1967 for (int j = 0; j < num_functions; j++) { |
| 1949 const auto& function_data = script_data.functions[j]; | 1968 const auto& function_data = script_data.functions[j]; |
| 1950 Handle<JSObject> range_obj = factory->NewJSObjectWithNullProto(); | 1969 ranges.emplace_back(function_data.start, function_data.end, |
| 1951 JSObject::AddProperty(range_obj, start_string, | 1970 function_data.count); |
| 1952 factory->NewNumberFromInt(function_data.start), | 1971 for (size_t k = 0; k < function_data.blocks.size(); k++) { |
| 1953 NONE); | 1972 const auto& block_data = function_data.blocks[k]; |
| 1954 JSObject::AddProperty(range_obj, end_string, | 1973 ranges.emplace_back(block_data.start, block_data.end, block_data.count); |
| 1955 factory->NewNumberFromInt(function_data.end), NONE); | 1974 } |
| 1956 JSObject::AddProperty(range_obj, count_string, | |
| 1957 factory->NewNumberFromUint(function_data.count), | |
| 1958 NONE); | |
| 1959 functions_array->set(j, *range_obj); | |
| 1960 } | 1975 } |
| 1976 |
| 1977 int num_ranges = static_cast<int>(ranges.size()); |
| 1978 Handle<FixedArray> ranges_array = factory->NewFixedArray(num_ranges); |
| 1979 for (int j = 0; j < num_ranges; j++) { |
| 1980 Handle<JSObject> range_object = MakeRangeObject(isolate, ranges[j]); |
| 1981 ranges_array->set(j, *range_object); |
| 1982 } |
| 1983 |
| 1961 Handle<JSArray> script_obj = | 1984 Handle<JSArray> script_obj = |
| 1962 factory->NewJSArrayWithElements(functions_array, FAST_ELEMENTS); | 1985 factory->NewJSArrayWithElements(ranges_array, FAST_ELEMENTS); |
| 1963 Handle<JSObject> wrapper = Script::GetWrapper(script_data.script); | 1986 Handle<JSObject> wrapper = Script::GetWrapper(script_data.script); |
| 1964 JSObject::AddProperty(script_obj, script_string, wrapper, NONE); | 1987 JSObject::AddProperty(script_obj, script_string, wrapper, NONE); |
| 1965 scripts_array->set(i, *script_obj); | 1988 scripts_array->set(i, *script_obj); |
| 1966 } | 1989 } |
| 1967 return *factory->NewJSArrayWithElements(scripts_array, FAST_ELEMENTS); | 1990 return *factory->NewJSArrayWithElements(scripts_array, FAST_ELEMENTS); |
| 1968 } | 1991 } |
| 1969 | 1992 |
| 1970 RUNTIME_FUNCTION(Runtime_DebugTogglePreciseCoverage) { | 1993 RUNTIME_FUNCTION(Runtime_DebugTogglePreciseCoverage) { |
| 1971 SealHandleScope shs(isolate); | 1994 SealHandleScope shs(isolate); |
| 1972 CONVERT_BOOLEAN_ARG_CHECKED(enable, 0); | 1995 CONVERT_BOOLEAN_ARG_CHECKED(enable, 0); |
| 1973 Coverage::SelectMode(isolate, enable ? debug::Coverage::kPreciseCount | 1996 Coverage::SelectMode(isolate, enable ? debug::Coverage::kPreciseCount |
| 1974 : debug::Coverage::kBestEffort); | 1997 : debug::Coverage::kBestEffort); |
| 1975 return isolate->heap()->undefined_value(); | 1998 return isolate->heap()->undefined_value(); |
| 1976 } | 1999 } |
| 1977 | 2000 |
| 2001 RUNTIME_FUNCTION(Runtime_DebugToggleBlockCoverage) { |
| 2002 SealHandleScope shs(isolate); |
| 2003 CONVERT_BOOLEAN_ARG_CHECKED(enable, 0); |
| 2004 Coverage::SelectMode(isolate, enable ? debug::Coverage::kBlockCount |
| 2005 : debug::Coverage::kBestEffort); |
| 2006 return isolate->heap()->undefined_value(); |
| 2007 } |
| 2008 |
| 2009 RUNTIME_FUNCTION(Runtime_IncBlockCounter) { |
| 2010 SealHandleScope scope(isolate); |
| 2011 DCHECK_EQ(2, args.length()); |
| 2012 CONVERT_ARG_CHECKED(JSFunction, function, 0); |
| 2013 CONVERT_SMI_ARG_CHECKED(coverage_array_slot_index, 1); |
| 2014 |
| 2015 DCHECK(FLAG_block_coverage); |
| 2016 |
| 2017 DebugInfo* debug_info = function->shared()->GetDebugInfo(); |
| 2018 CoverageInfo* coverage_info = CoverageInfo::cast(debug_info->coverage_info()); |
| 2019 coverage_info->IncrementBlockCount(coverage_array_slot_index); |
| 2020 |
| 2021 return isolate->heap()->undefined_value(); |
| 2022 } |
| 2023 |
| 1978 } // namespace internal | 2024 } // namespace internal |
| 1979 } // namespace v8 | 2025 } // namespace v8 |
| OLD | NEW |