diff --git a/js/src/builtin/Promise.cpp b/js/src/builtin/Promise.cpp index 66235ed94abf..f5ee11bdd883 100644 --- a/js/src/builtin/Promise.cpp +++ b/js/src/builtin/Promise.cpp @@ -8,11 +8,11 @@ #include "builtin/Promise.h" #include "mozilla/Atomics.h" +#include "mozilla/TimeStamp.h" #include "jscntxt.h" #include "gc/Heap.h" -#include "js/Date.h" #include "js/Debug.h" #include "vm/SelfHosting.h" @@ -41,10 +41,12 @@ static const JSPropertySpec promise_static_properties[] = { JS_PS_END }; -static Value -Now() +static double +MillisecondsSinceStartup() { - return JS::TimeValue(JS::TimeClip(static_cast(PRMJ_Now()) / PRMJ_USEC_PER_MSEC)); + auto now = mozilla::TimeStamp::Now(); + bool ignored; + return (now - mozilla::TimeStamp::ProcessCreation(ignored)).ToMilliseconds(); } static bool @@ -137,7 +139,8 @@ PromiseObject::create(JSContext* cx, HandleObject executor, HandleObject proto / return nullptr; } promise->setFixedSlot(PROMISE_ALLOCATION_SITE_SLOT, ObjectOrNullValue(stack)); - promise->setFixedSlot(PROMISE_ALLOCATION_TIME_SLOT, Now()); + promise->setFixedSlot(PROMISE_ALLOCATION_TIME_SLOT, + DoubleValue(MillisecondsSinceStartup())); } RootedValue promiseVal(cx, ObjectValue(*promise)); @@ -211,6 +214,12 @@ namespace { mozilla::Atomic gIDGenerator(0); } // namespace +double +PromiseObject::lifetime() +{ + return MillisecondsSinceStartup() - allocationTime(); +} + uint64_t PromiseObject::getID() { @@ -410,7 +419,8 @@ PromiseObject::reject(JSContext* cx, HandleValue rejectionValue) return Call(cx, funVal, UndefinedHandleValue, args, &dummy); } -void PromiseObject::onSettled(JSContext* cx) +void +PromiseObject::onSettled(JSContext* cx) { Rooted promise(cx, this); RootedObject stack(cx); @@ -421,7 +431,7 @@ void PromiseObject::onSettled(JSContext* cx) } } promise->setFixedSlot(PROMISE_RESOLUTION_SITE_SLOT, ObjectOrNullValue(stack)); - promise->setFixedSlot(PROMISE_RESOLUTION_TIME_SLOT, Now()); + promise->setFixedSlot(PROMISE_RESOLUTION_TIME_SLOT, DoubleValue(MillisecondsSinceStartup())); if (promise->state() == JS::PromiseState::Rejected && promise->getFixedSlot(PROMISE_IS_HANDLED_SLOT).toInt32() != diff --git a/js/src/builtin/Promise.h b/js/src/builtin/Promise.h index 71c8dd2f1a3c..ab2343879f83 100644 --- a/js/src/builtin/Promise.h +++ b/js/src/builtin/Promise.h @@ -8,9 +8,7 @@ #define builtin_Promise_h #include "builtin/SelfHostingDefines.h" -#include "js/Date.h" #include "vm/NativeObject.h" -#include "vm/Time.h" namespace js { @@ -52,10 +50,7 @@ class PromiseObject : public NativeObject JSObject* resolutionSite() { return getFixedSlot(PROMISE_RESOLUTION_SITE_SLOT).toObjectOrNull(); } - double lifetime() { - double now = JS::TimeClip(static_cast(PRMJ_Now()) / PRMJ_USEC_PER_MSEC).toDouble(); - return now - allocationTime(); - } + double lifetime(); double timeToResolution() { MOZ_ASSERT(state() != JS::PromiseState::Pending); return resolutionTime() - allocationTime();