18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
25f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2008, 2009 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#ifndef JSGlobalData_h
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define JSGlobalData_h
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3221939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "CachedTranscendentalFunction.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Heap.h"
34cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "DateInstanceCache.h"
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "ExecutableAllocator.h"
362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "Strong.h"
378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "JITStubs.h"
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "JSValue.h"
39231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "NumericStrings.h"
408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "SmallStrings.h"
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Terminator.h"
428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "TimeoutChecker.h"
43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WeakRandom.h"
440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include <wtf/BumpPointerAllocator.h>
458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <wtf/Forward.h>
468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <wtf/HashMap.h>
478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <wtf/RefCounted.h>
4806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <wtf/ThreadSpecific.h>
49f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include <wtf/WTFThreadData.h>
505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if ENABLE(REGEXP_TRACING)
515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include <wtf/ListHashSet.h>
525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct OpaqueJSClass;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct OpaqueJSClassContextData;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    class CodeBlock;
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class CommonIdentifiers;
612bde8e466a4451c7319e3a072d118917957d6554Steve Block    class HandleStack;
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class IdentifierTable;
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class Interpreter;
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class JSGlobalObject;
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class JSObject;
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class Lexer;
6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    class NativeExecutable;
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class Parser;
6906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    class RegExpCache;
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class Stringifier;
71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class Structure;
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class UString;
735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if ENABLE(REGEXP_TRACING)
745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    class RegExp;
755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    struct HashTable;
782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    struct Instruction;
792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    struct DSTOffsetCache {
81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        DSTOffsetCache()
82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        {
83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            reset();
84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        void reset()
87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        {
88643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            offset = 0.0;
89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            start = 0.0;
90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            end = -1.0;
91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            increment = 0.0;
92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
93643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        double offset;
95643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        double start;
96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        double end;
97643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        double increment;
98643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    };
99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    enum ThreadStackType {
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ThreadStackTypeLarge,
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ThreadStackTypeSmall
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    };
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class JSGlobalData : public RefCounted<JSGlobalData> {
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    public:
10721939df44de1705786c545cd1bf519d47250322dBen Murdoch        // WebCore has a one-to-one mapping of threads to JSGlobalDatas;
10821939df44de1705786c545cd1bf519d47250322dBen Murdoch        // either create() or createLeaked() should only be called once
10921939df44de1705786c545cd1bf519d47250322dBen Murdoch        // on a thread, this is the 'default' JSGlobalData (it uses the
11021939df44de1705786c545cd1bf519d47250322dBen Murdoch        // thread's default string uniquing table from wtfThreadData).
11121939df44de1705786c545cd1bf519d47250322dBen Murdoch        // API contexts created using the new context group aware interface
11221939df44de1705786c545cd1bf519d47250322dBen Murdoch        // create APIContextGroup objects which require less locking of JSC
11321939df44de1705786c545cd1bf519d47250322dBen Murdoch        // than the old singleton APIShared JSGlobalData created for use by
11421939df44de1705786c545cd1bf519d47250322dBen Murdoch        // the original API.
11521939df44de1705786c545cd1bf519d47250322dBen Murdoch        enum GlobalDataType { Default, APIContextGroup, APIShared };
11621939df44de1705786c545cd1bf519d47250322dBen Murdoch
1178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        struct ClientData {
1188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            virtual ~ClientData() = 0;
1198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        };
1208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
12121939df44de1705786c545cd1bf519d47250322dBen Murdoch        bool isSharedInstance() { return globalDataType == APIShared; }
1224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        bool usingAPI() { return globalDataType != Default; }
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static bool sharedInstanceExists();
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static JSGlobalData& sharedInstance();
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static PassRefPtr<JSGlobalData> create(ThreadStackType);
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static PassRefPtr<JSGlobalData> createLeaked(ThreadStackType);
12821939df44de1705786c545cd1bf519d47250322dBen Murdoch        static PassRefPtr<JSGlobalData> createContextGroup(ThreadStackType);
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ~JSGlobalData();
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JSC_MULTIPLE_THREADS)
132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Will start tracking threads that use the heap, which is resource-heavy.
1332bde8e466a4451c7319e3a072d118917957d6554Steve Block        void makeUsableFromMultipleThreads() { heap.machineThreads().makeUsableFromMultipleThreads(); }
134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
13621939df44de1705786c545cd1bf519d47250322dBen Murdoch        GlobalDataType globalDataType;
1378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        ClientData* clientData;
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const HashTable* arrayTable;
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const HashTable* dateTable;
1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        const HashTable* jsonTable;
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const HashTable* mathTable;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const HashTable* numberTable;
14481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        const HashTable* objectConstructorTable;
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const HashTable* regExpTable;
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const HashTable* regExpConstructorTable;
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const HashTable* stringTable;
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> structureStructure;
1502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> activationStructure;
1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> interruptedExecutionErrorStructure;
1522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> terminatedExecutionErrorStructure;
1532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> staticScopeStructure;
1542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> strictEvalActivationStructure;
1552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> stringStructure;
1562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> notAnObjectStructure;
1572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> propertyNameIteratorStructure;
1582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> getterSetterStructure;
1592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> apiWrapperStructure;
1602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> scopeChainNodeStructure;
1612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> executableStructure;
1622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> nativeExecutableStructure;
1632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> evalExecutableStructure;
1642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> programExecutableStructure;
1652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> functionExecutableStructure;
1662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> dummyMarkableCellStructure;
1672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> structureChainStructure;
1682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(JSC_ZOMBIES)
1702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Strong<Structure> zombieStructure;
1712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
173d0825bca7fe65beaee391d30da42e937db621564Steve Block        static void storeVPtrs();
174d0825bca7fe65beaee391d30da42e937db621564Steve Block        static JS_EXPORTDATA void* jsArrayVPtr;
175d0825bca7fe65beaee391d30da42e937db621564Steve Block        static JS_EXPORTDATA void* jsByteArrayVPtr;
176d0825bca7fe65beaee391d30da42e937db621564Steve Block        static JS_EXPORTDATA void* jsStringVPtr;
177d0825bca7fe65beaee391d30da42e937db621564Steve Block        static JS_EXPORTDATA void* jsFunctionVPtr;
1788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        IdentifierTable* identifierTable;
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CommonIdentifiers* propertyNames;
1815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        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.
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SmallStrings smallStrings;
183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        NumericStrings numericStrings;
184cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        DateInstanceCache dateInstanceCache;
185cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(ASSEMBLER)
1878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        ExecutableAllocator executableAllocator;
188f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        ExecutableAllocator regexAllocator;
1898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
191967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if !ENABLE(JIT)
192967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        bool canUseJIT() { return false; } // interpreter only
193967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#elif !ENABLE(INTERPRETER)
194967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        bool canUseJIT() { return true; } // jit only
195e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#else
196967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        bool canUseJIT() { return m_canUseJIT; }
197e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
198f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
199f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        const StackBounds& stack()
200f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        {
201f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return (globalDataType == Default)
202f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                ? m_stack
203f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                : wtfThreadData().stack();
204f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
205f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Lexer* lexer;
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Parser* parser;
2088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        Interpreter* interpreter;
2098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(JIT)
210967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        OwnPtr<JITThunks> jitStubs;
211e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        MacroAssemblerCodePtr getCTIStub(ThunkGenerator generator)
21221939df44de1705786c545cd1bf519d47250322dBen Murdoch        {
213967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            return jitStubs->ctiStub(this, generator);
21421939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
2152bde8e466a4451c7319e3a072d118917957d6554Steve Block        NativeExecutable* getHostFunction(NativeFunction, ThunkGenerator);
2168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif
2172bde8e466a4451c7319e3a072d118917957d6554Steve Block        NativeExecutable* getHostFunction(NativeFunction);
21881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        TimeoutChecker timeoutChecker;
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Terminator terminator;
2218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        Heap heap;
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2232bde8e466a4451c7319e3a072d118917957d6554Steve Block        JSValue exception;
2248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(JIT)
2250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ReturnAddressPtr exceptionLocation;
2268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HashMap<OpaqueJSClass*, OpaqueJSClassContextData*> opaqueJSClassData;
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        unsigned globalObjectCount;
2318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        JSGlobalObject* dynamicGlobalObject;
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
233ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        HashSet<JSObject*> stringRecursionCheckVisitedObjects;
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        double cachedUTCOffset;
236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        DSTOffsetCache dstOffsetCache;
237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        UString cachedDateString;
239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        double cachedDateStringValue;
240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int maxReentryDepth;
24206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
24306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        RegExpCache* m_regExpCache;
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        BumpPointerAllocator m_regExpAllocator;
2450617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
2465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if ENABLE(REGEXP_TRACING)
2475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        typedef ListHashSet<RefPtr<RegExp> > RTTraceList;
2485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        RTTraceList* m_rtTraceList;
2495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
2505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
251231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef NDEBUG
252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ThreadIdentifier exclusiveThread;
253231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
254231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
25521939df44de1705786c545cd1bf519d47250322dBen Murdoch        CachedTranscendentalFunction<sin> cachedSin;
25621939df44de1705786c545cd1bf519d47250322dBen Murdoch
257643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        void resetDateCache();
258643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
259231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void startSampling();
260231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void stopSampling();
261231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void dumpSampleData(ExecState* exec);
262f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        void recompileAllJSFunctions();
26306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        RegExpCache* regExpCache() { return m_regExpCache; }
2645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if ENABLE(REGEXP_TRACING)
2655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        void addRegExpToTrace(PassRefPtr<RegExp> regExp);
2665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
2675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        void dumpRegExpTrace();
26881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        HandleSlot allocateGlobalHandle() { return heap.allocateGlobalHandle(); }
2692bde8e466a4451c7319e3a072d118917957d6554Steve Block        HandleSlot allocateLocalHandle() { return heap.allocateLocalHandle(); }
2702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        void clearBuiltinStructures();
27181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    private:
27321939df44de1705786c545cd1bf519d47250322dBen Murdoch        JSGlobalData(GlobalDataType, ThreadStackType);
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static JSGlobalData*& sharedInstanceInternal();
2755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void createNativeThunk();
276e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(JIT) && ENABLE(INTERPRETER)
277e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        bool m_canUseJIT;
278e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
279f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        StackBounds m_stack;
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
28121939df44de1705786c545cd1bf519d47250322dBen Murdoch
2822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    inline HandleSlot allocateGlobalHandle(JSGlobalData& globalData)
2832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
2842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return globalData.allocateGlobalHandle();
2852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
2862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} // namespace JSC
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif // JSGlobalData_h
290