OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/object.h" | 5 #include "vm/object.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
10 #include "vm/bigint_operations.h" | 10 #include "vm/bigint_operations.h" |
(...skipping 6612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6623 } | 6623 } |
6624 #endif // DEBUG | 6624 #endif // DEBUG |
6625 } | 6625 } |
6626 | 6626 |
6627 | 6627 |
6628 void Stackmap::SetCode(const Code& code) const { | 6628 void Stackmap::SetCode(const Code& code) const { |
6629 StorePointer(&raw_ptr()->code_, code.raw()); | 6629 StorePointer(&raw_ptr()->code_, code.raw()); |
6630 } | 6630 } |
6631 | 6631 |
6632 | 6632 |
6633 bool Stackmap::GetBit(intptr_t bit_offset) const { | 6633 bool Stackmap::GetBit(intptr_t bit_index) const { |
6634 ASSERT(InRange(bit_offset)); | 6634 ASSERT(InRange(bit_index)); |
6635 int byte_offset = bit_offset >> kBitsPerByteLog2; | 6635 int byte_index = bit_index >> kBitsPerByteLog2; |
6636 int bit_remainder = bit_offset & (kBitsPerByte - 1); | 6636 int bit_remainder = bit_index & (kBitsPerByte - 1); |
6637 uint8_t byte_mask = 1U << bit_remainder; | 6637 uint8_t byte_mask = 1U << bit_remainder; |
6638 uint8_t byte = raw_ptr()->data_[byte_offset]; | 6638 uint8_t byte = raw_ptr()->data_[byte_index]; |
6639 return (byte & byte_mask); | 6639 return (byte & byte_mask); |
6640 } | 6640 } |
6641 | 6641 |
6642 | 6642 |
6643 void Stackmap::SetBit(intptr_t bit_offset, bool value) const { | 6643 void Stackmap::SetBit(intptr_t bit_index, bool value) const { |
6644 ASSERT(InRange(bit_offset)); | 6644 ASSERT(InRange(bit_index)); |
6645 int byte_offset = bit_offset >> kBitsPerByteLog2; | 6645 int byte_index = bit_index >> kBitsPerByteLog2; |
6646 int bit_remainder = bit_offset & (kBitsPerByte - 1); | 6646 int bit_remainder = bit_index & (kBitsPerByte - 1); |
6647 uint8_t byte_mask = 1U << bit_remainder; | 6647 uint8_t byte_mask = 1U << bit_remainder; |
6648 uint8_t* byte_addr = &(raw_ptr()->data_[byte_offset]); | 6648 uint8_t* byte_addr = &(raw_ptr()->data_[byte_index]); |
6649 if (value) { | 6649 if (value) { |
6650 *byte_addr |= byte_mask; | 6650 *byte_addr |= byte_mask; |
6651 } else { | 6651 } else { |
6652 *byte_addr &= ~byte_mask; | 6652 *byte_addr &= ~byte_mask; |
6653 } | 6653 } |
6654 } | 6654 } |
6655 | 6655 |
6656 | 6656 |
6657 RawStackmap* Stackmap::New(uword pc_offset, BitmapBuilder* bmap) { | 6657 RawStackmap* Stackmap::New(uword pc_offset, BitmapBuilder* bmap) { |
6658 ASSERT(Object::stackmap_class() != Class::null()); | 6658 ASSERT(Object::stackmap_class() != Class::null()); |
6659 ASSERT(bmap != NULL); | 6659 ASSERT(bmap != NULL); |
6660 Stackmap& result = Stackmap::Handle(); | 6660 Stackmap& result = Stackmap::Handle(); |
6661 intptr_t size = bmap->SizeInBytes(); | 6661 intptr_t size = bmap->SizeInBytes(); |
6662 { | 6662 { |
6663 // Stackmap data objects are associated with a code object, allocate them | 6663 // Stackmap data objects are associated with a code object, allocate them |
6664 // in old generation. | 6664 // in old generation. |
6665 RawObject* raw = Object::Allocate(Stackmap::kInstanceKind, | 6665 RawObject* raw = Object::Allocate(Stackmap::kInstanceKind, |
6666 Stackmap::InstanceSize(size), | 6666 Stackmap::InstanceSize(size), |
6667 Heap::kOld); | 6667 Heap::kOld); |
6668 NoGCScope no_gc; | 6668 NoGCScope no_gc; |
6669 result ^= raw; | 6669 result ^= raw; |
6670 result.set_bitmap_size_in_bytes(size); | 6670 result.set_bitmap_size_in_bytes(size); |
6671 } | 6671 } |
6672 result.SetPC(pc_offset); | 6672 result.SetPC(pc_offset); |
6673 intptr_t bound = bmap->SizeInBits(); | 6673 intptr_t bound = bmap->SizeInBits(); |
6674 for (intptr_t i = 0; i < bound; i++) { | 6674 for (intptr_t i = 0; i < bound; i++) { |
6675 result.SetBit(i, bmap->Get(i)); | 6675 result.SetBit(i, bmap->Get(i)); |
6676 } | 6676 } |
6677 result.SetMinBitOffset(bmap->Minimum()); | 6677 result.SetMinBitIndex(bmap->Minimum()); |
6678 result.SetMaxBitOffset(bmap->Maximum()); | 6678 result.SetMaxBitIndex(bmap->Maximum()); |
6679 return result.raw(); | 6679 return result.raw(); |
6680 } | 6680 } |
6681 | 6681 |
6682 | 6682 |
6683 void Stackmap::set_bitmap_size_in_bytes(intptr_t value) const { | 6683 void Stackmap::set_bitmap_size_in_bytes(intptr_t value) const { |
6684 // This is only safe because we create a new Smi, which does not cause | 6684 // This is only safe because we create a new Smi, which does not cause |
6685 // heap allocation. | 6685 // heap allocation. |
6686 raw_ptr()->bitmap_size_in_bytes_ = Smi::New(value); | 6686 raw_ptr()->bitmap_size_in_bytes_ = Smi::New(value); |
6687 } | 6687 } |
6688 | 6688 |
6689 | 6689 |
6690 const char* Stackmap::ToCString() const { | 6690 const char* Stackmap::ToCString() const { |
6691 if (IsNull()) { | 6691 if (IsNull()) { |
6692 return "{null}"; | 6692 return "{null}"; |
6693 } else { | 6693 } else { |
6694 intptr_t index = OS::SNPrint(NULL, 0, "0x%lx { ", PC()); | 6694 intptr_t index = OS::SNPrint(NULL, 0, "0x%lx { ", PC()); |
6695 intptr_t alloc_size = | 6695 intptr_t alloc_size = |
6696 index + ((MaximumBitOffset() + 1) * 2) + 2; // "{ 1 0 .... }". | 6696 index + ((MaximumBitIndex() + 1) * 2) + 2; // "{ 1 0 .... }". |
6697 Isolate* isolate = Isolate::Current(); | 6697 Isolate* isolate = Isolate::Current(); |
6698 char* chars = reinterpret_cast<char*>( | 6698 char* chars = reinterpret_cast<char*>( |
6699 isolate->current_zone()->Allocate(alloc_size)); | 6699 isolate->current_zone()->Allocate(alloc_size)); |
6700 index = OS::SNPrint(chars, alloc_size, "0x%lx { ", PC()); | 6700 index = OS::SNPrint(chars, alloc_size, "0x%lx { ", PC()); |
6701 for (intptr_t i = 0; i <= MaximumBitOffset(); i++) { | 6701 for (intptr_t i = 0; i <= MaximumBitIndex(); i++) { |
6702 index += OS::SNPrint((chars + index), | 6702 index += OS::SNPrint((chars + index), |
6703 (alloc_size - index), | 6703 (alloc_size - index), |
6704 "%d ", | 6704 "%d ", |
6705 IsObject(i) ? 1 : 0); | 6705 IsObject(i) ? 1 : 0); |
6706 } | 6706 } |
6707 OS::SNPrint((chars + index), (alloc_size - index), "}"); | 6707 OS::SNPrint((chars + index), (alloc_size - index), "}"); |
6708 return chars; | 6708 return chars; |
6709 } | 6709 } |
6710 } | 6710 } |
6711 | 6711 |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7106 node_ids->Add(node_id); | 7106 node_ids->Add(node_id); |
7107 ic_data_obj = CodePatcher::GetInstanceCallIcDataAt(descriptors.PC(i)); | 7107 ic_data_obj = CodePatcher::GetInstanceCallIcDataAt(descriptors.PC(i)); |
7108 ic_data_objs.Add(ic_data_obj); | 7108 ic_data_objs.Add(ic_data_obj); |
7109 } | 7109 } |
7110 } | 7110 } |
7111 return max_id; | 7111 return max_id; |
7112 } | 7112 } |
7113 | 7113 |
7114 | 7114 |
7115 RawStackmap* Code::GetStackmap(uword pc, Array* maps, Stackmap* map) const { | 7115 RawStackmap* Code::GetStackmap(uword pc, Array* maps, Stackmap* map) const { |
7116 // This code is used only during iterating frames during a GC and hence | 7116 // This code is used during iterating frames during a GC and hence it |
7117 // it should not in turn start a GC. | 7117 // should not in turn start a GC. |
7118 NoGCScope no_gc; | 7118 NoGCScope no_gc; |
7119 if (stackmaps() == Array::null()) { | 7119 if (stackmaps() == Array::null()) { |
7120 // No stack maps are present in the code object which means this | 7120 // No stack maps are present in the code object which means this |
7121 // frame relies on tagged pointers. | 7121 // frame relies on tagged pointers. |
7122 return Stackmap::null(); | 7122 return Stackmap::null(); |
7123 } | 7123 } |
7124 // A stack map is present in the code object, use the stack map to visit | 7124 // A stack map is present in the code object, use the stack map to visit |
7125 // frame slots which are marked as having objects. | 7125 // frame slots which are marked as having objects. |
7126 *maps = stackmaps(); | 7126 *maps = stackmaps(); |
7127 *map = Stackmap::null(); | 7127 *map = Stackmap::null(); |
(...skipping 3723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10851 const String& str = String::Handle(pattern()); | 10851 const String& str = String::Handle(pattern()); |
10852 const char* format = "JSRegExp: pattern=%s flags=%s"; | 10852 const char* format = "JSRegExp: pattern=%s flags=%s"; |
10853 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); | 10853 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); |
10854 char* chars = reinterpret_cast<char*>( | 10854 char* chars = reinterpret_cast<char*>( |
10855 Isolate::Current()->current_zone()->Allocate(len + 1)); | 10855 Isolate::Current()->current_zone()->Allocate(len + 1)); |
10856 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); | 10856 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); |
10857 return chars; | 10857 return chars; |
10858 } | 10858 } |
10859 | 10859 |
10860 } // namespace dart | 10860 } // namespace dart |
OLD | NEW |