tor-browser

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

commit 75a44f40d93800a03853b245e4c5bb32ac23de2d
parent bf6a6388ea10529cf521d485f0d12814e107ebb9
Author: André Bargull <andre.bargull@gmail.com>
Date:   Tue, 16 Dec 2025 18:23:28 +0000

Bug 2005531 - Part 6: Move supportedLocalesOf implementations to C++. r=spidermonkey-reviewers,dminor

Part 8 will remove the no longer used self-hosted JS functions.

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

Diffstat:
Mjs/src/builtin/intl/Collator.cpp | 25+++++++++++++++++++++++--
Mjs/src/builtin/intl/DateTimeFormat.cpp | 25+++++++++++++++++++++++--
Mjs/src/builtin/intl/DisplayNames.cpp | 25+++++++++++++++++++++++--
Mjs/src/builtin/intl/DurationFormat.cpp | 23+++++++++++++++++++++--
Mjs/src/builtin/intl/ListFormat.cpp | 25+++++++++++++++++++++++--
Mjs/src/builtin/intl/NumberFormat.cpp | 25+++++++++++++++++++++++--
Mjs/src/builtin/intl/PluralRules.cpp | 25+++++++++++++++++++++++--
Mjs/src/builtin/intl/RelativeTimeFormat.cpp | 25+++++++++++++++++++++++--
Mjs/src/builtin/intl/Segmenter.cpp | 25+++++++++++++++++++++++--
9 files changed, 205 insertions(+), 18 deletions(-)

