blob: ab9e47130b81c24bd1537e36971bf70fc639a188 [file] [log] [blame]
// Copyright 2013 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// ECMAScript 402 API implementation.
/**
* Intl object is a single object that has some named properties,
* all of which are constructors.
*/
(function(global, utils) {
"use strict";
%CheckIsBootstrapping();
// -------------------------------------------------------------------
// Imports
var GlobalIntl = global.Intl;
var GlobalIntlDateTimeFormat = GlobalIntl.DateTimeFormat;
var GlobalIntlNumberFormat = GlobalIntl.NumberFormat;
var GlobalIntlCollator = GlobalIntl.Collator;
// -------------------------------------------------------------------
// Save references to Intl objects and methods we use, for added security.
var savedObjects = {
__proto__: null,
'collator': GlobalIntlCollator,
'numberformat': GlobalIntlNumberFormat,
'dateformatall': GlobalIntlDateTimeFormat,
'dateformatdate': GlobalIntlDateTimeFormat,
'dateformattime': GlobalIntlDateTimeFormat
};
// Default (created with undefined locales and options parameters) collator,
// number and date format instances. They'll be created as needed.
var defaultObjects = {
__proto__: null,
'collator': UNDEFINED,
'numberformat': UNDEFINED,
'dateformatall': UNDEFINED,
'dateformatdate': UNDEFINED,
'dateformattime': UNDEFINED,
};
function clearDefaultObjects() {
defaultObjects['dateformatall'] = UNDEFINED;
defaultObjects['dateformatdate'] = UNDEFINED;
defaultObjects['dateformattime'] = UNDEFINED;
}
var date_cache_version = 0;
function checkDateCacheCurrent() {
var new_date_cache_version = %DateCacheVersion();
if (new_date_cache_version == date_cache_version) {
return;
}
date_cache_version = new_date_cache_version;
clearDefaultObjects();
}
/**
* Returns cached or newly created instance of a given service.
* We cache only default instances (where no locales or options are provided).
*/
function cachedOrNewService(service, locales, options, defaults) {
var useOptions = (IS_UNDEFINED(defaults)) ? options : defaults;
if (IS_UNDEFINED(locales) && IS_UNDEFINED(options)) {
checkDateCacheCurrent();
if (IS_UNDEFINED(defaultObjects[service])) {
defaultObjects[service] = new savedObjects[service](locales, useOptions);
}
return defaultObjects[service];
}
return new savedObjects[service](locales, useOptions);
}
// TODO(ftang) remove the %InstallToContext once
// cachedOrNewService is available in C++
%InstallToContext([
"cached_or_new_service", cachedOrNewService
]);
})