Cast std::chrono::duration.count() to int64_t in ArgumentCoder
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 29 Oct 2014 04:04:19 +0000 (04:04 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 29 Oct 2014 04:04:19 +0000 (04:04 +0000)
https://bugs.webkit.org/show_bug.cgi?id=136981

Patch by Ting-Wei Lan <lantw44@gmail.com> on 2014-10-28
Reviewed by Alexey Proskuryakov.

Explicitly cast the return value of std::chrono::duration.count() to
a fixed-size interger type, which prevents compilation error when
the return value type matches neither int32_t nor int64_t.

* Platform/IPC/ArgumentCoders.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@175299 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/Platform/IPC/ArgumentCoders.h

index b3b481c..cb02659 100644 (file)
@@ -1,3 +1,16 @@
+2014-10-28  Ting-Wei Lan  <lantw44@gmail.com>
+
+        Cast std::chrono::duration.count() to int64_t in ArgumentCoder
+        https://bugs.webkit.org/show_bug.cgi?id=136981
+
+        Reviewed by Alexey Proskuryakov.
+
+        Explicitly cast the return value of std::chrono::duration.count() to
+        a fixed-size interger type, which prevents compilation error when
+        the return value type matches neither int32_t nor int64_t.
+
+        * Platform/IPC/ArgumentCoders.h:
+
 2014-10-28  Jer Noble  <jer.noble@apple.com>
 
         [EME] Pass location for media key storage through from WebKit/WebKit2.
index 68b6686..8660270 100644 (file)
@@ -107,15 +107,16 @@ template<typename T, typename U> struct ArgumentCoder<std::pair<T, U>> {
 template<typename Rep, typename Period> struct ArgumentCoder<std::chrono::duration<Rep, Period>> {
     static void encode(ArgumentEncoder& encoder, const std::chrono::duration<Rep, Period>& duration)
     {
-        encoder << duration.count();
+        static_assert(std::is_integral<Rep>::value && std::is_signed<Rep>::value && sizeof(Rep) <= sizeof(int64_t), "Serialization of this Rep type is not supported yet. Only signed integer type which can be fit in an int64_t is currently supported.");
+        encoder << static_cast<int64_t>(duration.count());
     }
 
     static bool decode(ArgumentDecoder& decoder, std::chrono::duration<Rep, Period>& result)
     {
-        Rep count;
+        int64_t count;
         if (!decoder.decode(count))
             return false;
-        result = std::chrono::duration<Rep, Period>(count);
+        result = std::chrono::duration<Rep, Period>(static_cast<Rep>(count));
         return true;
     }
 };