Index: src/objects/break-points-info.cc |
diff --git a/src/objects/break-points-info.cc b/src/objects/break-points-info.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..64b6a4a608c5f32f158862e4122118f5d4523a28 |
--- /dev/null |
+++ b/src/objects/break-points-info.cc |
@@ -0,0 +1,113 @@ |
+// Copyright 2017 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "src/objects/break-points-info.h" |
+ |
+#include "src/objects-inl.h" |
+ |
+namespace v8 { |
+namespace internal { |
+ |
+// Remove the specified break point object. |
+void BreakPointInfo::ClearBreakPoint(Handle<BreakPointInfo> break_point_info, |
+ Handle<Object> break_point_object) { |
+ Isolate* isolate = break_point_info->GetIsolate(); |
+ // If there are no break points just ignore. |
+ if (break_point_info->break_point_objects()->IsUndefined(isolate)) return; |
+ // If there is a single break point clear it if it is the same. |
+ if (!break_point_info->break_point_objects()->IsFixedArray()) { |
+ if (break_point_info->break_point_objects() == *break_point_object) { |
+ break_point_info->set_break_point_objects( |
+ isolate->heap()->undefined_value()); |
+ } |
+ return; |
+ } |
+ // If there are multiple break points shrink the array |
+ DCHECK(break_point_info->break_point_objects()->IsFixedArray()); |
+ Handle<FixedArray> old_array = Handle<FixedArray>( |
+ FixedArray::cast(break_point_info->break_point_objects())); |
+ Handle<FixedArray> new_array = |
+ isolate->factory()->NewFixedArray(old_array->length() - 1); |
+ int found_count = 0; |
+ for (int i = 0; i < old_array->length(); i++) { |
+ if (old_array->get(i) == *break_point_object) { |
+ DCHECK(found_count == 0); |
+ found_count++; |
+ } else { |
+ new_array->set(i - found_count, old_array->get(i)); |
+ } |
+ } |
+ // If the break point was found in the list change it. |
+ if (found_count > 0) break_point_info->set_break_point_objects(*new_array); |
+} |
+ |
+// Add the specified break point object. |
+void BreakPointInfo::SetBreakPoint(Handle<BreakPointInfo> break_point_info, |
+ Handle<Object> break_point_object) { |
+ Isolate* isolate = break_point_info->GetIsolate(); |
+ |
+ // If there was no break point objects before just set it. |
+ if (break_point_info->break_point_objects()->IsUndefined(isolate)) { |
+ break_point_info->set_break_point_objects(*break_point_object); |
+ return; |
+ } |
+ // If the break point object is the same as before just ignore. |
+ if (break_point_info->break_point_objects() == *break_point_object) return; |
+ // If there was one break point object before replace with array. |
+ if (!break_point_info->break_point_objects()->IsFixedArray()) { |
+ Handle<FixedArray> array = isolate->factory()->NewFixedArray(2); |
+ array->set(0, break_point_info->break_point_objects()); |
+ array->set(1, *break_point_object); |
+ break_point_info->set_break_point_objects(*array); |
+ return; |
+ } |
+ // If there was more than one break point before extend array. |
+ Handle<FixedArray> old_array = Handle<FixedArray>( |
+ FixedArray::cast(break_point_info->break_point_objects())); |
+ Handle<FixedArray> new_array = |
+ isolate->factory()->NewFixedArray(old_array->length() + 1); |
+ for (int i = 0; i < old_array->length(); i++) { |
+ // If the break point was there before just ignore. |
+ if (old_array->get(i) == *break_point_object) return; |
+ new_array->set(i, old_array->get(i)); |
+ } |
+ // Add the new break point. |
+ new_array->set(old_array->length(), *break_point_object); |
+ break_point_info->set_break_point_objects(*new_array); |
+} |
+ |
+bool BreakPointInfo::HasBreakPointObject( |
+ Handle<BreakPointInfo> break_point_info, |
+ Handle<Object> break_point_object) { |
+ // No break point. |
+ Isolate* isolate = break_point_info->GetIsolate(); |
+ if (break_point_info->break_point_objects()->IsUndefined(isolate)) { |
+ return false; |
+ } |
+ // Single break point. |
+ if (!break_point_info->break_point_objects()->IsFixedArray()) { |
+ return break_point_info->break_point_objects() == *break_point_object; |
+ } |
+ // Multiple break points. |
+ FixedArray* array = FixedArray::cast(break_point_info->break_point_objects()); |
+ for (int i = 0; i < array->length(); i++) { |
+ if (array->get(i) == *break_point_object) { |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
+// Get the number of break points. |
+int BreakPointInfo::GetBreakPointCount() { |
+ // No break point. |
+ if (break_point_objects()->IsUndefined(GetIsolate())) return 0; |
+ // Single break point. |
+ if (!break_point_objects()->IsFixedArray()) return 1; |
+ // Multiple break points. |
+ return FixedArray::cast(break_point_objects())->length(); |
+} |
+ |
+} // namespace internal |
+} // namespace v8 |