From e504946a0eafb00df989054858a894eb794c6f33 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 30 Aug 2022 15:59:04 +0300 Subject: [PATCH 1/7] init --- src/binaryen-c.cpp | 11 +++++++++++ src/binaryen-c.h | 4 ++++ src/js/binaryen.js-post.js | 5 +++++ 3 files changed, 20 insertions(+) diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 7d11689b0c2..4c973a4acb3 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -3743,6 +3743,17 @@ void BinaryenAddMemoryImport(BinaryenModuleRef module, memory->shared = shared; ((Module*)module)->addMemory(std::move(memory)); } +void BinaryenSetMemoryImport(BinaryenModuleRef module, + const char* name, + const char* externalModuleName, + const char* externalBaseName) { + auto* memory = ((Module*)module)->getMemoryOrNull(name); + if (memory == nullptr) { + Fatal() << "invalid memory '" << name << "'."; + } + memory->module = externalModuleName; + memory->base = externalBaseName; +} void BinaryenAddGlobalImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, diff --git a/src/binaryen-c.h b/src/binaryen-c.h index a21c0966a1f..826c29a272f 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -2212,6 +2212,10 @@ BINARYEN_API void BinaryenAddTagImport(BinaryenModuleRef module, const char* externalBaseName, BinaryenType params, BinaryenType results); +BINARYEN_API void BinaryenSetMemoryImport(BinaryenModuleRef module, + const char* internalName, + const char* externalModuleName, + const char* externalBaseName); // Memory BINARYEN_REF(Memory); diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index c684553a5cc..99f696d05a4 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -2473,6 +2473,11 @@ function wrapModule(module, self = {}) { Module['_BinaryenAddMemoryImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName), shared) ); }; + self['setMemoryImport'] = function(internalName, externalModuleName, externalBaseName) { + return preserveStack(() => + Module['_BinaryenSetMemoryImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName)) + ); + }; self['addGlobalImport'] = function(internalName, externalModuleName, externalBaseName, globalType, mutable) { return preserveStack(() => Module['_BinaryenAddGlobalImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName), globalType, mutable) From 572e362a29019b2c06793cb818f046f8021a893e Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 30 Aug 2022 21:13:14 +0300 Subject: [PATCH 2/7] better --- src/binaryen-c.cpp | 102 ++++++++++++++++++++++++++++----------------- src/binaryen-c.h | 4 -- 2 files changed, 63 insertions(+), 43 deletions(-) diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 4c973a4acb3..91a3d09d72e 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -3714,45 +3714,55 @@ void BinaryenAddFunctionImport(BinaryenModuleRef module, const char* externalBaseName, BinaryenType params, BinaryenType results) { - auto* ret = new Function(); - ret->name = internalName; - ret->module = externalModuleName; - ret->base = externalBaseName; - // TODO: Take a HeapType rather than params and results. - ret->type = Signature(Type(params), Type(results)); - ((Module*)module)->addFunction(ret); + auto* func = ((Module*)module)->getFunctionOrNull(internalName); + if (func == nullptr) { + auto* func = new Function(); + func->name = internalName; + func->module = externalModuleName; + func->base = externalBaseName; + // TODO: Take a HeapType rather than params and results. + func->type = Signature(Type(params), Type(results)); + ((Module*)module)->addFunction(func); + } else { + // already exists so just set module and base + func->module = externalModuleName; + func->base = externalBaseName; + } } void BinaryenAddTableImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char* externalBaseName) { - auto table = std::make_unique(); - table->name = internalName; - table->module = externalModuleName; - table->base = externalBaseName; - ((Module*)module)->addTable(std::move(table)); + auto* table = ((Module*)module)->getTableOrNull(internalName); + if (table == nullptr) { + auto table = std::make_unique
(); + table->name = internalName; + table->module = externalModuleName; + table->base = externalBaseName; + ((Module*)module)->addTable(std::move(table)); + } else { + // already exists so just set module and base + table->module = externalModuleName; + table->base = externalBaseName; + } } void BinaryenAddMemoryImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char* externalBaseName, uint8_t shared) { - auto memory = Builder::makeMemory(internalName); - memory->module = externalModuleName; - memory->base = externalBaseName; - memory->shared = shared; - ((Module*)module)->addMemory(std::move(memory)); -} -void BinaryenSetMemoryImport(BinaryenModuleRef module, - const char* name, - const char* externalModuleName, - const char* externalBaseName) { - auto* memory = ((Module*)module)->getMemoryOrNull(name); + auto* memory = ((Module*)module)->getMemoryOrNull(internalName); if (memory == nullptr) { - Fatal() << "invalid memory '" << name << "'."; + auto memory = Builder::makeMemory(internalName); + memory->module = externalModuleName; + memory->base = externalBaseName; + memory->shared = shared; + ((Module*)module)->addMemory(std::move(memory)); + } else { + // already exists so just set module and base + memory->module = externalModuleName; + memory->base = externalBaseName; } - memory->module = externalModuleName; - memory->base = externalBaseName; } void BinaryenAddGlobalImport(BinaryenModuleRef module, const char* internalName, @@ -3760,13 +3770,20 @@ void BinaryenAddGlobalImport(BinaryenModuleRef module, const char* externalBaseName, BinaryenType globalType, bool mutable_) { - auto* ret = new Global(); - ret->name = internalName; - ret->module = externalModuleName; - ret->base = externalBaseName; - ret->type = Type(globalType); - ret->mutable_ = mutable_; - ((Module*)module)->addGlobal(ret); + auto* glob = ((Module*)module)->getGlobalOrNull(internalName); + if (glob == nullptr) { + auto* glob = new Global(); + glob->name = internalName; + glob->module = externalModuleName; + glob->base = externalBaseName; + glob->type = Type(globalType); + glob->mutable_ = mutable_; + ((Module*)module)->addGlobal(glob); + } else { + // already exists so just set module and base + glob->module = externalModuleName; + glob->base = externalBaseName; + } } void BinaryenAddTagImport(BinaryenModuleRef module, const char* internalName, @@ -3774,12 +3791,19 @@ void BinaryenAddTagImport(BinaryenModuleRef module, const char* externalBaseName, BinaryenType params, BinaryenType results) { - auto* ret = new Tag(); - ret->name = internalName; - ret->module = externalModuleName; - ret->base = externalBaseName; - ret->sig = Signature(Type(params), Type(results)); - ((Module*)module)->addTag(ret); + auto* tag = ((Module*)module)->getGlobalOrNull(internalName); + if (tag == nullptr) { + auto* tag = new Tag(); + tag->name = internalName; + tag->module = externalModuleName; + tag->base = externalBaseName; + tag->sig = Signature(Type(params), Type(results)); + ((Module*)module)->addTag(tag); + } else { + // already exists so just set module and base + tag->module = externalModuleName; + tag->base = externalBaseName; + } } // Exports diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 826c29a272f..a21c0966a1f 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -2212,10 +2212,6 @@ BINARYEN_API void BinaryenAddTagImport(BinaryenModuleRef module, const char* externalBaseName, BinaryenType params, BinaryenType results); -BINARYEN_API void BinaryenSetMemoryImport(BinaryenModuleRef module, - const char* internalName, - const char* externalModuleName, - const char* externalBaseName); // Memory BINARYEN_REF(Memory); From 400a1d2f1eee9020b8a5ab29a9952d2c45fd71cf Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 30 Aug 2022 21:16:08 +0300 Subject: [PATCH 3/7] cleanup --- src/js/binaryen.js-post.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 99f696d05a4..c684553a5cc 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -2473,11 +2473,6 @@ function wrapModule(module, self = {}) { Module['_BinaryenAddMemoryImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName), shared) ); }; - self['setMemoryImport'] = function(internalName, externalModuleName, externalBaseName) { - return preserveStack(() => - Module['_BinaryenSetMemoryImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName)) - ); - }; self['addGlobalImport'] = function(internalName, externalModuleName, externalBaseName, globalType, mutable) { return preserveStack(() => Module['_BinaryenAddGlobalImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName), globalType, mutable) From eb8847c6bbc30555ac22833ccdb2b1c305979899 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 30 Aug 2022 21:22:42 +0300 Subject: [PATCH 4/7] use unique pointes for consistency --- src/binaryen-c.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 91a3d09d72e..c6dd1c58bab 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -3716,13 +3716,13 @@ void BinaryenAddFunctionImport(BinaryenModuleRef module, BinaryenType results) { auto* func = ((Module*)module)->getFunctionOrNull(internalName); if (func == nullptr) { - auto* func = new Function(); + auto func = make_unique(); func->name = internalName; func->module = externalModuleName; func->base = externalBaseName; // TODO: Take a HeapType rather than params and results. func->type = Signature(Type(params), Type(results)); - ((Module*)module)->addFunction(func); + ((Module*)module)->addFunction(std::move(func)); } else { // already exists so just set module and base func->module = externalModuleName; @@ -3735,7 +3735,7 @@ void BinaryenAddTableImport(BinaryenModuleRef module, const char* externalBaseName) { auto* table = ((Module*)module)->getTableOrNull(internalName); if (table == nullptr) { - auto table = std::make_unique
(); + auto table = make_unique
(); table->name = internalName; table->module = externalModuleName; table->base = externalBaseName; @@ -3753,7 +3753,8 @@ void BinaryenAddMemoryImport(BinaryenModuleRef module, uint8_t shared) { auto* memory = ((Module*)module)->getMemoryOrNull(internalName); if (memory == nullptr) { - auto memory = Builder::makeMemory(internalName); + auto memory = make_unique(); + memory->name = internalName; memory->module = externalModuleName; memory->base = externalBaseName; memory->shared = shared; @@ -3772,13 +3773,13 @@ void BinaryenAddGlobalImport(BinaryenModuleRef module, bool mutable_) { auto* glob = ((Module*)module)->getGlobalOrNull(internalName); if (glob == nullptr) { - auto* glob = new Global(); + auto glob = make_unique(); glob->name = internalName; glob->module = externalModuleName; glob->base = externalBaseName; glob->type = Type(globalType); glob->mutable_ = mutable_; - ((Module*)module)->addGlobal(glob); + ((Module*)module)->addGlobal(std::move(glob)); } else { // already exists so just set module and base glob->module = externalModuleName; @@ -3793,12 +3794,12 @@ void BinaryenAddTagImport(BinaryenModuleRef module, BinaryenType results) { auto* tag = ((Module*)module)->getGlobalOrNull(internalName); if (tag == nullptr) { - auto* tag = new Tag(); + auto tag = make_unique(); tag->name = internalName; tag->module = externalModuleName; tag->base = externalBaseName; tag->sig = Signature(Type(params), Type(results)); - ((Module*)module)->addTag(tag); + ((Module*)module)->addTag(std::move(tag)); } else { // already exists so just set module and base tag->module = externalModuleName; From 6c49f4c128f7b92f2109a34a2d3b144a06985852 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 30 Aug 2022 21:37:16 +0300 Subject: [PATCH 5/7] add comment below Import --- src/binaryen-c.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/binaryen-c.h b/src/binaryen-c.h index a21c0966a1f..32ffea453e9 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -2185,6 +2185,10 @@ BinaryenGetFunctionByIndex(BinaryenModuleRef module, BinaryenIndex index); // Imports +// These either create a new entity (function/table/memory/etc.) and +// mark it as an import, or, if an entity already exists with internalName then +// the existing entity is turned into an import. + BINARYEN_API void BinaryenAddFunctionImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, From f49741e16787018b3a37867323abfb15f5b5809a Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 30 Aug 2022 21:50:30 +0300 Subject: [PATCH 6/7] fix --- src/binaryen-c.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index c6dd1c58bab..5c44dc708a8 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -3757,6 +3757,9 @@ void BinaryenAddMemoryImport(BinaryenModuleRef module, memory->name = internalName; memory->module = externalModuleName; memory->base = externalBaseName; + memory->initial = 0; + memory->max = Memory::kMaxSize32; + memory->indexType = Type::i32; memory->shared = shared; ((Module*)module)->addMemory(std::move(memory)); } else { From cd069e4c626c668fbf7f4a8ac65b300c16807446 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 30 Aug 2022 21:54:08 +0300 Subject: [PATCH 7/7] revert (unnecessary) --- src/binaryen-c.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 5c44dc708a8..c6dd1c58bab 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -3757,9 +3757,6 @@ void BinaryenAddMemoryImport(BinaryenModuleRef module, memory->name = internalName; memory->module = externalModuleName; memory->base = externalBaseName; - memory->initial = 0; - memory->max = Memory::kMaxSize32; - memory->indexType = Type::i32; memory->shared = shared; ((Module*)module)->addMemory(std::move(memory)); } else {