summaryrefslogtreecommitdiff
path: root/Source/WTF/wtf/StackBounds.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WTF/wtf/StackBounds.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WTF/wtf/StackBounds.h')
-rw-r--r--Source/WTF/wtf/StackBounds.h42
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: