aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/base
diff options
context:
space:
mode:
authorMichaël Zasso <targos@protonmail.com>2018-07-25 19:30:07 +0200
committerMichaël Zasso <targos@protonmail.com>2018-07-26 08:31:50 +0200
commit6a31d05340b22fc413ee83eaacd0a5565bbbe799 (patch)
tree78f9e1c2f417244842f6422f17e1816e70317100 /deps/v8/src/base
parent4d94bb2b1f72b6b612983a517a39c5545724a3ad (diff)
downloadandroid-node-v8-6a31d05340b22fc413ee83eaacd0a5565bbbe799.tar.gz
android-node-v8-6a31d05340b22fc413ee83eaacd0a5565bbbe799.tar.bz2
android-node-v8-6a31d05340b22fc413ee83eaacd0a5565bbbe799.zip
deps: update V8 to 6.8.275.24
PR-URL: https://github.com/nodejs/node/pull/21079 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Yang Guo <yangguo@chromium.org>
Diffstat (limited to 'deps/v8/src/base')
-rw-r--r--deps/v8/src/base/adapters.h12
-rw-r--r--deps/v8/src/base/atomic-utils.h1
-rw-r--r--deps/v8/src/base/ieee754.cc1
-rw-r--r--deps/v8/src/base/logging.cc3
-rw-r--r--deps/v8/src/base/macros.h28
-rw-r--r--deps/v8/src/base/platform/mutex.h16
-rw-r--r--deps/v8/src/base/platform/platform-cygwin.cc2
-rw-r--r--deps/v8/src/base/platform/platform-fuchsia.cc2
-rw-r--r--deps/v8/src/base/platform/platform-posix.cc14
-rw-r--r--deps/v8/src/base/platform/platform-win32.cc2
-rw-r--r--deps/v8/src/base/platform/platform.h1
-rw-r--r--deps/v8/src/base/template-utils.h7
12 files changed, 71 insertions, 18 deletions
diff --git a/deps/v8/src/base/adapters.h b/deps/v8/src/base/adapters.h
index f04391e2b2..6eeaed140b 100644
--- a/deps/v8/src/base/adapters.h
+++ b/deps/v8/src/base/adapters.h
@@ -8,6 +8,8 @@
#ifndef V8_BASE_ADAPTERS_H_
#define V8_BASE_ADAPTERS_H_
+#include <iterator>
+
#include "src/base/macros.h"
namespace v8 {
@@ -17,13 +19,15 @@ namespace base {
template <typename T>
class ReversedAdapter {
public:
- typedef decltype(static_cast<T*>(nullptr)->rbegin()) Iterator;
+ using Iterator =
+ std::reverse_iterator<decltype(std::begin(std::declval<T>()))>;
explicit ReversedAdapter(T& t) : t_(t) {}
- ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {}
+ ReversedAdapter(const ReversedAdapter& ra) = default;
- Iterator begin() const { return t_.rbegin(); }
- Iterator end() const { return t_.rend(); }
+ // TODO(clemensh): Use std::rbegin/std::rend once we have C++14 support.
+ Iterator begin() const { return Iterator(std::end(t_)); }
+ Iterator end() const { return Iterator(std::begin(t_)); }
private:
T& t_;
diff --git a/deps/v8/src/base/atomic-utils.h b/deps/v8/src/base/atomic-utils.h
index 5ba1ad4246..7787e4ff52 100644
--- a/deps/v8/src/base/atomic-utils.h
+++ b/deps/v8/src/base/atomic-utils.h
@@ -14,6 +14,7 @@
namespace v8 {
namespace base {
+// Deprecated. Use std::atomic<T> for new code.
template <class T>
class AtomicNumber {
public:
diff --git a/deps/v8/src/base/ieee754.cc b/deps/v8/src/base/ieee754.cc
index 95b84cf328..7a1cc175cb 100644
--- a/deps/v8/src/base/ieee754.cc
+++ b/deps/v8/src/base/ieee754.cc
@@ -51,6 +51,7 @@ namespace {
/*
* A union which permits us to convert between a double and two 32 bit
* ints.
+ * TODO(jkummerow): This is undefined behavior. Use bit_cast instead.
*/
#if V8_TARGET_LITTLE_ENDIAN
diff --git a/deps/v8/src/base/logging.cc b/deps/v8/src/base/logging.cc
index e58fdba09f..64f7fed413 100644
--- a/deps/v8/src/base/logging.cc
+++ b/deps/v8/src/base/logging.cc
@@ -135,7 +135,7 @@ class FailureMessage {
static const uintptr_t kStartMarker = 0xdecade10;
static const uintptr_t kEndMarker = 0xdecade11;
- static const int kMessageBufferSize = 1024;
+ static const int kMessageBufferSize = 512;
uintptr_t start_marker_ = kStartMarker;
char message_[kMessageBufferSize];
@@ -154,6 +154,7 @@ void V8_Fatal(const char* file, int line, const char* format, ...) {
fflush(stdout);
fflush(stderr);
+ // Print the formatted message to stdout without cropping the output.
v8::base::OS::PrintError("\n\n#\n# Fatal error in %s, line %d\n# ", file,
line);
diff --git a/deps/v8/src/base/macros.h b/deps/v8/src/base/macros.h
index db2f194591..3437309bc7 100644
--- a/deps/v8/src/base/macros.h
+++ b/deps/v8/src/base/macros.h
@@ -43,7 +43,6 @@ template <typename T, size_t N>
char (&ArraySizeHelper(const T (&array)[N]))[N];
#endif
-
// bit_cast<Dest,Source> is a template function that implements the
// equivalent of "*reinterpret_cast<Dest*>(&source)". We need this in
// very low-level functions like the protobuf library and fast math
@@ -150,20 +149,27 @@ V8_INLINE Dest bit_cast(Source const& source) {
#define INLINE(declarator) V8_INLINE declarator
#define NO_INLINE(declarator) V8_NOINLINE declarator
-// Define V8_USE_ADDRESS_SANITIZER macros.
+// Define V8_USE_ADDRESS_SANITIZER macro.
#if defined(__has_feature)
#if __has_feature(address_sanitizer)
#define V8_USE_ADDRESS_SANITIZER 1
#endif
#endif
-// Define DISABLE_ASAN macros.
+// Define DISABLE_ASAN macro.
#ifdef V8_USE_ADDRESS_SANITIZER
#define DISABLE_ASAN __attribute__((no_sanitize_address))
#else
#define DISABLE_ASAN
#endif
+// Define V8_USE_MEMORY_SANITIZER macro.
+#if defined(__has_feature)
+#if __has_feature(memory_sanitizer)
+#define V8_USE_MEMORY_SANITIZER 1
+#endif
+#endif
+
// Helper macro to define no_sanitize attributes only with clang.
#if defined(__clang__) && defined(__has_attribute)
#if __has_attribute(no_sanitize)
@@ -271,6 +277,14 @@ struct Use {
} // namespace base
} // namespace v8
+// implicit_cast<A>(x) triggers an implicit cast from {x} to type {A}. This is
+// useful in situations where static_cast<A>(x) would do too much.
+// Only use this for cheap-to-copy types, or use move semantics explicitly.
+template <class A>
+V8_INLINE A implicit_cast(A x) {
+ return x;
+}
+
// Define our own macros for writing 64-bit constants. This is less fragile
// than defining __STDC_CONSTANT_MACROS before including <stdint.h>, and it
// works on compilers that don't have it (like MSVC).
@@ -296,6 +310,14 @@ struct Use {
#define V8PRIdPTR V8_PTR_PREFIX "d"
#define V8PRIuPTR V8_PTR_PREFIX "u"
+#ifdef V8_TARGET_ARCH_64_BIT
+#define V8_PTR_HEX_DIGITS 12
+#define V8PRIxPTR_FMT "0x%012" V8PRIxPTR
+#else
+#define V8_PTR_HEX_DIGITS 8
+#define V8PRIxPTR_FMT "0x%08" V8PRIxPTR
+#endif
+
// ptrdiff_t is 't' according to the standard, but MSVC uses 'I'.
#if V8_CC_MSVC
#define V8PRIxPTRDIFF "Ix"
diff --git a/deps/v8/src/base/platform/mutex.h b/deps/v8/src/base/platform/mutex.h
index 59b653d6cd..6b4158f079 100644
--- a/deps/v8/src/base/platform/mutex.h
+++ b/deps/v8/src/base/platform/mutex.h
@@ -203,11 +203,21 @@ typedef LazyStaticInstance<RecursiveMutex,
// object was created, the LockGuard is destructed and the mutex is released.
// The LockGuard class is non-copyable.
-template <typename Mutex>
+// Controls whether a LockGuard always requires a valid Mutex or will just
+// ignore it if it's nullptr.
+enum class NullBehavior { kRequireNotNull, kIgnoreIfNull };
+
+template <typename Mutex, NullBehavior Behavior = NullBehavior::kRequireNotNull>
class LockGuard final {
public:
- explicit LockGuard(Mutex* mutex) : mutex_(mutex) { mutex_->Lock(); }
- ~LockGuard() { mutex_->Unlock(); }
+ explicit LockGuard(Mutex* mutex) : mutex_(mutex) {
+ if (Behavior == NullBehavior::kRequireNotNull || mutex_ != nullptr) {
+ mutex_->Lock();
+ }
+ }
+ ~LockGuard() {
+ if (mutex_ != nullptr) mutex_->Unlock();
+ }
private:
Mutex* mutex_;
diff --git a/deps/v8/src/base/platform/platform-cygwin.cc b/deps/v8/src/base/platform/platform-cygwin.cc
index ddcdc1a2d3..c5d94fc6ba 100644
--- a/deps/v8/src/base/platform/platform-cygwin.cc
+++ b/deps/v8/src/base/platform/platform-cygwin.cc
@@ -34,6 +34,8 @@ DWORD GetProtectionFromMemoryPermission(OS::MemoryPermission access) {
switch (access) {
case OS::MemoryPermission::kNoAccess:
return PAGE_NOACCESS;
+ case OS::MemoryPermission::kRead:
+ return PAGE_READONLY;
case OS::MemoryPermission::kReadWrite:
return PAGE_READWRITE;
case OS::MemoryPermission::kReadWriteExecute:
diff --git a/deps/v8/src/base/platform/platform-fuchsia.cc b/deps/v8/src/base/platform/platform-fuchsia.cc
index bba3f1baba..3a9d65a12d 100644
--- a/deps/v8/src/base/platform/platform-fuchsia.cc
+++ b/deps/v8/src/base/platform/platform-fuchsia.cc
@@ -19,6 +19,8 @@ uint32_t GetProtectionFromMemoryPermission(OS::MemoryPermission access) {
switch (access) {
case OS::MemoryPermission::kNoAccess:
return 0; // no permissions
+ case OS::MemoryPermission::kRead:
+ return ZX_VM_FLAG_PERM_READ;
case OS::MemoryPermission::kReadWrite:
return ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE;
case OS::MemoryPermission::kReadWriteExecute:
diff --git a/deps/v8/src/base/platform/platform-posix.cc b/deps/v8/src/base/platform/platform-posix.cc
index fee67589b6..d21107d6f7 100644
--- a/deps/v8/src/base/platform/platform-posix.cc
+++ b/deps/v8/src/base/platform/platform-posix.cc
@@ -112,6 +112,8 @@ int GetProtectionFromMemoryPermission(OS::MemoryPermission access) {
switch (access) {
case OS::MemoryPermission::kNoAccess:
return PROT_NONE;
+ case OS::MemoryPermission::kRead:
+ return PROT_READ;
case OS::MemoryPermission::kReadWrite:
return PROT_READ | PROT_WRITE;
case OS::MemoryPermission::kReadWriteExecute:
@@ -352,6 +354,18 @@ bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) {
if (ret == 0 && access == OS::MemoryPermission::kNoAccess) {
ret = ReclaimInaccessibleMemory(address, size);
}
+
+// For accounting purposes, we want to call MADV_FREE_REUSE on macOS after
+// changing permissions away from OS::MemoryPermission::kNoAccess. Since this
+// state is not kept at this layer, we always call this if access != kNoAccess.
+// The cost is a syscall that effectively no-ops.
+// TODO(erikchen): Fix this to only call MADV_FREE_REUSE when necessary.
+// https://crbug.com/823915
+#if defined(OS_MACOSX)
+ if (access != OS::MemoryPermission::kNoAccess)
+ madvise(address, size, MADV_FREE_REUSE);
+#endif
+
return ret == 0;
}
diff --git a/deps/v8/src/base/platform/platform-win32.cc b/deps/v8/src/base/platform/platform-win32.cc
index d4aa44f8a7..f618c65fb6 100644
--- a/deps/v8/src/base/platform/platform-win32.cc
+++ b/deps/v8/src/base/platform/platform-win32.cc
@@ -758,6 +758,8 @@ DWORD GetProtectionFromMemoryPermission(OS::MemoryPermission access) {
switch (access) {
case OS::MemoryPermission::kNoAccess:
return PAGE_NOACCESS;
+ case OS::MemoryPermission::kRead:
+ return PAGE_READONLY;
case OS::MemoryPermission::kReadWrite:
return PAGE_READWRITE;
case OS::MemoryPermission::kReadWriteExecute:
diff --git a/deps/v8/src/base/platform/platform.h b/deps/v8/src/base/platform/platform.h
index 4fbc87c4aa..5d015eeeac 100644
--- a/deps/v8/src/base/platform/platform.h
+++ b/deps/v8/src/base/platform/platform.h
@@ -159,6 +159,7 @@ class V8_BASE_EXPORT OS {
// v8::PageAllocator.
enum class MemoryPermission {
kNoAccess,
+ kRead,
kReadWrite,
// TODO(hpayer): Remove this flag. Memory should never be rwx.
kReadWriteExecute,
diff --git a/deps/v8/src/base/template-utils.h b/deps/v8/src/base/template-utils.h
index 07356346ec..cbbe7e3cbf 100644
--- a/deps/v8/src/base/template-utils.h
+++ b/deps/v8/src/base/template-utils.h
@@ -56,13 +56,6 @@ std::unique_ptr<T> make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
-// implicit_cast<A>(x) triggers an implicit cast from {x} to type {A}. This is
-// useful in situations where static_cast<A>(x) would do too much.
-template <class A>
-A implicit_cast(A x) {
- return x;
-}
-
// Helper to determine how to pass values: Pass scalars and arrays by value,
// others by const reference (even if it was a non-const ref before; this is
// disallowed by the style guide anyway).