Brian Carlstrom | 7e93b50 | 2011-08-04 14:16:22 -0700 | [diff] [blame] | 1 | // Copyright 2011 Google Inc. All Rights Reserved. |
| 2 | |
| 3 | #include "intern_table.h" |
| 4 | |
| 5 | #include "scoped_ptr.h" |
| 6 | |
| 7 | namespace art { |
| 8 | |
| 9 | InternTable::InternTable() { |
| 10 | intern_table_lock_ = Mutex::Create("InternTable::Lock"); |
| 11 | } |
| 12 | |
Elliott Hughes | de69d7f | 2011-08-18 16:49:37 -0700 | [diff] [blame] | 13 | InternTable::~InternTable() { |
| 14 | delete intern_table_lock_; |
| 15 | } |
| 16 | |
Brian Carlstrom | a663ea5 | 2011-08-19 23:33:41 -0700 | [diff] [blame^] | 17 | size_t InternTable::Size() const { |
| 18 | return intern_table_.size(); |
| 19 | } |
| 20 | |
| 21 | void InternTable::VisitRoots(Heap::RootVistor* root_visitor, void* arg) const { |
Brian Carlstrom | 7e93b50 | 2011-08-04 14:16:22 -0700 | [diff] [blame] | 22 | MutexLock mu(intern_table_lock_); |
| 23 | typedef Table::const_iterator It; // TODO: C++0x auto |
| 24 | for (It it = intern_table_.begin(), end = intern_table_.end(); it != end; ++it) { |
Brian Carlstrom | a663ea5 | 2011-08-19 23:33:41 -0700 | [diff] [blame^] | 25 | root_visitor(it->second, arg); |
Brian Carlstrom | 7e93b50 | 2011-08-04 14:16:22 -0700 | [diff] [blame] | 26 | } |
| 27 | } |
| 28 | |
| 29 | String* InternTable::Intern(int32_t utf16_length, const char* utf8_data_in) { |
Elliott Hughes | 40ef99e | 2011-08-11 17:44:34 -0700 | [diff] [blame] | 30 | scoped_array<uint16_t> utf16_data_out(new uint16_t[utf16_length]); |
Brian Carlstrom | 7e93b50 | 2011-08-04 14:16:22 -0700 | [diff] [blame] | 31 | String::ConvertModifiedUtf8ToUtf16(utf16_data_out.get(), utf8_data_in); |
| 32 | int32_t hash_code = String::ComputeUtf16Hash(utf16_data_out.get(), utf16_length); |
| 33 | { |
| 34 | MutexLock mu(intern_table_lock_); |
| 35 | typedef Table::const_iterator It; // TODO: C++0x auto |
| 36 | for (It it = intern_table_.find(hash_code), end = intern_table_.end(); it != end; ++it) { |
| 37 | String* string = it->second; |
| 38 | if (string->Equals(utf16_data_out.get(), 0, utf16_length)) { |
| 39 | return string; |
| 40 | } |
| 41 | } |
| 42 | String* new_string = String::AllocFromUtf16(utf16_length, utf16_data_out.get(), hash_code); |
Brian Carlstrom | a663ea5 | 2011-08-19 23:33:41 -0700 | [diff] [blame^] | 43 | Register(new_string); |
Brian Carlstrom | 7e93b50 | 2011-08-04 14:16:22 -0700 | [diff] [blame] | 44 | return new_string; |
| 45 | } |
| 46 | } |
| 47 | |
Brian Carlstrom | a663ea5 | 2011-08-19 23:33:41 -0700 | [diff] [blame^] | 48 | void InternTable::Register(String* string) { |
| 49 | intern_table_.insert(std::make_pair(string->GetHashCode(), string)); |
| 50 | } |
| 51 | |
Brian Carlstrom | 7e93b50 | 2011-08-04 14:16:22 -0700 | [diff] [blame] | 52 | } // namespace art |