Skip to content

[C API] Add experimental StringNew and StringEq variants #5471

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 1, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
----
Expand Down
34 changes: 29 additions & 5 deletions src/binaryen-c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand All @@ -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,
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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>());
Expand Down
13 changes: 12 additions & 1 deletion src/binaryen-c.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);

Expand Down Expand Up @@ -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(
Expand All @@ -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,
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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,
Expand Down
5 changes: 4 additions & 1 deletion src/js/binaryen.js-post.js
Original file line number Diff line number Diff line change
Expand Up @@ -564,6 +564,7 @@ function initializeConstants() {
'StringNewWTF8Array',
'StringNewReplaceArray',
'StringNewWTF16Array',
'StringNewFromCodePoint',
'StringMeasureUTF8',
'StringMeasureWTF8',
'StringMeasureWTF16',
Expand All @@ -581,7 +582,9 @@ function initializeConstants() {
'StringIterMoveAdvance',
'StringIterMoveRewind',
'StringSliceWTF8',
'StringSliceWTF16'
'StringSliceWTF16',
'StringEqEqual',
'StringEqCompare'
].forEach(name => {
Module['Operations'][name] = Module[name] = Module['_Binaryen' + name]();
});
Expand Down
51 changes: 43 additions & 8 deletions test/example/c-api-kitchen-sink.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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(
Expand Down
24 changes: 24 additions & 0 deletions test/example/c-api-kitchen-sink.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2208,6 +2208,12 @@ BinaryenFeatureAll: 126975
(i32.const 0)
)
)
(drop
(string.new_utf8_try
(i32.const 0)
(i32.const 0)
)
)
(drop
(string.new_wtf8 wtf8
(i32.const 0)
Expand All @@ -2233,6 +2239,13 @@ BinaryenFeatureAll: 126975
(i32.const 0)
)
)
(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)
Expand All @@ -2254,6 +2267,11 @@ BinaryenFeatureAll: 126975
(i32.const 0)
)
)
(drop
(string.from_code_point
(i32.const 1)
)
)
(drop
(string.const "hello world")
)
Expand Down Expand Up @@ -2335,6 +2353,12 @@ BinaryenFeatureAll: 126975
(global.get $string-global)
)
)
(drop
(string.compare
(global.get $string-global)
(global.get $string-global)
)
)
(drop
(string.as_wtf8
(global.get $string-global)
Expand Down