summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-emscripten.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/wasm-emscripten.cpp')
-rw-r--r--src/wasm/wasm-emscripten.cpp116
1 files changed, 60 insertions, 56 deletions
diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp
index a43fc1fe7..92a11b8f1 100644
--- a/src/wasm/wasm-emscripten.cpp
+++ b/src/wasm/wasm-emscripten.cpp
@@ -755,73 +755,76 @@ std::string EmscriptenGlueGenerator::generateEmscriptenMetadata(
Address staticBump, std::vector<Name> const& initializerFunctions,
unsigned numReservedFunctionPointers) {
bool commaFirst;
- auto maybeComma = [&commaFirst]() {
+ auto nextElement = [&commaFirst]() {
if (commaFirst) {
commaFirst = false;
- return "";
+ return "\n ";
} else {
- return ",";
+ return ",\n ";
}
};
std::stringstream meta;
- meta << "{ ";
+ meta << "{\n";
AsmConstWalker emAsmWalker = fixEmAsmConstsAndReturnWalker(wasm);
// print
commaFirst = true;
- meta << "\"asmConsts\": {";
- for (auto& pair : emAsmWalker.sigsForCode) {
- auto& code = pair.first;
- auto& sigs = pair.second;
- meta << maybeComma();
- meta << '"' << emAsmWalker.ids[code] << "\": [\"" << code << "\", ";
- printSet(meta, sigs);
- meta << ", ";
+ if (!emAsmWalker.sigsForCode.empty()) {
+ meta << " \"asmConsts\": {";
+ for (auto& pair : emAsmWalker.sigsForCode) {
+ auto& code = pair.first;
+ auto& sigs = pair.second;
+ meta << nextElement();
+ meta << '"' << emAsmWalker.ids[code] << "\": [\"" << code << "\", ";
+ printSet(meta, sigs);
+ meta << ", ";
- // TODO: proxying to main thread. Currently this is unsupported, so proxy
- // mode is "none", represented by an empty string.
- meta << "[\"\"]";
+ // TODO: proxying to main thread. Currently this is unsupported, so proxy
+ // mode is "none", represented by an empty string.
+ meta << "[\"\"]";
- meta << "]";
+ meta << "]";
+ }
+ meta << "\n },\n";
}
- meta << "},";
EmJsWalker emJsWalker = fixEmJsFuncsAndReturnWalker(wasm);
- if (emJsWalker.codeByName.size() > 0) {
- meta << "\"emJsFuncs\": {";
+ if (!emJsWalker.codeByName.empty()) {
+ meta << "\" emJsFuncs\": {";
commaFirst = true;
for (auto& pair : emJsWalker.codeByName) {
auto& name = pair.first;
auto& code = pair.second;
- meta << maybeComma();
+ meta << nextElement();
meta << '"' << name << "\": \"" << code << '"';
}
- meta << "},";
+ meta << "\n },\n";
}
- meta << "\"staticBump\": " << staticBump << ", ";
+ meta << " \"staticBump\": " << staticBump << ",\n";
- meta << "\"initializers\": [";
- commaFirst = true;
- for (const auto& func : initializerFunctions) {
- meta << maybeComma();
- meta << "\"" << func.c_str() << "\"";
+ if (!initializerFunctions.empty()) {
+ meta << " \"initializers\": [";
+ commaFirst = true;
+ for (const auto& func : initializerFunctions) {
+ meta << nextElement();
+ meta << "\"" << func.c_str() << "\"";
+ }
+ meta << "\n ],\n";
}
- meta << "]";
if (numReservedFunctionPointers) {
JSCallWalker jsCallWalker = getJSCallWalker(wasm);
- meta << ", ";
- meta << "\"jsCallStartIndex\": " << jsCallWalker.jsCallStartIndex << ", ";
- meta << "\"jsCallFuncType\": [";
+ meta << " \"jsCallStartIndex\": " << jsCallWalker.jsCallStartIndex << ",\n";
+ meta << " \"jsCallFuncType\": [";
commaFirst = true;
for (std::string sig : jsCallWalker.indirectlyCallableSigs) {
- meta << maybeComma();
+ meta << nextElement();
meta << "\"" << sig << "\"";
}
- meta << "]";
+ meta << "\n ],\n";
}
// Avoid adding duplicate imports to `declares' or `invokeFuncs`. Even
@@ -833,7 +836,7 @@ std::string EmscriptenGlueGenerator::generateEmscriptenMetadata(
// We use the `base` rather than the `name` of the imports here and below
// becasue this is the externally visible name that the embedder (JS) will
// see.
- meta << ", \"declares\": [";
+ meta << " \"declares\": [";
commaFirst = true;
ModuleUtils::iterImportedFunctions(wasm, [&](Function* import) {
if (emJsWalker.codeByName.count(import->base.str) == 0 &&
@@ -841,47 +844,48 @@ std::string EmscriptenGlueGenerator::generateEmscriptenMetadata(
!import->base.startsWith("invoke_") &&
!import->base.startsWith("jsCall_")) {
if (declares.insert(import->base.str).second) {
- meta << maybeComma() << '"' << import->base.str << '"';
+ meta << nextElement() << '"' << import->base.str << '"';
}
}
});
- meta << "]";
+ meta << "\n ],\n";
- meta << ", \"externs\": [";
+ meta << " \"externs\": [";
commaFirst = true;
ModuleUtils::iterImportedGlobals(wasm, [&](Global* import) {
- meta << maybeComma() << "\"_" << import->base.str << '"';
+ meta << nextElement() << "\"_" << import->base.str << '"';
});
- meta << "]";
+ meta << "\n ],\n";
- meta << ", \"implementedFunctions\": [";
- commaFirst = true;
- for (const auto& ex : wasm.exports) {
- if (ex->kind == ExternalKind::Function) {
- meta << maybeComma() << "\"_" << ex->name.str << '"';
+ if (!wasm.exports.empty()) {
+ meta << " \"implementedFunctions\": [";
+ commaFirst = true;
+ for (const auto& ex : wasm.exports) {
+ if (ex->kind == ExternalKind::Function) {
+ meta << nextElement() << "\"_" << ex->name.str << '"';
+ }
}
- }
- meta << "]";
+ meta << "\n ],\n";
- meta << ", \"exports\": [";
- commaFirst = true;
- for (const auto& ex : wasm.exports) {
- meta << maybeComma() << '"' << ex->name.str << '"';
+ meta << " \"exports\": [";
+ commaFirst = true;
+ for (const auto& ex : wasm.exports) {
+ meta << nextElement() << '"' << ex->name.str << '"';
+ }
+ meta << "\n ],\n";
}
- meta << "]";
- meta << ", \"invokeFuncs\": [";
+ meta << " \"invokeFuncs\": [";
commaFirst = true;
ModuleUtils::iterImportedFunctions(wasm, [&](Function* import) {
if (import->base.startsWith("invoke_")) {
if (invokeFuncs.insert(import->base.str).second) {
- meta << maybeComma() << '"' << import->base.str << '"';
+ meta << nextElement() << '"' << import->base.str << '"';
}
}
});
- meta << "]";
-
- meta << " }\n";
+ meta << "\n ]\n";
+ meta << "}\n";
return meta.str();
}