• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008, 2009 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 JSGlobalData_h
30 #define JSGlobalData_h
31 
32 #include "Collector.h"
33 #include "DateInstanceCache.h"
34 #include "ExecutableAllocator.h"
35 #include "JITStubs.h"
36 #include "JSValue.h"
37 #include "MarkStack.h"
38 #include "NumericStrings.h"
39 #include "SmallStrings.h"
40 #include "TimeoutChecker.h"
41 #include "WeakRandom.h"
42 #include <wtf/Forward.h>
43 #include <wtf/HashMap.h>
44 #include <wtf/RefCounted.h>
45 
46 struct OpaqueJSClass;
47 struct OpaqueJSClassContextData;
48 
49 namespace JSC {
50 
51     class CodeBlock;
52     class CommonIdentifiers;
53     class IdentifierTable;
54     class Interpreter;
55     class JSGlobalObject;
56     class JSObject;
57     class Lexer;
58     class Parser;
59     class Stringifier;
60     class Structure;
61     class UString;
62 
63     struct HashTable;
64     struct Instruction;
65 
66     struct DSTOffsetCache {
DSTOffsetCacheDSTOffsetCache67         DSTOffsetCache()
68         {
69             reset();
70         }
71 
resetDSTOffsetCache72         void reset()
73         {
74             offset = 0.0;
75             start = 0.0;
76             end = -1.0;
77             increment = 0.0;
78         }
79 
80         double offset;
81         double start;
82         double end;
83         double increment;
84     };
85 
86     class JSGlobalData : public RefCounted<JSGlobalData> {
87     public:
88         struct ClientData {
89             virtual ~ClientData() = 0;
90         };
91 
92         static bool sharedInstanceExists();
93         static JSGlobalData& sharedInstance();
94 
95         static PassRefPtr<JSGlobalData> create();
96         static PassRefPtr<JSGlobalData> createLeaked();
97         static PassRefPtr<JSGlobalData> createNonDefault();
98         ~JSGlobalData();
99 
100 #if ENABLE(JSC_MULTIPLE_THREADS)
101         // Will start tracking threads that use the heap, which is resource-heavy.
makeUsableFromMultipleThreads()102         void makeUsableFromMultipleThreads() { heap.makeUsableFromMultipleThreads(); }
103 #endif
104 
105         bool isSharedInstance;
106         ClientData* clientData;
107 
108         const HashTable* arrayTable;
109         const HashTable* dateTable;
110         const HashTable* jsonTable;
111         const HashTable* mathTable;
112         const HashTable* numberTable;
113         const HashTable* regExpTable;
114         const HashTable* regExpConstructorTable;
115         const HashTable* stringTable;
116 
117         RefPtr<Structure> activationStructure;
118         RefPtr<Structure> interruptedExecutionErrorStructure;
119         RefPtr<Structure> staticScopeStructure;
120         RefPtr<Structure> stringStructure;
121         RefPtr<Structure> notAnObjectErrorStubStructure;
122         RefPtr<Structure> notAnObjectStructure;
123         RefPtr<Structure> propertyNameIteratorStructure;
124         RefPtr<Structure> getterSetterStructure;
125         RefPtr<Structure> apiWrapperStructure;
126         RefPtr<Structure> dummyMarkableCellStructure;
127 
128 #if USE(JSVALUE32)
129         RefPtr<Structure> numberStructure;
130 #endif
131 
132         static void storeVPtrs();
133         static JS_EXPORTDATA void* jsArrayVPtr;
134         static JS_EXPORTDATA void* jsByteArrayVPtr;
135         static JS_EXPORTDATA void* jsStringVPtr;
136         static JS_EXPORTDATA void* jsFunctionVPtr;
137 
138         IdentifierTable* identifierTable;
139         CommonIdentifiers* propertyNames;
140         const MarkedArgumentBuffer* emptyList; // Lists are supposed to be allocated on the stack to have their elements properly marked, which is not the case here - but this list has nothing to mark.
141         SmallStrings smallStrings;
142         NumericStrings numericStrings;
143         DateInstanceCache dateInstanceCache;
144 
145 #if ENABLE(ASSEMBLER)
146         ExecutableAllocator executableAllocator;
147 #endif
148 
149         Lexer* lexer;
150         Parser* parser;
151         Interpreter* interpreter;
152 #if ENABLE(JIT)
153         JITThunks jitStubs;
154 #endif
155         TimeoutChecker timeoutChecker;
156         Heap heap;
157 
158         JSValue exception;
159 #if ENABLE(JIT)
160         ReturnAddressPtr exceptionLocation;
161 #endif
162 
163         const Vector<Instruction>& numericCompareFunction(ExecState*);
164         Vector<Instruction> lazyNumericCompareFunction;
165         bool initializingLazyNumericCompareFunction;
166 
167         HashMap<OpaqueJSClass*, OpaqueJSClassContextData*> opaqueJSClassData;
168 
169         JSGlobalObject* head;
170         JSGlobalObject* dynamicGlobalObject;
171 
172         HashSet<JSObject*> arrayVisitedElements;
173 
174         CodeBlock* functionCodeBlockBeingReparsed;
175         Stringifier* firstStringifierToMark;
176 
177         MarkStack markStack;
178 
179         double cachedUTCOffset;
180         DSTOffsetCache dstOffsetCache;
181 
182         UString cachedDateString;
183         double cachedDateStringValue;
184 
185         WeakRandom weakRandom;
186 
187 #ifndef NDEBUG
188         bool mainThreadOnly;
189 #endif
190 
191         void resetDateCache();
192 
193         void startSampling();
194         void stopSampling();
195         void dumpSampleData(ExecState* exec);
196     private:
197         JSGlobalData(bool isShared);
198         static JSGlobalData*& sharedInstanceInternal();
199         void createNativeThunk();
200     };
201 
202 } // namespace JSC
203 
204 #endif // JSGlobalData_h
205