summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--src/binaryen-c.cpp9
-rw-r--r--src/binaryen-c.h2
-rw-r--r--src/js/binaryen.js-post.js9
-rw-r--r--test/binaryen.js/kitchen-sink.js3
-rw-r--r--test/binaryen.js/kitchen-sink.js.txt6
-rw-r--r--test/example/c-api-kitchen-sink.c2
-rw-r--r--test/example/c-api-kitchen-sink.txt2
8 files changed, 18 insertions, 16 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2f98b5797..3891c43ec 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,3 +15,4 @@ Current Trunk
### BREAKING CHANGES
- `BinaryenSetFunctionTable` in the C API no longer accepts an array of functions, instead it accepts an array of function names, `const char** funcNames`. Previously, you could not include imported functions because they are of type `BinaryenImportRef` instead of `BinaryenFunctionRef`. [#1650](https://github.com/WebAssembly/binaryen/pull/1650)
+- `BinaryenSetFunctionTable` in the C API now expects the initial and maximum table size as additional parameters, like `BinaryenSetMemory` does for pages, so tables can be grown dynamically. [#1687](https://github.com/WebAssembly/binaryen/pull/1687)
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 2d082c088..b8fa9d034 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -1778,7 +1778,7 @@ void BinaryenRemoveExport(BinaryenModuleRef module, const char* externalName) {
// Function table. One per module
-void BinaryenSetFunctionTable(BinaryenModuleRef module, const char** funcNames, BinaryenIndex numFuncNames) {
+void BinaryenSetFunctionTable(BinaryenModuleRef module, BinaryenIndex initial, BinaryenIndex maximum, const char** funcNames, BinaryenIndex numFuncNames) {
if (tracing) {
std::cout << " {\n";
std::cout << " const char* funcNames[] = { ";
@@ -1787,18 +1787,19 @@ void BinaryenSetFunctionTable(BinaryenModuleRef module, const char** funcNames,
std::cout << "\"" << funcNames[i] << "\"";
}
std::cout << " };\n";
- std::cout << " BinaryenSetFunctionTable(the_module, funcNames, " << numFuncNames << ");\n";
+ std::cout << " BinaryenSetFunctionTable(the_module, " << initial << ", " << maximum << ", funcNames, " << numFuncNames << ");\n";
std::cout << " }\n";
}
auto* wasm = (Module*)module;
- wasm->table.exists = true;
Table::Segment segment(wasm->allocator.alloc<Const>()->set(Literal(int32_t(0))));
for (BinaryenIndex i = 0; i < numFuncNames; i++) {
segment.data.push_back(funcNames[i]);
}
+ wasm->table.initial = initial;
+ wasm->table.max = maximum;
+ wasm->table.exists = true;
wasm->table.segments.push_back(segment);
- wasm->table.initial = wasm->table.max = numFuncNames;
}
// Memory. One per module
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index 9a2750353..74eb776ce 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -616,7 +616,7 @@ BinaryenGlobalRef BinaryenAddGlobal(BinaryenModuleRef module, const char* name,
// Function table. One per module
-void BinaryenSetFunctionTable(BinaryenModuleRef module, const char** funcNames, BinaryenIndex numFuncNames);
+void BinaryenSetFunctionTable(BinaryenModuleRef module, BinaryenIndex initial, BinaryenIndex maximum, const char** funcNames, BinaryenIndex numFuncNames);
// Memory. One per module
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index 6b4a0ae16..0222d1b75 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -1112,11 +1112,12 @@ Module['Module'] = function(module) {
return Module['_BinaryenRemoveExport'](module, strToStack(externalName));
});
};
- this['setFunctionTable'] = function(funcNames) {
+ this['setFunctionTable'] = function(initial, maximum, funcNames) {
return preserveStack(function() {
- return Module['_BinaryenSetFunctionTable'](module, i32sToStack(
- funcNames.map(strToStack)
- ), funcNames.length);
+ return Module['_BinaryenSetFunctionTable'](module, initial, maximum,
+ i32sToStack(funcNames.map(strToStack)),
+ funcNames.length
+ );
});
};
this['setMemory'] = function(initial, maximum, exportName, segments) {
diff --git a/test/binaryen.js/kitchen-sink.js b/test/binaryen.js/kitchen-sink.js
index 82b041926..33c98d97a 100644
--- a/test/binaryen.js/kitchen-sink.js
+++ b/test/binaryen.js/kitchen-sink.js
@@ -1,4 +1,3 @@
-
// kitchen sink, tests the full API
function cleanInfo(info) {
@@ -249,7 +248,7 @@ function test_core() {
// Function table. One per module
- module.setFunctionTable([ Binaryen.getFunctionInfo(sinker).name ]);
+ module.setFunctionTable(1, 0xffffffff, [ Binaryen.getFunctionInfo(sinker).name ]);
// Memory. One per module
diff --git a/test/binaryen.js/kitchen-sink.js.txt b/test/binaryen.js/kitchen-sink.js.txt
index c90994613..8bba56c45 100644
--- a/test/binaryen.js/kitchen-sink.js.txt
+++ b/test/binaryen.js/kitchen-sink.js.txt
@@ -48,7 +48,7 @@ getExpressionInfo(f64.const)={"id":14,"type":4,"value":9.5}
(type $3 (func))
(memory $0 1 256)
(data (i32.const 10) "hello, world")
- (table 1 1 anyfunc)
+ (table 1 anyfunc)
(elem (i32.const 0) "$kitchen()sinker")
(import "module" "base" (func $an-imported (param i32 f64) (result f32)))
(export "kitchen_sinker" (func "$kitchen()sinker"))
@@ -1470,7 +1470,7 @@ getExpressionInfo(f64.const)={"id":14,"type":4,"value":9.5}
BinaryenFunctionGetBody(functions[0]);
{
const char* funcNames[] = { "kitchen()sinker" };
- BinaryenSetFunctionTable(the_module, funcNames, 1);
+ BinaryenSetFunctionTable(the_module, 1, 4294967295, funcNames, 1);
}
expressions[256] = BinaryenConst(the_module, BinaryenLiteralInt32(10));
{
@@ -1504,7 +1504,7 @@ getExpressionInfo(f64.const)={"id":14,"type":4,"value":9.5}
(type $3 (func))
(memory $0 1 256)
(data (i32.const 10) "hello, world")
- (table 1 1 anyfunc)
+ (table 1 anyfunc)
(elem (i32.const 0) "$kitchen()sinker")
(import "module" "base" (func $an-imported (param i32 f64) (result f32)))
(export "kitchen_sinker" (func "$kitchen()sinker"))
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c
index 4e4944cda..25c33956b 100644
--- a/test/example/c-api-kitchen-sink.c
+++ b/test/example/c-api-kitchen-sink.c
@@ -254,7 +254,7 @@ void test_core() {
// Function table. One per module
const char* funcNames[] = { BinaryenFunctionGetName(sinker) };
- BinaryenSetFunctionTable(module, funcNames, 1);
+ BinaryenSetFunctionTable(module, 1, 1, funcNames, 1);
// Memory. One per module
diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt
index 5dc884d2b..86533339a 100644
--- a/test/example/c-api-kitchen-sink.txt
+++ b/test/example/c-api-kitchen-sink.txt
@@ -1403,7 +1403,7 @@ int main() {
BinaryenFunctionGetName(functions[0]);
{
const char* funcNames[] = { "kitchen()sinker" };
- BinaryenSetFunctionTable(the_module, funcNames, 1);
+ BinaryenSetFunctionTable(the_module, 1, 1, funcNames, 1);
}
expressions[254] = BinaryenConst(the_module, BinaryenLiteralInt32(10));
{