Use memcpy in List::AddAll for fundamental types.
authoryangguo@chromium.org <yangguo@chromium.org>
Fri, 24 Oct 2014 12:33:58 +0000 (12:33 +0000)
committeryangguo@chromium.org <yangguo@chromium.org>
Fri, 24 Oct 2014 13:12:06 +0000 (13:12 +0000)
R=svenpanne@chromium.org

Review URL: https://codereview.chromium.org/663893004

Cr-Commit-Position: refs/heads/master@{#24868}
git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24868 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/base/macros.h
src/list-inl.h

index 79cf04ccf2b2637a0c70234ac49849b27e22f20b..b8f2a72f088d41194f7e728910b88644af598872 100644 (file)
@@ -398,4 +398,22 @@ inline T RoundUp(T x, intptr_t m) {
   return RoundDown<T>(static_cast<T>(x + m - 1), m);
 }
 
+
+namespace v8 {
+namespace base {
+
+// TODO(yangguo): This is a poor man's replacement for std::is_fundamental,
+// which requires C++11. Switch to std::is_fundamental once possible.
+template <typename T>
+inline bool is_fundamental() {
+  return false;
+}
+
+template <>
+inline bool is_fundamental<uint8_t>() {
+  return true;
+}
+}
+}  // namespace v8::base
+
 #endif   // V8_BASE_MACROS_H_
index 60e8fab6f6fb5196aa6c500e0fd3d7dfd948505a..9b122fdbae4417fc710b755cc4be9fe541f4b04b 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "src/list.h"
 
+#include "src/base/macros.h"
 #include "src/base/platform/platform.h"
 
 namespace v8 {
@@ -33,8 +34,10 @@ template<typename T, class P>
 void List<T, P>::AddAll(const Vector<T>& other, P alloc) {
   int result_length = length_ + other.length();
   if (capacity_ < result_length) Resize(result_length, alloc);
-  for (int i = 0; i < other.length(); i++) {
-    data_[length_ + i] = other.at(i);
+  if (base::is_fundamental<T>()) {
+    memcpy(data_ + length_, other.start(), sizeof(*data_) * other.length());
+  } else {
+    for (int i = 0; i < other.length(); i++) data_[length_ + i] = other.at(i);
   }
   length_ = result_length;
 }