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/cpu.h" | 10 #include "vm/cpu.h" |
(...skipping 6790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6801 } | 6801 } |
6802 | 6802 |
6803 | 6803 |
6804 void RedirectionData::PrintJSONImpl(JSONStream* stream, bool ref) const { | 6804 void RedirectionData::PrintJSONImpl(JSONStream* stream, bool ref) const { |
6805 Object::PrintJSONImpl(stream, ref); | 6805 Object::PrintJSONImpl(stream, ref); |
6806 } | 6806 } |
6807 | 6807 |
6808 | 6808 |
6809 RawString* Field::GetterName(const String& field_name) { | 6809 RawString* Field::GetterName(const String& field_name) { |
6810 CompilerStats::make_accessor_name++; | 6810 CompilerStats::make_accessor_name++; |
| 6811 // TODO(koda): Avoid most of these allocations by adding prefix-based lookup |
| 6812 // to Symbols. |
6811 return String::Concat(Symbols::GetterPrefix(), field_name); | 6813 return String::Concat(Symbols::GetterPrefix(), field_name); |
6812 } | 6814 } |
6813 | 6815 |
6814 | 6816 |
6815 RawString* Field::GetterSymbol(const String& field_name) { | 6817 RawString* Field::GetterSymbol(const String& field_name) { |
6816 const String& str = String::Handle(Field::GetterName(field_name)); | 6818 const String& str = String::Handle(Field::GetterName(field_name)); |
6817 return Symbols::New(str); | 6819 return Symbols::New(str); |
6818 } | 6820 } |
6819 | 6821 |
6820 | 6822 |
6821 RawString* Field::SetterName(const String& field_name) { | 6823 RawString* Field::SetterName(const String& field_name) { |
6822 CompilerStats::make_accessor_name++; | 6824 CompilerStats::make_accessor_name++; |
| 6825 // TODO(koda): Avoid most of these allocations by adding prefix-based lookup |
| 6826 // to Symbols. |
6823 return String::Concat(Symbols::SetterPrefix(), field_name); | 6827 return String::Concat(Symbols::SetterPrefix(), field_name); |
6824 } | 6828 } |
6825 | 6829 |
6826 | 6830 |
6827 RawString* Field::SetterSymbol(const String& field_name) { | 6831 RawString* Field::SetterSymbol(const String& field_name) { |
6828 const String& str = String::Handle(Field::SetterName(field_name)); | 6832 const String& str = String::Handle(Field::SetterName(field_name)); |
6829 return Symbols::New(str); | 6833 return Symbols::New(str); |
6830 } | 6834 } |
6831 | 6835 |
6832 | 6836 |
(...skipping 816 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7649 return descriptor.literal->Hash(); | 7653 return descriptor.literal->Hash(); |
7650 } | 7654 } |
7651 | 7655 |
7652 static uword Hash(const Object& key) { | 7656 static uword Hash(const Object& key) { |
7653 if (key.IsLiteralToken()) { | 7657 if (key.IsLiteralToken()) { |
7654 return String::HashRawSymbol(LiteralToken::Cast(key).literal()); | 7658 return String::HashRawSymbol(LiteralToken::Cast(key).literal()); |
7655 } else { | 7659 } else { |
7656 return String::Cast(key).Hash(); | 7660 return String::Cast(key).Hash(); |
7657 } | 7661 } |
7658 } | 7662 } |
| 7663 |
| 7664 static RawObject* NewKey(const Scanner::TokenDescriptor& descriptor) { |
| 7665 return LiteralToken::New(descriptor.kind, *descriptor.literal); |
| 7666 } |
7659 }; | 7667 }; |
7660 typedef UnorderedHashMap<CompressedTokenTraits> CompressedTokenMap; | 7668 typedef UnorderedHashMap<CompressedTokenTraits> CompressedTokenMap; |
7661 | 7669 |
7662 | 7670 |
7663 // Helper class for creation of compressed token stream data. | 7671 // Helper class for creation of compressed token stream data. |
7664 class CompressedTokenStreamData : public ValueObject { | 7672 class CompressedTokenStreamData : public ValueObject { |
7665 public: | 7673 public: |
7666 static const intptr_t kInitialBufferSize = 16 * KB; | 7674 static const intptr_t kInitialBufferSize = 16 * KB; |
7667 CompressedTokenStreamData() : | 7675 CompressedTokenStreamData() : |
7668 buffer_(NULL), | 7676 buffer_(NULL), |
7669 stream_(&buffer_, Reallocate, kInitialBufferSize), | 7677 stream_(&buffer_, Reallocate, kInitialBufferSize), |
7670 tokens_(Array::Handle( | 7678 tokens_(Array::Handle( |
7671 HashTables::New<CompressedTokenMap>(kInitialTableSize))) { | 7679 HashTables::New<CompressedTokenMap>(kInitialTableSize))) { |
7672 } | 7680 } |
7673 ~CompressedTokenStreamData() { | 7681 ~CompressedTokenStreamData() { |
7674 // Safe to discard the hash table now. | 7682 // Safe to discard the hash table now. |
7675 tokens_.Release(); | 7683 tokens_.Release(); |
7676 } | 7684 } |
7677 | 7685 |
7678 // Add an IDENT token into the stream and the token hash map. | 7686 // Add an IDENT token into the stream and the token hash map. |
7679 void AddIdentToken(const String* ident) { | 7687 void AddIdentToken(const String* ident) { |
7680 ASSERT(ident->IsSymbol()); | 7688 ASSERT(ident->IsSymbol()); |
7681 intptr_t index = tokens_.NumOccupied(); | 7689 const intptr_t fresh_index = tokens_.NumOccupied(); |
7682 intptr_t entry; | 7690 intptr_t index = Smi::Value(Smi::RawCast( |
7683 if (!tokens_.FindKeyOrDeletedOrUnused(*ident, &entry)) { | 7691 tokens_.InsertOrGetValue(*ident, |
7684 tokens_.InsertKey(entry, *ident); | 7692 Smi::Handle(Smi::New(fresh_index))))); |
7685 tokens_.UpdatePayload(entry, 0, Smi::Handle(Smi::New(index))); | |
7686 HashTables::EnsureLoadFactor(0.0, kMaxLoadFactor, tokens_); | |
7687 } else { | |
7688 index = Smi::Value(Smi::RawCast(tokens_.GetPayload(entry, 0))); | |
7689 } | |
7690 WriteIndex(index); | 7693 WriteIndex(index); |
7691 } | 7694 } |
7692 | 7695 |
7693 // Add a LITERAL token into the stream and the token hash map. | 7696 // Add a LITERAL token into the stream and the token hash map. |
7694 void AddLiteralToken(const Scanner::TokenDescriptor& descriptor) { | 7697 void AddLiteralToken(const Scanner::TokenDescriptor& descriptor) { |
7695 ASSERT(descriptor.literal->IsSymbol()); | 7698 ASSERT(descriptor.literal->IsSymbol()); |
7696 intptr_t index = tokens_.NumOccupied(); | 7699 const intptr_t fresh_index = tokens_.NumOccupied(); |
7697 intptr_t entry; | 7700 intptr_t index = Smi::Value(Smi::RawCast( |
7698 if (!tokens_.FindKeyOrDeletedOrUnused(descriptor, &entry)) { | 7701 tokens_.InsertNewOrGetValue(descriptor, |
7699 LiteralToken& new_literal = LiteralToken::Handle( | 7702 Smi::Handle(Smi::New(fresh_index))))); |
7700 LiteralToken::New(descriptor.kind, *descriptor.literal)); | |
7701 tokens_.InsertKey(entry, new_literal); | |
7702 tokens_.UpdatePayload(entry, 0, Smi::Handle(Smi::New(index))); | |
7703 HashTables::EnsureLoadFactor(0.0, kMaxLoadFactor, tokens_); | |
7704 } else { | |
7705 index = Smi::Value(Smi::RawCast(tokens_.GetPayload(entry, 0))); | |
7706 } | |
7707 WriteIndex(index); | 7703 WriteIndex(index); |
7708 } | 7704 } |
7709 | 7705 |
7710 // Add a simple token into the stream. | 7706 // Add a simple token into the stream. |
7711 void AddSimpleToken(intptr_t kind) { | 7707 void AddSimpleToken(intptr_t kind) { |
7712 stream_.WriteUnsigned(kind); | 7708 stream_.WriteUnsigned(kind); |
7713 } | 7709 } |
7714 | 7710 |
7715 // Return the compressed token stream. | 7711 // Return the compressed token stream. |
7716 uint8_t* GetStream() const { return buffer_; } | 7712 uint8_t* GetStream() const { return buffer_; } |
(...skipping 21 matching lines...) Expand all Loading... |
7738 } | 7734 } |
7739 | 7735 |
7740 static uint8_t* Reallocate(uint8_t* ptr, | 7736 static uint8_t* Reallocate(uint8_t* ptr, |
7741 intptr_t old_size, | 7737 intptr_t old_size, |
7742 intptr_t new_size) { | 7738 intptr_t new_size) { |
7743 void* new_ptr = ::realloc(reinterpret_cast<void*>(ptr), new_size); | 7739 void* new_ptr = ::realloc(reinterpret_cast<void*>(ptr), new_size); |
7744 return reinterpret_cast<uint8_t*>(new_ptr); | 7740 return reinterpret_cast<uint8_t*>(new_ptr); |
7745 } | 7741 } |
7746 | 7742 |
7747 static const intptr_t kInitialTableSize = 32; | 7743 static const intptr_t kInitialTableSize = 32; |
7748 static const double kMaxLoadFactor; | |
7749 | 7744 |
7750 uint8_t* buffer_; | 7745 uint8_t* buffer_; |
7751 WriteStream stream_; | 7746 WriteStream stream_; |
7752 CompressedTokenMap tokens_; | 7747 CompressedTokenMap tokens_; |
7753 | 7748 |
7754 DISALLOW_COPY_AND_ASSIGN(CompressedTokenStreamData); | 7749 DISALLOW_COPY_AND_ASSIGN(CompressedTokenStreamData); |
7755 }; | 7750 }; |
7756 | 7751 |
7757 | 7752 |
7758 const double CompressedTokenStreamData::kMaxLoadFactor = 0.75; | |
7759 | |
7760 | |
7761 RawTokenStream* TokenStream::New(const Scanner::GrowableTokenStream& tokens, | 7753 RawTokenStream* TokenStream::New(const Scanner::GrowableTokenStream& tokens, |
7762 const String& private_key) { | 7754 const String& private_key) { |
7763 // Copy the relevant data out of the scanner into a compressed stream of | 7755 // Copy the relevant data out of the scanner into a compressed stream of |
7764 // tokens. | 7756 // tokens. |
7765 CompressedTokenStreamData data; | 7757 CompressedTokenStreamData data; |
7766 intptr_t len = tokens.length(); | 7758 intptr_t len = tokens.length(); |
7767 for (intptr_t i = 0; i < len; i++) { | 7759 for (intptr_t i = 0; i < len; i++) { |
7768 Scanner::TokenDescriptor token = tokens[i]; | 7760 Scanner::TokenDescriptor token = tokens[i]; |
7769 if (token.kind == Token::kIDENT) { // Identifier token. | 7761 if (token.kind == Token::kIDENT) { // Identifier token. |
7770 if (FLAG_compiler_stats) { | 7762 if (FLAG_compiler_stats) { |
(...skipping 11394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19165 return tag_label.ToCString(); | 19157 return tag_label.ToCString(); |
19166 } | 19158 } |
19167 | 19159 |
19168 | 19160 |
19169 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 19161 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
19170 Instance::PrintJSONImpl(stream, ref); | 19162 Instance::PrintJSONImpl(stream, ref); |
19171 } | 19163 } |
19172 | 19164 |
19173 | 19165 |
19174 } // namespace dart | 19166 } // namespace dart |
OLD | NEW |