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:
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;
+}