diff options
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | src/binaryen-c.cpp | 9 | ||||
-rw-r--r-- | src/binaryen-c.h | 2 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 9 | ||||
-rw-r--r-- | test/binaryen.js/kitchen-sink.js | 3 | ||||
-rw-r--r-- | test/binaryen.js/kitchen-sink.js.txt | 6 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.c | 2 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.txt | 2 |
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)); { |