summaryrefslogtreecommitdiff
path: root/deps/v8/src/runtime/runtime-debug.cc
diff options
context:
space:
mode:
authorMichaƫl Zasso <targos@protonmail.com>2017-09-12 11:34:59 +0200
committerAnna Henningsen <anna@addaleax.net>2017-09-13 16:15:18 +0200
commitd82e1075dbc2cec2d6598ade10c1f43805f690fd (patch)
treeccd242b9b491dfc341d1099fe11b0ef528839877 /deps/v8/src/runtime/runtime-debug.cc
parentb4b7ac6ae811b2b5a3082468115dfb5a5246fe3f (diff)
downloadandroid-node-v8-d82e1075dbc2cec2d6598ade10c1f43805f690fd.tar.gz
android-node-v8-d82e1075dbc2cec2d6598ade10c1f43805f690fd.tar.bz2
android-node-v8-d82e1075dbc2cec2d6598ade10c1f43805f690fd.zip
deps: update V8 to 6.1.534.36
PR-URL: https://github.com/nodejs/node/pull/14730 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Diffstat (limited to 'deps/v8/src/runtime/runtime-debug.cc')
-rw-r--r--deps/v8/src/runtime/runtime-debug.cc150
1 files changed, 96 insertions, 54 deletions
diff --git a/deps/v8/src/runtime/runtime-debug.cc b/deps/v8/src/runtime/runtime-debug.cc
index b65757b2de..b58dce22b6 100644
--- a/deps/v8/src/runtime/runtime-debug.cc
+++ b/deps/v8/src/runtime/runtime-debug.cc
@@ -17,6 +17,7 @@
#include "src/interpreter/bytecodes.h"
#include "src/interpreter/interpreter.h"
#include "src/isolate-inl.h"
+#include "src/objects/debug-objects-inl.h"
#include "src/runtime/runtime.h"
#include "src/wasm/wasm-module.h"
#include "src/wasm/wasm-objects.h"
@@ -146,18 +147,19 @@ static MaybeHandle<JSArray> GetIteratorInternalProperties(
Isolate* isolate, Handle<IteratorType> object) {
Factory* factory = isolate->factory();
Handle<IteratorType> iterator = Handle<IteratorType>::cast(object);
- CHECK(iterator->kind()->IsSmi());
const char* kind = NULL;
- switch (Smi::cast(iterator->kind())->value()) {
- case IteratorType::kKindKeys:
+ switch (iterator->map()->instance_type()) {
+ case JS_MAP_KEY_ITERATOR_TYPE:
kind = "keys";
break;
- case IteratorType::kKindValues:
- kind = "values";
- break;
- case IteratorType::kKindEntries:
+ case JS_MAP_KEY_VALUE_ITERATOR_TYPE:
+ case JS_SET_KEY_VALUE_ITERATOR_TYPE:
kind = "entries";
break;
+ case JS_MAP_VALUE_ITERATOR_TYPE:
+ case JS_SET_VALUE_ITERATOR_TYPE:
+ kind = "values";
+ break;
default:
UNREACHABLE();
}
@@ -921,6 +923,11 @@ RUNTIME_FUNCTION(Runtime_GetGeneratorScopeCount) {
// Check arguments.
CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, gen, 0);
+ // Only inspect suspended generator scopes.
+ if (!gen->is_suspended()) {
+ return Smi::kZero;
+ }
+
// Count the visible scopes.
int n = 0;
for (ScopeIterator it(isolate, gen); !it.Done(); it.Next()) {
@@ -942,6 +949,11 @@ RUNTIME_FUNCTION(Runtime_GetGeneratorScopeDetails) {
CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, gen, 0);
CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]);
+ // Only inspect suspended generator scopes.
+ if (!gen->is_suspended()) {
+ return isolate->heap()->undefined_value();
+ }
+
// Find the requested scope.
int n = 0;
ScopeIterator it(isolate, gen);
@@ -1046,28 +1058,15 @@ RUNTIME_FUNCTION(Runtime_SetBreakPointsActive) {
}
-static bool IsPositionAlignmentCodeCorrect(int alignment) {
- return alignment == STATEMENT_ALIGNED || alignment == BREAK_POSITION_ALIGNED;
-}
-
-
RUNTIME_FUNCTION(Runtime_GetBreakLocations) {
HandleScope scope(isolate);
- DCHECK_EQ(2, args.length());
+ DCHECK_EQ(1, args.length());
CHECK(isolate->debug()->is_active());
CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0);
- CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[1]);
-
- if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) {
- return isolate->ThrowIllegalOperation();
- }
- BreakPositionAlignment alignment =
- static_cast<BreakPositionAlignment>(statement_aligned_code);
Handle<SharedFunctionInfo> shared(fun->shared());
// Find the number of break points
- Handle<Object> break_locations =
- Debug::GetSourceBreakLocations(shared, alignment);
+ Handle<Object> break_locations = Debug::GetSourceBreakLocations(shared);
if (break_locations->IsUndefined(isolate)) {
return isolate->heap()->undefined_value();
}
@@ -1098,29 +1097,20 @@ RUNTIME_FUNCTION(Runtime_SetFunctionBreakPoint) {
return Smi::FromInt(source_position);
}
-
// Changes the state of a break point in a script and returns source position
// where break point was set. NOTE: Regarding performance see the NOTE for
// GetScriptFromScriptData.
// args[0]: script to set break point in
// args[1]: number: break source position (within the script source)
-// args[2]: number, breakpoint position alignment
-// args[3]: number: break point object
+// args[2]: number: break point object
RUNTIME_FUNCTION(Runtime_SetScriptBreakPoint) {
HandleScope scope(isolate);
- DCHECK_EQ(4, args.length());
+ DCHECK_EQ(3, args.length());
CHECK(isolate->debug()->is_active());
CONVERT_ARG_HANDLE_CHECKED(JSValue, wrapper, 0);
CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]);
CHECK(source_position >= 0);
- CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[2]);
- CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 3);
-
- if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) {
- return isolate->ThrowIllegalOperation();
- }
- BreakPositionAlignment alignment =
- static_cast<BreakPositionAlignment>(statement_aligned_code);
+ CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 2);
// Get the script from the script wrapper.
CHECK(wrapper->value()->IsScript());
@@ -1128,7 +1118,7 @@ RUNTIME_FUNCTION(Runtime_SetScriptBreakPoint) {
// Set break point.
if (!isolate->debug()->SetBreakPointForScript(script, break_point_object_arg,
- &source_position, alignment)) {
+ &source_position)) {
return isolate->heap()->undefined_value();
}
@@ -1567,7 +1557,7 @@ int ScriptLinePosition(Handle<Script> script, int line) {
if (line == 0) return 0;
// If line == line_count, we return the first position beyond the last line.
if (line > line_count) return -1;
- return Smi::cast(line_ends_array->get(line - 1))->value() + 1;
+ return Smi::ToInt(line_ends_array->get(line - 1)) + 1;
}
} // namespace
@@ -1802,8 +1792,8 @@ RUNTIME_FUNCTION(Runtime_ScriptSourceLine) {
}
const int start =
- (line == 0) ? 0 : Smi::cast(line_ends_array->get(line - 1))->value() + 1;
- const int end = Smi::cast(line_ends_array->get(line))->value();
+ (line == 0) ? 0 : Smi::ToInt(line_ends_array->get(line - 1)) + 1;
+ const int end = Smi::ToInt(line_ends_array->get(line));
Handle<String> source =
handle(String::cast(script_handle->source()), isolate);
@@ -1910,6 +1900,26 @@ RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) {
return NULL;
}
+namespace {
+Handle<JSObject> MakeRangeObject(Isolate* isolate, const CoverageBlock& range) {
+ Factory* factory = isolate->factory();
+
+ Handle<String> start_string = factory->InternalizeUtf8String("start");
+ Handle<String> end_string = factory->InternalizeUtf8String("end");
+ Handle<String> count_string = factory->InternalizeUtf8String("count");
+
+ Handle<JSObject> range_obj = factory->NewJSObjectWithNullProto();
+ JSObject::AddProperty(range_obj, start_string,
+ factory->NewNumberFromInt(range.start), NONE);
+ JSObject::AddProperty(range_obj, end_string,
+ factory->NewNumberFromInt(range.end), NONE);
+ JSObject::AddProperty(range_obj, count_string,
+ factory->NewNumberFromUint(range.count), NONE);
+
+ return range_obj;
+}
+} // namespace
+
RUNTIME_FUNCTION(Runtime_DebugCollectCoverage) {
HandleScope scope(isolate);
DCHECK_EQ(0, args.length());
@@ -1927,34 +1937,36 @@ RUNTIME_FUNCTION(Runtime_DebugCollectCoverage) {
// Prepare property keys.
Handle<FixedArray> scripts_array = factory->NewFixedArray(num_scripts);
Handle<String> script_string = factory->NewStringFromStaticChars("script");
- Handle<String> start_string = factory->NewStringFromStaticChars("start");
- Handle<String> end_string = factory->NewStringFromStaticChars("end");
- Handle<String> count_string = factory->NewStringFromStaticChars("count");
for (int i = 0; i < num_scripts; i++) {
const auto& script_data = coverage->at(i);
HandleScope inner_scope(isolate);
+
+ std::vector<CoverageBlock> ranges;
int num_functions = static_cast<int>(script_data.functions.size());
- Handle<FixedArray> functions_array = factory->NewFixedArray(num_functions);
for (int j = 0; j < num_functions; j++) {
const auto& function_data = script_data.functions[j];
- Handle<JSObject> range_obj = factory->NewJSObjectWithNullProto();
- JSObject::AddProperty(range_obj, start_string,
- factory->NewNumberFromInt(function_data.start),
- NONE);
- JSObject::AddProperty(range_obj, end_string,
- factory->NewNumberFromInt(function_data.end), NONE);
- JSObject::AddProperty(range_obj, count_string,
- factory->NewNumberFromUint(function_data.count),
- NONE);
- functions_array->set(j, *range_obj);
+ ranges.emplace_back(function_data.start, function_data.end,
+ function_data.count);
+ for (size_t k = 0; k < function_data.blocks.size(); k++) {
+ const auto& block_data = function_data.blocks[k];
+ ranges.emplace_back(block_data.start, block_data.end, block_data.count);
+ }
+ }
+
+ int num_ranges = static_cast<int>(ranges.size());
+ Handle<FixedArray> ranges_array = factory->NewFixedArray(num_ranges);
+ for (int j = 0; j < num_ranges; j++) {
+ Handle<JSObject> range_object = MakeRangeObject(isolate, ranges[j]);
+ ranges_array->set(j, *range_object);
}
+
Handle<JSArray> script_obj =
- factory->NewJSArrayWithElements(functions_array, FAST_ELEMENTS);
+ factory->NewJSArrayWithElements(ranges_array, PACKED_ELEMENTS);
Handle<JSObject> wrapper = Script::GetWrapper(script_data.script);
JSObject::AddProperty(script_obj, script_string, wrapper, NONE);
scripts_array->set(i, *script_obj);
}
- return *factory->NewJSArrayWithElements(scripts_array, FAST_ELEMENTS);
+ return *factory->NewJSArrayWithElements(scripts_array, PACKED_ELEMENTS);
}
RUNTIME_FUNCTION(Runtime_DebugTogglePreciseCoverage) {
@@ -1965,5 +1977,35 @@ RUNTIME_FUNCTION(Runtime_DebugTogglePreciseCoverage) {
return isolate->heap()->undefined_value();
}
+RUNTIME_FUNCTION(Runtime_DebugToggleBlockCoverage) {
+ SealHandleScope shs(isolate);
+ CONVERT_BOOLEAN_ARG_CHECKED(enable, 0);
+ Coverage::SelectMode(isolate, enable ? debug::Coverage::kBlockCount
+ : debug::Coverage::kBestEffort);
+ return isolate->heap()->undefined_value();
+}
+
+RUNTIME_FUNCTION(Runtime_IncBlockCounter) {
+ SealHandleScope scope(isolate);
+ DCHECK_EQ(2, args.length());
+ CONVERT_ARG_CHECKED(JSFunction, function, 0);
+ CONVERT_SMI_ARG_CHECKED(coverage_array_slot_index, 1);
+
+ DCHECK(FLAG_block_coverage);
+
+ // It's quite possible that a function contains IncBlockCounter bytecodes, but
+ // no coverage info exists. This happens e.g. by selecting the best-effort
+ // coverage collection mode, which triggers deletion of all coverage infos in
+ // order to avoid memory leaks.
+
+ SharedFunctionInfo* shared = function->shared();
+ if (shared->HasCoverageInfo()) {
+ CoverageInfo* coverage_info = shared->GetCoverageInfo();
+ coverage_info->IncrementBlockCount(coverage_array_slot_index);
+ }
+
+ return isolate->heap()->undefined_value();
+}
+
} // namespace internal
} // namespace v8