diff --git a/js/src/builtin/intl/Collator.cpp b/js/src/builtin/intl/Collator.cpp @@ -17,6 +17,7 @@ #include "builtin/intl/CommonFunctions.h" #include "builtin/intl/FormatBuffer.h" #include "builtin/intl/LanguageTag.h" +#include "builtin/intl/LocaleNegotiation.h" #include "builtin/intl/SharedIntlData.h" #include "gc/GCContext.h" #include "js/PropertySpec.h" @@ -32,6 +33,7 @@ #include "vm/JSObject-inl.h" using namespace js; +using namespace js::intl; using JS::AutoStableStringChars; @@ -62,6 +64,9 @@ const JSClass CollatorObject::class_ = { const JSClass& CollatorObject::protoClass_ = PlainObject::class_; +static bool collator_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp); + static bool collator_toSource(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); args.rval().setString(cx->names().Collator); @@ -69,8 +74,7 @@ static bool collator_toSource(JSContext* cx, unsigned argc, Value* vp) { } static const JSFunctionSpec collator_static_methods[] = { - JS_SELF_HOSTED_FN("supportedLocalesOf", "Intl_Collator_supportedLocalesOf", - 1, 0), + JS_FN("supportedLocalesOf", collator_supportedLocalesOf, 1, 0), JS_FS_END, }; @@ -505,3 +509,20 @@ bool js::intl_isIgnorePunctuation(JSContext* cx, unsigned argc, Value* vp) { args.rval().setBoolean(isIgnorePunctuation); return true; } + +/** + * Intl.Collator.supportedLocalesOf ( locales [ , options ] ) + */ +static bool collator_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + + // Steps 1-3. + auto* array = SupportedLocalesOf(cx, AvailableLocaleKind::Collator, + args.get(0), args.get(1)); + if (!array) { + return false; + } + args.rval().setObject(*array); + return true; +} diff --git a/js/src/builtin/intl/DateTimeFormat.cpp b/js/src/builtin/intl/DateTimeFormat.cpp @@ -23,6 +23,7 @@ #include "builtin/intl/CommonFunctions.h" #include "builtin/intl/FormatBuffer.h" #include "builtin/intl/LanguageTag.h" +#include "builtin/intl/LocaleNegotiation.h" #include "builtin/intl/SharedIntlData.h" #include "builtin/temporal/Calendar.h" #include "builtin/temporal/Instant.h" @@ -55,6 +56,7 @@ #include "vm/NativeObject-inl.h" using namespace js; +using namespace js::intl; using namespace js::temporal; using JS::AutoStableStringChars; @@ -91,6 +93,9 @@ const JSClass DateTimeFormatObject::class_ = { const JSClass& DateTimeFormatObject::protoClass_ = PlainObject::class_; +static bool dateTimeFormat_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp); + static bool dateTimeFormat_toSource(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); args.rval().setString(cx->names().DateTimeFormat); @@ -98,8 +103,7 @@ static bool dateTimeFormat_toSource(JSContext* cx, unsigned argc, Value* vp) { } static const JSFunctionSpec dateTimeFormat_static_methods[] = { - JS_SELF_HOSTED_FN("supportedLocalesOf", - "Intl_DateTimeFormat_supportedLocalesOf", 1, 0), + JS_FN("supportedLocalesOf", dateTimeFormat_supportedLocalesOf, 1, 0), JS_FS_END, }; @@ -2618,6 +2622,23 @@ bool js::intl_FormatDateTimeRange(JSContext* cx, unsigned argc, Value* vp) { : FormatDateTimeRange(cx, df, dif, x, y, args.rval()); } +/** + * Intl.DateTimeFormat.supportedLocalesOf ( locales [ , options ] ) + */ +static bool dateTimeFormat_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + + // Steps 1-3. + auto* array = SupportedLocalesOf(cx, AvailableLocaleKind::DateTimeFormat, + args.get(0), args.get(1)); + if (!array) { + return false; + } + args.rval().setObject(*array); + return true; +} + bool js::intl::TemporalObjectToLocaleString( JSContext* cx, const CallArgs& args, DateTimeFormatKind formatKind, Handle<Value> toLocaleStringTimeZone) { diff --git a/js/src/builtin/intl/DisplayNames.cpp b/js/src/builtin/intl/DisplayNames.cpp @@ -18,6 +18,7 @@ #include "builtin/intl/CommonFunctions.h" #include "builtin/intl/FormatBuffer.h" +#include "builtin/intl/LocaleNegotiation.h" #include "gc/AllocKind.h" #include "gc/GCContext.h" #include "js/CallArgs.h" @@ -43,6 +44,7 @@ #include "vm/NativeObject-inl.h" using namespace js; +using namespace js::intl; const JSClassOps DisplayNamesObject::classOps_ = { nullptr, /* addProperty */ @@ -65,6 +67,9 @@ const JSClass DisplayNamesObject::class_ = { const JSClass& DisplayNamesObject::protoClass_ = PlainObject::class_; +static bool displayNames_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp); + static bool displayNames_toSource(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); args.rval().setString(cx->names().DisplayNames); @@ -72,8 +77,7 @@ static bool displayNames_toSource(JSContext* cx, unsigned argc, Value* vp) { } static const JSFunctionSpec displayNames_static_methods[] = { - JS_SELF_HOSTED_FN("supportedLocalesOf", - "Intl_DisplayNames_supportedLocalesOf", 1, 0), + JS_FN("supportedLocalesOf", displayNames_supportedLocalesOf, 1, 0), JS_FS_END, }; @@ -555,3 +559,20 @@ bool js::intl_ComputeDisplayName(JSContext* cx, unsigned argc, Value* vp) { return true; } + +/** + * Intl.DisplayNames.supportedLocalesOf ( locales [ , options ] ) + */ +static bool displayNames_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + + // Steps 1-3. + auto* array = SupportedLocalesOf(cx, AvailableLocaleKind::DisplayNames, + args.get(0), args.get(1)); + if (!array) { + return false; + } + args.rval().setObject(*array); + return true; +} diff --git a/js/src/builtin/intl/DurationFormat.cpp b/js/src/builtin/intl/DurationFormat.cpp @@ -24,6 +24,7 @@ #include "builtin/intl/FormatBuffer.h" #include "builtin/intl/LanguageTag.h" #include "builtin/intl/ListFormat.h" +#include "builtin/intl/LocaleNegotiation.h" #include "builtin/intl/NumberFormat.h" #include "builtin/temporal/Duration.h" #include "gc/AllocKind.h" @@ -68,6 +69,8 @@ const JSClass& DurationFormatObject::protoClass_ = PlainObject::class_; static bool durationFormat_format(JSContext* cx, unsigned argc, Value* vp); static bool durationFormat_formatToParts(JSContext* cx, unsigned argc, Value* vp); +static bool durationFormat_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp); static bool durationFormat_toSource(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); @@ -76,8 +79,7 @@ static bool durationFormat_toSource(JSContext* cx, unsigned argc, Value* vp) { } static const JSFunctionSpec durationFormat_static_methods[] = { - JS_SELF_HOSTED_FN("supportedLocalesOf", - "Intl_DurationFormat_supportedLocalesOf", 1, 0), + JS_FN("supportedLocalesOf", durationFormat_supportedLocalesOf, 1, 0), JS_FS_END, }; @@ -1800,6 +1802,23 @@ static bool durationFormat_formatToParts(JSContext* cx, unsigned argc, cx, args); } +/** + * Intl.DurationFormat.supportedLocalesOf ( locales [ , options ] ) + */ +static bool durationFormat_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + + // Steps 1-3. + auto* array = SupportedLocalesOf(cx, AvailableLocaleKind::DurationFormat, + args.get(0), args.get(1)); + if (!array) { + return false; + } + args.rval().setObject(*array); + return true; +} + bool js::TemporalDurationToLocaleString(JSContext* cx, const JS::CallArgs& args) { MOZ_ASSERT(args.thisv().isObject()); diff --git a/js/src/builtin/intl/ListFormat.cpp b/js/src/builtin/intl/ListFormat.cpp @@ -14,6 +14,7 @@ #include "builtin/Array.h" #include "builtin/intl/CommonFunctions.h" #include "builtin/intl/FormatBuffer.h" +#include "builtin/intl/LocaleNegotiation.h" #include "gc/GCContext.h" #include "js/Utility.h" #include "js/Vector.h" @@ -26,6 +27,7 @@ #include "vm/ObjectOperations-inl.h" using namespace js; +using namespace js::intl; const JSClassOps ListFormatObject::classOps_ = { nullptr, // addProperty @@ -50,6 +52,9 @@ const JSClass ListFormatObject::class_ = { const JSClass& ListFormatObject::protoClass_ = PlainObject::class_; +static bool listFormat_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp); + static bool listFormat_toSource(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); args.rval().setString(cx->names().ListFormat); @@ -57,8 +62,7 @@ static bool listFormat_toSource(JSContext* cx, unsigned argc, Value* vp) { } static const JSFunctionSpec listFormat_static_methods[] = { - JS_SELF_HOSTED_FN("supportedLocalesOf", - "Intl_ListFormat_supportedLocalesOf", 1, 0), + JS_FN("supportedLocalesOf", listFormat_supportedLocalesOf, 1, 0), JS_FS_END, }; @@ -377,3 +381,20 @@ bool js::intl_FormatList(JSContext* cx, unsigned argc, Value* vp) { } return FormatList(cx, lf, list, args.rval()); } + +/** + * Intl.ListFormat.supportedLocalesOf ( locales [ , options ] ) + */ +static bool listFormat_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + + // Steps 1-3. + auto* array = SupportedLocalesOf(cx, AvailableLocaleKind::ListFormat, + args.get(0), args.get(1)); + if (!array) { + return false; + } + args.rval().setObject(*array); + return true; +} diff --git a/js/src/builtin/intl/NumberFormat.cpp b/js/src/builtin/intl/NumberFormat.cpp @@ -32,6 +32,7 @@ #include "builtin/intl/CommonFunctions.h" #include "builtin/intl/FormatBuffer.h" #include "builtin/intl/LanguageTag.h" +#include "builtin/intl/LocaleNegotiation.h" #include "builtin/intl/RelativeTimeFormat.h" #include "gc/GCContext.h" #include "js/CharacterEncoding.h" @@ -50,6 +51,7 @@ #include "vm/NativeObject-inl.h" using namespace js; +using namespace js::intl; using mozilla::AssertedCast; @@ -79,6 +81,9 @@ const JSClass NumberFormatObject::class_ = { const JSClass& NumberFormatObject::protoClass_ = PlainObject::class_; +static bool numberFormat_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp); + static bool numberFormat_toSource(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); args.rval().setString(cx->names().NumberFormat); @@ -86,8 +91,7 @@ static bool numberFormat_toSource(JSContext* cx, unsigned argc, Value* vp) { } static const JSFunctionSpec numberFormat_static_methods[] = { - JS_SELF_HOSTED_FN("supportedLocalesOf", - "Intl_NumberFormat_supportedLocalesOf", 1, 0), + JS_FN("supportedLocalesOf", numberFormat_supportedLocalesOf, 1, 0), JS_FS_END, }; @@ -1441,3 +1445,20 @@ ArrayObject* js::intl::FormatNumberToParts( return FormattedNumberToParts(cx, str, parts, DisplayNumberPartSource::No, DisplayLiteralUnit::Yes, unit); } + +/** + * Intl.NumberFormat.supportedLocalesOf ( locales [ , options ] ) + */ +static bool numberFormat_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + + // Steps 1-3. + auto* array = SupportedLocalesOf(cx, AvailableLocaleKind::NumberFormat, + args.get(0), args.get(1)); + if (!array) { + return false; + } + args.rval().setObject(*array); + return true; +} diff --git a/js/src/builtin/intl/PluralRules.cpp b/js/src/builtin/intl/PluralRules.cpp @@ -14,6 +14,7 @@ #include "builtin/Array.h" #include "builtin/intl/CommonFunctions.h" +#include "builtin/intl/LocaleNegotiation.h" #include "gc/GCContext.h" #include "js/PropertySpec.h" #include "vm/GlobalObject.h" @@ -25,6 +26,7 @@ #include "vm/NativeObject-inl.h" using namespace js; +using namespace js::intl; using mozilla::AssertedCast; @@ -52,6 +54,9 @@ const JSClass PluralRulesObject::class_ = { const JSClass& PluralRulesObject::protoClass_ = PlainObject::class_; +static bool pluralRules_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp); + static bool pluralRules_toSource(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); args.rval().setString(cx->names().PluralRules); @@ -59,8 +64,7 @@ static bool pluralRules_toSource(JSContext* cx, unsigned argc, Value* vp) { } static const JSFunctionSpec pluralRules_static_methods[] = { - JS_SELF_HOSTED_FN("supportedLocalesOf", - "Intl_PluralRules_supportedLocalesOf", 1, 0), + JS_FN("supportedLocalesOf", pluralRules_supportedLocalesOf, 1, 0), JS_FS_END, }; @@ -518,3 +522,20 @@ bool js::intl_GetPluralCategories(JSContext* cx, unsigned argc, Value* vp) { args.rval().setObject(*res); return true; } + +/** + * Intl.PluralRules.supportedLocalesOf ( locales [ , options ] ) + */ +static bool pluralRules_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + + // Steps 1-3. + auto* array = SupportedLocalesOf(cx, AvailableLocaleKind::PluralRules, + args.get(0), args.get(1)); + if (!array) { + return false; + } + args.rval().setObject(*array); + return true; +} diff --git a/js/src/builtin/intl/RelativeTimeFormat.cpp b/js/src/builtin/intl/RelativeTimeFormat.cpp @@ -14,6 +14,7 @@ #include "builtin/intl/CommonFunctions.h" #include "builtin/intl/FormatBuffer.h" #include "builtin/intl/LanguageTag.h" +#include "builtin/intl/LocaleNegotiation.h" #include "gc/GCContext.h" #include "js/friend/ErrorMessages.h" // js::GetErrorMessage, JSMSG_* #include "js/Printer.h" @@ -26,6 +27,7 @@ #include "vm/NativeObject-inl.h" using namespace js; +using namespace js::intl; /**************** RelativeTimeFormat *****************/ @@ -53,6 +55,9 @@ const JSClass RelativeTimeFormatObject::class_ = { const JSClass& RelativeTimeFormatObject::protoClass_ = PlainObject::class_; +static bool relativeTimeFormat_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp); + static bool relativeTimeFormat_toSource(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); @@ -61,8 +66,7 @@ static bool relativeTimeFormat_toSource(JSContext* cx, unsigned argc, } static const JSFunctionSpec relativeTimeFormat_static_methods[] = { - JS_SELF_HOSTED_FN("supportedLocalesOf", - "Intl_RelativeTimeFormat_supportedLocalesOf", 1, 0), + JS_FN("supportedLocalesOf", relativeTimeFormat_supportedLocalesOf, 1, 0), JS_FS_END, }; @@ -374,3 +378,20 @@ bool js::intl_FormatRelativeTime(JSContext* cx, unsigned argc, Value* vp) { args.rval().setString(str); return true; } + +/** + * Intl.RelativeTimeFormat.supportedLocalesOf ( locales [ , options ] ) + */ +static bool relativeTimeFormat_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + + // Steps 1-3. + auto* array = SupportedLocalesOf(cx, AvailableLocaleKind::RelativeTimeFormat, + args.get(0), args.get(1)); + if (!array) { + return false; + } + args.rval().setObject(*array); + return true; +} diff --git a/js/src/builtin/intl/Segmenter.cpp b/js/src/builtin/intl/Segmenter.cpp @@ -16,6 +16,7 @@ #include "builtin/Array.h" #include "builtin/intl/CommonFunctions.h" +#include "builtin/intl/LocaleNegotiation.h" #include "builtin/intl/StringAsciiChars.h" #include "gc/AllocKind.h" #include "gc/GCContext.h" @@ -41,6 +42,7 @@ #include "vm/NativeObject-inl.h" using namespace js; +using namespace js::intl; const JSClassOps SegmenterObject::classOps_ = { nullptr, // addProperty @@ -66,6 +68,9 @@ const JSClass SegmenterObject::class_ = { const JSClass& SegmenterObject::protoClass_ = PlainObject::class_; +static bool segmenter_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp); + static bool segmenter_toSource(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); args.rval().setString(cx->names().Segmenter); @@ -73,8 +78,7 @@ static bool segmenter_toSource(JSContext* cx, unsigned argc, Value* vp) { } static const JSFunctionSpec segmenter_static_methods[] = { - JS_SELF_HOSTED_FN("supportedLocalesOf", "Intl_Segmenter_supportedLocalesOf", - 1, 0), + JS_FN("supportedLocalesOf", segmenter_supportedLocalesOf, 1, 0), JS_FS_END, }; @@ -1023,3 +1027,20 @@ bool js::intl_FindNextSegmentBoundaries(JSContext* cx, unsigned argc, args.rval().setObject(*result); return true; } + +/** + * Intl.Segmenter.supportedLocalesOf ( locales [ , options ] ) + */ +static bool segmenter_supportedLocalesOf(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + + // Steps 1-3. + auto* array = SupportedLocalesOf(cx, AvailableLocaleKind::Segmenter, + args.get(0), args.get(1)); + if (!array) { + return false; + } + args.rval().setObject(*array); + return true; +}