tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 26b566cf17e2d11ad799bfc87a1053a0fbe250d7
parent 5462c55e9c4adf5ffc3efc3f5a1888c6f4424354
Author: André Bargull <andre.bargull@gmail.com>
Date:   Thu, 27 Nov 2025 10:03:35 +0000

Bug 1999315 - Part 5: Introduce CreateMonthCode and ParseMonthCode. r=spidermonkey-reviewers,mgaudet

Editorial changes from <https://github.com/tc39/proposal-temporal/pull/3144>.

(Our implementation doesn't have `CreateMonthCode`.)

Differential Revision: https://phabricator.services.mozilla.com/D272025

Diffstat:
Mjs/src/builtin/temporal/CalendarFields.cpp | 47+++++++++++++++++++----------------------------
1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/js/src/builtin/temporal/CalendarFields.cpp b/js/src/builtin/temporal/CalendarFields.cpp @@ -208,63 +208,59 @@ static mozilla::EnumSet<CalendarField> CalendarExtraFields( } /** - * ToMonthCode ( argument ) + * ParseMonthCode ( argument ) */ template <typename CharT> -static mozilla::Maybe<MonthCodeField> ToMonthCode( +static mozilla::Maybe<MonthCodeField> ParseMonthCode( mozilla::Range<const CharT> chars) { // Steps 1-2. (Not applicable) - // Step 3. - // - // Caller is responsible to ensure the string has the correct length. - MOZ_ASSERT(chars.length() >= 3 && chars.length() <= 4); + // Steps 3-6. + if (chars.length() < 3 || chars.length() > 4) { + return mozilla::Nothing(); + } - // Steps 4 and 7. - // // Starts with capital letter 'M'. Leap months end with capital letter 'L'. bool isLeapMonth = chars.length() == 4; if (chars[0] != 'M' || (isLeapMonth && chars[3] != 'L')) { return mozilla::Nothing(); } - // Steps 5-6. - // // Month numbers are ASCII digits. if (!mozilla::IsAsciiDigit(chars[1]) || !mozilla::IsAsciiDigit(chars[2])) { return mozilla::Nothing(); } - // Steps 8-9. + // Steps 6-7. int32_t ordinal = AsciiDigitToNumber(chars[1]) * 10 + AsciiDigitToNumber(chars[2]); - // Step 10. + // Step 8. if (ordinal == 0 && !isLeapMonth) { return mozilla::Nothing(); } - // Step 11. + // Step 9. return mozilla::Some(MonthCodeField{ordinal, isLeapMonth}); } /** - * ToMonthCode ( argument ) + * ParseMonthCode ( argument ) */ -static auto ToMonthCode(const JSLinearString* linear) { +static auto ParseMonthCode(const JSLinearString* linear) { JS::AutoCheckCannotGC nogc; if (linear->hasLatin1Chars()) { - return ToMonthCode(linear->latin1Range(nogc)); + return ParseMonthCode(linear->latin1Range(nogc)); } - return ToMonthCode(linear->twoByteRange(nogc)); + return ParseMonthCode(linear->twoByteRange(nogc)); } /** - * ToMonthCode ( argument ) + * ParseMonthCode ( argument ) */ -static bool ToMonthCode(JSContext* cx, Handle<Value> value, - MonthCodeField* result) { +static bool ParseMonthCode(JSContext* cx, Handle<Value> value, + MonthCodeField* result) { auto reportInvalidMonthCode = [&](JSLinearString* monthCode) { if (auto code = QuoteString(cx, monthCode)) { JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, @@ -292,13 +288,8 @@ static bool ToMonthCode(JSContext* cx, Handle<Value> value, return false; } - // Step 3. - if (monthCodeStr->length() < 3 || monthCodeStr->length() > 4) { - return reportInvalidMonthCode(monthCodeStr); - } - - // Steps 4-11. - auto parsed = ToMonthCode(monthCodeStr); + // Steps 3-9. + auto parsed = ParseMonthCode(monthCodeStr); if (!parsed) { return reportInvalidMonthCode(monthCodeStr); } @@ -417,7 +408,7 @@ static bool PrepareCalendarFields( } case CalendarField::MonthCode: { MonthCodeField monthCode; - if (!ToMonthCode(cx, value, &monthCode)) { + if (!ParseMonthCode(cx, value, &monthCode)) { return false; } result.setMonthCode(monthCode);