diff options
Diffstat (limited to 'Source/WTF/wtf')
-rw-r--r-- | Source/WTF/wtf/Compiler.h | 11 | ||||
-rw-r--r-- | Source/WTF/wtf/OSAllocatorPosix.cpp | 37 | ||||
-rw-r--r-- | Source/WTF/wtf/Platform.h | 12 | ||||
-rw-r--r-- | Source/WTF/wtf/PlatformQt.cmake | 2 | ||||
-rw-r--r-- | Source/WTF/wtf/StringExtras.h | 41 | ||||
-rw-r--r-- | Source/WTF/wtf/qt/WorkQueueQt.cpp | 1 | ||||
-rw-r--r-- | Source/WTF/wtf/text/win/WCharStringExtras.h | 70 |
7 files changed, 120 insertions, 54 deletions
diff --git a/Source/WTF/wtf/Compiler.h b/Source/WTF/wtf/Compiler.h index 89f4ca42e..f74fc8a0d 100644 --- a/Source/WTF/wtf/Compiler.h +++ b/Source/WTF/wtf/Compiler.h @@ -52,7 +52,6 @@ #define WTF_COMPILER_SUPPORTS_C_STATIC_ASSERT __has_feature(c_static_assert) #define WTF_COMPILER_SUPPORTS_CXX_REFERENCE_QUALIFIED_FUNCTIONS __has_feature(cxx_reference_qualified_functions) #define WTF_COMPILER_SUPPORTS_CXX_USER_LITERALS __has_feature(cxx_user_literals) -#define WTF_COMPILER_SUPPORTS_FALLTHROUGH_WARNINGS __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough") #endif /* COMPILER(GCC_OR_CLANG) - GNU Compiler Collection or Clang */ @@ -176,10 +175,18 @@ /* FALLTHROUGH */ -#if !defined(FALLTHROUGH) && COMPILER_SUPPORTS(FALLTHROUGH_WARNINGS) && COMPILER(CLANG) +#if !defined(FALLTHROUGH) && defined(__cplusplus) && defined(__has_cpp_attribute) + +#if __has_cpp_attribute(fallthrough) +#define FALLTHROUGH [[fallthrough]] +#elif __has_cpp_attribute(clang::fallthrough) #define FALLTHROUGH [[clang::fallthrough]] +#elif __has_cpp_attribute(gnu::fallthrough) +#define FALLTHROUGH [[gnu::fallthrough]] #endif +#endif // !defined(FALLTHROUGH) && defined(__cplusplus) && defined(__has_cpp_attribute) + #if !defined(FALLTHROUGH) #define FALLTHROUGH #endif diff --git a/Source/WTF/wtf/OSAllocatorPosix.cpp b/Source/WTF/wtf/OSAllocatorPosix.cpp index f5e6669a9..0a07be635 100644 --- a/Source/WTF/wtf/OSAllocatorPosix.cpp +++ b/Source/WTF/wtf/OSAllocatorPosix.cpp @@ -35,17 +35,54 @@ namespace WTF { +#if CPU(MIPS) +static bool isWithin256MB(const void* ptr, size_t length) +{ + const intptr_t start = reinterpret_cast<intptr_t>(ptr); + const intptr_t end = start + length - 1; + return (start & 0xf0000000) == (end & 0xf0000000); +} +#endif // CPU(MIPS) + void* OSAllocator::reserveUncommitted(size_t bytes, Usage usage, bool writable, bool executable, bool includesGuardPages) { #if OS(LINUX) UNUSED_PARAM(usage); UNUSED_PARAM(writable); +#if !CPU(MIPS) UNUSED_PARAM(executable); +#endif UNUSED_PARAM(includesGuardPages); void* result = mmap(0, bytes, PROT_NONE, MAP_NORESERVE | MAP_PRIVATE | MAP_ANON, -1, 0); if (result == MAP_FAILED) CRASH(); +#if CPU(MIPS) + // On MIPS we can use shorter j <address> jump instructions if the executable + // memory resides entirely within a single 256MB page (e.g. 0x3000.0000 to 0x3fff.ffff). + // Usually this is true for the small buffers we allocate, but we test, and upon failure + // we reallocate a double-size region, choose a valid region, and unmap the remainder. + if (executable && UNLIKELY(!isWithin256MB(result, bytes))) { + // Not in 256MB region, try to map double size. + if (munmap(result, bytes)) + CRASH(); + result = mmap(0, 2 * bytes, PROT_NONE, MAP_NORESERVE | MAP_PRIVATE | MAP_ANON, -1, 0); + if (result == MAP_FAILED) + CRASH(); + if (isWithin256MB(result, bytes)) { + // 1st half is good, release 2nd half. + if (munmap(reinterpret_cast<int8_t*>(result) + bytes, bytes)) + CRASH(); + } else if (isWithin256MB(reinterpret_cast<int8_t*>(result) + bytes, bytes)) { + // 2nd half is good, release 1st half. + if (munmap(result, bytes)) + CRASH(); + result = reinterpret_cast<int8_t*>(result) + bytes; + } else + ASSERT_NOT_REACHED(); + } +#endif // CPU(MIPS) + madvise(result, bytes, MADV_DONTNEED); #else void* result = reserveAndCommit(bytes, usage, writable, executable, includesGuardPages); diff --git a/Source/WTF/wtf/Platform.h b/Source/WTF/wtf/Platform.h index 3f2069e7c..f3d725217 100644 --- a/Source/WTF/wtf/Platform.h +++ b/Source/WTF/wtf/Platform.h @@ -626,12 +626,6 @@ #define HAVE_PTHREAD_NP_H 1 #endif -#if !defined(HAVE_VASPRINTF) -#if !COMPILER(MSVC) && !COMPILER(MINGW) -#define HAVE_VASPRINTF 1 -#endif -#endif - #if !defined(HAVE_STRNSTR) #if OS(DARWIN) || (OS(FREEBSD) && !defined(__GLIBC__)) #define HAVE_STRNSTR 1 @@ -900,7 +894,7 @@ /* Pick which allocator to use; we only need an executable allocator if the assembler is compiled in. On non-Windows x86-64, iOS, and ARM64 we use a single fixed mmap, on other platforms we mmap on demand. */ #if ENABLE(ASSEMBLER) -#if CPU(X86_64) || PLATFORM(IOS) || CPU(ARM64) +#if CPU(X86_64) || PLATFORM(IOS) || CPU(ARM64) || CPU(MIPS) #define ENABLE_EXECUTABLE_ALLOCATOR_FIXED 1 #else #define ENABLE_EXECUTABLE_ALLOCATOR_DEMAND 1 @@ -1130,10 +1124,6 @@ #if COMPILER(MSVC) #undef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS -#if _MSC_VER < 1900 -#undef _HAS_EXCEPTIONS -#define _HAS_EXCEPTIONS 1 -#endif #endif #if PLATFORM(MAC) diff --git a/Source/WTF/wtf/PlatformQt.cmake b/Source/WTF/wtf/PlatformQt.cmake index 636ad40c2..32c8d2c70 100644 --- a/Source/WTF/wtf/PlatformQt.cmake +++ b/Source/WTF/wtf/PlatformQt.cmake @@ -4,6 +4,7 @@ list(APPEND WTF_SOURCES text/qt/StringQt.cpp ) +QTWEBKIT_GENERATE_MOC_FILES_CPP(qt/MainThreadQt.cpp qt/RunLoopQt.cpp) list(APPEND WTF_SYSTEM_INCLUDE_DIRECTORIES ${Qt5Core_INCLUDE_DIRS} @@ -32,6 +33,7 @@ if (UNIX AND NOT APPLE) qt/WorkQueueQt.cpp ) + QTWEBKIT_GENERATE_MOC_FILES_CPP(qt/WorkQueueQt.cpp) endif () if (USE_GLIB) diff --git a/Source/WTF/wtf/StringExtras.h b/Source/WTF/wtf/StringExtras.h index 60644f972..6797d2ce1 100644 --- a/Source/WTF/wtf/StringExtras.h +++ b/Source/WTF/wtf/StringExtras.h @@ -36,47 +36,8 @@ #endif #if COMPILER(MSVC) -// FIXME: why a COMPILER check instead of OS? also, these should be HAVE checks -#include <errno.h> - -#if _MSC_VER < 1900 -inline int snprintf(char* buffer, size_t count, const char* format, ...) -{ - int result; - va_list args; - va_start(args, format); - result = _vsnprintf(buffer, count, format, args); - if (result < 0 && errno != EINVAL) - result = _vscprintf(format, args); - va_end(args); - - // In the case where the string entirely filled the buffer, _vsnprintf will not - // null-terminate it, but snprintf must. - if (count > 0) - buffer[count - 1] = '\0'; - - return result; -} -#endif - -inline double wtf_vsnprintf(char* buffer, size_t count, const char* format, va_list args) -{ - int result = _vsnprintf(buffer, count, format, args); - if (result < 0 && errno != EINVAL) - result = _vscprintf(format, args); - - // In the case where the string entirely filled the buffer, _vsnprintf will not - // null-terminate it, but vsnprintf must. - if (count > 0) - buffer[count - 1] = '\0'; - - return result; -} - -// Work around a difference in Microsoft's implementation of vsnprintf, where -// vsnprintf does not null terminate the buffer. WebKit can rely on the null termination. -#define vsnprintf(buffer, count, format, args) wtf_vsnprintf(buffer, count, format, args) +// FIXME: We should stop using these entirely and use suitable versions of equalIgnoringASCIICase instead. inline int strncasecmp(const char* s1, const char* s2, size_t len) { diff --git a/Source/WTF/wtf/qt/WorkQueueQt.cpp b/Source/WTF/wtf/qt/WorkQueueQt.cpp index be04dae3f..4e2f36409 100644 --- a/Source/WTF/wtf/qt/WorkQueueQt.cpp +++ b/Source/WTF/wtf/qt/WorkQueueQt.cpp @@ -30,7 +30,6 @@ #include <QObject> #include <QProcess> #include <QThread> -#include <wtf/Threading.h> namespace WTF { diff --git a/Source/WTF/wtf/text/win/WCharStringExtras.h b/Source/WTF/wtf/text/win/WCharStringExtras.h new file mode 100644 index 000000000..9d004e515 --- /dev/null +++ b/Source/WTF/wtf/text/win/WCharStringExtras.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2017 Konstantin Tokarev <annulen@yandex.ru> + * + * 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. AND ITS CONTRIBUTORS ``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 ITS 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. + */ + +#pragma once + +#include <wchar.h> +#include <wtf/text/WTFString.h> + +namespace WTF { + +inline Vector<wchar_t> stringToNullTerminatedWChar(const String& string) +{ + Vector<wchar_t> result; + + if (!string.isNull()) { + result.reserveInitialCapacity(string.impl()->length() + 1); + + if (string.is8Bit()) { + const LChar* characters8 = string.impl()->characters8(); + for (size_t i = 0; i < string.impl()->length(); ++i) + result.uncheckedAppend(characters8[i]); + } else { + const UChar* characters16 = string.impl()->characters16(); + result.append(characters16, string.impl()->length()); + } + + result.append(0); + } + + return result; +} + +inline String wcharToString(const wchar_t* characters, unsigned length) +{ + static_assert(sizeof(wchar_t) == sizeof(UChar), "We assume wchar_t and UChar have the same size"); + return String(reinterpret_cast<const UChar*>(characters), length); +} + +inline String nullTerminatedWCharToString(const wchar_t* characters) +{ + return wcharToString(characters, wcslen(characters) - 1); +} + +} // namespace WTF + +using WTF::stringToNullTerminatedWChar; +using WTF::wcharToString; +using WTF::nullTerminatedWCharToString; |