diff --git a/CHANGELOG.md b/CHANGELOG.md index 655f2aa8cf5..ff494961fce 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 9bbcbaf9e77..113b2faa9e0 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( 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( 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(expression)->end = (Expression*)endExpr; } +void BinaryenStringNewSetTry(BinaryenExpressionRef expr, bool try_) { + auto* expression = (Expression*)expr; + assert(expression->is()); + static_cast(expression)->try_ = try_; +} +bool BinaryenStringNewIsTry(BinaryenExpressionRef expr) { + auto* expression = (Expression*)expr; + assert(expression->is()); + return static_cast(expression)->try_; +} // StringConst const char* BinaryenStringConstGetString(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; @@ -4615,6 +4629,16 @@ void BinaryenStringConcatSetRight(BinaryenExpressionRef expr, static_cast(expression)->right = (Expression*)rightExpr; } // StringEq +BinaryenOp BinaryenStringEqGetOp(BinaryenExpressionRef expr) { + auto* expression = (Expression*)expr; + assert(expression->is()); + return static_cast(expression)->op; +} +void BinaryenStringEqSetOp(BinaryenExpressionRef expr, BinaryenOp op) { + auto* expression = (Expression*)expr; + assert(expression->is()); + static_cast(expression)->op = StringEqOp(op); +} BinaryenExpressionRef BinaryenStringEqGetLeft(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is()); diff --git a/src/binaryen-c.h b/src/binaryen-c.h index cd5bd67352c..32e3af46088 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 49a8d2b6907..5bd5e550543 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 b2b35da165d..4a1f53e3c70 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 51006031755..bd0d0e16f04 100644 --- a/test/example/c-api-kitchen-sink.txt +++ b/test/example/c-api-kitchen-sink.txt @@ -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) @@ -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) @@ -2254,6 +2267,11 @@ BinaryenFeatureAll: 126975 (i32.const 0) ) ) + (drop + (string.from_code_point + (i32.const 1) + ) + ) (drop (string.const "hello world") ) @@ -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)