diff options
author | Daniel Wirtz <dcode@dcode.io> | 2019-10-11 19:35:30 +0200 |
---|---|---|
committer | Alon Zakai <azakai@google.com> | 2019-10-11 10:35:30 -0700 |
commit | 4e80fde446764102fe5685496f351f0539377ff6 (patch) | |
tree | 4de5fffd75456294c556647c6c0c480584ce73ef /src | |
parent | c6cd444496c4c1b684dbc69b10fc2f5cbfdd8e47 (diff) | |
download | binaryen-4e80fde446764102fe5685496f351f0539377ff6.tar.gz binaryen-4e80fde446764102fe5685496f351f0539377ff6.tar.bz2 binaryen-4e80fde446764102fe5685496f351f0539377ff6.zip |
Add offset parameter to BinaryenSetFunctionTable (#2380)
This PR adds an offset parameter to BinaryenSetFunctionTable so table elements
can start at the value of an (imported constant) global. Previously, the offset
was fixed to zero. As usual this is a breaking change to the C-API but backwards
compatible when using the JS-API.
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 9 | ||||
-rw-r--r-- | src/binaryen-c.h | 3 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 5 |
3 files changed, 10 insertions, 7 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 7b4ee2bc5..2307de3e6 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -3449,7 +3449,8 @@ void BinaryenSetFunctionTable(BinaryenModuleRef module, BinaryenIndex initial, BinaryenIndex maximum, const char** funcNames, - BinaryenIndex numFuncNames) { + BinaryenIndex numFuncNames, + BinaryenExpressionRef offset) { if (tracing) { std::cout << " {\n"; std::cout << " const char* funcNames[] = { "; @@ -3461,13 +3462,13 @@ void BinaryenSetFunctionTable(BinaryenModuleRef module, } std::cout << " };\n"; std::cout << " BinaryenSetFunctionTable(the_module, " << initial << ", " - << maximum << ", funcNames, " << numFuncNames << ");\n"; + << maximum << ", funcNames, " << numFuncNames << ", expressions[" + << expressions[offset] << "]);\n"; std::cout << " }\n"; } auto* wasm = (Module*)module; - Table::Segment segment( - wasm->allocator.alloc<Const>()->set(Literal(int32_t(0)))); + Table::Segment segment((Expression*)offset); for (BinaryenIndex i = 0; i < numFuncNames; i++) { segment.data.push_back(funcNames[i]); } diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 3d15a7efe..ab159695a 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -1144,7 +1144,8 @@ BINARYEN_API void BinaryenSetFunctionTable(BinaryenModuleRef module, BinaryenIndex initial, BinaryenIndex maximum, const char** funcNames, - BinaryenIndex numFuncNames); + BinaryenIndex numFuncNames, + BinaryenExpressionRef offset); // Memory. One per module diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 8f49b105c..03e57d3d5 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -2056,11 +2056,12 @@ function wrapModule(module, self) { return Module['_BinaryenRemoveExport'](module, strToStack(externalName)); }); }; - self['setFunctionTable'] = function(initial, maximum, funcNames) { + self['setFunctionTable'] = function(initial, maximum, funcNames, offset) { return preserveStack(function() { return Module['_BinaryenSetFunctionTable'](module, initial, maximum, i32sToStack(funcNames.map(strToStack)), - funcNames.length + funcNames.length, + offset || self['i32']['const'](0) ); }); }; |