summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/ReorderLocals.cpp1
-rw-r--r--src/wasm-builder.h18
-rw-r--r--src/wasm.h2
-rw-r--r--src/wasm/wasm.cpp15
4 files changed, 20 insertions, 16 deletions
diff --git a/src/passes/ReorderLocals.cpp b/src/passes/ReorderLocals.cpp
index c18675cda..c880714e6 100644
--- a/src/passes/ReorderLocals.cpp
+++ b/src/passes/ReorderLocals.cpp
@@ -108,7 +108,6 @@ struct ReorderLocals : public WalkerPass<PostWalker<ReorderLocals>> {
auto oldLocalNames = curr->localNames;
auto oldLocalIndices = curr->localIndices;
curr->localNames.clear();
- curr->localNames.resize(newToOld.size());
curr->localIndices.clear();
for (size_t i = 0; i < newToOld.size(); i++) {
if (newToOld[i] < oldLocalNames.size()) {
diff --git a/src/wasm-builder.h b/src/wasm-builder.h
index e451f9e2b..4591c9c0d 100644
--- a/src/wasm-builder.h
+++ b/src/wasm-builder.h
@@ -54,13 +54,15 @@ public:
for (auto& param : params) {
func->params.push_back(param.type);
- func->localIndices[param.name] = func->localNames.size();
- func->localNames.push_back(param.name);
+ Index index = func->localNames.size();
+ func->localIndices[param.name] = index;
+ func->localNames[index] = param.name;
}
for (auto& var : vars) {
func->vars.push_back(var.type);
- func->localIndices[var.name] = func->localNames.size();
- func->localNames.push_back(var.name);
+ Index index = func->localNames.size();
+ func->localIndices[var.name] = index;
+ func->localNames[index] = var.name;
}
return func;
@@ -321,15 +323,17 @@ public:
func->params.push_back(type);
Index index = func->localNames.size();
func->localIndices[name] = index;
- func->localNames.push_back(name);
+ func->localNames[index] = name;
return index;
}
static Index addVar(Function* func, Name name, WasmType type) {
// always ok to add a var, it does not affect other indices
Index index = func->getNumLocals();
- if (name.is()) func->localIndices[name] = index;
- func->localNames.push_back(name);
+ if (name.is()) {
+ func->localIndices[name] = index;
+ func->localNames[index] = name;
+ }
func->vars.emplace_back(type);
return index;
}
diff --git a/src/wasm.h b/src/wasm.h
index fc167342a..50646e39f 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -591,7 +591,7 @@ public:
Expression* body;
// local names. these are optional.
- std::vector<Name> localNames;
+ std::map<Index, Name> localNames;
std::map<Name, Index> localIndices;
struct DebugLocation {
diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp
index 6db11cc7d..f4562fe64 100644
--- a/src/wasm/wasm.cpp
+++ b/src/wasm/wasm.cpp
@@ -578,25 +578,26 @@ bool Function::isVar(Index index) {
}
bool Function::hasLocalName(Index index) const {
- return index < localNames.size() && localNames[index].is();
+ return localNames.find(index) != localNames.end();
}
Name Function::getLocalName(Index index) {
- assert(hasLocalName(index));
- return localNames[index];
+ return localNames.at(index);
}
Name Function::getLocalNameOrDefault(Index index) {
- if (hasLocalName(index)) {
- return localNames[index];
+ auto nameIt = localNames.find(index);
+ if (nameIt != localNames.end()) {
+ return nameIt->second;
}
// this is an unnamed local
return Name();
}
Name Function::getLocalNameOrGeneric(Index index) {
- if (hasLocalName(index)) {
- return localNames[index];
+ auto nameIt = localNames.find(index);
+ if (nameIt != localNames.end()) {
+ return nameIt->second;
}
return Name::fromInt(index);
}