18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSGlobalData.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ArgList.h"
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Collector.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CommonIdentifiers.h"
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FunctionConstructor.h"
360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "GetterSetter.h"
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Interpreter.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSActivation.h"
390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "JSAPIValueWrapper.h"
408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "JSArray.h"
418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "JSByteArray.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSClassRef.h"
435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "JSFunction.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSLock.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSNotAnObject.h"
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "JSPropertyNameIterator.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSStaticScopeObject.h"
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Lexer.h"
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Lookup.h"
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Nodes.h"
51d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "Parser.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(JSC_MULTIPLE_THREADS)
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Threading.h>
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC)
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProfilerServer.h"
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WTF;
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochextern JSC_CONST_HASHTABLE HashTable arrayTable;
660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochextern JSC_CONST_HASHTABLE HashTable jsonTable;
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochextern JSC_CONST_HASHTABLE HashTable dateTable;
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochextern JSC_CONST_HASHTABLE HashTable mathTable;
690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochextern JSC_CONST_HASHTABLE HashTable numberTable;
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochextern JSC_CONST_HASHTABLE HashTable regExpTable;
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochextern JSC_CONST_HASHTABLE HashTable regExpConstructorTable;
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochextern JSC_CONST_HASHTABLE HashTable stringTable;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
74d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid* JSGlobalData::jsArrayVPtr;
75d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid* JSGlobalData::jsByteArrayVPtr;
76d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid* JSGlobalData::jsStringVPtr;
77d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid* JSGlobalData::jsFunctionVPtr;
788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
79d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid JSGlobalData::storeVPtrs()
808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    CollectorCell cell;
82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    void* storage = &cell;
838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPILE_ASSERT(sizeof(JSArray) <= sizeof(CollectorCell), sizeof_JSArray_must_be_less_than_CollectorCell);
858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    JSCell* jsArray = new (storage) JSArray(JSArray::createStructure(jsNull()));
86d0825bca7fe65beaee391d30da42e937db621564Steve Block    JSGlobalData::jsArrayVPtr = jsArray->vptr();
878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    jsArray->~JSCell();
888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPILE_ASSERT(sizeof(JSByteArray) <= sizeof(CollectorCell), sizeof_JSByteArray_must_be_less_than_CollectorCell);
908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    JSCell* jsByteArray = new (storage) JSByteArray(JSByteArray::VPtrStealingHack);
91d0825bca7fe65beaee391d30da42e937db621564Steve Block    JSGlobalData::jsByteArrayVPtr = jsByteArray->vptr();
928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    jsByteArray->~JSCell();
938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPILE_ASSERT(sizeof(JSString) <= sizeof(CollectorCell), sizeof_JSString_must_be_less_than_CollectorCell);
958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    JSCell* jsString = new (storage) JSString(JSString::VPtrStealingHack);
96d0825bca7fe65beaee391d30da42e937db621564Steve Block    JSGlobalData::jsStringVPtr = jsString->vptr();
978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    jsString->~JSCell();
988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    COMPILE_ASSERT(sizeof(JSFunction) <= sizeof(CollectorCell), sizeof_JSFunction_must_be_less_than_CollectorCell);
1008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    JSCell* jsFunction = new (storage) JSFunction(JSFunction::createStructure(jsNull()));
101d0825bca7fe65beaee391d30da42e937db621564Steve Block    JSGlobalData::jsFunctionVPtr = jsFunction->vptr();
1028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    jsFunction->~JSCell();
1038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
105d0825bca7fe65beaee391d30da42e937db621564Steve BlockJSGlobalData::JSGlobalData(bool isShared)
1068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    : isSharedInstance(isShared)
1078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    , clientData(0)
1085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    , arrayTable(fastNew<HashTable>(JSC::arrayTable))
1095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    , dateTable(fastNew<HashTable>(JSC::dateTable))
1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , jsonTable(fastNew<HashTable>(JSC::jsonTable))
1115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    , mathTable(fastNew<HashTable>(JSC::mathTable))
1125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    , numberTable(fastNew<HashTable>(JSC::numberTable))
1135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    , regExpTable(fastNew<HashTable>(JSC::regExpTable))
1145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    , regExpConstructorTable(fastNew<HashTable>(JSC::regExpConstructorTable))
1155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    , stringTable(fastNew<HashTable>(JSC::stringTable))
116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    , activationStructure(JSActivation::createStructure(jsNull()))
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    , interruptedExecutionErrorStructure(JSObject::createStructure(jsNull()))
118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    , staticScopeStructure(JSStaticScopeObject::createStructure(jsNull()))
119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    , stringStructure(JSString::createStructure(jsNull()))
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    , notAnObjectErrorStubStructure(JSNotAnObjectErrorStub::createStructure(jsNull()))
121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    , notAnObjectStructure(JSNotAnObject::createStructure(jsNull()))
1220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , propertyNameIteratorStructure(JSPropertyNameIterator::createStructure(jsNull()))
1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , getterSetterStructure(GetterSetter::createStructure(jsNull()))
1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , apiWrapperStructure(JSAPIValueWrapper::createStructure(jsNull()))
125d0825bca7fe65beaee391d30da42e937db621564Steve Block    , dummyMarkableCellStructure(JSCell::createDummyStructure())
1260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32)
127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    , numberStructure(JSNumberCell::createStructure(jsNull()))
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , identifierTable(createIdentifierTable())
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , propertyNames(new CommonIdentifiers(this))
1315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    , emptyList(new MarkedArgumentBuffer)
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , lexer(new Lexer(this))
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , parser(new Parser)
1348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    , interpreter(new Interpreter)
1358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(JIT)
1368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    , jitStubs(this)
1378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif
1388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    , heap(this)
1398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    , initializingLazyNumericCompareFunction(false)
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , head(0)
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , dynamicGlobalObject(0)
142231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    , functionCodeBlockBeingReparsed(0)
1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , firstStringifierToMark(0)
144d0825bca7fe65beaee391d30da42e937db621564Steve Block    , markStack(jsArrayVPtr)
145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , cachedUTCOffset(NaN)
146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , weakRandom(static_cast<int>(currentTime()))
147231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef NDEBUG
148231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    , mainThreadOnly(false)
149231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC)
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    startProfilerServerIfNeeded();
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSGlobalData::~JSGlobalData()
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // By the time this is destroyed, heap.destroy() must already have been called.
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    delete interpreter;
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Zeroing out to make the behavior more predictable when someone attempts to use a deleted instance.
163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    interpreter = 0;
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    arrayTable->deleteTable();
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    dateTable->deleteTable();
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    jsonTable->deleteTable();
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mathTable->deleteTable();
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    numberTable->deleteTable();
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    regExpTable->deleteTable();
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    regExpConstructorTable->deleteTable();
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    stringTable->deleteTable();
1745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    fastDelete(const_cast<HashTable*>(arrayTable));
1765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    fastDelete(const_cast<HashTable*>(dateTable));
1770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    fastDelete(const_cast<HashTable*>(jsonTable));
1785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    fastDelete(const_cast<HashTable*>(mathTable));
1795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    fastDelete(const_cast<HashTable*>(numberTable));
1805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    fastDelete(const_cast<HashTable*>(regExpTable));
1815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    fastDelete(const_cast<HashTable*>(regExpConstructorTable));
1825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    fastDelete(const_cast<HashTable*>(stringTable));
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete parser;
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete lexer;
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(opaqueJSClassData);
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete emptyList;
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete propertyNames;
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteIdentifierTable(identifierTable);
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete clientData;
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
197d0825bca7fe65beaee391d30da42e937db621564Steve BlockPassRefPtr<JSGlobalData> JSGlobalData::createNonDefault()
198d0825bca7fe65beaee391d30da42e937db621564Steve Block{
199d0825bca7fe65beaee391d30da42e937db621564Steve Block    return adoptRef(new JSGlobalData(false));
200d0825bca7fe65beaee391d30da42e937db621564Steve Block}
201d0825bca7fe65beaee391d30da42e937db621564Steve Block
202d0825bca7fe65beaee391d30da42e937db621564Steve BlockPassRefPtr<JSGlobalData> JSGlobalData::create()
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
204d0825bca7fe65beaee391d30da42e937db621564Steve Block    JSGlobalData* globalData = new JSGlobalData(false);
205d0825bca7fe65beaee391d30da42e937db621564Steve Block    setDefaultIdentifierTable(globalData->identifierTable);
206d0825bca7fe65beaee391d30da42e937db621564Steve Block    setCurrentIdentifierTable(globalData->identifierTable);
207d0825bca7fe65beaee391d30da42e937db621564Steve Block    return adoptRef(globalData);
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<JSGlobalData> JSGlobalData::createLeaked()
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
212635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Structure::startIgnoringLeaks();
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<JSGlobalData> data = create();
214635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Structure::stopIgnoringLeaks();
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return data.release();
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool JSGlobalData::sharedInstanceExists()
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return sharedInstanceInternal();
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSGlobalData& JSGlobalData::sharedInstance()
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSGlobalData*& instance = sharedInstanceInternal();
226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!instance) {
227d0825bca7fe65beaee391d30da42e937db621564Steve Block        instance = new JSGlobalData(true);
228635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JSC_MULTIPLE_THREADS)
229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        instance->makeUsableFromMultipleThreads();
230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return *instance;
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSGlobalData*& JSGlobalData::sharedInstanceInternal()
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(JSLock::currentThreadIsHoldingLock());
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static JSGlobalData* sharedInstance;
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return sharedInstance;
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// FIXME: We can also detect forms like v1 < v2 ? -1 : 0, reverse comparison, etc.
243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectconst Vector<Instruction>& JSGlobalData::numericCompareFunction(ExecState* exec)
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!lazyNumericCompareFunction.size() && !initializingLazyNumericCompareFunction) {
246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        initializingLazyNumericCompareFunction = true;
247231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        RefPtr<FunctionExecutable> function = FunctionExecutable::fromGlobalCode(Identifier(exec, "numericCompare"), exec, 0, makeSource(UString("(function (v1, v2) { return v1 - v2; })")), 0, 0);
248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        lazyNumericCompareFunction = function->bytecode(exec, exec->scopeChain()).instructions();
249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        initializingLazyNumericCompareFunction = false;
250635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return lazyNumericCompareFunction;
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
255635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectJSGlobalData::ClientData::~ClientData()
256635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
259643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid JSGlobalData::resetDateCache()
260643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    cachedUTCOffset = NaN;
262643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    dstOffsetCache.reset();
263643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    cachedDateString = UString();
264643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    dateInstanceCache.reset();
265643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
266643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
267231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid JSGlobalData::startSampling()
268231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
269231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    interpreter->startSampling();
270231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
271231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
272231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid JSGlobalData::stopSampling()
273231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
274231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    interpreter->stopSampling();
275231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
276231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
277231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid JSGlobalData::dumpSampleData(ExecState* exec)
278231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
279231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    interpreter->dumpSampleData(exec);
280231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
281231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace JSC
283