Index: vm/bitmap.cc |
=================================================================== |
--- vm/bitmap.cc (revision 0) |
+++ vm/bitmap.cc (revision 0) |
@@ -0,0 +1,109 @@ |
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+#include "vm/bitmap.h" |
+ |
+#include "platform/assert.h" |
+#include "vm/object.h" |
+ |
+namespace dart { |
+ |
+bool BitmapBuilder::Get(intptr_t bit_offset) const { |
+ if (!InRange(bit_offset)) { |
+ return false; |
+ } |
+ return GetBit(bit_offset); |
+} |
+ |
+ |
+void BitmapBuilder::Set(intptr_t bit_offset, bool value) { |
+ while (!InRange(bit_offset)) { |
+ intptr_t new_size = size_in_bytes_ + kIncrementSizeInBytes; |
+ ASSERT(new_size > size_in_bytes_); |
+ uint8_t* new_bit_list = reinterpret_cast<uint8_t*>( |
+ Isolate::Current()->current_zone()->Allocate(new_size)); |
+ ASSERT(new_bit_list != NULL); |
+ ASSERT(bit_list_ != NULL); |
+ uint8_t* old_bit_list = bit_list_; |
+ memmove(new_bit_list, old_bit_list, size_in_bytes_); |
+ memset((new_bit_list + size_in_bytes_), 0, kIncrementSizeInBytes); |
+ size_in_bytes_ = new_size; |
+ bit_list_ = new_bit_list; |
+ } |
+ SetBit(bit_offset, value); |
+} |
+ |
+ |
+// Return the bit offset of the highest bit set. |
+intptr_t BitmapBuilder::Maximum() const { |
+ intptr_t bound = SizeInBits(); |
+ for (intptr_t i = (bound - 1); i >= 0; i--) { |
+ if (Get(i)) return i; |
+ } |
+ return Stackmap::kNoMaximum; |
+} |
+ |
+ |
+// Return the bit offset of the lowest bit set. |
+intptr_t BitmapBuilder::Minimum() const { |
+ intptr_t bound = SizeInBits(); |
+ for (intptr_t i = 0; i < bound; i++) { |
+ if (Get(i)) return i; |
+ } |
+ return Stackmap::kNoMinimum; |
+} |
+ |
+ |
+void BitmapBuilder::SetRange(intptr_t min, intptr_t max, bool value) { |
+ for (intptr_t i = min; i <= max; i++) { |
+ Set(i, value); |
+ } |
+} |
+ |
+ |
+void BitmapBuilder::SetBits(const Stackmap& bitmap) { |
+ intptr_t min = bitmap.Minimum(); |
+ intptr_t max = bitmap.Maximum(); |
+ if (min == Stackmap::kNoMinimum || max == Stackmap::kNoMaximum) { |
+ return; |
+ } |
+ for (intptr_t i = 0; i < min; i++) { |
+ Set(i, false); |
+ } |
+ for (intptr_t i = min; i <= max; i++) { |
+ Set(i, bitmap.IsObject(i)); |
+ } |
+ intptr_t bound = SizeInBits(); |
+ for (intptr_t i = (max + 1); i < bound; i++) { |
+ Set(i, false); |
+ } |
+} |
+ |
+ |
+bool BitmapBuilder::GetBit(intptr_t bit_offset) const { |
+ ASSERT(InRange(bit_offset)); |
+ int byte_offset = bit_offset >> kBitsPerByteLog2; |
+ int bit_remainder = bit_offset & (kBitsPerByte - 1); |
+ uint8_t mask = 1U << bit_remainder; |
+ ASSERT(bit_list_ != NULL); |
+ return ((bit_list_[byte_offset] & mask) != 0); |
+} |
+ |
+ |
+void BitmapBuilder::SetBit(intptr_t bit_offset, bool value) { |
+ ASSERT(InRange(bit_offset)); |
+ int byte_offset = bit_offset >> kBitsPerByteLog2; |
+ int bit_remainder = bit_offset & (kBitsPerByte - 1); |
+ uint8_t mask = 1U << bit_remainder; |
+ uint8_t* byte_addr; |
+ ASSERT(bit_list_ != NULL); |
+ byte_addr = &(bit_list_[byte_offset]); |
+ if (value) { |
+ *byte_addr |= mask; |
+ } else { |
+ *byte_addr &= ~mask; |
+ } |
+} |
+ |
+} // namespace dart |