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); DEBUG("scope.symbols", "Defining '" << name << "' = " << def);
std::pair<symbol_map::iterator, bool> result if (! symbols)
= symbols.insert(symbol_map::value_type(symbol_t(kind, name, def), def)); symbols = symbol_map();
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), std::pair<symbol_map::iterator, bool> result
def)); = 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) if (! result.second)
throw_(compile_error, throw_(compile_error,
_("Redefinition of '%1' in the same scope") << name); _("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, expr_t::ptr_op_t symbol_scope_t::lookup(const symbol_t::kind_t kind,
const string& name) const string& name)
{ {
symbol_map::const_iterator i = symbols.find(symbol_t(kind, name)); if (symbols) {
if (i != symbols.end()) symbol_map::const_iterator i = symbols->find(symbol_t(kind, name));
return (*i).second; if (i != symbols->end())
return (*i).second;
}
return child_scope_t::lookup(kind, name); 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; typedef std::map<symbol_t, expr_t::ptr_op_t> symbol_map;
symbol_map symbols; optional<symbol_map> symbols;
public: public:
explicit symbol_scope_t() { explicit symbol_scope_t() {