[JSC] Upstream iOS Stack bound checking
authorbenjamin@webkit.org <benjamin@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 26 Feb 2013 04:13:34 +0000 (04:13 +0000)
committerbenjamin@webkit.org <benjamin@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 26 Feb 2013 04:13:34 +0000 (04:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=110813

Patch by Benjamin Poulain <bpoulain@apple.com> on 2013-02-25
Reviewed by Filip Pizlo.

On iOS, the StackBounds cannot be cached because the stack
can be in one of two threads (the web thread or the UI thread).

We simply always consider the current stack bound when testing
stack boundaries.

* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::BytecodeGenerator):
* bytecompiler/BytecodeGenerator.h:
(JSC::BytecodeGenerator::emitNode):
(JSC::BytecodeGenerator::emitNodeInConditionContext):
(BytecodeGenerator):
* parser/Parser.cpp:
(JSC::::Parser):
* parser/Parser.h:
(JSC::Parser::canRecurse):
(Parser):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@144004 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
Source/JavaScriptCore/parser/Parser.cpp
Source/JavaScriptCore/parser/Parser.h

index 3997efc..a0f1187 100644 (file)
@@ -1,3 +1,28 @@
+2013-02-25  Benjamin Poulain  <bpoulain@apple.com>
+
+        [JSC] Upstream iOS Stack bound checking
+        https://bugs.webkit.org/show_bug.cgi?id=110813
+
+        Reviewed by Filip Pizlo.
+
+        On iOS, the StackBounds cannot be cached because the stack
+        can be in one of two threads (the web thread or the UI thread).
+
+        We simply always consider the current stack bound when testing
+        stack boundaries.
+
+        * bytecompiler/BytecodeGenerator.cpp:
+        (JSC::BytecodeGenerator::BytecodeGenerator):
+        * bytecompiler/BytecodeGenerator.h:
+        (JSC::BytecodeGenerator::emitNode):
+        (JSC::BytecodeGenerator::emitNodeInConditionContext):
+        (BytecodeGenerator):
+        * parser/Parser.cpp:
+        (JSC::::Parser):
+        * parser/Parser.h:
+        (JSC::Parser::canRecurse):
+        (Parser):
+
 2013-02-25  Michael Saboff  <msaboff@apple.com>
 
         For JSVALUE32_64, maxOffsetRelativeToPatchedStorage() doesn't compute the maximum negative offset
