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:
parent
5cd8e59652
commit
11a217a481
2 changed files with 17 additions and 13 deletions
28
src/scope.cc
28
src/scope.cc
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue