Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(925)

Side by Side Diff: src/utils.h

Issue 7754014: Fix bug in collector. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 } else { 607 } else {
608 int growth = current_length * (growth_factor - 1); 608 int growth = current_length * (growth_factor - 1);
609 if (growth > max_growth) { 609 if (growth > max_growth) {
610 growth = max_growth; 610 growth = max_growth;
611 } 611 }
612 new_capacity = current_length + growth; 612 new_capacity = current_length + growth;
613 if (new_capacity < min_capacity) { 613 if (new_capacity < min_capacity) {
614 new_capacity = min_capacity + growth; 614 new_capacity = min_capacity + growth;
615 } 615 }
616 } 616 }
617 Vector<T> new_chunk = Vector<T>::New(new_capacity); 617 Vector<T> new_chunk = Vector<T>::New(new_capacity);
Rico 2011/09/08 13:42:37 We don't need this new_chunk vector anymore right?
Lasse Reichstein 2011/09/08 13:43:43 Gone.
618 int new_index = PrepareGrow(new_chunk); 618 NewChunk(new_capacity);
619 if (index_ > 0) {
620 chunks_.Add(current_chunk_.SubVector(0, index_));
621 } else {
622 // Can happen if the call to PrepareGrow moves everything into
623 // the new chunk.
624 current_chunk_.Dispose();
625 }
626 current_chunk_ = new_chunk;
627 index_ = new_index;
628 ASSERT(index_ + min_capacity <= current_chunk_.length()); 619 ASSERT(index_ + min_capacity <= current_chunk_.length());
629 } 620 }
630 621
631 // Before replacing the current chunk, give a subclass the option to move 622 // Before replacing the current chunk, give a subclass the option to move
632 // some of the current data into the new chunk. The function may update 623 // some of the current data into the new chunk. The function may update
633 // the current index_ value to represent data no longer in the current chunk. 624 // the current index_ value to represent data no longer in the current chunk.
634 // Returns the initial index of the new chunk (after copied data). 625 // Returns the initial index of the new chunk (after copied data).
635 virtual int PrepareGrow(Vector<T> new_chunk) { 626 virtual void NewChunk(int new_capacity) {
636 return 0; 627 Vector<T> new_chunk = Vector<T>::New(new_capacity);
628 if (index_ > 0) {
629 chunks_.Add(current_chunk_.SubVector(0, index_));
630 } else {
631 current_chunk_.Dispose();
632 }
633 current_chunk_ = new_chunk;
634 index_ = 0;
637 } 635 }
638 }; 636 };
639 637
640 638
641 /* 639 /*
642 * A collector that allows sequences of values to be guaranteed to 640 * A collector that allows sequences of values to be guaranteed to
643 * stay consecutive. 641 * stay consecutive.
644 * If the backing store grows while a sequence is active, the current 642 * If the backing store grows while a sequence is active, the current
645 * sequence might be moved, but after the sequence is ended, it will 643 * sequence might be moved, but after the sequence is ended, it will
646 * not move again. 644 * not move again.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 virtual void Reset() { 679 virtual void Reset() {
682 sequence_start_ = kNoSequence; 680 sequence_start_ = kNoSequence;
683 this->Collector<T, growth_factor, max_growth>::Reset(); 681 this->Collector<T, growth_factor, max_growth>::Reset();
684 } 682 }
685 683
686 private: 684 private:
687 static const int kNoSequence = -1; 685 static const int kNoSequence = -1;
688 int sequence_start_; 686 int sequence_start_;
689 687
690 // Move the currently active sequence to the new chunk. 688 // Move the currently active sequence to the new chunk.
691 virtual int PrepareGrow(Vector<T> new_chunk) { 689 virtual void NewChunk(int new_capacity) {
692 if (sequence_start_ != kNoSequence) { 690 if (sequence_start_ == kNoSequence) {
693 int sequence_length = this->index_ - sequence_start_; 691 // Fall back on default behavior if no sequence has been started.
694 // The new chunk is always larger than the current chunk, so there 692 this->Collector<T, growth_factor, max_growth>::NewChunk(new_capacity);
695 // is room for the copy. 693 return;
696 ASSERT(sequence_length < new_chunk.length());
697 for (int i = 0; i < sequence_length; i++) {
698 new_chunk[i] = this->current_chunk_[sequence_start_ + i];
699 }
700 this->index_ = sequence_start_;
701 sequence_start_ = 0;
702 return sequence_length;
703 } 694 }
704 return 0; 695 int sequence_length = this->index_ - sequence_start_;
696 Vector<T> new_chunk = Vector<T>::New(sequence_length + new_capacity);
697 ASSERT(sequence_length < new_chunk.length());
698 for (int i = 0; i < sequence_length; i++) {
699 new_chunk[i] = this->current_chunk_[sequence_start_ + i];
700 }
701 if (sequence_start_ > 0) {
702 this->chunks_.Add(this->current_chunk_.SubVector(0, sequence_start_));
703 } else {
704 this->current_chunk_.Dispose();
705 }
706 this->current_chunk_ = new_chunk;
707 this->index_ = sequence_length;
708 sequence_start_ = 0;
705 } 709 }
706 }; 710 };
707 711
708 712
709 // Compare ASCII/16bit chars to ASCII/16bit chars. 713 // Compare ASCII/16bit chars to ASCII/16bit chars.
710 template <typename lchar, typename rchar> 714 template <typename lchar, typename rchar>
711 static inline int CompareChars(const lchar* lhs, const rchar* rhs, int chars) { 715 static inline int CompareChars(const lchar* lhs, const rchar* rhs, int chars) {
712 const lchar* limit = lhs + chars; 716 const lchar* limit = lhs + chars;
713 #ifdef V8_HOST_CAN_READ_UNALIGNED 717 #ifdef V8_HOST_CAN_READ_UNALIGNED
714 if (sizeof(*lhs) == sizeof(*rhs)) { 718 if (sizeof(*lhs) == sizeof(*rhs)) {
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
911 ASSERT(element < static_cast<int>(sizeof(T) * CHAR_BIT)); 915 ASSERT(element < static_cast<int>(sizeof(T) * CHAR_BIT));
912 return 1 << element; 916 return 1 << element;
913 } 917 }
914 918
915 T bits_; 919 T bits_;
916 }; 920 };
917 921
918 } } // namespace v8::internal 922 } } // namespace v8::internal
919 923
920 #endif // V8_UTILS_H_ 924 #endif // V8_UTILS_H_
OLDNEW
« no previous file with comments | « src/preparser.cc ('k') | test/cctest/test-utils.cc » ('j') | test/cctest/test-utils.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698