summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/binaryen-c.cpp5
-rw-r--r--src/binaryen-c.h2
-rw-r--r--src/js/binaryen.js-post.js3
-rw-r--r--test/binaryen.js/copy-expression.js31
-rw-r--r--test/binaryen.js/copy-expression.js.txt0
5 files changed, 41 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index c57beeb22..a64c46fbf 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 0e1c88327..e460671b9 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 75d6bf401..1706d2b97 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 000000000..261c028fa
--- /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 000000000..e69de29bb
--- /dev/null
+++ b/test/binaryen.js/copy-expression.js.txt