~ubuntu-branches/ubuntu/raring/qtwebkit-source/raring-proposed

« back to all changes in this revision

Viewing changes to Source/JavaScriptCore/runtime/StringRecursionChecker.h

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2013-02-18 14:24:18 UTC
  • Revision ID: package-import@ubuntu.com-20130218142418-eon0jmjg3nj438uy
Tags: upstream-2.3
ImportĀ upstreamĀ versionĀ 2.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  Copyright (C) 2011 Apple Inc. All rights reserved.
 
3
 *
 
4
 *  This library is free software; you can redistribute it and/or
 
5
 *  modify it under the terms of the GNU Lesser General Public
 
6
 *  License as published by the Free Software Foundation; either
 
7
 *  version 2 of the License, or (at your option) any later version.
 
8
 *
 
9
 *  This library is distributed in the hope that it will be useful,
 
10
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
12
 *  Lesser General Public License for more details.
 
13
 *
 
14
 *  You should have received a copy of the GNU Lesser General Public
 
15
 *  License along with this library; if not, write to the Free Software
 
16
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
17
 *
 
18
 */
 
19
 
 
20
#ifndef StringRecursionChecker_h
 
21
#define StringRecursionChecker_h
 
22
 
 
23
#include "Interpreter.h"
 
24
#include <wtf/StackStats.h>
 
25
#include <wtf/WTFThreadData.h>
 
26
 
 
27
namespace JSC {
 
28
 
 
29
class StringRecursionChecker {
 
30
    WTF_MAKE_NONCOPYABLE(StringRecursionChecker);
 
31
 
 
32
public:
 
33
    StringRecursionChecker(ExecState*, JSObject* thisObject);
 
34
    ~StringRecursionChecker();
 
35
 
 
36
    JSValue earlyReturnValue() const; // 0 if everything is OK, value to return for failure cases
 
37
 
 
38
private:
 
39
    JSValue throwStackOverflowError();
 
40
    JSValue emptyString();
 
41
    JSValue performCheck();
 
42
 
 
43
    ExecState* m_exec;
 
44
    JSObject* m_thisObject;
 
45
    JSValue m_earlyReturnValue;
 
46
 
 
47
    StackStats::CheckPoint stackCheckpoint;
 
48
};
 
49
 
 
50
inline JSValue StringRecursionChecker::performCheck()
 
51
{
 
52
    const StackBounds& nativeStack = wtfThreadData().stack();
 
53
    if (!nativeStack.isSafeToRecurse())
 
54
        return throwStackOverflowError();
 
55
    bool alreadyVisited = !m_exec->globalData().stringRecursionCheckVisitedObjects.add(m_thisObject).isNewEntry;
 
56
    if (alreadyVisited)
 
57
        return emptyString(); // Return empty string to avoid infinite recursion.
 
58
    return JSValue(); // Indicate success.
 
59
}
 
60
 
 
61
inline StringRecursionChecker::StringRecursionChecker(ExecState* exec, JSObject* thisObject)
 
62
    : m_exec(exec)
 
63
    , m_thisObject(thisObject)
 
64
    , m_earlyReturnValue(performCheck())
 
65
{
 
66
}
 
67
 
 
68
inline JSValue StringRecursionChecker::earlyReturnValue() const
 
69
{
 
70
    return m_earlyReturnValue;
 
71
}
 
72
 
 
73
inline StringRecursionChecker::~StringRecursionChecker()
 
74
{
 
75
    if (m_earlyReturnValue)
 
76
        return;
 
77
    ASSERT(m_exec->globalData().stringRecursionCheckVisitedObjects.contains(m_thisObject));
 
78
    m_exec->globalData().stringRecursionCheckVisitedObjects.remove(m_thisObject);
 
79
}
 
80
 
 
81
}
 
82
 
 
83
#endif