From 7ea41298d4acd3ee6e63337c1992bedf47e7edac Mon Sep 17 00:00:00 2001 From: Lingming Zhang Date: Tue, 9 Jan 2024 22:00:28 +0800 Subject: [PATCH 1/2] C API: Add BinaryenFunctionAppendVar --- src/binaryen-c.cpp | 8 ++++++++ src/binaryen-c.h | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index c273a3af42e..711443bf514 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -5878,6 +5878,14 @@ BinaryenType BinaryenFunctionGetVar(BinaryenFunctionRef func, assert(index < vars.size()); return vars[index].getID(); } +BinaryenIndex BinaryenFunctionAppendVar(BinaryenFunctionRef func, + BinaryenType type) { + auto* function = (Function*)func; + auto& list = function->vars; + auto index = list.size(); + list.push_back((Type)type); + return index; +} BinaryenIndex BinaryenFunctionGetNumLocals(BinaryenFunctionRef func) { return ((Function*)func)->getNumLocals(); } diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 82de2dae934..145670d3224 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 +// insertion index. +BINARYEN_API BinaryenIndex BinaryenFunctionAppendVar(BinaryenFunctionRef func, + BinaryenType type); // Gets the number of locals within the specified function. Includes parameters. BINARYEN_API BinaryenIndex BinaryenFunctionGetNumLocals(BinaryenFunctionRef func); From b2a69dda6269491c8e3261693b9beabfa799a24a Mon Sep 17 00:00:00 2001 From: Lingming Zhang Date: Wed, 10 Jan 2024 13:31:38 +0800 Subject: [PATCH 2/2] [C API]: Add BinaryenFunctionAddVar --- src/binaryen-c.cpp | 10 +++------- src/binaryen-c.h | 6 +++--- test/example/c-api-kitchen-sink.c | 10 ++++++++++ test/example/c-api-kitchen-sink.txt | 1 + 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 711443bf514..21e65065094 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -5878,13 +5878,9 @@ BinaryenType BinaryenFunctionGetVar(BinaryenFunctionRef func, assert(index < vars.size()); return vars[index].getID(); } -BinaryenIndex BinaryenFunctionAppendVar(BinaryenFunctionRef func, - BinaryenType type) { - auto* function = (Function*)func; - auto& list = function->vars; - auto index = list.size(); - list.push_back((Type)type); - return index; +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 145670d3224..b12cdc21332 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -3198,9 +3198,9 @@ BINARYEN_API BinaryenIndex BinaryenFunctionGetNumVars(BinaryenFunctionRef func); BINARYEN_API BinaryenType BinaryenFunctionGetVar(BinaryenFunctionRef func, BinaryenIndex index); // Appends a local variable to the specified `Function`, returning its -// insertion index. -BINARYEN_API BinaryenIndex BinaryenFunctionAppendVar(BinaryenFunctionRef func, - BinaryenType type); +// 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