Revision: 19784
Author: [email protected]
Date: Tue Mar 11 09:04:14 2014 UTC
Log: Use a per-isolate cache for the date object JS bits
The old per-context cache made it difficult for the embedder to notify
v8 of date/time configuration changes. The embedder had to enter all
contexts for the isolate and notify v8 for each context.
With the new per-isolate cache, the embedder only needs to notify v8
once per isolate.
BUG=348856
LOG=y
[email protected], [email protected]
TEST=cctest/test-date
Review URL: https://codereview.chromium.org/189913023
http://code.google.com/p/v8/source/detail?r=19784
Modified:
/branches/bleeding_edge/src/api.cc
/branches/bleeding_edge/src/date.js
/branches/bleeding_edge/src/global-handles.h
/branches/bleeding_edge/src/runtime.cc
/branches/bleeding_edge/src/runtime.h
/branches/bleeding_edge/test/cctest/test-date.cc
=======================================
--- /branches/bleeding_edge/src/api.cc Mon Mar 10 08:56:48 2014 UTC
+++ /branches/bleeding_edge/src/api.cc Tue Mar 11 09:04:14 2014 UTC
@@ -5618,30 +5618,17 @@
i_isolate->date_cache()->ResetDateCache();
- i::HandleScope scope(i_isolate);
- // Get the function ResetDateCache (defined in date.js).
- i::Handle<i::String> func_name_str =
- i_isolate->factory()->InternalizeOneByteString(
- STATIC_ASCII_VECTOR("ResetDateCache"));
- i::MaybeObject* result =
- i_isolate->js_builtins_object()->GetProperty(*func_name_str);
- i::Object* object_func;
- if (!result->ToObject(&object_func)) {
+ if (!i_isolate->eternal_handles()->Exists(
+ i::EternalHandles::DATE_CACHE_VERSION)) {
return;
}
-
- if (object_func->IsJSFunction()) {
- i::Handle<i::JSFunction> func =
- i::Handle<i::JSFunction>(i::JSFunction::cast(object_func));
-
- // Call ResetDateCache(0 but expect no exceptions:
- bool caught_exception = false;
- i::Execution::TryCall(func,
- i_isolate->js_builtins_object(),
- 0,
- NULL,
- &caught_exception);
- }
+ i::Handle<i::FixedArray> date_cache_version =
+
i::Handle<i::FixedArray>::cast(i_isolate->eternal_handles()->GetSingleton(
+ i::EternalHandles::DATE_CACHE_VERSION));
+ ASSERT_EQ(1, date_cache_version->length());
+ ASSERT(date_cache_version->get(0)->IsNumber());
+ date_cache_version->set(0, i::Smi::FromInt(
+ date_cache_version->get(0)->Number() +
1));
}
=======================================
--- /branches/bleeding_edge/src/date.js Mon Mar 10 16:05:29 2014 UTC
+++ /branches/bleeding_edge/src/date.js Tue Mar 11 09:04:14 2014 UTC
@@ -46,6 +46,7 @@
function LocalTimezone(t) {
if (NUMBER_IS_NAN(t)) return "";
+ CheckDateCacheCurrent();
if (t == timezone_cache_time) {
return timezone_cache_timezone;
}
@@ -156,6 +157,7 @@
} else if (IS_STRING(year)) {
// Probe the Date cache. If we already have a time value for the
// given time, we re-use that instead of parsing the string again.
+ CheckDateCacheCurrent();
var cache = Date_cache;
if (cache.string === year) {
value = cache.time;
@@ -742,11 +744,23 @@
return o.toISOString();
}
+
+var date_cache_version_holder;
+var date_cache_version = NAN;
-function ResetDateCache() {
+
+function CheckDateCacheCurrent() {
+ if (!date_cache_version_holder) {
+ date_cache_version_holder = %DateCacheVersion();
+ }
+ if (date_cache_version_holder[0] == date_cache_version) {
+ return;
+ }
+ date_cache_version = date_cache_version_holder[0];
+
// Reset the timezone cache:
timezone_cache_time = NAN;
- timezone_cache_timezone = undefined;
+ timezone_cache_timezone = UNDEFINED;
// Reset the date cache:
cache = Date_cache;
=======================================
--- /branches/bleeding_edge/src/global-handles.h Wed Dec 18 08:09:37 2013
UTC
+++ /branches/bleeding_edge/src/global-handles.h Tue Mar 11 09:04:14 2014
UTC
@@ -340,6 +340,7 @@
enum SingletonHandle {
I18N_TEMPLATE_ONE,
I18N_TEMPLATE_TWO,
+ DATE_CACHE_VERSION,
NUMBER_OF_SINGLETON_HANDLES
};
=======================================
--- /branches/bleeding_edge/src/runtime.cc Mon Mar 10 16:05:29 2014 UTC
+++ /branches/bleeding_edge/src/runtime.cc Tue Mar 11 09:04:14 2014 UTC
@@ -9610,6 +9610,28 @@
return isolate->heap()->NumberFromDouble(static_cast<double>(time));
}
+
+
+RUNTIME_FUNCTION(MaybeObject*, Runtime_DateCacheVersion) {
+ HandleScope hs(isolate);
+ ASSERT(args.length() == 0);
+ if
(!isolate->eternal_handles()->Exists(EternalHandles::DATE_CACHE_VERSION)) {
+ Handle<FixedArray> date_cache_version =
+ isolate->factory()->NewFixedArray(1, TENURED);
+ date_cache_version->set(0, Smi::FromInt(0));
+ isolate->eternal_handles()->CreateSingleton(
+ isolate, *date_cache_version, EternalHandles::DATE_CACHE_VERSION);
+ }
+ Handle<FixedArray> date_cache_version =
+ Handle<FixedArray>::cast(isolate->eternal_handles()->GetSingleton(
+ EternalHandles::DATE_CACHE_VERSION));
+ // Return result as a JS array.
+ Handle<JSObject> result =
+ isolate->factory()->NewJSObject(isolate->array_function());
+ isolate->factory()->SetContent(Handle<JSArray>::cast(result),
+ date_cache_version);
+ return *result;
+}
RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalReceiver) {
=======================================
--- /branches/bleeding_edge/src/runtime.h Mon Mar 10 08:21:18 2014 UTC
+++ /branches/bleeding_edge/src/runtime.h Tue Mar 11 09:04:14 2014 UTC
@@ -257,6 +257,7 @@
F(DateToUTC, 1, 1) \
F(DateMakeDay, 2, 1) \
F(DateSetValue, 3, 1) \
+ F(DateCacheVersion, 0, 1) \
\
/* Numbers */ \
\
=======================================
--- /branches/bleeding_edge/test/cctest/test-date.cc Thu Sep 19 09:17:13
2013 UTC
+++ /branches/bleeding_edge/test/cctest/test-date.cc Tue Mar 11 09:04:14
2014 UTC
@@ -167,3 +167,25 @@
CheckDST(august_20 + 2 * 3600 - 1000);
CheckDST(august_20);
}
+
+
+TEST(DateCacheVersion) {
+ FLAG_allow_natives_syntax = true;
+ v8::Isolate* isolate = CcTest::isolate();
+ v8::Isolate::Scope isolate_scope(isolate);
+ v8::HandleScope scope(isolate);
+ v8::Handle<v8::Context> context = v8::Context::New(isolate);
+ v8::Context::Scope context_scope(context);
+ v8::Handle<v8::Array> date_cache_version =
+ v8::Handle<v8::Array>::Cast(CompileRun("%DateCacheVersion()"));
+
+ CHECK_EQ(1, static_cast<int32_t>(date_cache_version->Length()));
+ CHECK(date_cache_version->Get(0)->IsNumber());
+ CHECK_EQ(0.0, date_cache_version->Get(0)->NumberValue());
+
+ v8::Date::DateTimeConfigurationChangeNotification(isolate);
+
+ CHECK_EQ(1, static_cast<int32_t>(date_cache_version->Length()));
+ CHECK(date_cache_version->Get(0)->IsNumber());
+ CHECK_EQ(1.0, date_cache_version->Get(0)->NumberValue());
+}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.