diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index c273a3af42e..21e65065094 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -5878,6 +5878,10 @@ BinaryenType BinaryenFunctionGetVar(BinaryenFunctionRef func, assert(index < vars.size()); return vars[index].getID(); } +BinaryenIndex BinaryenFunctionAddVar(BinaryenFunctionRef func, + BinaryenType type) { + return Builder::addVar((Function*)func, (Type)type); +} BinaryenIndex BinaryenFunctionGetNumLocals(BinaryenFunctionRef func) { return ((Function*)func)->getNumLocals(); } diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 82de2dae934..b12cdc21332 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -3197,6 +3197,10 @@ BINARYEN_API BinaryenIndex BinaryenFunctionGetNumVars(BinaryenFunctionRef func); // specified `Function`. BINARYEN_API BinaryenType BinaryenFunctionGetVar(BinaryenFunctionRef func, BinaryenIndex index); +// Appends a local variable to the specified `Function`, returning its +// index. +BINARYEN_API BinaryenIndex BinaryenFunctionAddVar(BinaryenFunctionRef func, + BinaryenType type); // Gets the number of locals within the specified function. Includes parameters. BINARYEN_API BinaryenIndex BinaryenFunctionGetNumLocals(BinaryenFunctionRef func); diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c index d3368a6b147..fec0f2577b4 100644 --- a/test/example/c-api-kitchen-sink.c +++ b/test/example/c-api-kitchen-sink.c @@ -1417,6 +1417,16 @@ void test_core() { BinaryenFunctionRef sinker = BinaryenAddFunction( module, "kitchen()sinker", iIfF, BinaryenTypeInt32(), localTypes, 2, body); + BinaryenIndex numLocals = BinaryenFunctionGetNumLocals(sinker); + BinaryenIndex numParams = + BinaryenTypeArity(BinaryenFunctionGetParams(sinker)); + BinaryenIndex newLocalIdx = + BinaryenFunctionAddVar(sinker, BinaryenTypeFloat32()); + assert(newLocalIdx == numLocals); + assert(BinaryenFunctionGetNumLocals(sinker) == numLocals + 1); + assert(BinaryenFunctionGetVar(sinker, newLocalIdx - numParams) == + BinaryenTypeFloat32()); + // Globals BinaryenAddGlobal( diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt index 75c71b4ab01..5342236e147 100644 --- a/test/example/c-api-kitchen-sink.txt +++ b/test/example/c-api-kitchen-sink.txt @@ -102,6 +102,7 @@ BinaryenFeatureAll: 131071 (func $"kitchen()sinker" (type $2) (param $0 i32) (param $1 i64) (param $2 f32) (param $3 f64) (result i32) (local $4 i32) (local $5 externref) + (local $6 f32) (block $the-body (result i32) (block $the-nothing (drop