47 redirect_visitor.
VisitThread(isolate, isolate->thread_local_top());
48 isolate->thread_manager()->IterateArchivedThreads(&redirect_visitor);
56 new_flags &= ~kHasBreakInfo & ~kPreparedForDebugExecution;
57 new_flags &= ~kBreakAtEntry & ~kCanBreakAtEntry;
58 new_flags &= ~kDebugExecutionMode;
88 if (IsUndefined(break_point_info, isolate))
return false;
95 int source_position) {
97 for (
int i = 0;
i < break_points()->
length();
i++) {
98 if (!IsUndefined(break_points()->get(
i), isolate)) {
101 if (break_point_info->source_position() == source_position) {
102 return break_point_info;
112 DCHECK(debug_info->HasBreakInfo());
113 for (
int i = 0;
i < debug_info->break_points()->
length();
i++) {
114 if (IsUndefined(debug_info->break_points()->get(
i), isolate))
continue;
129 DCHECK(debug_info->HasBreakInfo());
131 debug_info->GetBreakPointInfo(isolate, source_position), isolate);
132 if (!IsUndefined(*break_point_info, isolate)) {
140 static const int kNoBreakPointInfo = -1;
141 int index = kNoBreakPointInfo;
142 for (
int i = 0;
i < debug_info->break_points()->
length();
i++) {
143 if (IsUndefined(debug_info->break_points()->get(
i), isolate)) {
148 if (index == kNoBreakPointInfo) {
153 isolate->factory()->NewFixedArray(
154 old_break_points->length() +
157 debug_info->set_break_points(*new_break_points);
158 for (
int i = 0;
i < old_break_points->length();
i++) {
159 new_break_points->set(
i, old_break_points->get(
i));
161 index = old_break_points->length();
167 isolate->factory()->NewBreakPointInfo(source_position);
169 debug_info->break_points()->set(index, *new_break_point_info);
174 int source_position) {
177 if (IsUndefined(break_point_info, isolate)) {
178 return isolate->factory()->undefined_value();
188 for (
int i = 0;
i < break_points()->
length();
i++) {
189 if (!IsUndefined(break_points()->get(
i), isolate)) {
192 count += break_point_info->GetBreakPointCount(isolate);
201 DCHECK(debug_info->HasBreakInfo());
202 for (
int i = 0;
i < debug_info->break_points()->
length();
i++) {
203 if (!IsUndefined(debug_info->break_points()->get(
i), isolate)) {
208 return break_point_info;
212 return isolate->factory()->undefined_value();
233 set_side_effect_state(has_no_side_effect);
240 return break_point1->id() == break_point2->id();
249 if (IsUndefined(break_point_info->break_points(), isolate))
return;
251 if (!IsFixedArray(break_point_info->break_points())) {
254 break_point_info->set_break_points(
260 DCHECK(IsFixedArray(break_point_info->break_points()));
264 isolate->factory()->NewFixedArray(old_array->length() - 1);
266 for (
int i = 0;
i < old_array->length();
i++) {
271 new_array->set(
i - found_count, old_array->get(
i));
275 if (found_count > 0) break_point_info->set_break_points(*new_array);
283 if (IsUndefined(break_point_info->break_points(), isolate)) {
284 break_point_info->set_break_points(*break_point);
288 if (!IsFixedArray(break_point_info->break_points())) {
295 array->set(0, break_point_info->break_points());
296 array->set(1, *break_point);
297 break_point_info->set_break_points(*array);
304 isolate->factory()->NewFixedArray(old_array->length() + 1);
305 for (
int i = 0;
i < old_array->length();
i++) {
308 new_array->set(
i, old_array->get(
i));
311 new_array->set(old_array->length(), *break_point);
312 break_point_info->set_break_points(*new_array);
319 if (IsUndefined(break_point_info->break_points(), isolate)) {
323 if (!IsFixedArray(break_point_info->break_points())) {
329 for (
int i = 0;
i < array->
length();
i++) {
341 if (IsUndefined(break_point_info->break_points(), isolate)) {
345 if (!IsFixedArray(break_point_info->break_points())) {
348 if (breakpoint->id() == breakpoint_id) {
355 for (
int i = 0;
i < array->
length();
i++) {
357 if (breakpoint->id() == breakpoint_id) {
368 if (IsUndefined(break_points(), isolate))
return 0;
370 if (!IsFixedArray(break_points()))
return 1;
376 set_slots_start_source_position(slot_index, from_pos);
377 set_slots_end_source_position(slot_index, to_pos);
379 set_slots_padding(slot_index, 0);
383 set_slots_block_count(slot_index, 0);
387 std::unique_ptr<
char[]> function_name) {
390 os <<
"Coverage info (";
391 if (function_name ==
nullptr) {
393 }
else if (strlen(function_name.get()) > 0) {
394 os << function_name.get();
398 os <<
"):" << std::endl;
400 for (
int i = 0;
i < slot_count();
i++) {
401 os <<
"{" << slots_start_source_position(
i) <<
","
402 << slots_end_source_position(
i) <<
"}" << std::endl;
408 if (IsScript(info->shared_or_script())) {
409 return info->bytecode_offset_or_source_position();
411 Isolate* isolate = info->GetIsolate();
415 int source_position = shared->abstract_code(isolate)->SourcePosition(
416 isolate, info->bytecode_offset_or_source_position());
417 info->set_shared_or_script(
Cast<Script>(shared->script()));
418 info->set_bytecode_offset_or_source_position(source_position);
419 return source_position;
static void SetBreakPoint(Isolate *isolate, DirectHandle< BreakPointInfo > info, DirectHandle< BreakPoint > break_point)
int GetBreakPointCount(Isolate *isolate)
static bool HasBreakPoint(Isolate *isolate, DirectHandle< BreakPointInfo > info, DirectHandle< BreakPoint > break_point)
static void ClearBreakPoint(Isolate *isolate, DirectHandle< BreakPointInfo > info, DirectHandle< BreakPoint > break_point)
static MaybeDirectHandle< BreakPoint > GetBreakPointById(Isolate *isolate, DirectHandle< BreakPointInfo > info, int breakpoint_id)
void InitializeSlot(int slot_index, int start_pos, int end_pos)
void ResetBlockCount(int slot_index)
void CoverageInfoPrint(std::ostream &os, std::unique_ptr< char[]> function_name=nullptr)
static DebugInfo::SideEffectState FunctionGetSideEffectState(Isolate *isolate, DirectHandle< SharedFunctionInfo > info)
static const int kEstimatedNofBreakPointsInFunction
bool HasBreakPoint(Isolate *isolate, int source_position)
bool HasInstrumentedBytecodeArray()
bool HasCoverageInfo() const
V8_EXPORT_PRIVATE void ClearBreakInfo(Isolate *isolate)
static bool ClearBreakPoint(Isolate *isolate, DirectHandle< DebugInfo > debug_info, DirectHandle< BreakPoint > break_point)
static DirectHandle< Object > FindBreakPointInfo(Isolate *isolate, DirectHandle< DebugInfo > debug_info, DirectHandle< BreakPoint > break_point)
void SetDebugExecutionMode(ExecutionMode value)
DirectHandle< Object > GetBreakPoints(Isolate *isolate, int source_position)
bool BreakAtEntry() const
bool HasBreakInfo() const
void ClearCoverageInfo(Isolate *isolate)
Tagged< Object > GetBreakPointInfo(Isolate *isolate, int source_position)
NEVER_READ_ONLY_SPACE bool IsEmpty() const
SideEffectState GetSideEffectState(Isolate *isolate)
bool CanBreakAtEntry() const
ExecutionMode DebugExecutionMode() const
static void SetBreakPoint(Isolate *isolate, DirectHandle< DebugInfo > debug_info, int source_position, DirectHandle< BreakPoint > break_point)
int GetBreakPointCount(Isolate *isolate)
void VisitThread(Isolate *isolate, ThreadLocalTop *top) override
static void UninstallDebugBytecode(Tagged< SharedFunctionInfo > shared, Isolate *isolate)
static void EnsureSourcePositionsAvailable(Isolate *isolate, DirectHandle< SharedFunctionInfo > shared_info)
static NEVER_READ_ONLY_SPACE int GetSourcePosition(DirectHandle< StackFrameInfo > info)
NEVER_READ_ONLY_SPACE int length() const
Tagged< StackFrameInfo > get(int index) const
SharedFunctionInfoRef shared
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr RelaxedLoadTag kRelaxedLoad
static constexpr RelaxedStoreTag kRelaxedStore
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)