blob: e0705735306c9276d81544ae670603f06fb5217e [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
5#include "scoped_ptr.h"
6
7namespace art {
8
9InternTable::InternTable() {
10 intern_table_lock_ = Mutex::Create("InternTable::Lock");
11}
12
Elliott Hughesde69d7f2011-08-18 16:49:37 -070013InternTable::~InternTable() {
14 delete intern_table_lock_;
15}
16
Brian Carlstroma663ea52011-08-19 23:33:41 -070017size_t InternTable::Size() const {
18 return intern_table_.size();
19}
20
21void InternTable::VisitRoots(Heap::RootVistor* root_visitor, void* arg) const {
Brian Carlstrom7e93b502011-08-04 14:16:22 -070022 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 Carlstroma663ea52011-08-19 23:33:41 -070025 root_visitor(it->second, arg);
Brian Carlstrom7e93b502011-08-04 14:16:22 -070026 }
27}
28
29String* InternTable::Intern(int32_t utf16_length, const char* utf8_data_in) {
Elliott Hughes40ef99e2011-08-11 17:44:34 -070030 scoped_array<uint16_t> utf16_data_out(new uint16_t[utf16_length]);
Brian Carlstrom7e93b502011-08-04 14:16:22 -070031 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 Carlstroma663ea52011-08-19 23:33:41 -070043 Register(new_string);
Brian Carlstrom7e93b502011-08-04 14:16:22 -070044 return new_string;
45 }
46}
47
Brian Carlstroma663ea52011-08-19 23:33:41 -070048void InternTable::Register(String* string) {
49 intern_table_.insert(std::make_pair(string->GetHashCode(), string));
50}
51
Brian Carlstrom7e93b502011-08-04 14:16:22 -070052} // namespace art