Remove list copy constructor (for which there was no corresponding
authorager@chromium.org <ager@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 22 May 2009 11:52:24 +0000 (11:52 +0000)
committerager@chromium.org <ager@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 22 May 2009 11:52:24 +0000 (11:52 +0000)
assignment operator) and add an AddAll method to lists instead.
Review URL: http://codereview.chromium.org/115705

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2033 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/jump-target.cc
src/list-inl.h
src/list.h
src/virtual-frame.cc
test/cctest/test-list.cc

index 8c73810173de86b66b8fcf2340e94b7d41ba9afd..32bd58742bb78792f1c5ce4e97e9aceeb6212e89 100644 (file)
@@ -480,8 +480,10 @@ void BreakTarget::set_direction(Directionality direction) {
 void BreakTarget::CopyTo(BreakTarget* destination) {
   ASSERT(destination != NULL);
   destination->direction_ = direction_;
-  destination->reaching_frames_ = reaching_frames_;
-  destination->merge_labels_ = merge_labels_;
+  destination->reaching_frames_.Rewind(0);
+  destination->reaching_frames_.AddAll(reaching_frames_);
+  destination->merge_labels_.Rewind(0);
+  destination->merge_labels_.AddAll(merge_labels_);
   destination->entry_frame_ = entry_frame_;
   destination->entry_label_ = entry_label_;
   destination->expected_height_ = expected_height_;
index da8bb13d90ab8fd967cc3523a3be4055d9d5c4b9..d64cba876fb47276664b0c3cb35fa26d58c0d95c 100644 (file)
@@ -34,32 +34,23 @@ namespace v8 { namespace internal {
 
 
 template<typename T, class P>
-List<T, P>::List(const List<T, P>& other) {
-  ASSERT(other.capacity() >= 0);
-  capacity_ = other.capacity();
-  length_ = other.length();
-  if (capacity_ > 0) {
-    data_ = NewData(capacity_);
-    int copy_size = length_ * sizeof(T);
-    const int kMinMemCpySize = 64;
-    if (copy_size < kMinMemCpySize) {
-      for (int i = 0; i < length_; i++) data_[i] = other.data_[i];
-    } else {
-      memcpy(data_, other.data_, copy_size);
-    }
+void List<T, P>::Add(const T& element) {
+  if (length_ < capacity_) {
+    data_[length_++] = element;
   } else {
-    data_ = NULL;
+    List<T, P>::ResizeAdd(element);
   }
 }
 
 
 template<typename T, class P>
-void List<T, P>::Add(const T& element) {
-  if (length_ < capacity_) {
-    data_[length_++] = element;
-  } else {
-    List<T, P>::ResizeAdd(element);
+void List<T, P>::AddAll(const List<T, P>& other) {
+  int result_length = length_ + other.length_;
+  if (capacity_ < result_length) Resize(result_length);
+  for (int i = 0; i < other.length_; i++) {
+    data_[length_ + i] = other.data_[i];
   }
+  length_ = result_length;
 }
 
 
@@ -77,11 +68,18 @@ void List<T, P>::ResizeAddInternal(const T& element) {
   // Grow the list capacity by 50%, but make sure to let it grow
   // even when the capacity is zero (possible initial case).
   int new_capacity = 1 + capacity_ + (capacity_ >> 1);
+  // Since the element reference could be an element of the list, copy
+  // it out of the old backing storage before resizing.
+  T temp = element;
+  Resize(new_capacity);
+  data_[length_++] = temp;
+}
+
+
+template<typename T, class P>
+void List<T, P>::Resize(int new_capacity) {
   T* new_data = List<T, P>::NewData(new_capacity);
   memcpy(new_data, data_, capacity_ * sizeof(T));
-  // Since the element reference could be an element of the list,
-  // assign it to the new backing store before deleting the old.
-  new_data[length_++] = element;
   List<T, P>::DeleteData(data_);
   data_ = new_data;
   capacity_ = new_capacity;
index cef0369d187c1024a2ebe76fd989bca63af6e6e4..869cd36a1c737af738639f8f1898187ea96af01b 100644 (file)
@@ -48,7 +48,6 @@ class List {
  public:
 
   INLINE(explicit List(int capacity)) { Initialize(capacity); }
-  INLINE(explicit List(const List<T, P>& other));
   INLINE(~List()) { DeleteData(data_); }
 
   INLINE(void* operator new(size_t size)) { return P::New(size); }
@@ -78,6 +77,9 @@ class List {
   // expanding the list if necessary.
   void Add(const T& element);
 
+  // Add all the elements from the argument list to this list.
+  void AddAll(const List<T, P>& other);
+
   // Added 'count' elements with the value 'value' and returns a
   // vector that allows access to the elements.  The vector is valid
   // until the next change is made to this list.
@@ -126,6 +128,11 @@ class List {
   // Inlined implementation of ResizeAdd, shared by inlined and
   // non-inlined versions of ResizeAdd.
   void ResizeAddInternal(const T& element);
+
+  // Resize the list.
+  void Resize(int new_capacity);
+
+  DISALLOW_COPY_AND_ASSIGN(List);
 };
 
 class FrameElement;
index f0c15eacc8bf36c5bc171237d2d39a5b062c3543..a9077565e42bbba98a8efad481c891622194dc2f 100644 (file)
@@ -37,8 +37,9 @@ namespace v8 { namespace internal {
 
 // When cloned, a frame is a deep copy of the original.
 VirtualFrame::VirtualFrame(VirtualFrame* original)
-    : elements_(original->elements_),
+    : elements_(original->elements_.length()),
       stack_pointer_(original->stack_pointer_) {
+  elements_.AddAll(original->elements_);
   // Copy register locations from original.
   memcpy(&register_locations_,
          original->register_locations_,
index 838a45d0dea1c15028f0a59bef43549bc38e62cd..624b6e939181b12d17e735b865d98c5632c9c646 100644 (file)
@@ -65,3 +65,37 @@ TEST(ListAdd) {
   list.Add(list[0]);
   CHECK_EQ(1, list[4]);
 }
+
+// Test that we can add all elements from a list to another list.
+TEST(ListAddAll) {
+  List<int, ZeroingAllocationPolicy> list(4);
+  list.Add(0);
+  list.Add(1);
+  list.Add(2);
+
+  CHECK_EQ(3, list.length());
+  for (int i = 0; i < 3; i++) {
+    CHECK_EQ(i, list[i]);
+  }
+
+  List<int, ZeroingAllocationPolicy> other_list(4);
+
+  // Add no elements to list since other_list is empty.
+  list.AddAll(other_list);
+  CHECK_EQ(3, list.length());
+  for (int i = 0; i < 3; i++) {
+    CHECK_EQ(i, list[i]);
+  }
+
+  // Add three elements to other_list.
+  other_list.Add(0);
+  other_list.Add(1);
+  other_list.Add(2);
+
+  // Copy the three elements from other_list to list.
+  list.AddAll(other_list);
+  CHECK_EQ(6, list.length());
+  for (int i = 0; i < 6; i++) {
+    CHECK_EQ(i % 3, list[i]);
+  }
+}