index d652179..1b62359 100644 (file)
@@ -248,7 +248,9 @@ BytecodeGenerator::BytecodeGenerator(JSGlobalData& globalData, ProgramNode* prog
 #ifndef NDEBUG
     , m_lastOpcodePosition(0)
 #endif
+#if !USE(WEB_THREAD)
     , m_stack(wtfThreadData().stack())
+#endif
     , m_usesExceptions(false)
     , m_expressionTooDeep(false)
 {
@@ -295,7 +297,9 @@ BytecodeGenerator::BytecodeGenerator(JSGlobalData& globalData, FunctionBodyNode*
 #ifndef NDEBUG
     , m_lastOpcodePosition(0)
 #endif
+#if !USE(WEB_THREAD)
     , m_stack(wtfThreadData().stack())
+#endif
     , m_usesExceptions(false)
     , m_expressionTooDeep(false)
 {
@@ -490,7 +494,9 @@ BytecodeGenerator::BytecodeGenerator(JSGlobalData& globalData, EvalNode* evalNod
 #ifndef NDEBUG
     , m_lastOpcodePosition(0)
 #endif
+#if !USE(WEB_THREAD)
     , m_stack(wtfThreadData().stack())
+#endif
     , m_usesExceptions(false)
     , m_expressionTooDeep(false)
 {
index dd0132c..3ce8e91 100644 (file)
@@ -47,6 +47,7 @@
 #include <wtf/PassRefPtr.h>
 #include <wtf/SegmentedVector.h>
 #include <wtf/Vector.h>
+#include <wtf/WTFThreadData.h>
 
 namespace JSC {
 
@@ -311,9 +312,12 @@ namespace JSC {
             // Node::emitCode assumes that dst, if provided, is either a local or a referenced temporary.
             ASSERT(!dst || dst == ignoredResult() || !dst->isTemporary() || dst->refCount());
             addLineInfo(n->lineNo());
-            return m_stack.isSafeToRecurse()
-                ? n->emitBytecode(*this, dst)
-                : emitThrowExpressionTooDeepException();
+#if USE(WEB_THREAD)
+            bool isSafeToRecurse = wtfThreadData().stack().isSafeToRecurse();
+#else
+            bool isSafeToRecurse = m_stack.isSafeToRecurse();
+#endif
+            return isSafeToRecurse ? n->emitBytecode(*this, dst) : emitThrowExpressionTooDeepException();
         }
 
         RegisterID* emitNode(Node* n)
@@ -324,7 +328,12 @@ namespace JSC {
         void emitNodeInConditionContext(ExpressionNode* n, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue)
         {
             addLineInfo(n->lineNo());
-            if (m_stack.isSafeToRecurse())
+#if USE(WEB_THREAD)
+            bool isSafeToRecurse = wtfThreadData().stack().isSafeToRecurse();
+#else
+            bool isSafeToRecurse = m_stack.isSafeToRecurse();
+#endif
+            if (isSafeToRecurse)
                 n->emitBytecodeInConditionContext(*this, trueTarget, falseTarget, fallThroughMeansTrue);
             else
                 emitThrowExpressionTooDeepException();
@@ -774,8 +783,9 @@ namespace JSC {
 #ifndef NDEBUG
         size_t m_lastOpcodePosition;
 #endif
-
+#if !USE(WEB_THREAD)
         StackBounds m_stack;
+#endif
 
         bool m_usesExceptions;
         bool m_expressionTooDeep;
index 6ff1288..fefa0a6 100644 (file)
@@ -33,7 +33,6 @@
 #include <utility>
 #include <wtf/HashFunctions.h>
 #include <wtf/OwnPtr.h>
-#include <wtf/WTFThreadData.h>
 
 #define fail() do { if (!m_error) updateErrorMessage(); return 0; } while (0)
 #define failWithToken(tok) do { if (!m_error) updateErrorMessage(tok); return 0; } while (0)
@@ -65,7 +64,9 @@ template <typename LexerType>
 Parser<LexerType>::Parser(JSGlobalData* globalData, const SourceCode& source, FunctionParameters* parameters, const Identifier& name, JSParserStrictness strictness, JSParserMode parserMode)
     : m_globalData(globalData)
     , m_source(&source)
+#if !USE(WEB_THREAD)
     , m_stack(wtfThreadData().stack())
+#endif
     , m_hasStackOverflow(false)
     , m_error(false)
     , m_errorMessage("Parse error")
index d4e1654..cb12a9f 100644 (file)
@@ -39,6 +39,7 @@
 #include <wtf/Noncopyable.h>
 #include <wtf/OwnPtr.h>
 #include <wtf/RefPtr.h>
+#include <wtf/WTFThreadData.h>
 namespace JSC {
 struct Scope;
 }
@@ -881,7 +882,11 @@ private:
     
     bool canRecurse()
     {
+#if USE(WEB_THREAD)
+        return wtfThreadData().stack().isSafeToRecurse();
+#else
         return m_stack.isSafeToRecurse();
+#endif
     }
     
     int lastTokenEnd() const
@@ -893,8 +898,10 @@ private:
     const SourceCode* m_source;
     ParserArena* m_arena;
     OwnPtr<LexerType> m_lexer;
-    
+
+#if !USE(WEB_THREAD)
     StackBounds m_stack;
+#endif
     bool m_hasStackOverflow;
     bool m_error;
     String m_errorMessage;