Chromium Code Reviews| Index: runtime/vm/object.cc |
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
| index f4f06dda7bec901d2cb7761e12e9751cb9131349..d6b16322d4cdc7387de7602a825db17e906ac7d4 100644 |
| --- a/runtime/vm/object.cc |
| +++ b/runtime/vm/object.cc |
| @@ -6937,7 +6937,7 @@ void PcDescriptors::Verify(bool check_ids) const { |
| } |
| -void Stackmap::SetCode(const Code& code) const { |
| +void Stackmap::SetCode(const dart::Code& code) const { |
|
srdjan
2012/08/21 16:06:04
Why dart:: ?
Kevin Millikin (Google)
2012/08/22 07:34:18
Because C++.
Class Code is shadowed by the access
|
| StorePointer(&raw_ptr()->code_, code.raw()); |
| } |
| @@ -6967,72 +6967,65 @@ void Stackmap::SetBit(intptr_t bit_index, bool value) const { |
| RawStackmap* Stackmap::New(intptr_t pc_offset, |
| - intptr_t length_in_bits, |
| + intptr_t length, |
| BitmapBuilder* bmap) { |
| ASSERT(Object::stackmap_class() != Class::null()); |
| ASSERT(bmap != NULL); |
| Stackmap& result = Stackmap::Handle(); |
| - intptr_t length_in_bytes = |
| - Utils::RoundUp(length_in_bits, kBitsPerByte) / kBitsPerByte; |
| - if (length_in_bytes < 0 || length_in_bytes > kMaxLengthInBytes) { |
| + // Guard against integer overflow of the instance size computation. |
| + intptr_t payload_size = |
| + Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte; |
| + if (payload_size < 0 || |
| + payload_size > |
| + (kSmiMax - static_cast<intptr_t>(sizeof(RawStackmap)))) { |
|
srdjan
2012/08/21 16:06:04
Add parenthesis
Kevin Millikin (Google)
2012/08/22 07:34:18
OK. Incorporated in an outstanding change list.
|
| // This should be caught before we reach here. |
| FATAL1("Fatal error in Stackmap::New: invalid length %" PRIdPTR "\n", |
| - length_in_bytes); |
| + length); |
| } |
| { |
| // Stackmap data objects are associated with a code object, allocate them |
| // in old generation. |
| RawObject* raw = Object::Allocate(Stackmap::kClassId, |
| - Stackmap::InstanceSize(length_in_bytes), |
| + Stackmap::InstanceSize(length), |
| Heap::kOld); |
| NoGCScope no_gc; |
| result ^= raw; |
| - result.set_bitmap_size_in_bytes(length_in_bytes); |
| + result.SetLength(length); |
| } |
| // When constructing a stackmap we store the pc offset in the stackmap's |
| // PC. StackmapTableBuilder::FinalizeStackmaps will replace it with the pc |
| // address. |
| ASSERT(pc_offset >= 0); |
| result.SetPC(pc_offset); |
| - for (intptr_t i = 0; i < length_in_bits; i++) { |
| + for (intptr_t i = 0; i < length; ++i) { |
| result.SetBit(i, bmap->Get(i)); |
| } |
| - ASSERT(bmap->Maximum() < length_in_bits); |
| - result.SetMinBitIndex(bmap->Minimum()); |
| - result.SetMaxBitIndex(bmap->Maximum()); |
| + ASSERT(bmap->Maximum() < length); |
| return result.raw(); |
| } |
| -void Stackmap::set_bitmap_size_in_bytes(intptr_t value) const { |
| - // This is only safe because we create a new Smi, which does not cause |
| - // heap allocation. |
| - raw_ptr()->bitmap_size_in_bytes_ = Smi::New(value); |
| -} |
| - |
| - |
| const char* Stackmap::ToCString() const { |
| if (IsNull()) { |
| return "{null}"; |
| } else { |
| - // Guard against integer overflow, though it is highly unlikely. |
| - if (MaximumBitIndex() > kIntptrMax / 4) { |
| - FATAL1("MaximumBitIndex() is unexpectedly large (%" PRIdPTR ")", |
| - MaximumBitIndex()); |
| - } |
| - intptr_t index = OS::SNPrint(NULL, 0, "0x%" PRIxPTR " { ", PC()); |
| - intptr_t alloc_size = |
| - index + ((MaximumBitIndex() + 1) * 2) + 2; // "{ 1 0 .... }". |
| + const char* kFormat = "0x%" PRIxPTR ": "; |
| + intptr_t fixed_length = OS::SNPrint(NULL, 0, kFormat, PC()) + 1; |
| Isolate* isolate = Isolate::Current(); |
| + // Guard against integer overflow in the computation of alloc_size. |
| + // |
| + // TODO(kmillikin): We could just truncate the string if someone |
| + // tries to print a 2 billion plus entry stackmap. |
| + if (Length() > (kIntptrMax - fixed_length)) { |
| + FATAL1("Length() is unexpectedly large (%" PRIdPTR ")", Length()); |
| + } |
| + intptr_t alloc_size = fixed_length + Length(); |
| char* chars = isolate->current_zone()->Alloc<char>(alloc_size); |
| - index = OS::SNPrint(chars, alloc_size, "0x%" PRIxPTR " { ", PC()); |
| - for (intptr_t i = 0; i <= MaximumBitIndex(); i++) { |
| - index += OS::SNPrint((chars + index), |
| - (alloc_size - index), |
| - "%d ", |
| - IsObject(i) ? 1 : 0); |
| - } |
| - OS::SNPrint((chars + index), (alloc_size - index), "}"); |
| + intptr_t index = OS::SNPrint(chars, alloc_size, kFormat, PC()); |
| + for (intptr_t i = 0; i < Length(); i++) { |
| + chars[index++] = IsObject(i) ? '1' : '0'; |
| + } |
| + chars[index] = '\0'; |
| return chars; |
| } |
| } |
| @@ -7344,7 +7337,6 @@ RawCode* Code::New(intptr_t pointer_offsets_length) { |
| result ^= raw; |
| result.set_pointer_offsets_length(pointer_offsets_length); |
| result.set_is_optimized(false); |
| - result.set_spill_slot_count(0); |
| result.set_comments(Comments::New(0)); |
| } |
| return result.raw(); |