| Index: third_party/WebKit/Source/wtf/StdLibExtras.h
|
| diff --git a/third_party/WebKit/Source/wtf/StdLibExtras.h b/third_party/WebKit/Source/wtf/StdLibExtras.h
|
| index b83d321a0c87af491cb69ad05be8f21334f5ac68..ec81685a5b3ce4e68c56111fe5f6176b73190453 100644
|
| --- a/third_party/WebKit/Source/wtf/StdLibExtras.h
|
| +++ b/third_party/WebKit/Source/wtf/StdLibExtras.h
|
| @@ -1,269 +1,9 @@
|
| -/*
|
| - * Copyright (C) 2008 Apple Inc. All Rights Reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright
|
| - * notice, this list of conditions and the following disclaimer in the
|
| - * documentation and/or other materials provided with the distribution.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
|
| - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
| - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
|
| - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
| - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
| - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
| - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
|
|
| -#ifndef WTF_StdLibExtras_h
|
| -#define WTF_StdLibExtras_h
|
| +#include "platform/wtf/StdLibExtras.h"
|
|
|
| -#include <cstddef>
|
| -#include "base/numerics/safe_conversions.h"
|
| -#include "wtf/Assertions.h"
|
| -#include "wtf/CPU.h"
|
| -#include "wtf/LeakAnnotations.h"
|
| -#include "wtf/Noncopyable.h"
|
| -#include "wtf/TypeTraits.h"
|
| -
|
| -#if DCHECK_IS_ON()
|
| -#include "wtf/Threading.h"
|
| -#endif
|
| -
|
| -// Use |DEFINE_STATIC_LOCAL()| to declare and define a static local variable
|
| -// (|static T;|) so that it is leaked and its destructors are not called at
|
| -// exit. T may also be a Blink garbage collected object, in which case it is
|
| -// wrapped up by an off-heap |Persistent<T>| reference to the object, keeping
|
| -// it alive across GCs.
|
| -//
|
| -// A |DEFINE_STATIC_LOCAL()| static should only be used on the thread it was
|
| -// created on.
|
| -//
|
| -#define DEFINE_STATIC_LOCAL(Type, Name, Arguments) \
|
| - static WTF::StaticSingleton<Type> s_##Name( \
|
| - new WTF::StaticSingleton<Type>::WrapperType Arguments); \
|
| - Type& Name = s_##Name.get(false)
|
| -
|
| -// |DEFINE_THREAD_SAFE_STATIC_LOCAL()| is the cross-thread accessible variant
|
| -// of |DEFINE_STATIC_LOCAL()|; use it if the singleton can be accessed by
|
| -// multiple threads.
|
| -//
|
| -// TODO: rename as DEFINE_CROSS_THREAD_STATIC_LOCAL() ?
|
| -#define DEFINE_THREAD_SAFE_STATIC_LOCAL(Type, Name, Initializer) \
|
| - static WTF::StaticSingleton<Type> s_##Name(Initializer); \
|
| - Type& Name = s_##Name.get(true)
|
| -
|
| -namespace blink {
|
| -template <typename T>
|
| -class Persistent;
|
| -
|
| -} // namespace blink
|
| -
|
| -namespace WTF {
|
| -
|
| -template <typename Type>
|
| -class StaticSingleton final {
|
| - WTF_MAKE_NONCOPYABLE(StaticSingleton);
|
| -
|
| - public:
|
| - template <typename T,
|
| - bool = WTF::IsGarbageCollectedType<T>::value &&
|
| - !WTF::IsPersistentReferenceType<T>::value>
|
| - struct Wrapper {
|
| - using type = T;
|
| -
|
| - static T& unwrap(T* singleton) { return *singleton; }
|
| - };
|
| -
|
| - template <typename T>
|
| - struct Wrapper<T, true> {
|
| - using type = blink::Persistent<T>;
|
| -
|
| - static T& unwrap(blink::Persistent<T>* singleton) {
|
| - DCHECK(singleton);
|
| - // If this assert triggers, you're supplying an empty ("()") 'Arguments'
|
| - // argument to DEFINE_STATIC_LOCAL() - it must be the heap object you wish
|
| - // to create as a static singleton and wrapped up with a Persistent
|
| - // reference.
|
| - DCHECK(*singleton);
|
| - return **singleton;
|
| - }
|
| - };
|
| -
|
| - using WrapperType = typename Wrapper<Type>::type;
|
| -
|
| - // To cooperate with leak detection(LSan) for Blink garbage collected objects,
|
| - // the objects owned by persistent local statics will in some cases have to be
|
| - // finalized prior to leak checking. This only applies to static references to
|
| - // Blink heap objects and what they transitively hold on to. Hence the
|
| - // LEAK_SANITIZER_REGISTER_STATIC_LOCAL() use, it taking care of the grungy
|
| - // details.
|
| -
|
| - explicit StaticSingleton(WrapperType* instance)
|
| - : m_instance(LEAK_SANITIZER_REGISTER_STATIC_LOCAL(WrapperType, instance))
|
| -#if DCHECK_IS_ON()
|
| - ,
|
| - m_safelyInitialized(WTF::isBeforeThreadCreated()),
|
| - m_thread(WTF::internal::currentThreadSyscall())
|
| -#endif
|
| - {
|
| - }
|
| -
|
| - Type& get(bool allowCrossThreadUse) const {
|
| -#if DCHECK_IS_ON()
|
| - DCHECK(isNotRacy(allowCrossThreadUse));
|
| -#endif
|
| - ALLOW_UNUSED_LOCAL(allowCrossThreadUse);
|
| - return Wrapper<Type>::unwrap(m_instance);
|
| - }
|
| -
|
| - operator Type&() { return get(); }
|
| -
|
| - private:
|
| -#if DCHECK_IS_ON()
|
| -
|
| - bool isNotRacy(bool allowCrossThreadUse) const {
|
| - // Make sure that singleton is safely initialized, or
|
| - // keeps being called on the same thread if cross-thread
|
| - // use is not permitted.
|
| - return allowCrossThreadUse || m_safelyInitialized ||
|
| - m_thread == WTF::internal::currentThreadSyscall();
|
| - }
|
| -#endif
|
| -
|
| - WrapperType* m_instance;
|
| -#if DCHECK_IS_ON()
|
| - bool m_safelyInitialized;
|
| - ThreadIdentifier m_thread;
|
| -#endif
|
| -};
|
| -
|
| -} // namespace WTF
|
| -
|
| -// Use this to declare and define a static local pointer to a ref-counted object
|
| -// so that it is leaked so that the object's destructors are not called at
|
| -// exit. This macro should be used with ref-counted objects rather than
|
| -// DEFINE_STATIC_LOCAL macro, as this macro does not lead to an extra memory
|
| -// allocation.
|
| -#define DEFINE_STATIC_REF(type, name, arguments) \
|
| - static type* name = PassRefPtr<type>(arguments).leakRef();
|
| -
|
| -/*
|
| - * The reinterpret_cast<Type1*>([pointer to Type2]) expressions - where
|
| - * sizeof(Type1) > sizeof(Type2) - cause the following warning on ARM with GCC:
|
| - * increases required alignment of target type.
|
| - *
|
| - * An implicit or an extra static_cast<void*> bypasses the warning.
|
| - * For more info see the following bugzilla entries:
|
| - * - https://bugs.webkit.org/show_bug.cgi?id=38045
|
| - * - http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43976
|
| - */
|
| -#if CPU(ARM) && COMPILER(GCC)
|
| -template <typename Type>
|
| -bool isPointerTypeAlignmentOkay(Type* ptr) {
|
| - return !(reinterpret_cast<intptr_t>(ptr) % __alignof__(Type));
|
| -}
|
| -
|
| -template <typename TypePtr>
|
| -TypePtr reinterpret_cast_ptr(void* ptr) {
|
| - DCHECK(isPointerTypeAlignmentOkay(reinterpret_cast<TypePtr>(ptr)));
|
| - return reinterpret_cast<TypePtr>(ptr);
|
| -}
|
| -
|
| -template <typename TypePtr>
|
| -TypePtr reinterpret_cast_ptr(const void* ptr) {
|
| - DCHECK(isPointerTypeAlignmentOkay(reinterpret_cast<TypePtr>(ptr)));
|
| - return reinterpret_cast<TypePtr>(ptr);
|
| -}
|
| -#else
|
| -template <typename Type>
|
| -bool isPointerTypeAlignmentOkay(Type*) {
|
| - return true;
|
| -}
|
| -#define reinterpret_cast_ptr reinterpret_cast
|
| -#endif
|
| -
|
| -namespace WTF {
|
| -
|
| -/*
|
| - * C++'s idea of a reinterpret_cast lacks sufficient cojones.
|
| - */
|
| -template <typename TO, typename FROM>
|
| -inline TO bitwiseCast(FROM from) {
|
| - static_assert(sizeof(TO) == sizeof(FROM),
|
| - "WTF::bitwiseCast sizeof casted types should be equal");
|
| - union {
|
| - FROM from;
|
| - TO to;
|
| - } u;
|
| - u.from = from;
|
| - return u.to;
|
| -}
|
| -
|
| -template <typename To, typename From>
|
| -inline To safeCast(From value) {
|
| - return base::checked_cast<To>(value);
|
| -}
|
| -
|
| -// Use the following macros to prevent errors caused by accidental
|
| -// implicit casting of function arguments. For example, this can
|
| -// be used to prevent overflows from non-promoting conversions.
|
| -//
|
| -// Example:
|
| -//
|
| -// HAS_STRICTLY_TYPED_ARG
|
| -// void sendData(void* data, STRICTLY_TYPED_ARG(size))
|
| -// {
|
| -// ALLOW_NUMERIC_ARG_TYPES_PROMOTABLE_TO(size_t);
|
| -// ...
|
| -// }
|
| -//
|
| -// The previous example will prevent callers from passing, for example, an
|
| -// 'int'. On a 32-bit build, it will prevent use of an 'unsigned long long'.
|
| -#define HAS_STRICTLY_TYPED_ARG template <typename ActualArgType>
|
| -#define STRICTLY_TYPED_ARG(argName) ActualArgType argName
|
| -#define STRICT_ARG_TYPE(ExpectedArgType) \
|
| - static_assert(std::is_same<ActualArgType, ExpectedArgType>::value, \
|
| - "Strictly typed argument must be of type '" #ExpectedArgType \
|
| - "'.")
|
| -#define ALLOW_NUMERIC_ARG_TYPES_PROMOTABLE_TO(ExpectedArgType) \
|
| - static_assert( \
|
| - std::numeric_limits<ExpectedArgType>::is_integer == \
|
| - std::numeric_limits<ActualArgType>::is_integer, \
|
| - "Conversion between integer and non-integer types not allowed."); \
|
| - static_assert(sizeof(ExpectedArgType) >= sizeof(ActualArgType), \
|
| - "Truncating conversions not allowed."); \
|
| - static_assert(!std::numeric_limits<ActualArgType>::is_signed || \
|
| - std::numeric_limits<ExpectedArgType>::is_signed, \
|
| - "Signed to unsigned conversion not allowed."); \
|
| - static_assert((sizeof(ExpectedArgType) != sizeof(ActualArgType)) || \
|
| - (std::numeric_limits<ActualArgType>::is_signed == \
|
| - std::numeric_limits<ExpectedArgType>::is_signed), \
|
| - "Unsigned to signed conversion not allowed for types with " \
|
| - "identical size (could overflow).");
|
| -
|
| -// Macro that returns a compile time constant with the length of an array, but
|
| -// gives an error if passed a non-array.
|
| -template <typename T, size_t Size>
|
| -char (&ArrayLengthHelperFunction(T (&)[Size]))[Size];
|
| -// GCC needs some help to deduce a 0 length array.
|
| -#if COMPILER(GCC)
|
| -template <typename T>
|
| -char (&ArrayLengthHelperFunction(T (&)[0]))[0];
|
| -#endif
|
| -#define WTF_ARRAY_LENGTH(array) sizeof(::WTF::ArrayLengthHelperFunction(array))
|
| -
|
| -} // namespace WTF
|
| -
|
| -using WTF::bitwiseCast;
|
| -using WTF::safeCast;
|
| -
|
| -#endif // WTF_StdLibExtras_h
|
| +// The contents of this header was moved to platform/wtf as part of
|
| +// WTF migration project. See the following post for details:
|
| +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
|
|
|