diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index c57beeb2212..a64c46fbf19 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -1319,6 +1319,11 @@ void BinaryenExpressionPrint(BinaryenExpressionRef expr) { std::cout << '\n'; } +BinaryenExpressionRef BinaryenExpressionCopy(BinaryenExpressionRef expr, + BinaryenModuleRef module) { + return ExpressionManipulator::copy(expr, *(Module*)module); +} + // Specific expression utility // Block diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 0e1c8832717..e460671b9ee 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -848,6 +848,8 @@ BINARYEN_API BinaryenExpressionId BinaryenExpressionGetId(BinaryenExpressionRef expr); BINARYEN_API BinaryenType BinaryenExpressionGetType(BinaryenExpressionRef expr); BINARYEN_API void BinaryenExpressionPrint(BinaryenExpressionRef expr); +BINARYEN_API BinaryenExpressionRef +BinaryenExpressionCopy(BinaryenExpressionRef expr, BinaryenModuleRef module); BINARYEN_API const char* BinaryenBlockGetName(BinaryenExpressionRef expr); BINARYEN_API BinaryenIndex diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 75d6bf401a9..1706d2b9770 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -2407,6 +2407,9 @@ function wrapModule(module, self) { self['setDebugLocation'] = function(func, expr, fileIndex, lineNumber, columnNumber) { return Module['_BinaryenFunctionSetDebugLocation'](func, expr, fileIndex, lineNumber, columnNumber); }; + self['copyExpression'] = function(expr) { + return Module['_BinaryenExpressionCopy'](expr, module); + }; return self; } diff --git a/test/binaryen.js/copy-expression.js b/test/binaryen.js/copy-expression.js new file mode 100644 index 00000000000..261c028faba --- /dev/null +++ b/test/binaryen.js/copy-expression.js @@ -0,0 +1,31 @@ +var module = new binaryen.Module(); + +// Create an expression and copy it +var original = module.block(null, [ + module.if( + module.local.get(0, binaryen.i32), + module.i32.const(1), + module.i32.const(2) + ) +], binaryen.i32); +var copy = module.copyExpression(original); + +// Check that the expression incl. sub-expressions are copies +assert(original !== copy); + +var originalInfo = binaryen.getExpressionInfo(original); +assert(originalInfo.children.length === 1); + +var copyInfo = binaryen.getExpressionInfo(copy); +assert(originalInfo.children.length === copyInfo.children.length); +assert(originalInfo.children[0] !== copyInfo.children[0]); + +var originalIfInfo = binaryen.getExpressionInfo(originalInfo.children[0]); +var copyIfInfo = binaryen.getExpressionInfo(copyInfo.children[0]); + +assert(originalIfInfo.condition !== copyIfInfo.condition); +assert(originalIfInfo.ifTrue !== copyIfInfo.ifTrue); +assert(originalIfInfo.ifFalse !== copyIfInfo.ifFalse); + +// Check that both are otherwise identical +assert(binaryen.emitText(original) === binaryen.emitText(copy)); diff --git a/test/binaryen.js/copy-expression.js.txt b/test/binaryen.js/copy-expression.js.txt new file mode 100644 index 00000000000..e69de29bb2d