diff options
author | 2016-07-12 09:07:21 -0700 | |
---|---|---|
committer | 2016-07-12 09:07:21 -0700 | |
commit | 9fd67a1f53809f5eff1210dd107241b450c48acc (patch) | |
tree | da60b78933d92f796cf1f5dc3ff3dffa6febf78f /src/sksl/ir/SkSLSymbolTable.cpp | |
parent | 5dba301e916448bbb17bfe8e70dc367f32eb7159 (diff) |
SkSL performance improvements (plus a couple of minor warning fixes)
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2131223002
Review-Url: https://codereview.chromium.org/2131223002
Diffstat (limited to 'src/sksl/ir/SkSLSymbolTable.cpp')
-rw-r--r-- | src/sksl/ir/SkSLSymbolTable.cpp | 81 |
1 files changed, 48 insertions, 33 deletions
diff --git a/src/sksl/ir/SkSLSymbolTable.cpp b/src/sksl/ir/SkSLSymbolTable.cpp index af83f7a456..80e22da009 100644 --- a/src/sksl/ir/SkSLSymbolTable.cpp +++ b/src/sksl/ir/SkSLSymbolTable.cpp @@ -5,23 +5,23 @@ * found in the LICENSE file. */ - #include "SkSLSymbolTable.h" +#include "SkSLSymbolTable.h" +#include "SkSLUnresolvedFunction.h" namespace SkSL { -std::vector<std::shared_ptr<FunctionDeclaration>> SymbolTable::GetFunctions( - const std::shared_ptr<Symbol>& s) { - switch (s->fKind) { +std::vector<const FunctionDeclaration*> SymbolTable::GetFunctions(const Symbol& s) { + switch (s.fKind) { case Symbol::kFunctionDeclaration_Kind: - return { std::static_pointer_cast<FunctionDeclaration>(s) }; + return { &((FunctionDeclaration&) s) }; case Symbol::kUnresolvedFunction_Kind: - return ((UnresolvedFunction&) *s).fFunctions; + return ((UnresolvedFunction&) s).fFunctions; default: return { }; } } -std::shared_ptr<Symbol> SymbolTable::operator[](const std::string& name) { +const Symbol* SymbolTable::operator[](const std::string& name) { const auto& entry = fSymbols.find(name); if (entry == fSymbols.end()) { if (fParent) { @@ -30,15 +30,15 @@ std::shared_ptr<Symbol> SymbolTable::operator[](const std::string& name) { return nullptr; } if (fParent) { - auto functions = GetFunctions(entry->second); + auto functions = GetFunctions(*entry->second); if (functions.size() > 0) { bool modified = false; - std::shared_ptr<Symbol> previous = (*fParent)[name]; + const Symbol* previous = (*fParent)[name]; if (previous) { - auto previousFunctions = GetFunctions(previous); - for (const std::shared_ptr<FunctionDeclaration>& prev : previousFunctions) { + auto previousFunctions = GetFunctions(*previous); + for (const FunctionDeclaration* prev : previousFunctions) { bool found = false; - for (const std::shared_ptr<FunctionDeclaration>& current : functions) { + for (const FunctionDeclaration* current : functions) { if (current->matches(*prev)) { found = true; break; @@ -51,7 +51,7 @@ std::shared_ptr<Symbol> SymbolTable::operator[](const std::string& name) { } if (modified) { ASSERT(functions.size() > 1); - return std::shared_ptr<Symbol>(new UnresolvedFunction(functions)); + return this->takeOwnership(new UnresolvedFunction(functions)); } } } @@ -59,27 +59,42 @@ std::shared_ptr<Symbol> SymbolTable::operator[](const std::string& name) { return entry->second; } -void SymbolTable::add(const std::string& name, std::shared_ptr<Symbol> symbol) { - const auto& existing = fSymbols.find(name); - if (existing == fSymbols.end()) { - fSymbols[name] = symbol; - } else if (symbol->fKind == Symbol::kFunctionDeclaration_Kind) { - const std::shared_ptr<Symbol>& oldSymbol = existing->second; - if (oldSymbol->fKind == Symbol::kFunctionDeclaration_Kind) { - std::vector<std::shared_ptr<FunctionDeclaration>> functions; - functions.push_back(std::static_pointer_cast<FunctionDeclaration>(oldSymbol)); - functions.push_back(std::static_pointer_cast<FunctionDeclaration>(symbol)); - fSymbols[name].reset(new UnresolvedFunction(std::move(functions))); - } else if (oldSymbol->fKind == Symbol::kUnresolvedFunction_Kind) { - std::vector<std::shared_ptr<FunctionDeclaration>> functions; - for (const auto& f : ((UnresolvedFunction&) *oldSymbol).fFunctions) { - functions.push_back(f); - } - functions.push_back(std::static_pointer_cast<FunctionDeclaration>(symbol)); - fSymbols[name].reset(new UnresolvedFunction(std::move(functions))); +Symbol* SymbolTable::takeOwnership(Symbol* s) { + fOwnedPointers.push_back(std::unique_ptr<Symbol>(s)); + return s; +} + +void SymbolTable::add(const std::string& name, std::unique_ptr<Symbol> symbol) { + this->addWithoutOwnership(name, symbol.get()); + fOwnedPointers.push_back(std::move(symbol)); +} + +void SymbolTable::addWithoutOwnership(const std::string& name, const Symbol* symbol) { + const auto& existing = fSymbols.find(name); + if (existing == fSymbols.end()) { + fSymbols[name] = symbol; + } else if (symbol->fKind == Symbol::kFunctionDeclaration_Kind) { + const Symbol* oldSymbol = existing->second; + if (oldSymbol->fKind == Symbol::kFunctionDeclaration_Kind) { + std::vector<const FunctionDeclaration*> functions; + functions.push_back((const FunctionDeclaration*) oldSymbol); + functions.push_back((const FunctionDeclaration*) symbol); + UnresolvedFunction* u = new UnresolvedFunction(std::move(functions)); + fSymbols[name] = u; + this->takeOwnership(u); + } else if (oldSymbol->fKind == Symbol::kUnresolvedFunction_Kind) { + std::vector<const FunctionDeclaration*> functions; + for (const auto* f : ((UnresolvedFunction&) *oldSymbol).fFunctions) { + functions.push_back(f); } - } else { - fErrorReporter.error(symbol->fPosition, "symbol '" + name + "' was already defined"); + functions.push_back((const FunctionDeclaration*) symbol); + UnresolvedFunction* u = new UnresolvedFunction(std::move(functions)); + fSymbols[name] = u; + this->takeOwnership(u); } + } else { + fErrorReporter.error(symbol->fPosition, "symbol '" + name + "' was already defined"); } +} + } // namespace |