Reviewed by Geoff Garen.
[WebKit-https.git] / JavaScriptCore / kjs / JSGlobalData.cpp
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 #include "config.h"
30 #include "JSGlobalData.h"
31
32 #include "ArgList.h"
33 #include "CommonIdentifiers.h"
34 #include "JSClassRef.h"
35 #include "JSLock.h"
36 #include "Machine.h"
37 #include "Parser.h"
38 #include "collector.h"
39 #include "lexer.h"
40 #include "lookup.h"
41 #include "nodes.h"
42
43 #if USE(MULTIPLE_THREADS)
44 #include <wtf/Threading.h>
45 #endif
46
47 using namespace WTF;
48
49 namespace KJS {
50
51 extern const HashTable arrayTable;
52 extern const HashTable dateTable;
53 extern const HashTable mathTable;
54 extern const HashTable numberTable;
55 extern const HashTable regExpTable;
56 extern const HashTable regExpConstructorTable;
57 extern const HashTable stringTable;
58
59 JSGlobalData::JSGlobalData(bool isShared)
60     : machine(new Machine)
61     , heap(new Heap(this))
62 #if USE(MULTIPLE_THREADS)
63     , arrayTable(new HashTable(KJS::arrayTable))
64     , dateTable(new HashTable(KJS::dateTable))
65     , mathTable(new HashTable(KJS::mathTable))
66     , numberTable(new HashTable(KJS::numberTable))
67     , regExpTable(new HashTable(KJS::regExpTable))
68     , regExpConstructorTable(new HashTable(KJS::regExpConstructorTable))
69     , stringTable(new HashTable(KJS::stringTable))
70 #else
71     , arrayTable(&KJS::arrayTable)
72     , dateTable(&KJS::dateTable)
73     , mathTable(&KJS::mathTable)
74     , numberTable(&KJS::numberTable)
75     , regExpTable(&KJS::regExpTable)
76     , regExpConstructorTable(&KJS::regExpConstructorTable)
77     , stringTable(&KJS::stringTable)
78 #endif
79     , identifierTable(createIdentifierTable())
80     , propertyNames(new CommonIdentifiers(this))
81     , emptyList(new ArgList)
82     , opaqueJSClassData(new HashMap<OpaqueJSClass*, OpaqueJSClassContextData*>)
83     , newParserObjects(0)
84     , parserObjectExtraRefCounts(0)
85     , lexer(new Lexer(this))
86     , parser(new Parser)
87     , head(0)
88     , isSharedInstance(isShared)
89 {
90 }
91
92 JSGlobalData::~JSGlobalData()
93 {
94     delete heap;
95     heap = 0; // zeroing out to make the behavior more predictable when someone attempts to use a deleted instance.
96     delete machine;
97     machine = 0;
98
99 #if USE(MULTIPLE_THREADS)
100     arrayTable->deleteTable();
101     dateTable->deleteTable();
102     mathTable->deleteTable();
103     numberTable->deleteTable();
104     regExpTable->deleteTable();
105     regExpConstructorTable->deleteTable();
106     stringTable->deleteTable();
107     delete arrayTable;
108     delete dateTable;
109     delete mathTable;
110     delete numberTable;
111     delete regExpTable;
112     delete regExpConstructorTable;
113     delete stringTable;
114 #endif
115
116     delete parser;
117     delete lexer;
118
119     deleteAllValues(*opaqueJSClassData);
120     delete opaqueJSClassData;
121
122     delete propertyNames;
123     deleteIdentifierTable(identifierTable);
124
125     delete newParserObjects;
126     delete parserObjectExtraRefCounts;
127 }
128
129 PassRefPtr<JSGlobalData> JSGlobalData::create()
130 {
131     return adoptRef(new JSGlobalData);
132 }
133
134 bool JSGlobalData::sharedInstanceExists()
135 {
136     return sharedInstanceInternal();
137 }
138
139 JSGlobalData& JSGlobalData::sharedInstance()
140 {
141     JSGlobalData*& instance = sharedInstanceInternal();
142     if (!instance)
143         instance = new JSGlobalData(true);
144     return *instance;
145 }
146
147 JSGlobalData*& JSGlobalData::sharedInstanceInternal()
148 {
149     ASSERT(JSLock::currentThreadIsHoldingLock());
150     static JSGlobalData* sharedInstance;
151     return sharedInstance;
152 }
153
154 }