dvander@54: /* dvander@54: * Copyright (C) 2012 David Anderson dvander@54: * dvander@54: * This file is part of JITCraft. dvander@54: * dvander@54: * JITCraft is free software: you can redistribute it and/or modify it under dvander@54: * the terms of the GNU General Public License as published by the Free dvander@54: * Software Foundation, either version 3 of the License, or (at your option) dvander@54: * any later version. dvander@54: * dvander@54: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@54: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@54: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@54: * dvander@54: * You should have received a copy of the GNU General Public License along with dvander@54: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@54: */ danderson@92: #include "Zone.h" dvander@54: #include "StringPool.h" dvander@54: #include "Strings.h" dvander@54: #include "Spaces.h" danderson@92: #include "Spaces-inl.h" danderson@92: #include "Heap-inl.h" dvander@54: dvander@59: using namespace ke; dvander@54: dvander@54: StringPool::StringPool(Zone *zone) dvander@54: : zone_(zone), dvander@54: set_(ZoneAllocatorPolicy()) dvander@54: { dvander@54: } dvander@54: dvander@54: StringPool::~StringPool() dvander@54: { dvander@54: } dvander@54: dvander@54: bool dvander@54: StringPool::initialize() dvander@54: { dvander@54: if (!set_.init(32)) dvander@54: return false; dvander@54: return true; dvander@54: } dvander@54: dvander@54: String * dvander@54: StringPool::add(const char *str, size_t length) dvander@54: { dvander@54: StringSet::Insert i = set_.findForAdd(CharsAndLength(str, length)); dvander@54: if (i.found()) dvander@54: return *i; dvander@54: dvander@69: Local obj(zone_, String::New(zone_, str, length, Heap::Tenure_Old)); dvander@54: if (!obj) dvander@54: return NULL; dvander@54: dvander@54: set_.add(i, obj); dvander@54: return obj; dvander@54: } dvander@54: dvander@54: void dvander@54: StringPool::sweep() dvander@54: { dvander@54: for (StringSet::iterator i(&set_); !i.empty(); i.next()) { dvander@54: String *obj = *i; dvander@54: MarkBit bits = HeapChunk::GetMarkBit(obj); dvander@54: if (HeapChunk::IsWhite(bits)) dvander@54: i.erase(); dvander@54: else dvander@54: assert(HeapChunk::IsBlack(bits)); dvander@54: } dvander@54: set_.checkDensity(); dvander@54: }