]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (C) 2012, 2013 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 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 JSSegmentedVariableObject_h | |
30 | #define JSSegmentedVariableObject_h | |
31 | ||
32 | #include "ConcurrentJITLock.h" | |
33 | #include "JSObject.h" | |
34 | #include "JSSymbolTableObject.h" | |
35 | #include "Register.h" | |
36 | #include "SymbolTable.h" | |
37 | #include <wtf/SegmentedVector.h> | |
38 | ||
39 | namespace JSC { | |
40 | ||
41 | class LLIntOffsetsExtractor; | |
42 | class Register; | |
43 | ||
44 | // This is a mostly drop-in replacement for JSVariableObject, except that it preserves | |
45 | // the invariant that after a variable is created, its address in memory will not change | |
46 | // so long as the JSSegmentedVariableObject is alive. This allows optimizations based | |
47 | // on getting the address of the variable and remembering it. As well, unlike a | |
48 | // JSVariableObject, this will manage the memory for the registers itself and neither | |
49 | // requires nor allows for the subclasses to manage that memory. Finally, | |
50 | // JSSegmentedVariableObject has its own GC tracing functionality, since it knows the | |
51 | // exact dimensions of the variables array at all times. | |
52 | ||
53 | class JSSegmentedVariableObject : public JSSymbolTableObject { | |
54 | friend class JIT; | |
55 | friend class LLIntOffsetsExtractor; | |
56 | ||
57 | public: | |
58 | typedef JSSymbolTableObject Base; | |
59 | ||
60 | WriteBarrier<Unknown>& registerAt(int index) { return m_registers[index]; } | |
61 | ||
62 | // This is a slow method call, which searches the register bank to find the index | |
63 | // given a pointer. It will CRASH() if it does not find the register. Only use this | |
64 | // in debug code (like bytecode dumping). | |
65 | JS_EXPORT_PRIVATE int findRegisterIndex(void*); | |
66 | ||
67 | WriteBarrier<Unknown>* assertRegisterIsInThisObject(WriteBarrier<Unknown>* registerPointer) | |
68 | { | |
69 | #if !ASSERT_DISABLED | |
70 | findRegisterIndex(registerPointer); | |
71 | #endif | |
72 | return registerPointer; | |
73 | } | |
74 | ||
75 | // Adds numberOfRegistersToAdd registers, initializes them to Undefined, and returns | |
76 | // the index of the first one added. | |
77 | JS_EXPORT_PRIVATE int addRegisters(int numberOfRegistersToAdd); | |
78 | ||
79 | JS_EXPORT_PRIVATE static void visitChildren(JSCell*, SlotVisitor&); | |
80 | ||
81 | protected: | |
82 | static const unsigned StructureFlags = OverridesVisitChildren | JSSymbolTableObject::StructureFlags; | |
83 | ||
84 | JSSegmentedVariableObject(VM& vm, Structure* structure, JSScope* scope) | |
85 | : JSSymbolTableObject(vm, structure, scope) | |
86 | { | |
87 | } | |
88 | ||
89 | void finishCreation(VM& vm) | |
90 | { | |
91 | Base::finishCreation(vm); | |
92 | } | |
93 | ||
94 | SegmentedVector<WriteBarrier<Unknown>, 16> m_registers; | |
95 | ConcurrentJITLock m_lock; | |
96 | }; | |
97 | ||
98 | } // namespace JSC | |
99 | ||
100 | #endif // JSSegmentedVariableObject_h | |
101 |