Skip to content

Commit 7ce4b09

Browse files
authored
[C API] Add experimental StringNew and StringEq variants (#5471)
Adds APIs for string.from_code_point, string.new_utf8_try, string.new_utf8_array_try (#5459) and string.compare (#5453).
1 parent d7cb5b3 commit 7ce4b09

File tree

6 files changed

+118
-15
lines changed

6 files changed

+118
-15
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ Current Trunk
3232
and JS APIs and `RefIs` has been replaced with `RefIsNull`.
3333
- Types `Data` and `Dataref` have been replaced with types `Struct` and
3434
`Structref` in the C and JS APIs.
35+
* `BinaryenStringNew` now takes an additional last argument, `try_`, indicating
36+
whether the instruction is one of `string.new_utf8_try` respectively
37+
`string.new_utf8_array_try`.
38+
* `BinaryenStringEq` now takes an additional second argument, `op`, that is
39+
either `BinaryenStringEqEqual()` if the instruction is `string.eq` or
40+
`BinaryenStringEqCompare()` if the instruction is `string.compare`.
3541

3642
v111
3743
----

src/binaryen-c.cpp

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,9 @@ BinaryenOp BinaryenStringNewUTF8Array(void) { return StringNewUTF8Array; }
10231023
BinaryenOp BinaryenStringNewWTF8Array(void) { return StringNewWTF8Array; }
10241024
BinaryenOp BinaryenStringNewReplaceArray(void) { return StringNewReplaceArray; }
10251025
BinaryenOp BinaryenStringNewWTF16Array(void) { return StringNewWTF16Array; }
1026+
BinaryenOp BinaryenStringNewFromCodePoint(void) {
1027+
return StringNewFromCodePoint;
1028+
}
10261029
BinaryenOp BinaryenStringMeasureUTF8(void) { return StringMeasureUTF8; }
10271030
BinaryenOp BinaryenStringMeasureWTF8(void) { return StringMeasureWTF8; }
10281031
BinaryenOp BinaryenStringMeasureWTF16(void) { return StringMeasureWTF16; }
@@ -1045,6 +1048,8 @@ BinaryenOp BinaryenStringIterMoveAdvance(void) { return StringIterMoveAdvance; }
10451048
BinaryenOp BinaryenStringIterMoveRewind(void) { return StringIterMoveRewind; }
10461049
BinaryenOp BinaryenStringSliceWTF8(void) { return StringSliceWTF8; }
10471050
BinaryenOp BinaryenStringSliceWTF16(void) { return StringSliceWTF16; }
1051+
BinaryenOp BinaryenStringEqEqual(void) { return StringEqEqual; }
1052+
BinaryenOp BinaryenStringEqCompare(void) { return StringEqCompare; }
10481053

10491054
BinaryenExpressionRef BinaryenBlock(BinaryenModuleRef module,
10501055
const char* name,
@@ -1835,10 +1840,8 @@ BinaryenExpressionRef BinaryenStringNew(BinaryenModuleRef module,
18351840
BinaryenExpressionRef ptr,
18361841
BinaryenExpressionRef length,
18371842
BinaryenExpressionRef start,
1838-
BinaryenExpressionRef end) {
1839-
// TODO: add API support for this
1840-
bool try_ = false;
1841-
1843+
BinaryenExpressionRef end,
1844+
bool try_) {
18421845
Builder builder(*(Module*)module);
18431846
return static_cast<Expression*>(
18441847
length ? builder.makeStringNew(
@@ -1880,11 +1883,12 @@ BinaryenExpressionRef BinaryenStringConcat(BinaryenModuleRef module,
18801883
.makeStringConcat((Expression*)left, (Expression*)right));
18811884
}
18821885
BinaryenExpressionRef BinaryenStringEq(BinaryenModuleRef module,
1886+
BinaryenOp op,
18831887
BinaryenExpressionRef left,
18841888
BinaryenExpressionRef right) {
18851889
return static_cast<Expression*>(
18861890
Builder(*(Module*)module)
1887-
.makeStringEq(StringEqEqual, (Expression*)left, (Expression*)right));
1891+
.makeStringEq(StringEqOp(op), (Expression*)left, (Expression*)right));
18881892
}
18891893
BinaryenExpressionRef BinaryenStringAs(BinaryenModuleRef module,
18901894
BinaryenOp op,
@@ -4506,6 +4510,16 @@ void BinaryenStringNewSetEnd(BinaryenExpressionRef expr,
45064510
// may be null (GC only)
45074511
static_cast<StringNew*>(expression)->end = (Expression*)endExpr;
45084512
}
4513+
void BinaryenStringNewSetTry(BinaryenExpressionRef expr, bool try_) {
4514+
auto* expression = (Expression*)expr;
4515+
assert(expression->is<StringNew>());
4516+
static_cast<StringNew*>(expression)->try_ = try_;
4517+
}
4518+
bool BinaryenStringNewIsTry(BinaryenExpressionRef expr) {
4519+
auto* expression = (Expression*)expr;
4520+
assert(expression->is<StringNew>());
4521+
return static_cast<StringNew*>(expression)->try_;
4522+
}
45094523
// StringConst
45104524
const char* BinaryenStringConstGetString(BinaryenExpressionRef expr) {
45114525
auto* expression = (Expression*)expr;
@@ -4615,6 +4629,16 @@ void BinaryenStringConcatSetRight(BinaryenExpressionRef expr,
46154629
static_cast<StringConcat*>(expression)->right = (Expression*)rightExpr;
46164630
}
46174631
// StringEq
4632+
BinaryenOp BinaryenStringEqGetOp(BinaryenExpressionRef expr) {
4633+
auto* expression = (Expression*)expr;
4634+
assert(expression->is<StringEq>());
4635+
return static_cast<StringEq*>(expression)->op;
4636+
}
4637+
void BinaryenStringEqSetOp(BinaryenExpressionRef expr, BinaryenOp op) {
4638+
auto* expression = (Expression*)expr;
4639+
assert(expression->is<StringEq>());
4640+
static_cast<StringEq*>(expression)->op = StringEqOp(op);
4641+
}
46184642
BinaryenExpressionRef BinaryenStringEqGetLeft(BinaryenExpressionRef expr) {
46194643
auto* expression = (Expression*)expr;
46204644
assert(expression->is<StringEq>());

src/binaryen-c.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,7 @@ BINARYEN_API BinaryenOp BinaryenStringNewUTF8Array(void);
685685
BINARYEN_API BinaryenOp BinaryenStringNewWTF8Array(void);
686686
BINARYEN_API BinaryenOp BinaryenStringNewReplaceArray(void);
687687
BINARYEN_API BinaryenOp BinaryenStringNewWTF16Array(void);
688+
BINARYEN_API BinaryenOp BinaryenStringNewFromCodePoint(void);
688689
BINARYEN_API BinaryenOp BinaryenStringMeasureUTF8(void);
689690
BINARYEN_API BinaryenOp BinaryenStringMeasureWTF8(void);
690691
BINARYEN_API BinaryenOp BinaryenStringMeasureWTF16(void);
@@ -703,6 +704,8 @@ BINARYEN_API BinaryenOp BinaryenStringIterMoveAdvance(void);
703704
BINARYEN_API BinaryenOp BinaryenStringIterMoveRewind(void);
704705
BINARYEN_API BinaryenOp BinaryenStringSliceWTF8(void);
705706
BINARYEN_API BinaryenOp BinaryenStringSliceWTF16(void);
707+
BINARYEN_API BinaryenOp BinaryenStringEqEqual(void);
708+
BINARYEN_API BinaryenOp BinaryenStringEqCompare(void);
706709

707710
BINARYEN_REF(Expression);
708711

@@ -1087,7 +1090,8 @@ BinaryenStringNew(BinaryenModuleRef module,
10871090
BinaryenExpressionRef ptr,
10881091
BinaryenExpressionRef length,
10891092
BinaryenExpressionRef start,
1090-
BinaryenExpressionRef end);
1093+
BinaryenExpressionRef end,
1094+
bool try_);
10911095
BINARYEN_API BinaryenExpressionRef BinaryenStringConst(BinaryenModuleRef module,
10921096
const char* name);
10931097
BINARYEN_API BinaryenExpressionRef BinaryenStringMeasure(
@@ -1104,6 +1108,7 @@ BinaryenStringConcat(BinaryenModuleRef module,
11041108
BinaryenExpressionRef right);
11051109
BINARYEN_API BinaryenExpressionRef
11061110
BinaryenStringEq(BinaryenModuleRef module,
1111+
BinaryenOp op,
11071112
BinaryenExpressionRef left,
11081113
BinaryenExpressionRef right);
11091114
BINARYEN_API BinaryenExpressionRef BinaryenStringAs(BinaryenModuleRef module,
@@ -2529,6 +2534,9 @@ BINARYEN_API BinaryenExpressionRef
25292534
BinaryenStringNewGetEnd(BinaryenExpressionRef expr);
25302535
BINARYEN_API void BinaryenStringNewSetEnd(BinaryenExpressionRef expr,
25312536
BinaryenExpressionRef endExpr);
2537+
BINARYEN_API void BinaryenStringNewSetTry(BinaryenExpressionRef expr,
2538+
bool try_);
2539+
BINARYEN_API bool BinaryenStringNewIsTry(BinaryenExpressionRef expr);
25322540

25332541
// StringConst
25342542

@@ -2578,6 +2586,9 @@ BINARYEN_API void BinaryenStringConcatSetRight(BinaryenExpressionRef expr,
25782586

25792587
// StringEq
25802588

2589+
BINARYEN_API BinaryenOp BinaryenStringEqGetOp(BinaryenExpressionRef expr);
2590+
BINARYEN_API void BinaryenStringEqSetOp(BinaryenExpressionRef expr,
2591+
BinaryenOp op);
25812592
BINARYEN_API BinaryenExpressionRef
25822593
BinaryenStringEqGetLeft(BinaryenExpressionRef expr);
25832594
BINARYEN_API void BinaryenStringEqSetLeft(BinaryenExpressionRef expr,

src/js/binaryen.js-post.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,7 @@ function initializeConstants() {
564564
'StringNewWTF8Array',
565565
'StringNewReplaceArray',
566566
'StringNewWTF16Array',
567+
'StringNewFromCodePoint',
567568
'StringMeasureUTF8',
568569
'StringMeasureWTF8',
569570
'StringMeasureWTF16',
@@ -581,7 +582,9 @@ function initializeConstants() {
581582
'StringIterMoveAdvance',
582583
'StringIterMoveRewind',
583584
'StringSliceWTF8',
584-
'StringSliceWTF16'
585+
'StringSliceWTF16',
586+
'StringEqEqual',
587+
'StringEqCompare'
585588
].forEach(name => {
586589
Module['Operations'][name] = Module[name] = Module['_Binaryen' + name]();
587590
});

test/example/c-api-kitchen-sink.c

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,49 +1137,78 @@ void test_core() {
11371137
makeInt32(module, 0),
11381138
makeInt32(module, 0),
11391139
0,
1140-
0),
1140+
0,
1141+
false),
1142+
BinaryenStringNew(module,
1143+
BinaryenStringNewUTF8(),
1144+
makeInt32(module, 0),
1145+
makeInt32(module, 0),
1146+
0,
1147+
0,
1148+
true),
11411149
BinaryenStringNew(module,
11421150
BinaryenStringNewWTF8(),
11431151
makeInt32(module, 0),
11441152
makeInt32(module, 0),
11451153
0,
1146-
0),
1154+
0,
1155+
false),
11471156
BinaryenStringNew(module,
11481157
BinaryenStringNewReplace(),
11491158
makeInt32(module, 0),
11501159
makeInt32(module, 0),
11511160
0,
1152-
0),
1161+
0,
1162+
false),
11531163
BinaryenStringNew(module,
11541164
BinaryenStringNewWTF16(),
11551165
makeInt32(module, 0),
11561166
makeInt32(module, 0),
11571167
0,
1158-
0),
1168+
0,
1169+
false),
11591170
BinaryenStringNew(module,
11601171
BinaryenStringNewUTF8Array(),
11611172
BinaryenGlobalGet(module, "i8Array-global", i8Array),
11621173
0,
11631174
makeInt32(module, 0),
1164-
makeInt32(module, 0)),
1175+
makeInt32(module, 0),
1176+
false),
1177+
BinaryenStringNew(module,
1178+
BinaryenStringNewUTF8Array(),
1179+
BinaryenGlobalGet(module, "i8Array-global", i8Array),
1180+
0,
1181+
makeInt32(module, 0),
1182+
makeInt32(module, 0),
1183+
true),
11651184
BinaryenStringNew(module,
11661185
BinaryenStringNewWTF8Array(),
11671186
BinaryenGlobalGet(module, "i8Array-global", i8Array),
11681187
0,
11691188
makeInt32(module, 0),
1170-
makeInt32(module, 0)),
1189+
makeInt32(module, 0),
1190+
false),
11711191
BinaryenStringNew(module,
11721192
BinaryenStringNewReplaceArray(),
11731193
BinaryenGlobalGet(module, "i8Array-global", i8Array),
11741194
0,
11751195
makeInt32(module, 0),
1176-
makeInt32(module, 0)),
1196+
makeInt32(module, 0),
1197+
false),
11771198
BinaryenStringNew(module,
11781199
BinaryenStringNewWTF16Array(),
11791200
BinaryenGlobalGet(module, "i16Array-global", i8Array),
11801201
0,
11811202
makeInt32(module, 0),
1182-
makeInt32(module, 0)),
1203+
makeInt32(module, 0),
1204+
false),
1205+
BinaryenStringNew(module,
1206+
BinaryenStringNewFromCodePoint(),
1207+
makeInt32(module, 1),
1208+
0,
1209+
0,
1210+
0,
1211+
false),
11831212
BinaryenStringConst(module, "hello world"),
11841213
BinaryenStringMeasure(
11851214
module,
@@ -1246,6 +1275,12 @@ void test_core() {
12461275
BinaryenGlobalGet(module, "string-global", BinaryenTypeStringref())),
12471276
BinaryenStringEq(
12481277
module,
1278+
BinaryenStringEqEqual(),
1279+
BinaryenGlobalGet(module, "string-global", BinaryenTypeStringref()),
1280+
BinaryenGlobalGet(module, "string-global", BinaryenTypeStringref())),
1281+
BinaryenStringEq(
1282+
module,
1283+
BinaryenStringEqCompare(),
12491284
BinaryenGlobalGet(module, "string-global", BinaryenTypeStringref()),
12501285
BinaryenGlobalGet(module, "string-global", BinaryenTypeStringref())),
12511286
BinaryenStringAs(

test/example/c-api-kitchen-sink.txt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2208,6 +2208,12 @@ BinaryenFeatureAll: 126975
22082208
(i32.const 0)
22092209
)
22102210
)
2211+
(drop
2212+
(string.new_utf8_try
2213+
(i32.const 0)
2214+
(i32.const 0)
2215+
)
2216+
)
22112217
(drop
22122218
(string.new_wtf8 wtf8
22132219
(i32.const 0)
@@ -2233,6 +2239,13 @@ BinaryenFeatureAll: 126975
22332239
(i32.const 0)
22342240
)
22352241
)
2242+
(drop
2243+
(string.new_utf8_array_try
2244+
(global.get $i8Array-global)
2245+
(i32.const 0)
2246+
(i32.const 0)
2247+
)
2248+
)
22362249
(drop
22372250
(string.new_wtf8_array wtf8
22382251
(global.get $i8Array-global)
@@ -2254,6 +2267,11 @@ BinaryenFeatureAll: 126975
22542267
(i32.const 0)
22552268
)
22562269
)
2270+
(drop
2271+
(string.from_code_point
2272+
(i32.const 1)
2273+
)
2274+
)
22572275
(drop
22582276
(string.const "hello world")
22592277
)
@@ -2335,6 +2353,12 @@ BinaryenFeatureAll: 126975
23352353
(global.get $string-global)
23362354
)
23372355
)
2356+
(drop
2357+
(string.compare
2358+
(global.get $string-global)
2359+
(global.get $string-global)
2360+
)
2361+
)
23382362
(drop
23392363
(string.as_wtf8
23402364
(global.get $string-global)

0 commit comments

Comments
 (0)