summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md6
-rw-r--r--src/binaryen-c.cpp34
-rw-r--r--src/binaryen-c.h13
-rw-r--r--src/js/binaryen.js-post.js5
-rw-r--r--test/example/c-api-kitchen-sink.c51
-rw-r--r--test/example/c-api-kitchen-sink.txt24
6 files changed, 118 insertions, 15 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 655f2aa8c..ff494961f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -32,6 +32,12 @@ Current Trunk
and JS APIs and `RefIs` has been replaced with `RefIsNull`.
- Types `Data` and `Dataref` have been replaced with types `Struct` and
`Structref` in the C and JS APIs.
+* `BinaryenStringNew` now takes an additional last argument, `try_`, indicating
+ whether the instruction is one of `string.new_utf8_try` respectively
+ `string.new_utf8_array_try`.
+* `BinaryenStringEq` now takes an additional second argument, `op`, that is
+ either `BinaryenStringEqEqual()` if the instruction is `string.eq` or
+ `BinaryenStringEqCompare()` if the instruction is `string.compare`.
v111
----
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 9bbcbaf9e..113b2faa9 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -1023,6 +1023,9 @@ BinaryenOp BinaryenStringNewUTF8Array(void) { return StringNewUTF8Array; }
BinaryenOp BinaryenStringNewWTF8Array(void) { return StringNewWTF8Array; }
BinaryenOp BinaryenStringNewReplaceArray(void) { return StringNewReplaceArray; }
BinaryenOp BinaryenStringNewWTF16Array(void) { return StringNewWTF16Array; }
+BinaryenOp BinaryenStringNewFromCodePoint(void) {
+ return StringNewFromCodePoint;
+}
BinaryenOp BinaryenStringMeasureUTF8(void) { return StringMeasureUTF8; }
BinaryenOp BinaryenStringMeasureWTF8(void) { return StringMeasureWTF8; }
BinaryenOp BinaryenStringMeasureWTF16(void) { return StringMeasureWTF16; }
@@ -1045,6 +1048,8 @@ BinaryenOp BinaryenStringIterMoveAdvance(void) { return StringIterMoveAdvance; }
BinaryenOp BinaryenStringIterMoveRewind(void) { return StringIterMoveRewind; }
BinaryenOp BinaryenStringSliceWTF8(void) { return StringSliceWTF8; }
BinaryenOp BinaryenStringSliceWTF16(void) { return StringSliceWTF16; }
+BinaryenOp BinaryenStringEqEqual(void) { return StringEqEqual; }
+BinaryenOp BinaryenStringEqCompare(void) { return StringEqCompare; }
BinaryenExpressionRef BinaryenBlock(BinaryenModuleRef module,
const char* name,
@@ -1835,10 +1840,8 @@ BinaryenExpressionRef BinaryenStringNew(BinaryenModuleRef module,
BinaryenExpressionRef ptr,
BinaryenExpressionRef length,
BinaryenExpressionRef start,
- BinaryenExpressionRef end) {
- // TODO: add API support for this
- bool try_ = false;
-
+ BinaryenExpressionRef end,
+ bool try_) {
Builder builder(*(Module*)module);
return static_cast<Expression*>(
length ? builder.makeStringNew(
@@ -1880,11 +1883,12 @@ BinaryenExpressionRef BinaryenStringConcat(BinaryenModuleRef module,
.makeStringConcat((Expression*)left, (Expression*)right));
}
BinaryenExpressionRef BinaryenStringEq(BinaryenModuleRef module,
+ BinaryenOp op,
BinaryenExpressionRef left,
BinaryenExpressionRef right) {
return static_cast<Expression*>(
Builder(*(Module*)module)
- .makeStringEq(StringEqEqual, (Expression*)left, (Expression*)right));
+ .makeStringEq(StringEqOp(op), (Expression*)left, (Expression*)right));
}
BinaryenExpressionRef BinaryenStringAs(BinaryenModuleRef module,
BinaryenOp op,
@@ -4506,6 +4510,16 @@ void BinaryenStringNewSetEnd(BinaryenExpressionRef expr,
// may be null (GC only)
static_cast<StringNew*>(expression)->end = (Expression*)endExpr;
}
+void BinaryenStringNewSetTry(BinaryenExpressionRef expr, bool try_) {
+ auto* expression = (Expression*)expr;
+ assert(expression->is<StringNew>());
+ static_cast<StringNew*>(expression)->try_ = try_;
+}
+bool BinaryenStringNewIsTry(BinaryenExpressionRef expr) {
+ auto* expression = (Expression*)expr;
+ assert(expression->is<StringNew>());
+ return static_cast<StringNew*>(expression)->try_;
+}
// StringConst
const char* BinaryenStringConstGetString(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
@@ -4615,6 +4629,16 @@ void BinaryenStringConcatSetRight(BinaryenExpressionRef expr,
static_cast<StringConcat*>(expression)->right = (Expression*)rightExpr;
}
// StringEq
+BinaryenOp BinaryenStringEqGetOp(BinaryenExpressionRef expr) {
+ auto* expression = (Expression*)expr;
+ assert(expression->is<StringEq>());
+ return static_cast<StringEq*>(expression)->op;
+}
+void BinaryenStringEqSetOp(BinaryenExpressionRef expr, BinaryenOp op) {
+ auto* expression = (Expression*)expr;
+ assert(expression->is<StringEq>());
+ static_cast<StringEq*>(expression)->op = StringEqOp(op);
+}
BinaryenExpressionRef BinaryenStringEqGetLeft(BinaryenExpressionRef expr) {
auto* expression = (Expression*)expr;
assert(expression->is<StringEq>());
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index cd5bd6735..32e3af460 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -685,6 +685,7 @@ BINARYEN_API BinaryenOp BinaryenStringNewUTF8Array(void);
BINARYEN_API BinaryenOp BinaryenStringNewWTF8Array(void);
BINARYEN_API BinaryenOp BinaryenStringNewReplaceArray(void);
BINARYEN_API BinaryenOp BinaryenStringNewWTF16Array(void);
+BINARYEN_API BinaryenOp BinaryenStringNewFromCodePoint(void);
BINARYEN_API BinaryenOp BinaryenStringMeasureUTF8(void);
BINARYEN_API BinaryenOp BinaryenStringMeasureWTF8(void);
BINARYEN_API BinaryenOp BinaryenStringMeasureWTF16(void);
@@ -703,6 +704,8 @@ BINARYEN_API BinaryenOp BinaryenStringIterMoveAdvance(void);
BINARYEN_API BinaryenOp BinaryenStringIterMoveRewind(void);
BINARYEN_API BinaryenOp BinaryenStringSliceWTF8(void);
BINARYEN_API BinaryenOp BinaryenStringSliceWTF16(void);
+BINARYEN_API BinaryenOp BinaryenStringEqEqual(void);
+BINARYEN_API BinaryenOp BinaryenStringEqCompare(void);
BINARYEN_REF(Expression);
@@ -1087,7 +1090,8 @@ BinaryenStringNew(BinaryenModuleRef module,
BinaryenExpressionRef ptr,
BinaryenExpressionRef length,
BinaryenExpressionRef start,
- BinaryenExpressionRef end);
+ BinaryenExpressionRef end,
+ bool try_);
BINARYEN_API BinaryenExpressionRef BinaryenStringConst(BinaryenModuleRef module,
const char* name);
BINARYEN_API BinaryenExpressionRef BinaryenStringMeasure(
@@ -1104,6 +1108,7 @@ BinaryenStringConcat(BinaryenModuleRef module,
BinaryenExpressionRef right);
BINARYEN_API BinaryenExpressionRef
BinaryenStringEq(BinaryenModuleRef module,
+ BinaryenOp op,
BinaryenExpressionRef left,
BinaryenExpressionRef right);
BINARYEN_API BinaryenExpressionRef BinaryenStringAs(BinaryenModuleRef module,
@@ -2529,6 +2534,9 @@ BINARYEN_API BinaryenExpressionRef
BinaryenStringNewGetEnd(BinaryenExpressionRef expr);
BINARYEN_API void BinaryenStringNewSetEnd(BinaryenExpressionRef expr,
BinaryenExpressionRef endExpr);
+BINARYEN_API void BinaryenStringNewSetTry(BinaryenExpressionRef expr,
+ bool try_);
+BINARYEN_API bool BinaryenStringNewIsTry(BinaryenExpressionRef expr);
// StringConst
@@ -2578,6 +2586,9 @@ BINARYEN_API void BinaryenStringConcatSetRight(BinaryenExpressionRef expr,
// StringEq
+BINARYEN_API BinaryenOp BinaryenStringEqGetOp(BinaryenExpressionRef expr);
+BINARYEN_API void BinaryenStringEqSetOp(BinaryenExpressionRef expr,
+ BinaryenOp op);
BINARYEN_API BinaryenExpressionRef
BinaryenStringEqGetLeft(BinaryenExpressionRef expr);
BINARYEN_API void BinaryenStringEqSetLeft(BinaryenExpressionRef expr,
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index 49a8d2b69..5bd5e5505 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -564,6 +564,7 @@ function initializeConstants() {
'StringNewWTF8Array',
'StringNewReplaceArray',
'StringNewWTF16Array',
+ 'StringNewFromCodePoint',
'StringMeasureUTF8',
'StringMeasureWTF8',
'StringMeasureWTF16',
@@ -581,7 +582,9 @@ function initializeConstants() {
'StringIterMoveAdvance',
'StringIterMoveRewind',
'StringSliceWTF8',
- 'StringSliceWTF16'
+ 'StringSliceWTF16',
+ 'StringEqEqual',
+ 'StringEqCompare'
].forEach(name => {
Module['Operations'][name] = Module[name] = Module['_Binaryen' + name]();
});
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c
index b2b35da16..4a1f53e3c 100644
--- a/test/example/c-api-kitchen-sink.c
+++ b/test/example/c-api-kitchen-sink.c
@@ -1137,49 +1137,78 @@ void test_core() {
makeInt32(module, 0),
makeInt32(module, 0),
0,
- 0),
+ 0,
+ false),
+ BinaryenStringNew(module,
+ BinaryenStringNewUTF8(),
+ makeInt32(module, 0),
+ makeInt32(module, 0),
+ 0,
+ 0,
+ true),
BinaryenStringNew(module,
BinaryenStringNewWTF8(),
makeInt32(module, 0),
makeInt32(module, 0),
0,
- 0),
+ 0,
+ false),
BinaryenStringNew(module,
BinaryenStringNewReplace(),
makeInt32(module, 0),
makeInt32(module, 0),
0,
- 0),
+ 0,
+ false),
BinaryenStringNew(module,
BinaryenStringNewWTF16(),
makeInt32(module, 0),
makeInt32(module, 0),
0,
- 0),
+ 0,
+ false),
BinaryenStringNew(module,
BinaryenStringNewUTF8Array(),
BinaryenGlobalGet(module, "i8Array-global", i8Array),
0,
makeInt32(module, 0),
- makeInt32(module, 0)),
+ makeInt32(module, 0),
+ false),
+ BinaryenStringNew(module,
+ BinaryenStringNewUTF8Array(),
+ BinaryenGlobalGet(module, "i8Array-global", i8Array),
+ 0,
+ makeInt32(module, 0),
+ makeInt32(module, 0),
+ true),
BinaryenStringNew(module,
BinaryenStringNewWTF8Array(),
BinaryenGlobalGet(module, "i8Array-global", i8Array),
0,
makeInt32(module, 0),
- makeInt32(module, 0)),
+ makeInt32(module, 0),
+ false),
BinaryenStringNew(module,
BinaryenStringNewReplaceArray(),
BinaryenGlobalGet(module, "i8Array-global", i8Array),
0,
makeInt32(module, 0),
- makeInt32(module, 0)),
+ makeInt32(module, 0),
+ false),
BinaryenStringNew(module,
BinaryenStringNewWTF16Array(),
BinaryenGlobalGet(module, "i16Array-global", i8Array),
0,
makeInt32(module, 0),
- makeInt32(module, 0)),
+ makeInt32(module, 0),
+ false),
+ BinaryenStringNew(module,
+ BinaryenStringNewFromCodePoint(),
+ makeInt32(module, 1),
+ 0,
+ 0,
+ 0,
+ false),
BinaryenStringConst(module, "hello world"),
BinaryenStringMeasure(
module,
@@ -1246,6 +1275,12 @@ void test_core() {
BinaryenGlobalGet(module, "string-global", BinaryenTypeStringref())),
BinaryenStringEq(
module,
+ BinaryenStringEqEqual(),
+ BinaryenGlobalGet(module, "string-global", BinaryenTypeStringref()),
+ BinaryenGlobalGet(module, "string-global", BinaryenTypeStringref())),
+ BinaryenStringEq(
+ module,
+ BinaryenStringEqCompare(),
BinaryenGlobalGet(module, "string-global", BinaryenTypeStringref()),
BinaryenGlobalGet(module, "string-global", BinaryenTypeStringref())),
BinaryenStringAs(
diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt
index 510060317..bd0d0e16f 100644
--- a/test/example/c-api-kitchen-sink.txt
+++ b/test/example/c-api-kitchen-sink.txt
@@ -2209,6 +2209,12 @@ BinaryenFeatureAll: 126975
)
)
(drop
+ (string.new_utf8_try
+ (i32.const 0)
+ (i32.const 0)
+ )
+ )
+ (drop
(string.new_wtf8 wtf8
(i32.const 0)
(i32.const 0)
@@ -2234,6 +2240,13 @@ BinaryenFeatureAll: 126975
)
)
(drop
+ (string.new_utf8_array_try
+ (global.get $i8Array-global)
+ (i32.const 0)
+ (i32.const 0)
+ )
+ )
+ (drop
(string.new_wtf8_array wtf8
(global.get $i8Array-global)
(i32.const 0)
@@ -2255,6 +2268,11 @@ BinaryenFeatureAll: 126975
)
)
(drop
+ (string.from_code_point
+ (i32.const 1)
+ )
+ )
+ (drop
(string.const "hello world")
)
(drop
@@ -2336,6 +2354,12 @@ BinaryenFeatureAll: 126975
)
)
(drop
+ (string.compare
+ (global.get $string-global)
+ (global.get $string-global)
+ )
+ )
+ (drop
(string.as_wtf8
(global.get $string-global)
)