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