Very minor but easy optimization for symbol_scope_t

Lots of symbol_scope_t throwaway objects get created during value
expression calculation, and 99% of them are never used.  Therefore, the
std::map which each contains is now within an optional<> wrapper, so
that no constructor happens unless one is actually used.
This commit is contained in:
John Wiegley 2009-11-24 04:14:34 -05:00
parent 5cd8e59652
commit 11a217a481
2 changed files with 17 additions and 13 deletions

View file

@ -42,15 +42,18 @@ void symbol_scope_t::define(const symbol_t::kind_t kind,
{
DEBUG("scope.symbols", "Defining '" << name << "' = " << def);
std::pair<symbol_map::iterator, bool> result
= symbols.insert(symbol_map::value_type(symbol_t(kind, name, def), def));
if (! result.second) {
symbol_map::iterator i = symbols.find(symbol_t(kind, name));
assert(i != symbols.end());
symbols.erase(i);
if (! symbols)
symbols = symbol_map();
result = symbols.insert(symbol_map::value_type(symbol_t(kind, name, def),
def));
std::pair<symbol_map::iterator, bool> result
= symbols->insert(symbol_map::value_type(symbol_t(kind, name, def), def));
if (! result.second) {
symbol_map::iterator i = symbols->find(symbol_t(kind, name));
assert(i != symbols->end());
symbols->erase(i);
result = symbols->insert(symbol_map::value_type(symbol_t(kind, name, def),
def));
if (! result.second)
throw_(compile_error,
_("Redefinition of '%1' in the same scope") << name);
@ -60,10 +63,11 @@ void symbol_scope_t::define(const symbol_t::kind_t kind,
expr_t::ptr_op_t symbol_scope_t::lookup(const symbol_t::kind_t kind,
const string& name)
{
symbol_map::const_iterator i = symbols.find(symbol_t(kind, name));
if (i != symbols.end())
return (*i).second;
if (symbols) {
symbol_map::const_iterator i = symbols->find(symbol_t(kind, name));
if (i != symbols->end())
return (*i).second;
}
return child_scope_t::lookup(kind, name);
}

View file

@ -172,7 +172,7 @@ class symbol_scope_t : public child_scope_t
{
typedef std::map<symbol_t, expr_t::ptr_op_t> symbol_map;
symbol_map symbols;
optional<symbol_map> symbols;
public:
explicit symbol_scope_t() {