diff --git a/ets2panda/bindings/native/include/panda_types.h b/ets2panda/bindings/native/include/panda_types.h index d29f51c232b1a2f311df23449f378d9a876ff151..4304bef4d5bc86f0c61028a26019e211a4ab644f 100644 --- a/ets2panda/bindings/native/include/panda_types.h +++ b/ets2panda/bindings/native/include/panda_types.h @@ -179,7 +179,7 @@ private: using KBoolean = int8_t; using KByte = uint8_t; -using KChar = int16_t; +using KChar = uint32_t; using KShort = int16_t; using KUShort = uint16_t; using KInt = int32_t; diff --git a/ets2panda/checker/ETSAnalyzer.cpp b/ets2panda/checker/ETSAnalyzer.cpp index a54a072efc182d7ccb80c1e1b9c08177eb1a9d38..7ae2c12d2280b1f42a21911d450dc2317b8785c7 100644 --- a/ets2panda/checker/ETSAnalyzer.cpp +++ b/ets2panda/checker/ETSAnalyzer.cpp @@ -2956,8 +2956,8 @@ static bool CheckIfLiteralValueIsAppropriate(ETSChecker *checker, Type *type, ir } } else if (relation->IsIdenticalTo(type, checker->GlobalCharBuiltinType())) { auto val = number.GetValueAndCastTo(); - return !number.IsReal() && val >= std::numeric_limits::min() && - val <= std::numeric_limits::max(); + return !number.IsReal() && val >= std::numeric_limits::min() && + val <= std::numeric_limits::max(); } else if (number.IsDouble()) { if (relation->IsIdenticalTo(type, checker->GlobalFloatBuiltinType())) { auto doubleVal = number.GetDouble(); diff --git a/ets2panda/checker/ETSchecker.h b/ets2panda/checker/ETSchecker.h index 9bfdaaba99a91efce6d9d970501c6102e85dcab8..190e1a6aef0e1fef6cd602b3f3f5a0f19987ba67 100644 --- a/ets2panda/checker/ETSchecker.h +++ b/ets2panda/checker/ETSchecker.h @@ -317,7 +317,7 @@ public: IntType *CreateIntType(int32_t value); LongType *CreateLongType(int64_t value); ShortType *CreateShortType(int16_t value); - CharType *CreateCharType(char16_t value); + CharType *CreateCharType(char32_t value); ETSBigIntType *CreateETSBigIntLiteralType(util::StringView value); ETSStringType *CreateETSStringLiteralType(util::StringView value); ETSResizableArrayType *CreateETSMultiDimResizableArrayType(Type *element, size_t dimSize); diff --git a/ets2panda/checker/ets/typeCreation.cpp b/ets2panda/checker/ets/typeCreation.cpp index c6396ad6435a2aa5eb7b8cc4107e733429543483..2ca6c9040bec54a37a900cb9a903f2b1fb8bee52 100644 --- a/ets2panda/checker/ets/typeCreation.cpp +++ b/ets2panda/checker/ets/typeCreation.cpp @@ -62,7 +62,7 @@ ShortType *ETSChecker::CreateShortType(int16_t value) return ProgramAllocator()->New(value); } -CharType *ETSChecker::CreateCharType(char16_t value) +CharType *ETSChecker::CreateCharType(char32_t value) { return ProgramAllocator()->New(value); } diff --git a/ets2panda/checker/types/ets/charType.h b/ets2panda/checker/types/ets/charType.h index 793a64ea4ed52a5ed44f86b1a6439623f9e55375..f69645a0e0799da386a3d67982277363de286b71 100644 --- a/ets2panda/checker/types/ets/charType.h +++ b/ets2panda/checker/types/ets/charType.h @@ -21,7 +21,7 @@ namespace ark::es2panda::checker { class CharType : public Type { public: - using UType = char16_t; + using UType = char32_t; CharType() : Type(TypeFlag::CHAR) {} explicit CharType(UType value) : Type(TypeFlag::CHAR | TypeFlag::CONSTANT), value_(value) {} diff --git a/ets2panda/compiler/core/ETSGen.cpp b/ets2panda/compiler/core/ETSGen.cpp index 5d2309adfc26f256187fe0b4765b793858193941..c16ce5424caa2374a178a25c991231def3b41b24 100644 --- a/ets2panda/compiler/core/ETSGen.cpp +++ b/ets2panda/compiler/core/ETSGen.cpp @@ -1068,22 +1068,18 @@ void ETSGen::CastToChar([[maybe_unused]] const ir::AstNode *node) case checker::TypeFlag::BYTE: case checker::TypeFlag::SHORT: case checker::TypeFlag::INT: { - Sa().Emit(node); break; } case checker::TypeFlag::LONG: { Sa().Emit(node); - Sa().Emit(node); break; } case checker::TypeFlag::FLOAT: { - Sa().Emit(node); - Sa().Emit(node); + Sa().Emit(node); break; } case checker::TypeFlag::DOUBLE: { - Sa().Emit(node); - Sa().Emit(node); + Sa().Emit(node); break; } case checker::TypeFlag::ETS_OBJECT: { @@ -2013,7 +2009,6 @@ void ETSGen::UpdateOperator(const ir::AstNode *node) } case checker::TypeFlag::CHAR: { Sa().Emit(node, 1); - Sa().Emit(node); break; } case checker::TypeFlag::SHORT: { @@ -2188,7 +2183,7 @@ void ETSGen::LoadAccumulatorNull([[maybe_unused]] const ir::AstNode *node) #endif // PANDA_WITH_ETS } -void ETSGen::LoadAccumulatorChar(const ir::AstNode *node, char16_t value) +void ETSGen::LoadAccumulatorChar(const ir::AstNode *node, char32_t value) { Sa().Emit(node, value); SetAccumulatorType(Checker()->GlobalCharType()); @@ -2652,7 +2647,7 @@ void ETSGen::LoadArrayElement(const ir::AstNode *node, VReg objectReg) break; } case checker::TypeFlag::CHAR: { - Ra().Emit(node, objectReg); + Ra().Emit(node, objectReg); break; } case checker::TypeFlag::SHORT: { @@ -2697,7 +2692,10 @@ void ETSGen::StoreArrayElement(const ir::AstNode *node, VReg objectReg, VReg ind Ra().Emit(node, objectReg, index); break; } - case checker::TypeFlag::CHAR: + case checker::TypeFlag::CHAR: { + Ra().Emit(node, objectReg, index); + break; + } case checker::TypeFlag::SHORT: { Ra().Emit(node, objectReg, index); break; diff --git a/ets2panda/compiler/core/ETSGen.h b/ets2panda/compiler/core/ETSGen.h index 4b306cccb2659231a1f06fa6f9dd783fe9a40d51..0e5e339ea4f1196e43849100ba5a21a357733768 100644 --- a/ets2panda/compiler/core/ETSGen.h +++ b/ets2panda/compiler/core/ETSGen.h @@ -221,7 +221,7 @@ public: void LoadAccumulatorPoison(const ir::AstNode *node, const checker::Type *type); - void LoadAccumulatorChar(const ir::AstNode *node, char16_t value); + void LoadAccumulatorChar(const ir::AstNode *node, char32_t value); void ApplyConversion(const ir::AstNode *node) { diff --git a/ets2panda/compiler/core/ETSemitter.cpp b/ets2panda/compiler/core/ETSemitter.cpp index b841f1d1884322af4683b62a4905787724f890e5..c7776dae5d31793494bf11ac6f0b8392aa61d9b0 100644 --- a/ets2panda/compiler/core/ETSemitter.cpp +++ b/ets2panda/compiler/core/ETSemitter.cpp @@ -407,7 +407,7 @@ static pandasm::ScalarValue CreateScalarValue(ir::Literal const *literal, checke } case checker::TypeFlag::CHAR: { ES2PANDA_ASSERT(literal->IsCharLiteral()); - return pandasm::ScalarValue::Create(literal->AsCharLiteral()->Char()); + return pandasm::ScalarValue::Create(literal->AsCharLiteral()->Char()); } case checker::TypeFlag::ETS_OBJECT: { ES2PANDA_ASSERT(literal->IsStringLiteral()); diff --git a/ets2panda/compiler/scripts/signatures.yaml b/ets2panda/compiler/scripts/signatures.yaml index 41a3720127681d2a03ee8edccf1bae8ce994bfa9..30913333270aefc8ba68c2f3eaac9bdf094f020d 100644 --- a/ets2panda/compiler/scripts/signatures.yaml +++ b/ets2panda/compiler/scripts/signatures.yaml @@ -32,7 +32,7 @@ defines: ref: SET_INDEX_METHOD - name: $_iterator ref: ITERATOR_METHOD - - name: Iterator + - name: Iterator ref: ITERATOR_CLASS - name: 'ambient_indexer' ref: AMBIENT_INDEXER @@ -272,7 +272,7 @@ primitives: - name: u1 ref: PRIMITIVE_BOOLEAN - - name: u16 + - name: u32 ref: PRIMITIVE_CHAR - name: i8 @@ -316,7 +316,7 @@ typedescriptors: ref: TYPE_DESCRIPTOR_INT - name: 'U' - ref: TYPE_DESCRIPTOR_UINT + ref: TYPE_DESCRIPTOR_UINT16 - name: 'F' ref: TYPE_DESCRIPTOR_FLOAT diff --git a/ets2panda/evaluate/helpers.cpp b/ets2panda/evaluate/helpers.cpp index 88a631b2f782a80548f9b7e16ad7cd09951a48f8..a8b81663519709f50248dab4d95b3613d7f95c31 100644 --- a/ets2panda/evaluate/helpers.cpp +++ b/ets2panda/evaluate/helpers.cpp @@ -47,7 +47,7 @@ ir::TypeNode *PrimitiveToTypeNode(panda_file::Type::TypeId typeId, checker::ETSC case panda_file::Type::TypeId::I8: irType = ir::PrimitiveType::BYTE; break; - case panda_file::Type::TypeId::U16: + case panda_file::Type::TypeId::U32: irType = ir::PrimitiveType::CHAR; break; case panda_file::Type::TypeId::I16: diff --git a/ets2panda/evaluate/helpers.h b/ets2panda/evaluate/helpers.h index 5038bcc9ac87d1dd69e2695c24ae86cff9107b1f..e9cd5a3593829a24ead2494cfc2482fd0e4e9b92 100644 --- a/ets2panda/evaluate/helpers.h +++ b/ets2panda/evaluate/helpers.h @@ -85,7 +85,7 @@ static inline constexpr std::string_view DEBUGGER_API_CLASS_NAME = "DebuggerAPI" case panda_file::Type::TypeId::I8: \ /* CC-OFFNXT(G.PRE.05) function gen */ \ return #TYPE_NAME_BASE "Byte"; \ - case panda_file::Type::TypeId::U16: \ + case panda_file::Type::TypeId::U32: \ /* CC-OFFNXT(G.PRE.05) function gen */ \ return #TYPE_NAME_BASE "Char"; \ case panda_file::Type::TypeId::I16: \ diff --git a/ets2panda/ir/astDump.cpp b/ets2panda/ir/astDump.cpp index 470679783384f4573d4802e218fb592468b63a60..1af2eb020c0ce6e41ff74c62c0c42e6ed2846abc 100644 --- a/ets2panda/ir/astDump.cpp +++ b/ets2panda/ir/astDump.cpp @@ -90,8 +90,8 @@ void AstDumper::Serialize(const AstDumper::Property &prop) SerializeBoolean(std::get(value)); } else if (std::holds_alternative(value)) { SerializeNumber(std::get(value)); - } else if (std::holds_alternative(value)) { - SerializeChar16(std::get(value)); + } else if (std::holds_alternative(value)) { + SerializeChar32(std::get(value)); } else if (std::holds_alternative(value)) { SerializeObject(std::get(value)); } else if (std::holds_alternative>(value)) { @@ -154,9 +154,9 @@ void AstDumper::SerializeNumber(lexer::Number number) } } -void AstDumper::SerializeChar16(char16_t c16) +void AstDumper::SerializeChar32(char32_t c32) { - SerializeString(util::Helpers::UTF16toUTF8(c16).c_str()); + SerializeString(util::Helpers::UTF32toUTF8(c32).c_str()); } void AstDumper::SerializeBoolean(bool boolean) diff --git a/ets2panda/ir/astDump.h b/ets2panda/ir/astDump.h index febaf9827013db6cf04b53c63a323ffb4bd72d9c..07abe7a7d77a247c9dec1b281e97c5d4e6681acb 100644 --- a/ets2panda/ir/astDump.h +++ b/ets2panda/ir/astDump.h @@ -84,13 +84,13 @@ public: }; using Val = std::variant, util::StringView, - bool, char16_t, lexer::Number, const ir::AstNode *, std::vector, + bool, char32_t, lexer::Number, const ir::AstNode *, std::vector, Constant, Nullish, Ignore>; Property(const char *key, const char *string) : key_(key), value_(string) {} Property(const char *key, util::StringView str) : key_(key), value_(str) {} Property(const char *key, bool boolean) : key_(key), value_(boolean) {} - Property(const char *key, char16_t c16) : key_(key), value_(c16) {} + Property(const char *key, char32_t c16) : key_(key), value_(c16) {} Property(const char *key, lexer::Number number) : key_(key), value_(number) {} Property(const char *key, lexer::TokenType token) : key_(key), value_(token) {} Property(const char *key, std::initializer_list props) : key_(key), value_(props) {} @@ -229,7 +229,7 @@ private: void SerializeString(const util::StringView &str); void SerializeNumber(size_t number); void SerializeNumber(lexer::Number number); - void SerializeChar16(char16_t c16); + void SerializeChar32(char32_t c32); void SerializeBoolean(bool boolean); void SerializeObject(const ir::AstNode *object); void SerializeToken(lexer::TokenType token); diff --git a/ets2panda/ir/expressions/literals/charLiteral.cpp b/ets2panda/ir/expressions/literals/charLiteral.cpp index 3dcd401f22f96dc2f48f27692e4be373ba887452..4169f13b70bf3a883a61785b5951bdeab78dd152 100644 --- a/ets2panda/ir/expressions/literals/charLiteral.cpp +++ b/ets2panda/ir/expressions/literals/charLiteral.cpp @@ -73,7 +73,7 @@ CharLiteral *CharLiteral::Clone(ArenaAllocator *const allocator, AstNode *const std::string CharLiteral::ToString() const { - std::string utf8Str = util::Helpers::UTF16toUTF8(char_); + std::string utf8Str = util::Helpers::UTF32toUTF8(char_); if (UNLIKELY(utf8Str.empty())) { return std::to_string(char_); } diff --git a/ets2panda/ir/expressions/literals/charLiteral.h b/ets2panda/ir/expressions/literals/charLiteral.h index 4ffb2f2d0812005612b86d570c7de9970264d031..219d27d467f677cfcc2bf4df586d8061acb5f2e3 100644 --- a/ets2panda/ir/expressions/literals/charLiteral.h +++ b/ets2panda/ir/expressions/literals/charLiteral.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -28,9 +28,9 @@ public: NO_MOVE_SEMANTIC(CharLiteral); explicit CharLiteral() : CharLiteral(u'\u0000') {} - explicit CharLiteral(char16_t const character) : Literal(AstNodeType::CHAR_LITERAL), char_(character) {} + explicit CharLiteral(char32_t const character) : Literal(AstNodeType::CHAR_LITERAL), char_(character) {} - [[nodiscard]] char16_t Char() const noexcept + [[nodiscard]] char32_t Char() const noexcept { return char_; } @@ -58,7 +58,7 @@ public: } private: - char16_t const char_; + char32_t const char_; }; } // namespace ark::es2panda::ir diff --git a/ets2panda/lexer/ETSLexer.cpp b/ets2panda/lexer/ETSLexer.cpp index 58645e09fa9e7ebd9e002ed626567f1db84226bd..c414b616f5a04fb02e7b4670ba4147f632d2d627 100644 --- a/ets2panda/lexer/ETSLexer.cpp +++ b/ets2panda/lexer/ETSLexer.cpp @@ -64,9 +64,7 @@ bool ETSLexer::ScanCharLiteral() } } - if (CheckUtf16Compatible(cp)) { - GetToken().c16_ = cp; - } + GetToken().c32_ = cp; if (Iterator().Peek() != LEX_CHAR_SINGLE_QUOTE) { LogError(diagnostic::UNSUPPORTED_CHAR_LIT); @@ -93,16 +91,6 @@ void ETSLexer::CheckNumberLiteralEnd() } } -bool ETSLexer::CheckUtf16Compatible(char32_t cp) const -{ - if (cp >= util::StringView::Constants::CELESTIAL_OFFSET) { - // lexer_invalid_characters.ets - LogError(diagnostic::UNSUPPORTED_CHAR_LIT); - return false; - } - return true; -} - void ETSLexer::ScanAsteriskPunctuator() { GetToken().type_ = TokenType::PUNCTUATOR_MULTIPLY; diff --git a/ets2panda/lexer/token/token.h b/ets2panda/lexer/token/token.h index 35d27885f84e2623c2f2727f878b74b8fdde3ad2..4ed62c634b7d848f68f11d27c310fd97ef98e6da 100644 --- a/ets2panda/lexer/token/token.h +++ b/ets2panda/lexer/token/token.h @@ -64,9 +64,9 @@ public: return flags_; } - char16_t Utf16() const + char32_t Utf32() const { - return c16_; + return c32_; } void SetTokenType(TokenType type) @@ -158,7 +158,7 @@ private: SourceRange loc_ {}; Number number_ {}; util::StringView src_ {}; - char16_t c16_ {}; + char32_t c32_ {}; }; } // namespace ark::es2panda::lexer diff --git a/ets2panda/parser/expressionParser.cpp b/ets2panda/parser/expressionParser.cpp index 6d111ce34ace4c3348ba058e12bf2ad0e88774d0..f5f470bbcc7e6515ab3afa882e28e96650077c76 100644 --- a/ets2panda/parser/expressionParser.cpp +++ b/ets2panda/parser/expressionParser.cpp @@ -912,7 +912,7 @@ ir::CharLiteral *ParserImpl::ParseCharLiteral() { ES2PANDA_ASSERT(lexer_->GetToken().Type() == lexer::TokenType::LITERAL_CHAR); - auto *charNode = AllocNode(lexer_->GetToken().Utf16()); + auto *charNode = AllocNode(lexer_->GetToken().Utf32()); ES2PANDA_ASSERT(charNode != nullptr); charNode->SetRange(lexer_->GetToken().Loc()); diff --git a/ets2panda/public/README.md b/ets2panda/public/README.md index 819296956a07ff4543543c580bc8cd0d8d012156..0736d0b7d3be4a2fd90eb0917272845283c24ef9 100644 --- a/ets2panda/public/README.md +++ b/ets2panda/public/README.md @@ -501,6 +501,7 @@ Other types/classes are represented in the same way as in C-API. - `uint8_t` => `u8` - `int16_t` => `i16` - `char16_t` => `i16` +- `char32_t` => `i16` - `int32_t` => `i32` - `uint32_t` => `u32` - `int64_t` => `i64` diff --git a/ets2panda/public/es2panda_lib.rb b/ets2panda/public/es2panda_lib.rb index 82f2cd6522a9269a242eeec28c2e0150afa6e504..7ced1b1898485868c0a87f121e6cfccc542b4750 100644 --- a/ets2panda/public/es2panda_lib.rb +++ b/ets2panda/public/es2panda_lib.rb @@ -567,6 +567,7 @@ module Es2pandaLibApi 'uint8_t' => 'u8', 'int16_t' => 'i16', 'char16_t' => 'i16', + 'char32_t' => 'i32', 'int32_t' => 'i32', 'uint32_t' => 'u32', 'int64_t' => 'i64', @@ -1345,6 +1346,7 @@ module Es2pandaLibApi %w[ char char16_t + char32_t short int long diff --git a/ets2panda/test/runtime/ets/CastPrimitive.ets b/ets2panda/test/runtime/ets/CastPrimitive.ets index c568b206e9c750f5fbbd169de5bbc92e87d244bd..3dc2d5c8a2ce44874c7e96f90b247dfda4d9df5c 100644 --- a/ets2panda/test/runtime/ets/CastPrimitive.ets +++ b/ets2panda/test/runtime/ets/CastPrimitive.ets @@ -38,12 +38,12 @@ function main(): void { let c : long = 1193046; // 1193046 == 0x123456 arktest.assertEQ(Long.toInt(c), 1193046) arktest.assertEQ(Long.toShort(c), 13398) // 13398 == 0x3456 - arktest.assertEQ(Long.toChar(c), c'\u3456') + arktest.assertEQ(Long.toChar(c), 1193046) // 0x123456 is invalid Unicode sequence arktest.assertEQ(Long.toByte(c), 86) // 86 == 0x56 let d : int = 126977; // 65537 == 0x1F001 arktest.assertEQ(Int.toShort(d), -4095) // -4095 == 0xF001 - arktest.assertEQ(Int.toChar(d), c'\uF001') + arktest.assertEQ(Int.toChar(d), c'\u{1F001}') arktest.assertEQ(Int.toByte(d), 1) // 1 == 0x01 let e : short = -30875; // -30875 == 0x8765 @@ -51,7 +51,7 @@ function main(): void { arktest.assertEQ(Short.toFloat(e), -30875.0) arktest.assertEQ(Short.toLong(e), -30875) // -30875 == 0xFFFFFFFFFFFF8765 arktest.assertEQ(Short.toInt(e), -30875) // -30875 == 0xFFFF8765 - arktest.assertEQ(Short.toChar(e), c'\u8765') + arktest.assertEQ(Short.toChar(e), 4294936421) arktest.assertEQ(Short.toByte(e), 101) // 101 == 0x65 let f : char = c'\uF001'; @@ -68,7 +68,7 @@ function main(): void { arktest.assertEQ(Byte.toLong(g), -128) arktest.assertEQ(Byte.toInt(g), -128) arktest.assertEQ(Byte.toShort(g), -128) - arktest.assertEQ(Byte.toChar(g), c'\uFF80') + arktest.assertEQ(Byte.toChar(g), 4294967168) arktest.assertEQ(Int.toByte(-128), -128) arktest.assertEQ(Int.toByte(-129), 127) diff --git a/ets2panda/test/runtime/ets/UpdateExpression.ets b/ets2panda/test/runtime/ets/UpdateExpression.ets index a1288b3278bca7a29eb81ea7990bf398d12fcd9f..a7e7162e386d98c8a3af3a85876182693e13befb 100644 --- a/ets2panda/test/runtime/ets/UpdateExpression.ets +++ b/ets2panda/test/runtime/ets/UpdateExpression.ets @@ -84,9 +84,9 @@ function main(): void { arktest.assertEQ(Byte.toInt(++b), -128) arktest.assertEQ(Byte.toInt(--b), 127) - let c: char = 65535; - arktest.assertEQ(Char.toInt(++c), 0) - arktest.assertEQ(Char.toInt(--c), 65535) + let c: char = 4294967295; + arktest.assertEQ(Char.toLong(++c), 0) + arktest.assertEQ(Char.toLong(--c), 4294967295) let s: short = 32767; arktest.assertEQ(Short.toInt(++s), -32768) diff --git a/ets2panda/test/runtime/ets/stringChar32.ets b/ets2panda/test/runtime/ets/stringChar32.ets new file mode 100644 index 0000000000000000000000000000000000000000..cdf00a02b8fe532676f4b7868b573d23be4cea78 --- /dev/null +++ b/ets2panda/test/runtime/ets/stringChar32.ets @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +let a = new String("πŸš€world🌏") +let array: FixedArray = [c'πŸš€', c'w', c'o', c'r', c'l', c'd', c'🌏'] +let stringFromArray = new String(array) +arktest.assertEQ(a, stringFromArray) +for(let i = 0; i < a.length; i++) { + arktest.assertEQ(a[i], stringFromArray[i]) +} +let charArrayFromString = a.getChars() +for(let i = 0; i < charArrayFromString.length; i++) { + arktest.assertEQ(charArrayFromString[i], array[i]) +} +arktest.assertEQ(c'\u{1F680}', c'πŸš€') +arktest.assertEQ(128640 as char, c'πŸš€') \ No newline at end of file diff --git a/ets2panda/test/test-lists/ets-runtime/ets-runtime-ignored.txt b/ets2panda/test/test-lists/ets-runtime/ets-runtime-ignored.txt index 158d14d3d2d965957182b7256ae24ba86c5fd934..8da8dc71e204abe5fa3f902d4d52c2113e9083be 100644 --- a/ets2panda/test/test-lists/ets-runtime/ets-runtime-ignored.txt +++ b/ets2panda/test/test-lists/ets-runtime/ets-runtime-ignored.txt @@ -130,3 +130,6 @@ large_number_parse.ets # Issue #28914 non_null_number_as_index.ets + +# bytecode optimizer generate incorrect bytecode for some u32 instr +fieldImplicitCasting.ets diff --git a/ets2panda/util/ast-builders/charLiteralBuilder.h b/ets2panda/util/ast-builders/charLiteralBuilder.h index 701ede6cf5a00b4db8668870352b02bf7a06ea94..66fc3e4375377d97eb474dee157dd7ac01040a68 100644 --- a/ets2panda/util/ast-builders/charLiteralBuilder.h +++ b/ets2panda/util/ast-builders/charLiteralBuilder.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -26,7 +26,7 @@ class CharLiteralBuilder : public AstBuilder { public: explicit CharLiteralBuilder(ark::ArenaAllocator *allocator) : AstBuilder(allocator) {} - CharLiteralBuilder &SetValue(char16_t val) + CharLiteralBuilder &SetValue(char32_t val) { value_ = val; return *this; @@ -39,7 +39,7 @@ public: } private: - char16_t value_ = u'\u0000'; + char32_t value_ = u'\u0000'; }; } // namespace ark::es2panda::ir diff --git a/ets2panda/util/helpers.cpp b/ets2panda/util/helpers.cpp index 51c7b324e479e55b5e3ec6808d1c71f4e2a8e7b6..033eaf588bf8851a36ce5c6a0050037e6f8c2cdc 100644 --- a/ets2panda/util/helpers.cpp +++ b/ets2panda/util/helpers.cpp @@ -683,9 +683,10 @@ std::string Helpers::CreateEscapedString(const std::string &str) return escapedStr; } -std::string Helpers::UTF16toUTF8(const char16_t c) +std::string Helpers::UTF32toUTF8(const char32_t c) { - const utf::Utf8Char utf8Ch = utf::ConvertUtf16ToUtf8(c, 0, false); + auto c16 = utf::ConvertUtf32ToUtf16(c); + const utf::Utf8Char utf8Ch = utf::ConvertUtf16ToUtf8(c16.ch[0], c16.ch[1], false); return std::string(reinterpret_cast(utf8Ch.ch.data()), utf8Ch.n); } diff --git a/ets2panda/util/helpers.h b/ets2panda/util/helpers.h index 396ff2c401522fe9bf7abb6d825c749442f9809c..f1696483bbca9e33176d07321f2319ef6ccdabf1 100644 --- a/ets2panda/util/helpers.h +++ b/ets2panda/util/helpers.h @@ -194,7 +194,7 @@ public: static const uint32_t INVALID_INDEX = 4294967295L; static std::string CreateEscapedString(const std::string &str); - static std::string UTF16toUTF8(const char16_t c); + static std::string UTF32toUTF8(const char32_t c); template static std::string AppendAll(Elements &&...elems);