From 2a4a377e809fdc9726a580e177ea1f1addb78063 Mon Sep 17 00:00:00 2001 From: yp9522 Date: Wed, 2 Jul 2025 17:18:44 +0800 Subject: [PATCH] fix hex bug Signed-off-by: yp9522 --- ets2panda/lexer/token/number.cpp | 21 ++++---- ets2panda/lexer/token/number.h | 31 ++++++++++-- .../test/runtime/ets/const_number_literal.ets | 48 +++++++++++++++++++ 3 files changed, 86 insertions(+), 14 deletions(-) create mode 100644 ets2panda/test/runtime/ets/const_number_literal.ets diff --git a/ets2panda/lexer/token/number.cpp b/ets2panda/lexer/token/number.cpp index 51de994851..c6455edfce 100644 --- a/ets2panda/lexer/token/number.cpp +++ b/ets2panda/lexer/token/number.cpp @@ -31,21 +31,20 @@ Number::Number(util::StringView str, NumberFlags flags) noexcept : str_(str), fl } else { num_ = temp; } - } else { - flags_ |= NumberFlags::ERROR; + return; } - } else { - const double temp = Lexer::StrToNumeric(&std::strtod, str.Utf8().data(), res); - if (res == Lexer::ConversionResult::SUCCESS) { - if (str.Utf8().back() != 'f') { - num_ = temp; - } else { - num_ = static_cast(temp); - } + } + const double temp = Lexer::StrToNumeric(&std::strtod, str.Utf8().data(), res); + if (res == Lexer::ConversionResult::SUCCESS) { + if (str.Utf8().back() != 'f') { + num_ = temp; } else { - flags_ |= NumberFlags::ERROR; + num_ = static_cast(temp); } + } else { + flags_ |= NumberFlags::ERROR; } + if (res == Lexer::ConversionResult::OUT_OF_RANGE) { num_ = 0; } diff --git a/ets2panda/lexer/token/number.h b/ets2panda/lexer/token/number.h index 1e053da19a..43fa58a05b 100644 --- a/ets2panda/lexer/token/number.h +++ b/ets2panda/lexer/token/number.h @@ -63,11 +63,36 @@ public: explicit Number(util::StringView str, double num) noexcept : str_(str), num_(num) {} explicit Number(uint8_t num) noexcept : Number(static_cast(num)) {} explicit Number(int8_t num) noexcept : num_(num) {} - explicit Number(uint16_t num) noexcept : Number(static_cast(num)) {} + explicit Number(uint16_t num) noexcept + { + const int32_t temp = static_cast(num); + if (temp <= std::numeric_limits::max() && temp >= std::numeric_limits::min()) { + num_ = static_cast(temp); + } else { + num_ = static_cast(temp); + } + } explicit Number(int16_t num) noexcept : num_(num) {} - explicit Number(uint32_t num) noexcept : Number(static_cast(num)) {} + explicit Number(uint32_t num) noexcept + { + const int64_t temp = static_cast(num); + if (temp <= std::numeric_limits::max() && temp >= std::numeric_limits::min()) { + num_ = static_cast(temp); + } else { + num_ = temp; + } + } explicit Number(int32_t num) noexcept : num_(num) {} - explicit Number(uint64_t num) noexcept : Number(static_cast(num)) {} + explicit Number(uint64_t num) noexcept + { + const double temp = static_cast(num); + if (temp <= static_cast(std::numeric_limits::max()) && + temp >= static_cast(std::numeric_limits::min())) { + num_ = static_cast(num); + } else { + num_ = static_cast(num); + } + } explicit Number(int64_t num) noexcept : num_(num) {} explicit Number(float num) noexcept : num_(num) {} explicit Number(double num) noexcept : num_(num) {} diff --git a/ets2panda/test/runtime/ets/const_number_literal.ets b/ets2panda/test/runtime/ets/const_number_literal.ets new file mode 100644 index 0000000000..24bdb1c115 --- /dev/null +++ b/ets2panda/test/runtime/ets/const_number_literal.ets @@ -0,0 +1,48 @@ +/* + * 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. + */ + +function main(): void { + // test hex + const x1 : number = 0xffff0000 + arktest.assertEQ(x1, 4294901760) + const x2 : number = 0xf0000000 + arktest.assertEQ(x2, 4026531840) + const x3 : number = 0xff00 + arktest.assertEQ(x3, 65280) + const x4 : number = 0xffffffffff000000 + arktest.assertEQ(x4, 18446744073692774400) + const x5 : number = 18446744073692774400 + arktest.assertEQ(x5, 18446744073692774400) + + // test bin + const y1 : number = 0b11111111111111110000000000000000 + arktest.assertEQ(y1, 4294901760) + const y2 : number = 0b11110000000000000000000000000000 + arktest.assertEQ(y2, 4026531840) + const y3 : number = 0b1111111100000000 + arktest.assertEQ(y3, 65280) + const y4 : number = 0b1111111111111111111111111111111111111111000000000000000000000000 + arktest.assertEQ(y4, 18446744073692774400) + + // test oct + const z1 : number = 0o37777600000 + arktest.assertEQ(z1, 4294901760) + const z2 : number = 0o36000000000 + arktest.assertEQ(z2, 4026531840) + const z3 : number = 0o177400 + arktest.assertEQ(z3, 65280) + const z4 : number = 0o1777777777777700000000 + arktest.assertEQ(z4, 18446744073692774400) +} -- Gitee