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
24
src/scope.cc
24
src/scope.cc
|
|
@ -42,14 +42,17 @@ 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
|
||||||
|
= 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));
|
def));
|
||||||
if (! result.second)
|
if (! result.second)
|
||||||
throw_(compile_error,
|
throw_(compile_error,
|
||||||
|
|
@ -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));
|
||||||
|
if (i != symbols->end())
|
||||||
return (*i).second;
|
return (*i).second;
|
||||||
|
}
|
||||||
return child_scope_t::lookup(kind, name);
|
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;
|
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() {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue