blob: 7e3a2f60b6a113d8a08c298a4254a371bccacb84 [file] [log] [blame]
Brian Carlstrom7e93b502011-08-04 14:16:22 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#include "intern_table.h"
4
Elliott Hughes90a33692011-08-30 13:27:07 -07005#include "UniquePtr.h"
Elliott Hughes814e4032011-08-23 12:07:56 -07006#include "utf.h"
Brian Carlstrom7e93b502011-08-04 14:16:22 -07007
8namespace art {
9
10InternTable::InternTable() {
11 intern_table_lock_ = Mutex::Create("InternTable::Lock");
12}
13
Elliott Hughesde69d7f2011-08-18 16:49:37 -070014InternTable::~InternTable() {
15 delete intern_table_lock_;
16}
17
Brian Carlstroma663ea52011-08-19 23:33:41 -070018size_t InternTable::Size() const {
19 return intern_table_.size();
20}
21
22void InternTable::VisitRoots(Heap::RootVistor* root_visitor, void* arg) const {
Brian Carlstrom7e93b502011-08-04 14:16:22 -070023 MutexLock mu(intern_table_lock_);
24 typedef Table::const_iterator It; // TODO: C++0x auto
25 for (It it = intern_table_.begin(), end = intern_table_.end(); it != end; ++it) {
Brian Carlstroma663ea52011-08-19 23:33:41 -070026 root_visitor(it->second, arg);
Brian Carlstrom7e93b502011-08-04 14:16:22 -070027 }
28}
29
30String* InternTable::Intern(int32_t utf16_length, const char* utf8_data_in) {
Elliott Hughes90a33692011-08-30 13:27:07 -070031 UniquePtr<uint16_t[]> utf16_data_out(new uint16_t[utf16_length]);
Elliott Hughes814e4032011-08-23 12:07:56 -070032 ConvertModifiedUtf8ToUtf16(utf16_data_out.get(), utf8_data_in);
33 int32_t hash_code = ComputeUtf16Hash(utf16_data_out.get(), utf16_length);
Brian Carlstrom7e93b502011-08-04 14:16:22 -070034 {
35 MutexLock mu(intern_table_lock_);
36 typedef Table::const_iterator It; // TODO: C++0x auto
37 for (It it = intern_table_.find(hash_code), end = intern_table_.end(); it != end; ++it) {
38 String* string = it->second;
39 if (string->Equals(utf16_data_out.get(), 0, utf16_length)) {
40 return string;
41 }
42 }
43 String* new_string = String::AllocFromUtf16(utf16_length, utf16_data_out.get(), hash_code);
Brian Carlstroma663ea52011-08-19 23:33:41 -070044 Register(new_string);
Brian Carlstrom7e93b502011-08-04 14:16:22 -070045 return new_string;
46 }
47}
48
Brian Carlstroma663ea52011-08-19 23:33:41 -070049void InternTable::Register(String* string) {
50 intern_table_.insert(std::make_pair(string->GetHashCode(), string));
51}
52
Brian Carlstrom7e93b502011-08-04 14:16:22 -070053} // namespace art