Bug 1402379 - Part 2: Don't build Intl sources when ENABLE_INTL_API is not set. r=jwalden

Depends on D41767

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
André Bargull 2019-08-19 18:37:50 +00:00
parent b24e1821b8
commit c8b6bf7f43
14 changed files with 106 additions and 57 deletions

View File

@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#if ENABLE_INTL_API
/**
* Format this BigInt object into a string, using the locale and formatting
* options provided.
@ -32,3 +33,4 @@ function BigInt_toLocaleString() {
// Step 3.
return intl_FormatNumber(numberFormat, x, /* formatToParts = */ false);
}
#endif // ENABLE_INTL_API

View File

@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#if ENABLE_INTL_API
// This cache, once primed, has these properties:
//
// runtimeDefaultLocale:
@ -166,3 +167,4 @@ function Date_toLocaleTimeString() {
// Step 7.
return intl_FormatDateTime(dateTimeFormat, x, /* formatToParts = */ false);
}
#endif // ENABLE_INTL_API

View File

@ -2,9 +2,9 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#if ENABLE_INTL_API
var numberFormatCache = new Record();
/**
* Format this Number object into a string, using the locale and formatting options
* provided.
@ -37,6 +37,7 @@ function Number_toLocaleString() {
// Step 5.
return intl_FormatNumber(numberFormat, x, /* formatToParts = */ false);
}
#endif // ENABLE_INTL_API
// ES6 draft ES6 20.1.2.4
function Number_isFinite(num) {

View File

@ -26,8 +26,10 @@
#include "builtin/Array.h"
#include "builtin/Boolean.h"
#include "builtin/intl/CommonFunctions.h"
#include "builtin/intl/ICUStubs.h"
#if ENABLE_INTL_API
# include "builtin/intl/CommonFunctions.h"
# include "builtin/intl/ICUStubs.h"
#endif
#include "builtin/RegExp.h"
#include "jit/InlinableNatives.h"
#include "js/Conversions.h"
@ -885,6 +887,10 @@ bool js::str_toLowerCase(JSContext* cx, unsigned argc, Value* vp) {
return true;
}
#if ENABLE_INTL_API
// String.prototype.toLocaleLowerCase is self-hosted when Intl is exposed,
// with core functionality performed by the intrinsic below.
static const char* CaseMappingLocale(JSContext* cx, JSString* str) {
JSLinearString* locale = str->ensureLinear(cx);
if (!locale) {
@ -973,11 +979,6 @@ bool js::intl_toLocaleLowerCase(JSContext* cx, unsigned argc, Value* vp) {
return true;
}
#if ENABLE_INTL_API
// String.prototype.toLocaleLowerCase is self-hosted when Intl is exposed,
// with core functionality performed by the intrinsic above.
#else
// When the Intl API is not exposed, String.prototype.toLowerCase is implemented
@ -1328,6 +1329,10 @@ bool js::str_toUpperCase(JSContext* cx, unsigned argc, Value* vp) {
return true;
}
#if ENABLE_INTL_API
// String.prototype.toLocaleUpperCase is self-hosted when Intl is exposed,
// with core functionality performed by the intrinsic below.
bool js::intl_toLocaleUpperCase(JSContext* cx, unsigned argc, Value* vp) {
CallArgs args = CallArgsFromVp(argc, vp);
MOZ_ASSERT(args.length() == 2);
@ -1390,11 +1395,6 @@ bool js::intl_toLocaleUpperCase(JSContext* cx, unsigned argc, Value* vp) {
return true;
}
#if ENABLE_INTL_API
// String.prototype.toLocaleUpperCase is self-hosted when Intl is exposed,
// with core functionality performed by the intrinsic above.
#else
// When the Intl API is not exposed, String.prototype.toUpperCase is implemented

View File

@ -56,13 +56,11 @@ extern bool str_charCodeAt(JSContext* cx, unsigned argc, Value* vp);
extern bool str_endsWith(JSContext* cx, unsigned argc, Value* vp);
#if ENABLE_INTL_API
/**
* Returns the input string converted to lower case based on the language
* specific case mappings for the input locale.
*
* This function only works #if ENABLE_INTL_API; if not, it will *crash*.
* Govern yourself accordingly.
*
* Usage: lowerCase = intl_toLocaleLowerCase(string, locale)
*/
extern MOZ_MUST_USE bool intl_toLocaleLowerCase(JSContext* cx, unsigned argc,
@ -72,13 +70,11 @@ extern MOZ_MUST_USE bool intl_toLocaleLowerCase(JSContext* cx, unsigned argc,
* Returns the input string converted to upper case based on the language
* specific case mappings for the input locale.
*
* This function only works #if ENABLE_INTL_API; if not, it will *crash*.
* Govern yourself accordingly.
*
* Usage: upperCase = intl_toLocaleUpperCase(string, locale)
*/
extern MOZ_MUST_USE bool intl_toLocaleUpperCase(JSContext* cx, unsigned argc,
Value* vp);
#endif
ArrayObject* StringSplitString(JSContext* cx, Handle<ObjectGroup*> group,
HandleString str, HandleString sep,

View File

@ -561,6 +561,7 @@ function StringIteratorNext() {
return result;
}
#if ENABLE_INTL_API
var collatorCache = new Record();
/**
@ -678,6 +679,7 @@ function String_toLocaleUpperCase() {
// Steps 7-16.
return intl_toLocaleUpperCase(string, requestedLocale);
}
#endif // ENABLE_INTL_API
// ES2018 draft rev 8fadde42cf6a9879b4ab0cb6142b31c4ee501667
// 21.1.2.4 String.raw ( template, ...substitutions )

View File

@ -366,8 +366,10 @@ void js::gc::GCRuntime::traceRuntimeCommon(JSTracer* trc,
// Trace the self-hosting global compartment.
rt->traceSelfHostingGlobal(trc);
#ifdef ENABLE_INTL_API
// Trace the shared Intl data.
rt->traceSharedIntlData(trc);
#endif
// Trace the JSContext.
rt->mainContextFromOwnThread()->trace(trc);

View File

@ -9,12 +9,14 @@
#include "jsmath.h"
#include "builtin/AtomicsObject.h"
#include "builtin/intl/Collator.h"
#include "builtin/intl/DateTimeFormat.h"
#include "builtin/intl/Locale.h"
#include "builtin/intl/NumberFormat.h"
#include "builtin/intl/PluralRules.h"
#include "builtin/intl/RelativeTimeFormat.h"
#ifdef ENABLE_INTL_API
# include "builtin/intl/Collator.h"
# include "builtin/intl/DateTimeFormat.h"
# include "builtin/intl/Locale.h"
# include "builtin/intl/NumberFormat.h"
# include "builtin/intl/PluralRules.h"
# include "builtin/intl/RelativeTimeFormat.h"
#endif
#include "builtin/MapObject.h"
#include "builtin/String.h"
#include "builtin/TestingFunctions.h"
@ -311,6 +313,7 @@ IonBuilder::InliningResult IonBuilder::inlineNativeCall(CallInfo& callInfo,
case InlinableNative::Boolean:
return inlineBoolean(callInfo);
#ifdef ENABLE_INTL_API
// Intl natives.
case InlinableNative::IntlGuardToCollator:
return inlineGuardToClass(callInfo, &CollatorObject::class_);
@ -324,6 +327,15 @@ IonBuilder::InliningResult IonBuilder::inlineNativeCall(CallInfo& callInfo,
return inlineGuardToClass(callInfo, &PluralRulesObject::class_);
case InlinableNative::IntlGuardToRelativeTimeFormat:
return inlineGuardToClass(callInfo, &RelativeTimeFormatObject::class_);
#else
case InlinableNative::IntlGuardToCollator:
case InlinableNative::IntlGuardToDateTimeFormat:
case InlinableNative::IntlGuardToLocale:
case InlinableNative::IntlGuardToNumberFormat:
case InlinableNative::IntlGuardToPluralRules:
case InlinableNative::IntlGuardToRelativeTimeFormat:
MOZ_CRASH("Intl API disabled");
#endif
// Math natives.
case InlinableNative::MathAbs:

View File

@ -2604,6 +2604,7 @@ MOZ_ALWAYS_INLINE JSObject* ToWindowProxyIfWindow(JSObject* obj) {
*/
extern JS_FRIEND_API JSObject* ToWindowIfWindowProxy(JSObject* obj);
#if ENABLE_INTL_API
// Create and add the Intl.MozDateTimeFormat constructor function to the
// provided object.
//
@ -2622,6 +2623,7 @@ extern bool AddMozDateTimeFormatConstructor(JSContext* cx,
// Create and add the Intl.Locale constructor function to the provided object.
// This function throws if called more than once per realm/global object.
extern bool AddLocaleConstructor(JSContext* cx, JS::Handle<JSObject*> intl);
#endif // ENABLE_INTL_API
class MOZ_STACK_CLASS JS_FRIEND_API AutoAssertNoContentJS {
public:

View File

@ -205,15 +205,6 @@ UNIFIED_SOURCES += [
'builtin/Boolean.cpp',
'builtin/DataViewObject.cpp',
'builtin/Eval.cpp',
'builtin/intl/Collator.cpp',
'builtin/intl/CommonFunctions.cpp',
'builtin/intl/DateTimeFormat.cpp',
'builtin/intl/IntlObject.cpp',
'builtin/intl/Locale.cpp',
'builtin/intl/NumberFormat.cpp',
'builtin/intl/PluralRules.cpp',
'builtin/intl/RelativeTimeFormat.cpp',
'builtin/intl/SharedIntlData.cpp',
'builtin/JSON.cpp',
'builtin/MapObject.cpp',
'builtin/ModuleObject.cpp',
@ -355,6 +346,19 @@ SOURCES += [
'vm/ProfilingStack.cpp',
]
if CONFIG['ENABLE_INTL_API']:
UNIFIED_SOURCES += [
'builtin/intl/Collator.cpp',
'builtin/intl/CommonFunctions.cpp',
'builtin/intl/DateTimeFormat.cpp',
'builtin/intl/IntlObject.cpp',
'builtin/intl/Locale.cpp',
'builtin/intl/NumberFormat.cpp',
'builtin/intl/PluralRules.cpp',
'builtin/intl/RelativeTimeFormat.cpp',
'builtin/intl/SharedIntlData.cpp',
]
if CONFIG['MOZ_INSTRUMENTS']:
SOURCES += [
'devtools/Instruments.cpp',
@ -428,17 +432,6 @@ selfhosted.inputs = [
'builtin/Error.js',
'builtin/Function.js',
'builtin/Generator.js',
'builtin/intl/Collator.js',
'builtin/intl/CommonFunctions.js',
'builtin/intl/CurrencyDataGenerated.js',
'builtin/intl/DateTimeFormat.js',
'builtin/intl/IntlObject.js',
'builtin/intl/LangTagMappingsGenerated.js',
'builtin/intl/Locale.js',
'builtin/intl/NumberFormat.js',
'builtin/intl/PluralRules.js',
'builtin/intl/RelativeTimeFormat.js',
'builtin/intl/UnicodeExtensionsGenerated.js',
'builtin/Iterator.js',
'builtin/Map.js',
'builtin/Module.js',
@ -458,6 +451,21 @@ selfhosted.inputs = [
'builtin/WeakSet.js'
]
if CONFIG['ENABLE_INTL_API']:
selfhosted.inputs += [
'builtin/intl/Collator.js',
'builtin/intl/CommonFunctions.js',
'builtin/intl/CurrencyDataGenerated.js',
'builtin/intl/DateTimeFormat.js',
'builtin/intl/IntlObject.js',
'builtin/intl/LangTagMappingsGenerated.js',
'builtin/intl/Locale.js',
'builtin/intl/NumberFormat.js',
'builtin/intl/PluralRules.js',
'builtin/intl/RelativeTimeFormat.js',
'builtin/intl/UnicodeExtensionsGenerated.js',
]
if CONFIG['JS_HAS_CTYPES']:
if CONFIG['MOZ_SYSTEM_FFI']:
CXXFLAGS += CONFIG['MOZ_FFI_CFLAGS']

View File

@ -475,11 +475,13 @@ class GlobalObject : public NativeObject {
return &global->getPrototype(JSProto_WeakSet).toObject().as<NativeObject>();
}
#if ENABLE_INTL_API
static JSObject* getOrCreateIntlObject(JSContext* cx,
Handle<GlobalObject*> global) {
return getOrCreateObject(cx, global, APPLICATION_SLOTS + JSProto_Intl,
initIntlObject);
}
#endif
static JSObject* getOrCreateTypedObjectModule(JSContext* cx,
Handle<GlobalObject*> global) {
@ -498,6 +500,7 @@ class GlobalObject : public NativeObject {
TypedObjectModuleObject& getTypedObjectModule() const;
#if ENABLE_INTL_API
static JSObject* getOrCreateCollatorPrototype(JSContext* cx,
Handle<GlobalObject*> global) {
return getOrCreateObject(cx, global, COLLATOR_PROTO, initIntlObject);
@ -543,6 +546,7 @@ class GlobalObject : public NativeObject {
Handle<GlobalObject*> global) {
return getOrCreateObject(cx, global, LOCALE_PROTO, initIntlObject);
}
#endif // ENABLE_INTL_API
static bool ensureModulePrototypesCreated(JSContext* cx,
Handle<GlobalObject*> global);
@ -843,11 +847,13 @@ class GlobalObject : public NativeObject {
static bool initMapIteratorProto(JSContext* cx, Handle<GlobalObject*> global);
static bool initSetIteratorProto(JSContext* cx, Handle<GlobalObject*> global);
#ifdef ENABLE_INTL_API
// Implemented in builtin/intl/IntlObject.cpp.
static bool initIntlObject(JSContext* cx, Handle<GlobalObject*> global);
// Implemented in builtin/intl/Locale.cpp.
static bool addLocaleConstructor(JSContext* cx, HandleObject intl);
#endif
// Implemented in builtin/ModuleObject.cpp
static bool initModuleProto(JSContext* cx, Handle<GlobalObject*> global);

View File

@ -242,7 +242,9 @@ void JSRuntime::destroyRuntime() {
MOZ_ASSERT(childRuntimeCount == 0);
MOZ_ASSERT(initialized_);
#ifdef ENABLE_INTL_API
sharedIntlData.ref().destroyInstance();
#endif
if (gcInitialized) {
/*
@ -368,8 +370,10 @@ void JSRuntime::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf,
sharedImmutableStrings_->sizeOfExcludingThis(mallocSizeOf);
}
#ifdef ENABLE_INTL_API
rtSizes->sharedIntlData +=
sharedIntlData.ref().sizeOfExcludingThis(mallocSizeOf);
#endif
{
AutoLockScriptData lock(this);
@ -564,9 +568,11 @@ const char* JSRuntime::getDefaultLocale() {
return defaultLocale.ref().get();
}
#ifdef ENABLE_INTL_API
void JSRuntime::traceSharedIntlData(JSTracer* trc) {
sharedIntlData.ref().trace(trc);
}
#endif
JSFreeOp::JSFreeOp(JSRuntime* maybeRuntime, bool isDefault)
: runtime_(maybeRuntime), isDefault(isDefault), isCollecting_(!isDefault) {

View File

@ -22,7 +22,9 @@
#include <setjmp.h>
#include "builtin/AtomicsObject.h"
#include "builtin/intl/SharedIntlData.h"
#ifdef ENABLE_INTL_API
# include "builtin/intl/SharedIntlData.h"
#endif
#include "builtin/Promise.h"
#include "frontend/BinASTRuntimeSupport.h"
#include "frontend/NameCollections.h"
@ -816,10 +818,12 @@ struct JSRuntime {
// these are shared with the parentRuntime, if any.
js::WriteOnceData<js::WellKnownSymbols*> wellKnownSymbols;
#ifdef ENABLE_INTL_API
/* Shared Intl data for this runtime. */
js::MainThreadData<js::intl::SharedIntlData> sharedIntlData;
void traceSharedIntlData(JSTracer* trc);
#endif
// Table of bytecode and other data that may be shared across scripts
// within the runtime. This may be modified by threads using

View File

@ -21,13 +21,15 @@
#include "builtin/Array.h"
#include "builtin/BigInt.h"
#include "builtin/intl/Collator.h"
#include "builtin/intl/DateTimeFormat.h"
#include "builtin/intl/IntlObject.h"
#include "builtin/intl/Locale.h"
#include "builtin/intl/NumberFormat.h"
#include "builtin/intl/PluralRules.h"
#include "builtin/intl/RelativeTimeFormat.h"
#ifdef ENABLE_INTL_API
# include "builtin/intl/Collator.h"
# include "builtin/intl/DateTimeFormat.h"
# include "builtin/intl/IntlObject.h"
# include "builtin/intl/Locale.h"
# include "builtin/intl/NumberFormat.h"
# include "builtin/intl/PluralRules.h"
# include "builtin/intl/RelativeTimeFormat.h"
#endif
#include "builtin/MapObject.h"
#include "builtin/ModuleObject.h"
#include "builtin/Object.h"
@ -1724,6 +1726,7 @@ bool js::ReportIncompatibleSelfHostedMethod(JSContext* cx,
return false;
}
#ifdef ENABLE_INTL_API
/**
* Returns the default locale as a well-formed, but not necessarily
* canonicalized, BCP-47 language tag.
@ -1808,6 +1811,7 @@ static bool intrinsic_GetBuiltinIntlConstructor(JSContext* cx, unsigned argc,
args.rval().setObject(*constructor);
return true;
}
#endif // ENABLE_INTL_API
static bool intrinsic_WarnDeprecatedMethod(JSContext* cx, unsigned argc,
Value* vp) {
@ -2220,8 +2224,6 @@ static const JSFunctionSpec intrinsic_functions[] = {
JS_INLINABLE_FN("_FinishBoundFunctionInit",
intrinsic_FinishBoundFunctionInit, 3, 0,
IntrinsicFinishBoundFunctionInit),
JS_FN("RuntimeDefaultLocale", intrinsic_RuntimeDefaultLocale, 0, 0),
JS_FN("IsRuntimeDefaultLocale", intrinsic_IsRuntimeDefaultLocale, 1, 0),
JS_FN("_DefineDataProperty", intrinsic_DefineDataProperty, 4, 0),
JS_FN("_DefineProperty", intrinsic_DefineProperty, 6, 0),
JS_FN("CopyDataPropertiesOrGetOwnKeys",
@ -2451,13 +2453,14 @@ static const JSFunctionSpec intrinsic_functions[] = {
// clang-format on
#undef LOAD_AND_STORE_REFERENCE_FN_DECLS
#ifdef ENABLE_INTL_API
// See builtin/intl/*.h for descriptions of the intl_* functions.
JS_FN("intl_availableCalendars", intl_availableCalendars, 1, 0),
JS_FN("intl_availableCollations", intl_availableCollations, 1, 0),
#if DEBUG || MOZ_SYSTEM_ICU
# if DEBUG || MOZ_SYSTEM_ICU
JS_FN("intl_availableMeasurementUnits", intl_availableMeasurementUnits, 0,
0),
#endif
# endif
JS_FN("intl_canonicalizeTimeZone", intl_canonicalizeTimeZone, 1, 0),
JS_FN("intl_Collator", intl_Collator, 2, 0),
JS_FN("intl_Collator_availableLocales", intl_Collator_availableLocales, 0,
@ -2542,6 +2545,9 @@ static const JSFunctionSpec intrinsic_functions[] = {
intrinsic_GetBuiltinIntlConstructor<
GlobalObject::getOrCreateNumberFormatConstructor>,
0, 0),
JS_FN("RuntimeDefaultLocale", intrinsic_RuntimeDefaultLocale, 0, 0),
JS_FN("IsRuntimeDefaultLocale", intrinsic_IsRuntimeDefaultLocale, 1, 0),
#endif // ENABLE_INTL_API
JS_FN("GetOwnPropertyDescriptorToArray", GetOwnPropertyDescriptorToArray, 2,
0),