aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/sksl/ir/SkSLSymbolTable.cpp
diff options
context:
space:
mode:
authorGravatar ethannicholas <ethannicholas@google.com>2016-07-12 09:07:21 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-07-12 09:07:21 -0700
commit9fd67a1f53809f5eff1210dd107241b450c48acc (patch)
treeda60b78933d92f796cf1f5dc3ff3dffa6febf78f /src/sksl/ir/SkSLSymbolTable.cpp
parent5dba301e916448bbb17bfe8e70dc367f32eb7159 (diff)
SkSL performance improvements (plus a couple of minor warning fixes)
Diffstat (limited to 'src/sksl/ir/SkSLSymbolTable.cpp')
-rw-r--r--src/sksl/ir/SkSLSymbolTable.cpp81
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