diff --git a/js/src/builtin/temporal/TemporalParser.cpp b/js/src/builtin/temporal/TemporalParser.cpp index b6e97eed68ac..41d53f5e8f30 100644 --- a/js/src/builtin/temporal/TemporalParser.cpp +++ b/js/src/builtin/temporal/TemporalParser.cpp @@ -3877,6 +3877,18 @@ Result TimeZoneAnnotation ParserError > +timeZoneIdentifier +( +) +; +mozilla +: +: +Result +< +TimeZoneAnnotation +ParserError +> timeZoneAnnotation ( ) @@ -4057,6 +4069,18 @@ mozilla : Result < +TimeZoneAnnotation +ParserError +> +parseTimeZoneIdentifier +( +) +; +mozilla +: +: +Result +< TimeZoneUTCOffset ParserError > @@ -5491,35 +5515,10 @@ CharT > : : -timeZoneAnnotation +timeZoneIdentifier ( ) { -if -( -! -character -( -' -[ -' -) -) -{ -return -mozilla -: -: -Err -( -JSMSG_TEMPORAL_PARSER_BRACKET_BEFORE_TIMEZONE -) -; -} -annotationCriticalFlag -( -) -; TimeZoneAnnotation result = @@ -5605,6 +5604,82 @@ unwrap ) ; } +return +result +; +} +template +< +typename +CharT +> +mozilla +: +: +Result +< +TimeZoneAnnotation +ParserError +> +TemporalParser +< +CharT +> +: +: +timeZoneAnnotation +( +) +{ +if +( +! +character +( +' +[ +' +) +) +{ +return +mozilla +: +: +Err +( +JSMSG_TEMPORAL_PARSER_BRACKET_BEFORE_TIMEZONE +) +; +} +annotationCriticalFlag +( +) +; +auto +result += +timeZoneIdentifier +( +) +; +if +( +result +. +isErr +( +) +) +{ +return +result +. +propagateErr +( +) +; +} if ( ! @@ -7171,6 +7246,280 @@ mozilla : Result < +TimeZoneAnnotation +ParserError +> +TemporalParser +< +CharT +> +: +: +parseTimeZoneIdentifier +( +) +{ +auto +result += +timeZoneIdentifier +( +) +; +if +( +result +. +isErr +( +) +) +{ +return +result +. +propagateErr +( +) +; +} +if +( +! +reader_ +. +atEnd +( +) +) +{ +return +mozilla +: +: +Err +( +JSMSG_TEMPORAL_PARSER_GARBAGE_AFTER_INPUT +) +; +} +return +result +; +} +template +< +typename +CharT +> +static +auto +ParseTimeZoneIdentifier +( +mozilla +: +: +Span +< +const +CharT +> +str +) +{ +TemporalParser +< +CharT +> +parser +( +str +) +; +return +parser +. +parseTimeZoneIdentifier +( +) +; +} +static +auto +ParseTimeZoneIdentifier +( +Handle +< +JSLinearString +* +> +str +) +{ +JS +: +: +AutoCheckCannotGC +nogc +; +if +( +str +- +> +hasLatin1Chars +( +) +) +{ +return +ParseTimeZoneIdentifier +< +Latin1Char +> +( +str +- +> +latin1Range +( +nogc +) +) +; +} +return +ParseTimeZoneIdentifier +< +char16_t +> +( +str +- +> +twoByteRange +( +nogc +) +) +; +} +bool +js +: +: +temporal +: +: +ParseTimeZoneIdentifier +( +JSContext +* +cx +Handle +< +JSString +* +> +str +MutableHandle +< +ParsedTimeZone +> +result +) +{ +Rooted +< +JSLinearString +* +> +linear +( +cx +str +- +> +ensureLinear +( +cx +) +) +; +if +( +! +linear +) +{ +return +false +; +} +auto +parseResult += +: +: +ParseTimeZoneIdentifier +( +linear +) +; +if +( +parseResult +. +isErr +( +) +) +{ +JS_ReportErrorNumberASCII +( +cx +GetErrorMessage +nullptr +parseResult +. +unwrapErr +( +) +) +; +return +false +; +} +auto +timeZone += +parseResult +. +unwrap +( +) +; +return +ParseTimeZoneAnnotation +( +cx +timeZone +linear +result +) +; +} +template +< +typename +CharT +> +mozilla +: +: +Result +< TimeZoneUTCOffset ParserError > diff --git a/js/src/builtin/temporal/TemporalParser.h b/js/src/builtin/temporal/TemporalParser.h index 80d6af34c4b9..7e7d41abd9f1 100644 --- a/js/src/builtin/temporal/TemporalParser.h +++ b/js/src/builtin/temporal/TemporalParser.h @@ -223,6 +223,31 @@ result ) ; bool +ParseTimeZoneIdentifier +( +JSContext +* +cx +JS +: +: +Handle +< +JSString +* +> +str +JS +: +: +MutableHandle +< +ParsedTimeZone +> +result +) +; +bool ParseTimeZoneOffsetString ( JSContext diff --git a/js/src/builtin/temporal/TimeZone.cpp b/js/src/builtin/temporal/TimeZone.cpp index fdcc2f0ce1a1..2e6c94680414 100644 --- a/js/src/builtin/temporal/TimeZone.cpp +++ b/js/src/builtin/temporal/TimeZone.cpp @@ -5251,6 +5251,447 @@ n ) ; } +bool +js +: +: +temporal +: +: +TimeZoneEquals +( +JSContext +* +cx +Handle +< +JSString +* +> +one +Handle +< +JSString +* +> +two +bool +* +equals +) +{ +if +( +! +EqualStrings +( +cx +one +two +equals +) +) +{ +return +false +; +} +if +( +* +equals +) +{ +return +true +; +} +Rooted +< +ParsedTimeZone +> +timeZoneOne +( +cx +) +; +if +( +! +ParseTimeZoneIdentifier +( +cx +one +& +timeZoneOne +) +) +{ +return +false +; +} +Rooted +< +ParsedTimeZone +> +timeZoneTwo +( +cx +) +; +if +( +! +ParseTimeZoneIdentifier +( +cx +two +& +timeZoneTwo +) +) +{ +return +false +; +} +if +( +timeZoneOne +. +name +( +) +& +& +timeZoneTwo +. +name +( +) +) +{ +Rooted +< +JSAtom +* +> +validTimeZoneOne +( +cx +) +; +if +( +! +IsValidTimeZoneName +( +cx +timeZoneOne +. +name +( +) +& +validTimeZoneOne +) +) +{ +return +false +; +} +if +( +! +validTimeZoneOne +) +{ +* +equals += +false +; +return +true +; +} +Rooted +< +JSAtom +* +> +validTimeZoneTwo +( +cx +) +; +if +( +! +IsValidTimeZoneName +( +cx +timeZoneTwo +. +name +( +) +& +validTimeZoneTwo +) +) +{ +return +false +; +} +if +( +! +validTimeZoneTwo +) +{ +* +equals += +false +; +return +true +; +} +Rooted +< +JSString +* +> +canonicalOne +( +cx +CanonicalizeTimeZoneName +( +cx +validTimeZoneOne +) +) +; +if +( +! +canonicalOne +) +{ +return +false +; +} +JSString +* +canonicalTwo += +CanonicalizeTimeZoneName +( +cx +validTimeZoneTwo +) +; +if +( +! +canonicalTwo +) +{ +return +false +; +} +return +EqualStrings +( +cx +canonicalOne +canonicalTwo +equals +) +; +} +if +( +! +timeZoneOne +. +name +( +) +& +& +! +timeZoneTwo +. +name +( +) +) +{ +* +equals += +( +timeZoneOne +. +offset +( +) += += +timeZoneTwo +. +offset +( +) +) +; +return +true +; +} +* +equals += +false +; +return +true +; +} +bool +js +: +: +temporal +: +: +TimeZoneEquals +( +JSContext +* +cx +Handle +< +TimeZoneValue +> +one +Handle +< +TimeZoneValue +> +two +bool +* +equals +) +{ +if +( +one +. +isObject +( +) +& +& +two +. +isObject +( +) +& +& +one +. +toObject +( +) += += +two +. +toObject +( +) +) +{ +* +equals += +true +; +return +true +; +} +Rooted +< +JSString +* +> +timeZoneOne +( +cx +ToTemporalTimeZoneIdentifier +( +cx +one +) +) +; +if +( +! +timeZoneOne +) +{ +return +false +; +} +Rooted +< +JSString +* +> +timeZoneTwo +( +cx +ToTemporalTimeZoneIdentifier +( +cx +two +) +) +; +if +( +! +timeZoneTwo +) +{ +return +false +; +} +return +TimeZoneEquals +( +cx +timeZoneOne +timeZoneTwo +equals +) +; +} static inline double @@ -8117,6 +8558,138 @@ true } static bool +TimeZone_equals +( +JSContext +* +cx +const +CallArgs +& +args +) +{ +Rooted +< +TimeZoneValue +> +timeZone +( +cx +& +args +. +thisv +( +) +. +toObject +( +) +) +; +Rooted +< +TimeZoneValue +> +other +( +cx +) +; +if +( +! +ToTemporalTimeZone +( +cx +args +. +get +( +0 +) +& +other +) +) +{ +return +false +; +} +bool +equals +; +if +( +! +TimeZoneEquals +( +cx +timeZone +other +& +equals +) +) +{ +return +false +; +} +args +. +rval +( +) +. +setBoolean +( +equals +) +; +return +true +; +} +static +bool +TimeZone_equals +( +JSContext +* +cx +unsigned +argc +Value +* +vp +) +{ +CallArgs +args += +CallArgsFromVp +( +argc +vp +) +; +return +CallNonGenericMethod +< +IsTimeZone +TimeZone_equals +> +( +cx +args +) +; +} +static +bool TimeZone_getOffsetNanosecondsFor ( JSContext @@ -9870,6 +10443,15 @@ TimeZone_prototype_methods JS_FN ( " +equals +" +TimeZone_equals +1 +0 +) +JS_FN +( +" getOffsetNanosecondsFor " TimeZone_getOffsetNanosecondsFor diff --git a/js/src/builtin/temporal/TimeZone.h b/js/src/builtin/temporal/TimeZone.h index a4061d6d12a8..781058dce080 100644 --- a/js/src/builtin/temporal/TimeZone.h +++ b/js/src/builtin/temporal/TimeZone.h @@ -838,6 +838,62 @@ TimeZoneValue timeZone ) ; +bool +TimeZoneEquals +( +JSContext +* +cx +JS +: +: +Handle +< +JSString +* +> +one +JS +: +: +Handle +< +JSString +* +> +two +bool +* +equals +) +; +bool +TimeZoneEquals +( +JSContext +* +cx +JS +: +: +Handle +< +TimeZoneValue +> +one +JS +: +: +Handle +< +TimeZoneValue +> +two +bool +* +equals +) +; PlainDateTimeObject * GetPlainDateTimeFor diff --git a/js/src/builtin/temporal/ZonedDateTime.cpp b/js/src/builtin/temporal/ZonedDateTime.cpp index 5c92394593c3..a8f29d32d2d6 100644 --- a/js/src/builtin/temporal/ZonedDateTime.cpp +++ b/js/src/builtin/temporal/ZonedDateTime.cpp @@ -4291,7 +4291,7 @@ result } static bool -TimeZoneEquals +TimeZoneEqualsOrThrow ( JSContext * @@ -4306,9 +4306,6 @@ Handle TimeZoneValue > two -bool -* -equals ) { if @@ -4341,11 +4338,6 @@ toObject ) ) { -* -equals -= -true -; return true ; @@ -4375,123 +4367,20 @@ return false ; } -JSString -* -timeZoneTwo -= -ToTemporalTimeZoneIdentifier -( -cx -two -) -; -if -( -! -timeZoneTwo -) -{ -return -false -; -} -return -EqualStrings -( -cx -timeZoneOne -timeZoneTwo -equals -) -; -} -static -bool -TimeZoneEqualsOrThrow -( -JSContext -* -cx -Handle -< -TimeZoneValue -> -one -Handle -< -TimeZoneValue -> -two -) -{ -if -( -one -. -isObject -( -) -& -& -two -. -isObject -( -) -& -& -one -. -toObject -( -) -= -= -two -. -toObject -( -) -) -{ -return -true -; -} Rooted < JSString * > -timeZoneOne +timeZoneTwo ( cx ToTemporalTimeZoneIdentifier ( cx -one -) -) -; -if -( -! -timeZoneOne -) -{ -return -false -; -} -JSString -* -timeZoneTwo -= -ToTemporalTimeZoneIdentifier -( -cx two ) +) ; if ( @@ -4509,7 +4398,7 @@ equals if ( ! -EqualStrings +TimeZoneEquals ( cx timeZoneOne