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 6919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6930 ASSERT(DeoptId(k) != deopt_id); | 6930 ASSERT(DeoptId(k) != deopt_id); |
6931 } | 6931 } |
6932 ASSERT(pc != PC(k)); | 6932 ASSERT(pc != PC(k)); |
6933 } | 6933 } |
6934 } | 6934 } |
6935 } | 6935 } |
6936 #endif // DEBUG | 6936 #endif // DEBUG |
6937 } | 6937 } |
6938 | 6938 |
6939 | 6939 |
6940 void Stackmap::SetCode(const Code& code) const { | 6940 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
| |
6941 StorePointer(&raw_ptr()->code_, code.raw()); | 6941 StorePointer(&raw_ptr()->code_, code.raw()); |
6942 } | 6942 } |
6943 | 6943 |
6944 | 6944 |
6945 bool Stackmap::GetBit(intptr_t bit_index) const { | 6945 bool Stackmap::GetBit(intptr_t bit_index) const { |
6946 ASSERT(InRange(bit_index)); | 6946 ASSERT(InRange(bit_index)); |
6947 int byte_index = bit_index >> kBitsPerByteLog2; | 6947 int byte_index = bit_index >> kBitsPerByteLog2; |
6948 int bit_remainder = bit_index & (kBitsPerByte - 1); | 6948 int bit_remainder = bit_index & (kBitsPerByte - 1); |
6949 uint8_t byte_mask = 1U << bit_remainder; | 6949 uint8_t byte_mask = 1U << bit_remainder; |
6950 uint8_t byte = raw_ptr()->data_[byte_index]; | 6950 uint8_t byte = raw_ptr()->data_[byte_index]; |
6951 return (byte & byte_mask); | 6951 return (byte & byte_mask); |
6952 } | 6952 } |
6953 | 6953 |
6954 | 6954 |
6955 void Stackmap::SetBit(intptr_t bit_index, bool value) const { | 6955 void Stackmap::SetBit(intptr_t bit_index, bool value) const { |
6956 ASSERT(InRange(bit_index)); | 6956 ASSERT(InRange(bit_index)); |
6957 int byte_index = bit_index >> kBitsPerByteLog2; | 6957 int byte_index = bit_index >> kBitsPerByteLog2; |
6958 int bit_remainder = bit_index & (kBitsPerByte - 1); | 6958 int bit_remainder = bit_index & (kBitsPerByte - 1); |
6959 uint8_t byte_mask = 1U << bit_remainder; | 6959 uint8_t byte_mask = 1U << bit_remainder; |
6960 uint8_t* byte_addr = &(raw_ptr()->data_[byte_index]); | 6960 uint8_t* byte_addr = &(raw_ptr()->data_[byte_index]); |
6961 if (value) { | 6961 if (value) { |
6962 *byte_addr |= byte_mask; | 6962 *byte_addr |= byte_mask; |
6963 } else { | 6963 } else { |
6964 *byte_addr &= ~byte_mask; | 6964 *byte_addr &= ~byte_mask; |
6965 } | 6965 } |
6966 } | 6966 } |
6967 | 6967 |
6968 | 6968 |
6969 RawStackmap* Stackmap::New(intptr_t pc_offset, | 6969 RawStackmap* Stackmap::New(intptr_t pc_offset, |
6970 intptr_t length_in_bits, | 6970 intptr_t length, |
6971 BitmapBuilder* bmap) { | 6971 BitmapBuilder* bmap) { |
6972 ASSERT(Object::stackmap_class() != Class::null()); | 6972 ASSERT(Object::stackmap_class() != Class::null()); |
6973 ASSERT(bmap != NULL); | 6973 ASSERT(bmap != NULL); |
6974 Stackmap& result = Stackmap::Handle(); | 6974 Stackmap& result = Stackmap::Handle(); |
6975 intptr_t length_in_bytes = | 6975 // Guard against integer overflow of the instance size computation. |
6976 Utils::RoundUp(length_in_bits, kBitsPerByte) / kBitsPerByte; | 6976 intptr_t payload_size = |
6977 if (length_in_bytes < 0 || length_in_bytes > kMaxLengthInBytes) { | 6977 Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte; |
6978 if (payload_size < 0 || | |
6979 payload_size > | |
6980 (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.
| |
6978 // This should be caught before we reach here. | 6981 // This should be caught before we reach here. |
6979 FATAL1("Fatal error in Stackmap::New: invalid length %" PRIdPTR "\n", | 6982 FATAL1("Fatal error in Stackmap::New: invalid length %" PRIdPTR "\n", |
6980 length_in_bytes); | 6983 length); |
6981 } | 6984 } |
6982 { | 6985 { |
6983 // Stackmap data objects are associated with a code object, allocate them | 6986 // Stackmap data objects are associated with a code object, allocate them |
6984 // in old generation. | 6987 // in old generation. |
6985 RawObject* raw = Object::Allocate(Stackmap::kClassId, | 6988 RawObject* raw = Object::Allocate(Stackmap::kClassId, |
6986 Stackmap::InstanceSize(length_in_bytes), | 6989 Stackmap::InstanceSize(length), |
6987 Heap::kOld); | 6990 Heap::kOld); |
6988 NoGCScope no_gc; | 6991 NoGCScope no_gc; |
6989 result ^= raw; | 6992 result ^= raw; |
6990 result.set_bitmap_size_in_bytes(length_in_bytes); | 6993 result.SetLength(length); |
6991 } | 6994 } |
6992 // When constructing a stackmap we store the pc offset in the stackmap's | 6995 // When constructing a stackmap we store the pc offset in the stackmap's |
6993 // PC. StackmapTableBuilder::FinalizeStackmaps will replace it with the pc | 6996 // PC. StackmapTableBuilder::FinalizeStackmaps will replace it with the pc |
6994 // address. | 6997 // address. |
6995 ASSERT(pc_offset >= 0); | 6998 ASSERT(pc_offset >= 0); |
6996 result.SetPC(pc_offset); | 6999 result.SetPC(pc_offset); |
6997 for (intptr_t i = 0; i < length_in_bits; i++) { | 7000 for (intptr_t i = 0; i < length; ++i) { |
6998 result.SetBit(i, bmap->Get(i)); | 7001 result.SetBit(i, bmap->Get(i)); |
6999 } | 7002 } |
7000 ASSERT(bmap->Maximum() < length_in_bits); | 7003 ASSERT(bmap->Maximum() < length); |
7001 result.SetMinBitIndex(bmap->Minimum()); | |
7002 result.SetMaxBitIndex(bmap->Maximum()); | |
7003 return result.raw(); | 7004 return result.raw(); |
7004 } | 7005 } |
7005 | 7006 |
7006 | 7007 |
7007 void Stackmap::set_bitmap_size_in_bytes(intptr_t value) const { | |
7008 // This is only safe because we create a new Smi, which does not cause | |
7009 // heap allocation. | |
7010 raw_ptr()->bitmap_size_in_bytes_ = Smi::New(value); | |
7011 } | |
7012 | |
7013 | |
7014 const char* Stackmap::ToCString() const { | 7008 const char* Stackmap::ToCString() const { |
7015 if (IsNull()) { | 7009 if (IsNull()) { |
7016 return "{null}"; | 7010 return "{null}"; |
7017 } else { | 7011 } else { |
7018 // Guard against integer overflow, though it is highly unlikely. | 7012 const char* kFormat = "0x%" PRIxPTR ": "; |
7019 if (MaximumBitIndex() > kIntptrMax / 4) { | 7013 intptr_t fixed_length = OS::SNPrint(NULL, 0, kFormat, PC()) + 1; |
7020 FATAL1("MaximumBitIndex() is unexpectedly large (%" PRIdPTR ")", | 7014 Isolate* isolate = Isolate::Current(); |
7021 MaximumBitIndex()); | 7015 // Guard against integer overflow in the computation of alloc_size. |
7016 // | |
7017 // TODO(kmillikin): We could just truncate the string if someone | |
7018 // tries to print a 2 billion plus entry stackmap. | |
7019 if (Length() > (kIntptrMax - fixed_length)) { | |
7020 FATAL1("Length() is unexpectedly large (%" PRIdPTR ")", Length()); | |
7022 } | 7021 } |
7023 intptr_t index = OS::SNPrint(NULL, 0, "0x%" PRIxPTR " { ", PC()); | 7022 intptr_t alloc_size = fixed_length + Length(); |
7024 intptr_t alloc_size = | |
7025 index + ((MaximumBitIndex() + 1) * 2) + 2; // "{ 1 0 .... }". | |
7026 Isolate* isolate = Isolate::Current(); | |
7027 char* chars = isolate->current_zone()->Alloc<char>(alloc_size); | 7023 char* chars = isolate->current_zone()->Alloc<char>(alloc_size); |
7028 index = OS::SNPrint(chars, alloc_size, "0x%" PRIxPTR " { ", PC()); | 7024 intptr_t index = OS::SNPrint(chars, alloc_size, kFormat, PC()); |
7029 for (intptr_t i = 0; i <= MaximumBitIndex(); i++) { | 7025 for (intptr_t i = 0; i < Length(); i++) { |
7030 index += OS::SNPrint((chars + index), | 7026 chars[index++] = IsObject(i) ? '1' : '0'; |
7031 (alloc_size - index), | |
7032 "%d ", | |
7033 IsObject(i) ? 1 : 0); | |
7034 } | 7027 } |
7035 OS::SNPrint((chars + index), (alloc_size - index), "}"); | 7028 chars[index] = '\0'; |
7036 return chars; | 7029 return chars; |
7037 } | 7030 } |
7038 } | 7031 } |
7039 | 7032 |
7040 | 7033 |
7041 RawString* LocalVarDescriptors::GetName(intptr_t var_index) const { | 7034 RawString* LocalVarDescriptors::GetName(intptr_t var_index) const { |
7042 ASSERT(var_index < Length()); | 7035 ASSERT(var_index < Length()); |
7043 const Array& names = Array::Handle(raw_ptr()->names_); | 7036 const Array& names = Array::Handle(raw_ptr()->names_); |
7044 ASSERT(Length() == names.Length()); | 7037 ASSERT(Length() == names.Length()); |
7045 const String& name = String::CheckedHandle(names.At(var_index)); | 7038 const String& name = String::CheckedHandle(names.At(var_index)); |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7337 } | 7330 } |
7338 ASSERT(Object::code_class() != Class::null()); | 7331 ASSERT(Object::code_class() != Class::null()); |
7339 Code& result = Code::Handle(); | 7332 Code& result = Code::Handle(); |
7340 { | 7333 { |
7341 uword size = Code::InstanceSize(pointer_offsets_length); | 7334 uword size = Code::InstanceSize(pointer_offsets_length); |
7342 RawObject* raw = Object::Allocate(Code::kClassId, size, Heap::kOld); | 7335 RawObject* raw = Object::Allocate(Code::kClassId, size, Heap::kOld); |
7343 NoGCScope no_gc; | 7336 NoGCScope no_gc; |
7344 result ^= raw; | 7337 result ^= raw; |
7345 result.set_pointer_offsets_length(pointer_offsets_length); | 7338 result.set_pointer_offsets_length(pointer_offsets_length); |
7346 result.set_is_optimized(false); | 7339 result.set_is_optimized(false); |
7347 result.set_spill_slot_count(0); | |
7348 result.set_comments(Comments::New(0)); | 7340 result.set_comments(Comments::New(0)); |
7349 } | 7341 } |
7350 return result.raw(); | 7342 return result.raw(); |
7351 } | 7343 } |
7352 | 7344 |
7353 | 7345 |
7354 RawCode* Code::FinalizeCode(const char* name, Assembler* assembler) { | 7346 RawCode* Code::FinalizeCode(const char* name, Assembler* assembler) { |
7355 ASSERT(assembler != NULL); | 7347 ASSERT(assembler != NULL); |
7356 | 7348 |
7357 // Allocate the Instructions object. | 7349 // Allocate the Instructions object. |
(...skipping 3984 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11342 } | 11334 } |
11343 return result.raw(); | 11335 return result.raw(); |
11344 } | 11336 } |
11345 | 11337 |
11346 | 11338 |
11347 const char* WeakProperty::ToCString() const { | 11339 const char* WeakProperty::ToCString() const { |
11348 return "WeakProperty"; | 11340 return "WeakProperty"; |
11349 } | 11341 } |
11350 | 11342 |
11351 } // namespace dart | 11343 } // namespace dart |
OLD | NEW |