Groundwork for reimplementing the slow script dialog
[WebKit-https.git] / JavaScriptCore / VM / LabelID.h
1 /*
2  * Copyright (C) 2008 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #ifndef LabelID_h
30 #define LabelID_h
31
32 #include "CodeBlock.h"
33 #include "Instruction.h"
34 #include <wtf/Assertions.h>
35 #include <wtf/Vector.h>
36 #include <limits.h>
37
38 namespace KJS {
39
40     class LabelID {
41     public:
42         explicit LabelID(CodeBlock* codeBlock)
43             : m_refCount(0)
44             , m_location(invalidLocation)
45             , m_codeBlock(codeBlock)
46         {
47         }
48
49         // It doesn't really make sense to copy a LabelID, but we need this copy
50         // constructor to support moving LabelIDs in a Vector.
51
52         LabelID(const LabelID& other)
53             : m_refCount(other.m_refCount)
54             , m_location(other.m_location)
55             , m_codeBlock(other.m_codeBlock)
56             , m_unresolvedJumps(other.m_unresolvedJumps)
57         {
58         #ifndef NDEBUG
59             const_cast<LabelID&>(other).m_codeBlock = 0;
60         #endif
61         }
62
63         void setLocation(unsigned location)
64         {
65             ASSERT(m_codeBlock);
66             m_location = location;
67
68             unsigned size = m_unresolvedJumps.size();
69             for (unsigned i = 0; i < size; ++i) {
70                 unsigned j = m_unresolvedJumps[i];
71                 m_codeBlock->instructions[j].u.operand = m_location - j;
72             }
73         }
74
75         int offsetFrom(int location) const
76         {
77             ASSERT(m_codeBlock);
78             if (m_location == invalidLocation) {
79                 m_unresolvedJumps.append(location);
80                 return 0;
81             }
82             return m_location - location;
83         }
84
85         void ref()
86         {
87             ++m_refCount;
88         }
89
90         void deref()
91         {
92             --m_refCount;
93             ASSERT(m_refCount >= 0);
94         }
95
96         int refCount() const
97         {
98             return m_refCount;
99         }
100
101         bool isForwardLabel() { return m_location == invalidLocation; }
102     private:
103         typedef Vector<int, 8> JumpVector;
104
105         static const unsigned invalidLocation = UINT_MAX;
106
107         int m_refCount;
108         unsigned m_location;
109         CodeBlock* m_codeBlock;
110         mutable JumpVector m_unresolvedJumps;
111     };
112
113 } // namespace KJS
114
115 #endif // LabelID_h