@@ -3714,61 +3714,97 @@ void BinaryenAddFunctionImport(BinaryenModuleRef module,
3714
3714
const char * externalBaseName,
3715
3715
BinaryenType params,
3716
3716
BinaryenType results) {
3717
- auto * ret = new Function ();
3718
- ret->name = internalName;
3719
- ret->module = externalModuleName;
3720
- ret->base = externalBaseName;
3721
- // TODO: Take a HeapType rather than params and results.
3722
- ret->type = Signature (Type (params), Type (results));
3723
- ((Module*)module)->addFunction (ret);
3717
+ auto * func = ((Module*)module)->getFunctionOrNull (internalName);
3718
+ if (func == nullptr ) {
3719
+ auto func = make_unique<Function>();
3720
+ func->name = internalName;
3721
+ func->module = externalModuleName;
3722
+ func->base = externalBaseName;
3723
+ // TODO: Take a HeapType rather than params and results.
3724
+ func->type = Signature (Type (params), Type (results));
3725
+ ((Module*)module)->addFunction (std::move (func));
3726
+ } else {
3727
+ // already exists so just set module and base
3728
+ func->module = externalModuleName;
3729
+ func->base = externalBaseName;
3730
+ }
3724
3731
}
3725
3732
void BinaryenAddTableImport (BinaryenModuleRef module,
3726
3733
const char * internalName,
3727
3734
const char * externalModuleName,
3728
3735
const char * externalBaseName) {
3729
- auto table = std::make_unique<Table>();
3730
- table->name = internalName;
3731
- table->module = externalModuleName;
3732
- table->base = externalBaseName;
3733
- ((Module*)module)->addTable (std::move (table));
3736
+ auto * table = ((Module*)module)->getTableOrNull (internalName);
3737
+ if (table == nullptr ) {
3738
+ auto table = make_unique<Table>();
3739
+ table->name = internalName;
3740
+ table->module = externalModuleName;
3741
+ table->base = externalBaseName;
3742
+ ((Module*)module)->addTable (std::move (table));
3743
+ } else {
3744
+ // already exists so just set module and base
3745
+ table->module = externalModuleName;
3746
+ table->base = externalBaseName;
3747
+ }
3734
3748
}
3735
3749
void BinaryenAddMemoryImport (BinaryenModuleRef module,
3736
3750
const char * internalName,
3737
3751
const char * externalModuleName,
3738
3752
const char * externalBaseName,
3739
3753
uint8_t shared) {
3740
- auto memory = Builder::makeMemory (internalName);
3741
- memory->module = externalModuleName;
3742
- memory->base = externalBaseName;
3743
- memory->shared = shared;
3744
- ((Module*)module)->addMemory (std::move (memory));
3754
+ auto * memory = ((Module*)module)->getMemoryOrNull (internalName);
3755
+ if (memory == nullptr ) {
3756
+ auto memory = make_unique<Memory>();
3757
+ memory->name = internalName;
3758
+ memory->module = externalModuleName;
3759
+ memory->base = externalBaseName;
3760
+ memory->shared = shared;
3761
+ ((Module*)module)->addMemory (std::move (memory));
3762
+ } else {
3763
+ // already exists so just set module and base
3764
+ memory->module = externalModuleName;
3765
+ memory->base = externalBaseName;
3766
+ }
3745
3767
}
3746
3768
void BinaryenAddGlobalImport (BinaryenModuleRef module,
3747
3769
const char * internalName,
3748
3770
const char * externalModuleName,
3749
3771
const char * externalBaseName,
3750
3772
BinaryenType globalType,
3751
3773
bool mutable_) {
3752
- auto * ret = new Global ();
3753
- ret->name = internalName;
3754
- ret->module = externalModuleName;
3755
- ret->base = externalBaseName;
3756
- ret->type = Type (globalType);
3757
- ret->mutable_ = mutable_;
3758
- ((Module*)module)->addGlobal (ret);
3774
+ auto * glob = ((Module*)module)->getGlobalOrNull (internalName);
3775
+ if (glob == nullptr ) {
3776
+ auto glob = make_unique<Global>();
3777
+ glob->name = internalName;
3778
+ glob->module = externalModuleName;
3779
+ glob->base = externalBaseName;
3780
+ glob->type = Type (globalType);
3781
+ glob->mutable_ = mutable_;
3782
+ ((Module*)module)->addGlobal (std::move (glob));
3783
+ } else {
3784
+ // already exists so just set module and base
3785
+ glob->module = externalModuleName;
3786
+ glob->base = externalBaseName;
3787
+ }
3759
3788
}
3760
3789
void BinaryenAddTagImport (BinaryenModuleRef module,
3761
3790
const char * internalName,
3762
3791
const char * externalModuleName,
3763
3792
const char * externalBaseName,
3764
3793
BinaryenType params,
3765
3794
BinaryenType results) {
3766
- auto * ret = new Tag ();
3767
- ret->name = internalName;
3768
- ret->module = externalModuleName;
3769
- ret->base = externalBaseName;
3770
- ret->sig = Signature (Type (params), Type (results));
3771
- ((Module*)module)->addTag (ret);
3795
+ auto * tag = ((Module*)module)->getGlobalOrNull (internalName);
3796
+ if (tag == nullptr ) {
3797
+ auto tag = make_unique<Tag>();
3798
+ tag->name = internalName;
3799
+ tag->module = externalModuleName;
3800
+ tag->base = externalBaseName;
3801
+ tag->sig = Signature (Type (params), Type (results));
3802
+ ((Module*)module)->addTag (std::move (tag));
3803
+ } else {
3804
+ // already exists so just set module and base
3805
+ tag->module = externalModuleName;
3806
+ tag->base = externalBaseName;
3807
+ }
3772
3808
}
3773
3809
3774
3810
// Exports
0 commit comments