Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions src/asmjs/asm_v_wasm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,14 +107,13 @@ FunctionType* ensureFunctionType(std::string sig, Module* wasm) {
return wasm->getFunctionType(name);
}
// add new type
auto type = new FunctionType;
auto type = make_unique<FunctionType>();
type->name = name;
type->result = sigToType(sig[0]);
for (size_t i = 1; i < sig.size(); i++) {
type->params.push_back(sigToType(sig[i]));
}
wasm->addFunctionType(type);
return type;
return wasm->addFunctionType(std::move(type));
}

Expression* ensureDouble(Expression* expr, MixedArena& allocator) {
Expand Down
16 changes: 6 additions & 10 deletions src/binaryen-c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -306,21 +306,14 @@ void BinaryenModuleDispose(BinaryenModuleRef module) {

BinaryenFunctionTypeRef BinaryenAddFunctionType(BinaryenModuleRef module, const char* name, BinaryenType result, BinaryenType* paramTypes, BinaryenIndex numParams) {
auto* wasm = (Module*)module;
auto* ret = new FunctionType;
auto ret = make_unique<FunctionType>();
if (name) ret->name = name;
else ret->name = Name::fromInt(wasm->functionTypes.size());
ret->result = Type(result);
for (BinaryenIndex i = 0; i < numParams; i++) {
ret->params.push_back(Type(paramTypes[i]));
}

// Lock. This can be called from multiple threads at once, and is a
// point where they all access and modify the module.
{
std::lock_guard<std::mutex> lock(BinaryenFunctionTypeMutex);
wasm->addFunctionType(ret);
}

if (tracing) {
std::cout << " {\n";
std::cout << " BinaryenType paramTypes[] = { ";
Expand All @@ -332,13 +325,16 @@ BinaryenFunctionTypeRef BinaryenAddFunctionType(BinaryenModuleRef module, const
std::cout << " };\n";
size_t id = functionTypes.size();
std::cout << " functionTypes[" << id << "] = BinaryenAddFunctionType(the_module, ";
functionTypes[ret] = id;
functionTypes[ret.get()] = id;
traceNameOrNULL(name);
std::cout << ", " << result << ", paramTypes, " << numParams << ");\n";
std::cout << " }\n";
}

return ret;
// Lock. This can be called from multiple threads at once, and is a
// point where they all access and modify the module.
std::lock_guard<std::mutex> lock(BinaryenFunctionTypeMutex);
return wasm->addFunctionType(std::move(ret));
}
void BinaryenRemoveFunctionType(BinaryenModuleRef module, const char* name) {
if (tracing) {
Expand Down
2 changes: 1 addition & 1 deletion src/ir/module-utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ inline void copyModule(Module& in, Module& out) {
// we use names throughout, not raw points, so simple copying is fine
// for everything *but* expressions
for (auto& curr : in.functionTypes) {
out.addFunctionType(new FunctionType(*curr));
out.addFunctionType(make_unique<FunctionType>(*curr));
}
for (auto& curr : in.exports) {
out.addExport(new Export(*curr));
Expand Down
6 changes: 3 additions & 3 deletions src/passes/LegalizeJSInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ struct LegalizeJSInterface : public Pass {
// wasm calls the import, so it must call a stub that calls the actual legal JS import
Name makeLegalStubForCalledImport(Function* im, Module* module) {
Builder builder(*module);
auto* type = new FunctionType;
auto type = make_unique<FunctionType>();
type->name = Name(std::string("legaltype$") + im->name.str);
auto* legal = new Function;
legal->name = Name(std::string("legalimport$") + im->name.str);
Expand Down Expand Up @@ -236,13 +236,13 @@ struct LegalizeJSInterface : public Pass {
type->result = imFunctionType->result;
}
func->result = imFunctionType->result;
FunctionTypeUtils::fillFunction(legal, type);
FunctionTypeUtils::fillFunction(legal, type.get());

if (!module->getFunctionOrNull(func->name)) {
module->addFunction(func);
}
if (!module->getFunctionTypeOrNull(type->name)) {
module->addFunctionType(type);
module->addFunctionType(std::move(type));
}
if (!module->getFunctionOrNull(legal->name)) {
module->addFunction(legal);
Expand Down
2 changes: 1 addition & 1 deletion src/tools/wasm-merge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ struct InputMergeable : public ExpressionStackWalker<InputMergeable, Visitor<Inp

// copy in the data
for (auto& curr : wasm.functionTypes) {
outputMergeable.wasm.addFunctionType(curr.release());
outputMergeable.wasm.addFunctionType(std::move(curr));
}
for (auto& curr : wasm.globals) {
if (curr->imported()) {
Expand Down
2 changes: 1 addition & 1 deletion src/wasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -917,7 +917,7 @@ class Module {
Function* getFunctionOrNull(Name name);
Global* getGlobalOrNull(Name name);

void addFunctionType(FunctionType* curr);
FunctionType* addFunctionType(std::unique_ptr<FunctionType> curr);
void addExport(Export* curr);
void addFunction(Function* curr);
void addGlobal(Global* curr);
Expand Down
4 changes: 2 additions & 2 deletions src/wasm/wasm-binary.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -937,7 +937,7 @@ void WasmBinaryBuilder::readSignatures() {
if (debug) std::cerr << "num: " << numTypes << std::endl;
for (size_t i = 0; i < numTypes; i++) {
if (debug) std::cerr << "read one" << std::endl;
auto curr = new FunctionType;
auto curr = make_unique<FunctionType>();
auto form = getS32LEB();
if (form != BinaryConsts::EncodedType::Func) {
throwError("bad signature form " + std::to_string(form));
Expand All @@ -957,7 +957,7 @@ void WasmBinaryBuilder::readSignatures() {
curr->result = getType();
}
curr->name = Name::fromInt(wasm.functionTypes.size());
wasm.addFunctionType(curr);
wasm.addFunctionType(std::move(curr));
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/wasm/wasm-s-parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,7 @@ void SExpressionWasmBuilder::preParseFunctionType(Element& s) {
functionType->name = Name::fromInt(wasm.functionTypes.size());
functionTypeNames.push_back(functionType->name);
if (wasm.getFunctionTypeOrNull(functionType->name)) throw ParseException("duplicate function type", s.line, s.col);
wasm.addFunctionType(functionType.release());
wasm.addFunctionType(std::move(functionType));
}
}
}
Expand Down Expand Up @@ -1828,7 +1828,7 @@ void SExpressionWasmBuilder::parseType(Element& s) {
}
functionTypeNames.push_back(type->name);
if (wasm.getFunctionTypeOrNull(type->name)) throw ParseException("duplicate function type", s.line, s.col);
wasm.addFunctionType(type.release());
wasm.addFunctionType(std::move(type));
}

} // namespace wasm
8 changes: 5 additions & 3 deletions src/wasm/wasm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -809,15 +809,17 @@ Global* Module::getGlobalOrNull(Name name) {
return iter->second;
}

void Module::addFunctionType(FunctionType* curr) {
FunctionType* Module::addFunctionType(std::unique_ptr<FunctionType> curr) {
if (!curr->name.is()) {
Fatal() << "Module::addFunctionType: empty name";
}
if (getFunctionTypeOrNull(curr->name)) {
Fatal() << "Module::addFunctionType: " << curr->name << " already exists";
}
functionTypes.push_back(std::unique_ptr<FunctionType>(curr));
functionTypesMap[curr->name] = curr;
auto* p = curr.get();
functionTypes.emplace_back(std::move(curr));
functionTypesMap[p->name] = p;
return p;
}

void Module::addExport(Export* curr) {
Expand Down