diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WTF/wtf/StackBounds.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WTF/wtf/StackBounds.h')
-rw-r--r-- | Source/WTF/wtf/StackBounds.h | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/Source/WTF/wtf/StackBounds.h b/Source/WTF/wtf/StackBounds.h index ca397496f..ce9ea96dd 100644 --- a/Source/WTF/wtf/StackBounds.h +++ b/Source/WTF/wtf/StackBounds.h @@ -10,10 +10,10 @@ * 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 COMPUTER, INC. ``AS IS'' AND ANY + * 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 COMPUTER, INC. OR + * 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 @@ -27,6 +27,8 @@ #ifndef StackBounds_h #define StackBounds_h +#include <algorithm> + namespace WTF { class StackBounds { @@ -52,6 +54,12 @@ public: return m_origin; } + void* end() const + { + ASSERT(m_bound); + return m_bound; + } + size_t size() const { if (isGrowingDownward()) @@ -67,14 +75,36 @@ public: return static_cast<char*>(m_bound) - minAvailableDelta; } + void* recursionLimit(char* startOfUserStack, size_t maxUserStack, size_t reservedZoneSize) const + { + checkConsistency(); + if (maxUserStack < reservedZoneSize) + reservedZoneSize = maxUserStack; + size_t maxUserStackWithReservedZone = maxUserStack - reservedZoneSize; + + if (isGrowingDownward()) { + char* endOfStackWithReservedZone = reinterpret_cast<char*>(m_bound) + reservedZoneSize; + if (startOfUserStack < endOfStackWithReservedZone) + return endOfStackWithReservedZone; + size_t availableUserStack = startOfUserStack - endOfStackWithReservedZone; + if (maxUserStackWithReservedZone > availableUserStack) + maxUserStackWithReservedZone = availableUserStack; + return startOfUserStack - maxUserStackWithReservedZone; + } + + char* endOfStackWithReservedZone = reinterpret_cast<char*>(m_bound) - reservedZoneSize; + if (startOfUserStack > endOfStackWithReservedZone) + return endOfStackWithReservedZone; + size_t availableUserStack = endOfStackWithReservedZone - startOfUserStack; + if (maxUserStackWithReservedZone > availableUserStack) + maxUserStackWithReservedZone = availableUserStack; + return startOfUserStack + maxUserStackWithReservedZone; + } + bool isGrowingDownward() const { ASSERT(m_origin && m_bound); -#if OS(WINCE) - return m_origin > m_bound; -#else return true; -#endif } private: |