OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <memory> | 9 #include <memory> |
10 #include <sstream> | 10 #include <sstream> |
(...skipping 18444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18455 Handle<ObjectHashTable> new_table = | 18455 Handle<ObjectHashTable> new_table = |
18456 ObjectHashTable::Remove(table, key, &was_present, hash); | 18456 ObjectHashTable::Remove(table, key, &was_present, hash); |
18457 weak_collection->set_table(*new_table); | 18457 weak_collection->set_table(*new_table); |
18458 if (*table != *new_table) { | 18458 if (*table != *new_table) { |
18459 // Zap the old table since we didn't record slots for its elements. | 18459 // Zap the old table since we didn't record slots for its elements. |
18460 table->FillWithHoles(0, table->length()); | 18460 table->FillWithHoles(0, table->length()); |
18461 } | 18461 } |
18462 return was_present; | 18462 return was_present; |
18463 } | 18463 } |
18464 | 18464 |
18465 // Check if there is a break point at this code offset. | 18465 // Check if there is a break point at this source position. |
18466 bool DebugInfo::HasBreakPoint(int code_offset) { | 18466 bool DebugInfo::HasBreakPoint(int source_position) { |
18467 // Get the break point info object for this code offset. | 18467 // Get the break point info object for this code offset. |
18468 Object* break_point_info = GetBreakPointInfo(code_offset); | 18468 Object* break_point_info = GetBreakPointInfo(source_position); |
18469 | 18469 |
18470 // If there is no break point info object or no break points in the break | 18470 // If there is no break point info object or no break points in the break |
18471 // point info object there is no break point at this code offset. | 18471 // point info object there is no break point at this code offset. |
18472 if (break_point_info->IsUndefined(GetIsolate())) return false; | 18472 if (break_point_info->IsUndefined(GetIsolate())) return false; |
18473 return BreakPointInfo::cast(break_point_info)->GetBreakPointCount() > 0; | 18473 return BreakPointInfo::cast(break_point_info)->GetBreakPointCount() > 0; |
18474 } | 18474 } |
18475 | 18475 |
18476 // Get the break point info object for this code offset. | 18476 // Get the break point info object for this source position. |
18477 Object* DebugInfo::GetBreakPointInfo(int code_offset) { | 18477 Object* DebugInfo::GetBreakPointInfo(int source_position) { |
18478 // Find the index of the break point info object for this code offset. | 18478 Isolate* isolate = GetIsolate(); |
18479 int index = GetBreakPointInfoIndex(code_offset); | 18479 if (!break_points()->IsUndefined(isolate)) { |
18480 | 18480 for (int i = 0; i < break_points()->length(); i++) { |
18481 // Return the break point info object if any. | 18481 if (!break_points()->get(i)->IsUndefined(isolate)) { |
18482 if (index == kNoBreakPointInfo) return GetHeap()->undefined_value(); | 18482 BreakPointInfo* break_point_info = |
18483 return BreakPointInfo::cast(break_points()->get(index)); | 18483 BreakPointInfo::cast(break_points()->get(i)); |
| 18484 if (break_point_info->source_position() == source_position) { |
| 18485 return break_point_info; |
| 18486 } |
| 18487 } |
| 18488 } |
| 18489 } |
| 18490 return isolate->heap()->undefined_value(); |
18484 } | 18491 } |
18485 | 18492 |
18486 // Clear a break point at the specified code offset. | 18493 // Clear a break point at the specified source_position. |
18487 void DebugInfo::ClearBreakPoint(Handle<DebugInfo> debug_info, int code_offset, | 18494 void DebugInfo::ClearBreakPoint(Handle<DebugInfo> debug_info, |
| 18495 int source_position, |
18488 Handle<Object> break_point_object) { | 18496 Handle<Object> break_point_object) { |
18489 Isolate* isolate = debug_info->GetIsolate(); | 18497 Isolate* isolate = debug_info->GetIsolate(); |
18490 Handle<Object> break_point_info(debug_info->GetBreakPointInfo(code_offset), | 18498 Handle<Object> break_point_info( |
18491 isolate); | 18499 debug_info->GetBreakPointInfo(source_position), isolate); |
18492 if (break_point_info->IsUndefined(isolate)) return; | 18500 if (break_point_info->IsUndefined(isolate)) return; |
18493 BreakPointInfo::ClearBreakPoint( | 18501 BreakPointInfo::ClearBreakPoint( |
18494 Handle<BreakPointInfo>::cast(break_point_info), | 18502 Handle<BreakPointInfo>::cast(break_point_info), |
18495 break_point_object); | 18503 break_point_object); |
18496 } | 18504 } |
18497 | 18505 |
18498 void DebugInfo::SetBreakPoint(Handle<DebugInfo> debug_info, int code_offset, | 18506 void DebugInfo::SetBreakPoint(Handle<DebugInfo> debug_info, int source_position, |
18499 int source_position, int statement_position, | 18507 int statement_position, |
18500 Handle<Object> break_point_object) { | 18508 Handle<Object> break_point_object) { |
18501 Isolate* isolate = debug_info->GetIsolate(); | 18509 Isolate* isolate = debug_info->GetIsolate(); |
18502 Handle<Object> break_point_info(debug_info->GetBreakPointInfo(code_offset), | 18510 Handle<Object> break_point_info( |
18503 isolate); | 18511 debug_info->GetBreakPointInfo(source_position), isolate); |
18504 if (!break_point_info->IsUndefined(isolate)) { | 18512 if (!break_point_info->IsUndefined(isolate)) { |
18505 BreakPointInfo::SetBreakPoint( | 18513 BreakPointInfo::SetBreakPoint( |
18506 Handle<BreakPointInfo>::cast(break_point_info), | 18514 Handle<BreakPointInfo>::cast(break_point_info), |
18507 break_point_object); | 18515 break_point_object); |
18508 return; | 18516 return; |
18509 } | 18517 } |
18510 | 18518 |
18511 // Adding a new break point for a code offset which did not have any | 18519 // Adding a new break point for a code offset which did not have any |
18512 // break points before. Try to find a free slot. | 18520 // break points before. Try to find a free slot. |
| 18521 static const int kNoBreakPointInfo = -1; |
18513 int index = kNoBreakPointInfo; | 18522 int index = kNoBreakPointInfo; |
18514 for (int i = 0; i < debug_info->break_points()->length(); i++) { | 18523 for (int i = 0; i < debug_info->break_points()->length(); i++) { |
18515 if (debug_info->break_points()->get(i)->IsUndefined(isolate)) { | 18524 if (debug_info->break_points()->get(i)->IsUndefined(isolate)) { |
18516 index = i; | 18525 index = i; |
18517 break; | 18526 break; |
18518 } | 18527 } |
18519 } | 18528 } |
18520 if (index == kNoBreakPointInfo) { | 18529 if (index == kNoBreakPointInfo) { |
18521 // No free slot - extend break point info array. | 18530 // No free slot - extend break point info array. |
18522 Handle<FixedArray> old_break_points = Handle<FixedArray>( | 18531 Handle<FixedArray> old_break_points = Handle<FixedArray>( |
18523 FixedArray::cast(debug_info->break_points()), isolate); | 18532 FixedArray::cast(debug_info->break_points()), isolate); |
18524 Handle<FixedArray> new_break_points = | 18533 Handle<FixedArray> new_break_points = |
18525 isolate->factory()->NewFixedArray( | 18534 isolate->factory()->NewFixedArray( |
18526 old_break_points->length() + | 18535 old_break_points->length() + |
18527 DebugInfo::kEstimatedNofBreakPointsInFunction); | 18536 DebugInfo::kEstimatedNofBreakPointsInFunction); |
18528 | 18537 |
18529 debug_info->set_break_points(*new_break_points); | 18538 debug_info->set_break_points(*new_break_points); |
18530 for (int i = 0; i < old_break_points->length(); i++) { | 18539 for (int i = 0; i < old_break_points->length(); i++) { |
18531 new_break_points->set(i, old_break_points->get(i)); | 18540 new_break_points->set(i, old_break_points->get(i)); |
18532 } | 18541 } |
18533 index = old_break_points->length(); | 18542 index = old_break_points->length(); |
18534 } | 18543 } |
18535 DCHECK(index != kNoBreakPointInfo); | 18544 DCHECK(index != kNoBreakPointInfo); |
18536 | 18545 |
18537 // Allocate new BreakPointInfo object and set the break point. | 18546 // Allocate new BreakPointInfo object and set the break point. |
18538 Handle<BreakPointInfo> new_break_point_info = Handle<BreakPointInfo>::cast( | 18547 Handle<BreakPointInfo> new_break_point_info = Handle<BreakPointInfo>::cast( |
18539 isolate->factory()->NewStruct(BREAK_POINT_INFO_TYPE)); | 18548 isolate->factory()->NewStruct(BREAK_POINT_INFO_TYPE)); |
18540 new_break_point_info->set_code_offset(code_offset); | |
18541 new_break_point_info->set_source_position(source_position); | 18549 new_break_point_info->set_source_position(source_position); |
18542 new_break_point_info->set_statement_position(statement_position); | |
18543 new_break_point_info->set_break_point_objects( | 18550 new_break_point_info->set_break_point_objects( |
18544 isolate->heap()->undefined_value()); | 18551 isolate->heap()->undefined_value()); |
18545 BreakPointInfo::SetBreakPoint(new_break_point_info, break_point_object); | 18552 BreakPointInfo::SetBreakPoint(new_break_point_info, break_point_object); |
18546 debug_info->break_points()->set(index, *new_break_point_info); | 18553 debug_info->break_points()->set(index, *new_break_point_info); |
18547 } | 18554 } |
18548 | 18555 |
18549 // Get the break point objects for a code offset. | 18556 // Get the break point objects for a source position. |
18550 Handle<Object> DebugInfo::GetBreakPointObjects(int code_offset) { | 18557 Handle<Object> DebugInfo::GetBreakPointObjects(int source_position) { |
18551 Object* break_point_info = GetBreakPointInfo(code_offset); | 18558 Object* break_point_info = GetBreakPointInfo(source_position); |
18552 Isolate* isolate = GetIsolate(); | 18559 Isolate* isolate = GetIsolate(); |
18553 if (break_point_info->IsUndefined(isolate)) { | 18560 if (break_point_info->IsUndefined(isolate)) { |
18554 return isolate->factory()->undefined_value(); | 18561 return isolate->factory()->undefined_value(); |
18555 } | 18562 } |
18556 return Handle<Object>( | 18563 return Handle<Object>( |
18557 BreakPointInfo::cast(break_point_info)->break_point_objects(), isolate); | 18564 BreakPointInfo::cast(break_point_info)->break_point_objects(), isolate); |
18558 } | 18565 } |
18559 | 18566 |
18560 | 18567 |
18561 // Get the total number of break points. | 18568 // Get the total number of break points. |
(...skipping 23 matching lines...) Expand all Loading... |
18585 if (BreakPointInfo::HasBreakPointObject(break_point_info, | 18592 if (BreakPointInfo::HasBreakPointObject(break_point_info, |
18586 break_point_object)) { | 18593 break_point_object)) { |
18587 return break_point_info; | 18594 return break_point_info; |
18588 } | 18595 } |
18589 } | 18596 } |
18590 } | 18597 } |
18591 } | 18598 } |
18592 return isolate->factory()->undefined_value(); | 18599 return isolate->factory()->undefined_value(); |
18593 } | 18600 } |
18594 | 18601 |
18595 | |
18596 // Find the index of the break point info object for the specified code | |
18597 // position. | |
18598 int DebugInfo::GetBreakPointInfoIndex(int code_offset) { | |
18599 Isolate* isolate = GetIsolate(); | |
18600 if (break_points()->IsUndefined(isolate)) return kNoBreakPointInfo; | |
18601 for (int i = 0; i < break_points()->length(); i++) { | |
18602 if (!break_points()->get(i)->IsUndefined(isolate)) { | |
18603 BreakPointInfo* break_point_info = | |
18604 BreakPointInfo::cast(break_points()->get(i)); | |
18605 if (break_point_info->code_offset() == code_offset) { | |
18606 return i; | |
18607 } | |
18608 } | |
18609 } | |
18610 return kNoBreakPointInfo; | |
18611 } | |
18612 | |
18613 | |
18614 // Remove the specified break point object. | 18602 // Remove the specified break point object. |
18615 void BreakPointInfo::ClearBreakPoint(Handle<BreakPointInfo> break_point_info, | 18603 void BreakPointInfo::ClearBreakPoint(Handle<BreakPointInfo> break_point_info, |
18616 Handle<Object> break_point_object) { | 18604 Handle<Object> break_point_object) { |
18617 Isolate* isolate = break_point_info->GetIsolate(); | 18605 Isolate* isolate = break_point_info->GetIsolate(); |
18618 // If there are no break points just ignore. | 18606 // If there are no break points just ignore. |
18619 if (break_point_info->break_point_objects()->IsUndefined(isolate)) return; | 18607 if (break_point_info->break_point_objects()->IsUndefined(isolate)) return; |
18620 // If there is a single break point clear it if it is the same. | 18608 // If there is a single break point clear it if it is the same. |
18621 if (!break_point_info->break_point_objects()->IsFixedArray()) { | 18609 if (!break_point_info->break_point_objects()->IsFixedArray()) { |
18622 if (break_point_info->break_point_objects() == *break_point_object) { | 18610 if (break_point_info->break_point_objects() == *break_point_object) { |
18623 break_point_info->set_break_point_objects( | 18611 break_point_info->set_break_point_objects( |
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19206 for (PrototypeIterator iter(isolate, this, kStartAtReceiver, | 19194 for (PrototypeIterator iter(isolate, this, kStartAtReceiver, |
19207 PrototypeIterator::END_AT_NULL); | 19195 PrototypeIterator::END_AT_NULL); |
19208 !iter.IsAtEnd(); iter.AdvanceIgnoringProxies()) { | 19196 !iter.IsAtEnd(); iter.AdvanceIgnoringProxies()) { |
19209 if (iter.GetCurrent<Object>()->IsJSProxy()) return true; | 19197 if (iter.GetCurrent<Object>()->IsJSProxy()) return true; |
19210 } | 19198 } |
19211 return false; | 19199 return false; |
19212 } | 19200 } |
19213 | 19201 |
19214 } // namespace internal | 19202 } // namespace internal |
19215 } // namespace v8 | 19203 } // namespace v8 |
OLD | NEW |