1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/*
2e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Copyright (C) 2008, 2009, 2010 Apple Inc. All rights reserved.
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Cameron Zwarich <cwzwarich@uwaterloo.ca>
4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * are met:
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     documentation and/or other materials provided with the distribution.
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     its contributors may be used to endorse or promote products derived
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     from this software without specific prior written permission.
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef CodeBlock_h
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define CodeBlock_h
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "EvalCodeCache.h"
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Instruction.h"
358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "JITCode.h"
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "JSGlobalObject.h"
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "JumpTable.h"
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Nodes.h"
39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "RegExp.h"
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "UString.h"
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/FastAllocBase.h>
42e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <wtf/PassOwnPtr.h>
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/RefPtr.h>
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/Vector.h>
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "StructureStubInfo.h"
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// Register numbers used in bytecode operations have different meaning according to their ranges:
515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen//      0x80000000-0xFFFFFFFF  Negative indices from the CallFrame pointer are entries in the call frame, see RegisterFile.h.
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch//      0x00000000-0x3FFFFFFF  Forwards indices from the CallFrame pointer are local vars and temporaries with the function's callframe.
530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch//      0x40000000-0x7FFFFFFF  Positive indices from 0x40000000 specify entries in the constant pool on the CodeBlock.
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic const int FirstConstantRegisterIndex = 0x40000000;
550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace JSC {
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    enum HasSeenShouldRepatch {
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        hasSeenShouldRepatch
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    };
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class ExecState;
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    enum CodeType { GlobalCode, EvalCode, FunctionCode };
65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
66e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    inline int unmodifiedArgumentsRegister(int argumentsRegister) { return argumentsRegister - 1; }
67e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static ALWAYS_INLINE int missingThisObjectMarker() { return std::numeric_limits<int>::max(); }
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct HandlerInfo {
71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        uint32_t start;
72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        uint32_t end;
73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        uint32_t target;
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        uint32_t scopeDepth;
75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CodeLocationLabel nativeCode;
77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct ExpressionRangeInfo {
81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        enum {
82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            MaxOffset = (1 << 7) - 1,
83635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            MaxDivot = (1 << 25) - 1
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        };
85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        uint32_t instructionOffset : 25;
86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        uint32_t divotPoint : 25;
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        uint32_t startOffset : 7;
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        uint32_t endOffset : 7;
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct LineInfo {
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        uint32_t instructionOffset;
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int32_t lineNumber;
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct CallLinkInfo {
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CallLinkInfo()
992bde8e466a4451c7319e3a072d118917957d6554Steve Block            : hasSeenShouldRepatch(false)
100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CodeLocationNearCall callReturnLocation;
1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CodeLocationDataLabelPtr hotPathBegin;
1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CodeLocationNearCall hotPathOther;
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block        WriteBarrier<JSFunction> callee;
1072bde8e466a4451c7319e3a072d118917957d6554Steve Block        bool hasSeenShouldRepatch;
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1092bde8e466a4451c7319e3a072d118917957d6554Steve Block        void setUnlinked() { callee.clear(); }
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool isLinked() { return callee; }
1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool seenOnce()
1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        {
114692e5dbf12901edacf14812a6fae25462920af42Steve Block            return hasSeenShouldRepatch;
1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void setSeen()
1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        {
119692e5dbf12901edacf14812a6fae25462920af42Steve Block            hasSeenShouldRepatch = true;
1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    struct MethodCallLinkInfo {
1245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        MethodCallLinkInfo()
1255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        {
1265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
1275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool seenOnce()
1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        {
130692e5dbf12901edacf14812a6fae25462920af42Steve Block            ASSERT(!cachedStructure);
131692e5dbf12901edacf14812a6fae25462920af42Steve Block            return cachedPrototypeStructure;
1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
1330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void setSeen()
1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        {
136692e5dbf12901edacf14812a6fae25462920af42Steve Block            ASSERT(!cachedStructure && !cachedPrototypeStructure);
137692e5dbf12901edacf14812a6fae25462920af42Steve Block            // We use the values of cachedStructure & cachedPrototypeStructure to indicate the
138692e5dbf12901edacf14812a6fae25462920af42Steve Block            // current state.
139692e5dbf12901edacf14812a6fae25462920af42Steve Block            //     - In the initial state, both are null.
140692e5dbf12901edacf14812a6fae25462920af42Steve Block            //     - Once this transition has been taken once, cachedStructure is
141692e5dbf12901edacf14812a6fae25462920af42Steve Block            //       null and cachedPrototypeStructure is set to a nun-null value.
142692e5dbf12901edacf14812a6fae25462920af42Steve Block            //     - Once the call is linked both structures are set to non-null values.
1432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            cachedPrototypeStructure.setWithoutWriteBarrier((Structure*)1);
1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CodeLocationCall callReturnLocation;
1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CodeLocationDataLabelPtr structureLabel;
1482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        WriteBarrier<Structure> cachedStructure;
1492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        WriteBarrier<Structure> cachedPrototypeStructure;
1505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    };
1515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct GlobalResolveInfo {
153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        GlobalResolveInfo(unsigned bytecodeOffset)
1542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            : offset(0)
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , bytecodeOffset(bytecodeOffset)
156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        WriteBarrier<Structure> structure;
160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        unsigned offset;
161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        unsigned bytecodeOffset;
162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // This structure is used to map from a call return location
1658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // (given as an offset in bytes into the JIT code) back to
1668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // the bytecode index of the corresponding bytecode operation.
1678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // This is then used to look up the corresponding handler.
168e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    struct CallReturnOffsetToBytecodeOffset {
169e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        CallReturnOffsetToBytecodeOffset(unsigned callReturnOffset, unsigned bytecodeOffset)
1708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            : callReturnOffset(callReturnOffset)
171e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            , bytecodeOffset(bytecodeOffset)
172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
174635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        unsigned callReturnOffset;
176e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        unsigned bytecodeOffset;
177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1792bde8e466a4451c7319e3a072d118917957d6554Steve Block    // valueAtPosition helpers for the binarySearch algorithm.
180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
181635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    inline void* getStructureStubInfoReturnLocation(StructureStubInfo* structureStubInfo)
182635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
1830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return structureStubInfo->callReturnLocation.executableAddress();
184635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
186635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    inline void* getCallLinkInfoReturnLocation(CallLinkInfo* callLinkInfo)
187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
1880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return callLinkInfo->callReturnLocation.executableAddress();
189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    inline void* getMethodCallLinkInfoReturnLocation(MethodCallLinkInfo* methodCallLinkInfo)
1925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    {
1930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return methodCallLinkInfo->callReturnLocation.executableAddress();
1945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
1955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
196e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    inline unsigned getCallReturnOffset(CallReturnOffsetToBytecodeOffset* pc)
197635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
1988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return pc->callReturnOffset;
199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
200635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
202ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    class CodeBlock {
203ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        WTF_MAKE_FAST_ALLOCATED;
204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        friend class JIT;
205231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    protected:
206dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        CodeBlock(ScriptExecutable* ownerExecutable, CodeType, JSGlobalObject*, PassRefPtr<SourceProvider>, unsigned sourceOffset, SymbolTable* symbolTable, bool isConstructor);
207dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
2082bde8e466a4451c7319e3a072d118917957d6554Steve Block        WriteBarrier<JSGlobalObject> m_globalObject;
2092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        Heap* m_heap;
210dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
211635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    public:
212231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        virtual ~CodeBlock();
213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void markAggregate(MarkStack&);
215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        static void dumpStatistics();
217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if !defined(NDEBUG) || ENABLE_OPCODE_SAMPLING
219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void dump(ExecState*) const;
220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void printStructures(const Instruction*) const;
221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void printStructure(const char* name, const Instruction*, int operand) const;
222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
224a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        bool isStrictMode() const { return m_isStrictMode; }
225a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        inline bool isKnownNotImmediate(int index)
227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
228a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (index == m_thisRegister && !m_isStrictMode)
229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                return true;
230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (isConstantRegisterIndex(index))
232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                return getConstant(index).isCell();
233635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return false;
235635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ALWAYS_INLINE bool isTemporaryRegisterIndex(int index)
238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return index >= m_numVars;
240635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        HandlerInfo* handlerForBytecodeOffset(unsigned bytecodeOffset);
2434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        int lineNumberForBytecodeOffset(unsigned bytecodeOffset);
2444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        void expressionRangeForBytecodeOffset(unsigned bytecodeOffset, int& divot, int& startOffset, int& endOffset);
245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
247635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        StructureStubInfo& getStubInfo(ReturnAddressPtr returnAddress)
249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
2502bde8e466a4451c7319e3a072d118917957d6554Steve Block            return *(binarySearch<StructureStubInfo, void*, getStructureStubInfoReturnLocation>(m_structureStubInfos.begin(), m_structureStubInfos.size(), returnAddress.value()));
251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CallLinkInfo& getCallLinkInfo(ReturnAddressPtr returnAddress)
254635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
2552bde8e466a4451c7319e3a072d118917957d6554Steve Block            return *(binarySearch<CallLinkInfo, void*, getCallLinkInfoReturnLocation>(m_callLinkInfos.begin(), m_callLinkInfos.size(), returnAddress.value()));
256635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
257635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        MethodCallLinkInfo& getMethodCallLinkInfo(ReturnAddressPtr returnAddress)
2595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        {
2602bde8e466a4451c7319e3a072d118917957d6554Steve Block            return *(binarySearch<MethodCallLinkInfo, void*, getMethodCallLinkInfoReturnLocation>(m_methodCallLinkInfos.begin(), m_methodCallLinkInfos.size(), returnAddress.value()));
2615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
2625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        unsigned bytecodeOffset(ReturnAddressPtr returnAddress)
264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
2654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (!m_rareData)
26606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                return 1;
2674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            Vector<CallReturnOffsetToBytecodeOffset>& callIndices = m_rareData->m_callReturnIndexVector;
2684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (!callIndices.size())
2694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                return 1;
2702bde8e466a4451c7319e3a072d118917957d6554Steve Block            return binarySearch<CallReturnOffsetToBytecodeOffset, unsigned, getCallReturnOffset>(callIndices.begin(), callIndices.size(), getJITCode().offsetOf(returnAddress.value()))->bytecodeOffset;
271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
272e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
273e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
2744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        unsigned bytecodeOffset(Instruction* returnAddress)
275e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        {
276e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            return static_cast<Instruction*>(returnAddress) - instructions().begin();
277e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void setIsNumericCompareFunction(bool isNumericCompareFunction) { m_isNumericCompareFunction = isNumericCompareFunction; }
281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool isNumericCompareFunction() { return m_isNumericCompareFunction; }
282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<Instruction>& instructions() { return m_instructions; }
284231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void discardBytecode() { m_instructions.clear(); }
285231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef NDEBUG
287231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        unsigned instructionCount() { return m_instructionCount; }
288635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void setInstructionCount(unsigned instructionCount) { m_instructionCount = instructionCount; }
289635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
290635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
2926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        JITCode& getJITCode() { return m_isConstructor ? ownerExecutable()->generatedJITCodeForConstruct() : ownerExecutable()->generatedJITCodeForCall(); }
2936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        ExecutablePool* executablePool() { return getJITCode().getExecutablePool(); }
294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2962bde8e466a4451c7319e3a072d118917957d6554Steve Block        ScriptExecutable* ownerExecutable() const { return m_ownerExecutable.get(); }
297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
298635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void setGlobalData(JSGlobalData* globalData) { m_globalData = globalData; }
299635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void setThisRegister(int thisRegister) { m_thisRegister = thisRegister; }
301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int thisRegister() const { return m_thisRegister; }
302635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void setNeedsFullScopeChain(bool needsFullScopeChain) { m_needsFullScopeChain = needsFullScopeChain; }
304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool needsFullScopeChain() const { return m_needsFullScopeChain; }
305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void setUsesEval(bool usesEval) { m_usesEval = usesEval; }
306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool usesEval() const { return m_usesEval; }
307e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
308e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        void setArgumentsRegister(int argumentsRegister)
309e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        {
310e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            ASSERT(argumentsRegister != -1);
311e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            m_argumentsRegister = argumentsRegister;
312e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            ASSERT(usesArguments());
313e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
314e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int argumentsRegister()
315e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        {
316e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            ASSERT(usesArguments());
317e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            return m_argumentsRegister;
318e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
319a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        void setActivationRegister(int activationRegister)
320a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        {
321a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_activationRegister = activationRegister;
322a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
323a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int activationRegister()
324a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        {
325a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            ASSERT(needsFullScopeChain());
326a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return m_activationRegister;
327a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
328e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        bool usesArguments() const { return m_argumentsRegister != -1; }
329635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
330635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CodeType codeType() const { return m_codeType; }
331635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
332231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SourceProvider* source() const { return m_source.get(); }
333231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        unsigned sourceOffset() const { return m_sourceOffset; }
334635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t numberOfJumpTargets() const { return m_jumpTargets.size(); }
336635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void addJumpTarget(unsigned jumpTarget) { m_jumpTargets.append(jumpTarget); }
337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        unsigned jumpTarget(int index) const { return m_jumpTargets[index]; }
338635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        unsigned lastJumpTarget() const { return m_jumpTargets.last(); }
339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
340a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        void createActivation(CallFrame*);
341a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
342e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
343635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void addPropertyAccessInstruction(unsigned propertyAccessInstruction) { m_propertyAccessInstructions.append(propertyAccessInstruction); }
344635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void addGlobalResolveInstruction(unsigned globalResolveInstruction) { m_globalResolveInstructions.append(globalResolveInstruction); }
345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool hasGlobalResolveInstructionAtBytecodeOffset(unsigned bytecodeOffset);
346e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
347e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(JIT)
348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t numberOfStructureStubInfos() const { return m_structureStubInfos.size(); }
349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void addStructureStubInfo(const StructureStubInfo& stubInfo) { m_structureStubInfos.append(stubInfo); }
350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        StructureStubInfo& structureStubInfo(int index) { return m_structureStubInfos[index]; }
351635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void addGlobalResolveInfo(unsigned globalResolveInstruction) { m_globalResolveInfos.append(GlobalResolveInfo(globalResolveInstruction)); }
353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        GlobalResolveInfo& globalResolveInfo(int index) { return m_globalResolveInfos[index]; }
354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool hasGlobalResolveInfoAtBytecodeOffset(unsigned bytecodeOffset);
355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t numberOfCallLinkInfos() const { return m_callLinkInfos.size(); }
357635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void addCallLinkInfo() { m_callLinkInfos.append(CallLinkInfo()); }
358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CallLinkInfo& callLinkInfo(int index) { return m_callLinkInfos[index]; }
359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void addMethodCallLinkInfos(unsigned n) { m_methodCallLinkInfos.grow(n); }
3615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        MethodCallLinkInfo& methodCallLinkInfo(int index) { return m_methodCallLinkInfos[index]; }
362635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
364635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Exception handling support
365635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
366635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t numberOfExceptionHandlers() const { return m_rareData ? m_rareData->m_exceptionHandlers.size() : 0; }
367635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void addExceptionHandler(const HandlerInfo& hanler) { createRareDataIfNecessary(); return m_rareData->m_exceptionHandlers.append(hanler); }
368635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        HandlerInfo& exceptionHandler(int index) { ASSERT(m_rareData); return m_rareData->m_exceptionHandlers[index]; }
369635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        void addExpressionInfo(const ExpressionRangeInfo& expressionInfo)
3714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        {
3724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            createRareDataIfNecessary();
3734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            m_rareData->m_expressionInfo.append(expressionInfo);
3744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
375635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        void addLineInfo(unsigned bytecodeOffset, int lineNo)
3774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        {
3784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            createRareDataIfNecessary();
3794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            Vector<LineInfo>& lineInfo = m_rareData->m_lineInfo;
3804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (!lineInfo.size() || lineInfo.last().lineNumber != lineNo) {
3814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                LineInfo info = { bytecodeOffset, lineNo };
3824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                lineInfo.append(info);
3834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            }
3844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
385635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        bool hasExpressionInfo() { return m_rareData && m_rareData->m_expressionInfo.size(); }
3874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        bool hasLineInfo() { return m_rareData && m_rareData->m_lineInfo.size(); }
3882bde8e466a4451c7319e3a072d118917957d6554Steve Block        //  We only generate exception handling info if the user is debugging
3892bde8e466a4451c7319e3a072d118917957d6554Steve Block        // (and may want line number info), or if the function contains exception handler.
3904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        bool needsCallReturnIndices()
3914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        {
3924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            return m_rareData &&
3934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                (m_rareData->m_expressionInfo.size() || m_rareData->m_lineInfo.size() || m_rareData->m_exceptionHandlers.size());
3944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
395635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
3974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        Vector<CallReturnOffsetToBytecodeOffset>& callReturnIndexVector()
3984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        {
3994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            createRareDataIfNecessary();
4004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            return m_rareData->m_callReturnIndexVector;
4014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
402635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
403635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
404635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Constant Pool
405635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
406635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t numberOfIdentifiers() const { return m_identifiers.size(); }
407635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void addIdentifier(const Identifier& i) { return m_identifiers.append(i); }
408635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Identifier& identifier(int index) { return m_identifiers[index]; }
409635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
410635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t numberOfConstantRegisters() const { return m_constantRegisters.size(); }
4112bde8e466a4451c7319e3a072d118917957d6554Steve Block        void addConstant(JSValue v)
4122bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
4132bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_constantRegisters.append(WriteBarrier<Unknown>());
4142bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_constantRegisters.last().set(m_globalObject->globalData(), m_ownerExecutable.get(), v);
4152bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
4162bde8e466a4451c7319e3a072d118917957d6554Steve Block        WriteBarrier<Unknown>& constantRegister(int index) { return m_constantRegisters[index - FirstConstantRegisterIndex]; }
417643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ALWAYS_INLINE bool isConstantRegisterIndex(int index) const { return index >= FirstConstantRegisterIndex; }
4182bde8e466a4451c7319e3a072d118917957d6554Steve Block        ALWAYS_INLINE JSValue getConstant(int index) const { return m_constantRegisters[index - FirstConstantRegisterIndex].get(); }
419635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4202bde8e466a4451c7319e3a072d118917957d6554Steve Block        unsigned addFunctionDecl(FunctionExecutable* n)
4212bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
4222bde8e466a4451c7319e3a072d118917957d6554Steve Block            unsigned size = m_functionDecls.size();
4232bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_functionDecls.append(WriteBarrier<FunctionExecutable>());
4242bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_functionDecls.last().set(m_globalObject->globalData(), m_ownerExecutable.get(), n);
4252bde8e466a4451c7319e3a072d118917957d6554Steve Block            return size;
4262bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
427231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        FunctionExecutable* functionDecl(int index) { return m_functionDecls[index].get(); }
428231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        int numberOfFunctionDecls() { return m_functionDecls.size(); }
4292bde8e466a4451c7319e3a072d118917957d6554Steve Block        unsigned addFunctionExpr(FunctionExecutable* n)
4302bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
4312bde8e466a4451c7319e3a072d118917957d6554Steve Block            unsigned size = m_functionExprs.size();
4322bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_functionExprs.append(WriteBarrier<FunctionExecutable>());
4332bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_functionExprs.last().set(m_globalObject->globalData(), m_ownerExecutable.get(), n);
4342bde8e466a4451c7319e3a072d118917957d6554Steve Block            return size;
4352bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
436231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        FunctionExecutable* functionExpr(int index) { return m_functionExprs[index].get(); }
437635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4382bde8e466a4451c7319e3a072d118917957d6554Steve Block        unsigned addRegExp(PassRefPtr<RegExp> r) { createRareDataIfNecessary(); unsigned size = m_rareData->m_regexps.size(); m_rareData->m_regexps.append(r); return size; }
4396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        RegExp* regexp(int index) const { ASSERT(m_rareData); return m_rareData->m_regexps[index].get(); }
4406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
4412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        JSGlobalObject* globalObject() { return m_globalObject.get(); }
4426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
443635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Jump Tables
444635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
445635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t numberOfImmediateSwitchJumpTables() const { return m_rareData ? m_rareData->m_immediateSwitchJumpTables.size() : 0; }
446635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        SimpleJumpTable& addImmediateSwitchJumpTable() { createRareDataIfNecessary(); m_rareData->m_immediateSwitchJumpTables.append(SimpleJumpTable()); return m_rareData->m_immediateSwitchJumpTables.last(); }
447635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        SimpleJumpTable& immediateSwitchJumpTable(int tableIndex) { ASSERT(m_rareData); return m_rareData->m_immediateSwitchJumpTables[tableIndex]; }
448635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
449635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t numberOfCharacterSwitchJumpTables() const { return m_rareData ? m_rareData->m_characterSwitchJumpTables.size() : 0; }
450635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        SimpleJumpTable& addCharacterSwitchJumpTable() { createRareDataIfNecessary(); m_rareData->m_characterSwitchJumpTables.append(SimpleJumpTable()); return m_rareData->m_characterSwitchJumpTables.last(); }
451635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        SimpleJumpTable& characterSwitchJumpTable(int tableIndex) { ASSERT(m_rareData); return m_rareData->m_characterSwitchJumpTables[tableIndex]; }
452635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
453635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t numberOfStringSwitchJumpTables() const { return m_rareData ? m_rareData->m_stringSwitchJumpTables.size() : 0; }
454635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        StringJumpTable& addStringSwitchJumpTable() { createRareDataIfNecessary(); m_rareData->m_stringSwitchJumpTables.append(StringJumpTable()); return m_rareData->m_stringSwitchJumpTables.last(); }
455635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        StringJumpTable& stringSwitchJumpTable(int tableIndex) { ASSERT(m_rareData); return m_rareData->m_stringSwitchJumpTables[tableIndex]; }
456635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
457635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
458231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SymbolTable* symbolTable() { return m_symbolTable; }
459231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SharedSymbolTable* sharedSymbolTable() { ASSERT(m_codeType == FunctionCode); return static_cast<SharedSymbolTable*>(m_symbolTable); }
460635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
461231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        EvalCodeCache& evalCodeCache() { createRareDataIfNecessary(); return m_rareData->m_evalCodeCache; }
462635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
463635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void shrinkToFit();
464635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
465635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // FIXME: Make these remaining members private.
466635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
467635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int m_numCalleeRegisters;
468635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int m_numVars;
469bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int m_numCapturedVars;
470635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int m_numParameters;
4716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        bool m_isConstructor;
472635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
473635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    private:
474635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if !defined(NDEBUG) || ENABLE(OPCODE_SAMPLING)
475635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void dump(ExecState*, const Vector<Instruction>::const_iterator& begin, Vector<Instruction>::const_iterator&) const;
476643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
477643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        CString registerName(ExecState*, int r) const;
478643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        void printUnaryOp(ExecState*, int location, Vector<Instruction>::const_iterator&, const char* op) const;
479643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        void printBinaryOp(ExecState*, int location, Vector<Instruction>::const_iterator&, const char* op) const;
480643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        void printConditionalJump(ExecState*, const Vector<Instruction>::const_iterator&, Vector<Instruction>::const_iterator&, int location, const char* op) const;
481643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        void printGetByIdOp(ExecState*, int location, Vector<Instruction>::const_iterator&, const char* op) const;
482643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        void printPutByIdOp(ExecState*, int location, Vector<Instruction>::const_iterator&, const char* op) const;
483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
4842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        void markStructures(MarkStack&, Instruction* vPC) const;
485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
486635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void createRareDataIfNecessary()
487635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
488635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (!m_rareData)
489e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                m_rareData = adoptPtr(new RareData);
490635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
491635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4922bde8e466a4451c7319e3a072d118917957d6554Steve Block        WriteBarrier<ScriptExecutable> m_ownerExecutable;
493635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        JSGlobalData* m_globalData;
494635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
495635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<Instruction> m_instructions;
496635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef NDEBUG
497635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        unsigned m_instructionCount;
498635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
499635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
500635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int m_thisRegister;
501e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int m_argumentsRegister;
502a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int m_activationRegister;
503635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
504635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool m_needsFullScopeChain;
505635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool m_usesEval;
506635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool m_isNumericCompareFunction;
507a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        bool m_isStrictMode;
508635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
509635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CodeType m_codeType;
510635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
511635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        RefPtr<SourceProvider> m_source;
512635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        unsigned m_sourceOffset;
513635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
514e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
515635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<unsigned> m_propertyAccessInstructions;
516635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<unsigned> m_globalResolveInstructions;
517e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
518e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(JIT)
519635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<StructureStubInfo> m_structureStubInfos;
520635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<GlobalResolveInfo> m_globalResolveInfos;
521635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<CallLinkInfo> m_callLinkInfos;
5225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        Vector<MethodCallLinkInfo> m_methodCallLinkInfos;
523635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
524635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
525635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<unsigned> m_jumpTargets;
526635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
527635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Constant Pool
528635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<Identifier> m_identifiers;
5292bde8e466a4451c7319e3a072d118917957d6554Steve Block        COMPILE_ASSERT(sizeof(Register) == sizeof(WriteBarrier<Unknown>), Register_must_be_same_size_as_WriteBarrier_Unknown);
5302bde8e466a4451c7319e3a072d118917957d6554Steve Block        Vector<WriteBarrier<Unknown> > m_constantRegisters;
5312bde8e466a4451c7319e3a072d118917957d6554Steve Block        Vector<WriteBarrier<FunctionExecutable> > m_functionDecls;
5322bde8e466a4451c7319e3a072d118917957d6554Steve Block        Vector<WriteBarrier<FunctionExecutable> > m_functionExprs;
533635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
534231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SymbolTable* m_symbolTable;
535058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu
536ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        struct RareData {
537ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch           WTF_MAKE_FAST_ALLOCATED;
538ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        public:
539635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Vector<HandlerInfo> m_exceptionHandlers;
540635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
5416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            // Rare Constants
5426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            Vector<RefPtr<RegExp> > m_regexps;
5436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
544635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // Jump Tables
545635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Vector<SimpleJumpTable> m_immediateSwitchJumpTables;
546635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Vector<SimpleJumpTable> m_characterSwitchJumpTables;
547635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Vector<StringJumpTable> m_stringSwitchJumpTables;
548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
549635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            EvalCodeCache m_evalCodeCache;
550635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
5514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            // Expression info - present if debugging.
5524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            Vector<ExpressionRangeInfo> m_expressionInfo;
5534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            // Line info - present if profiling or debugging.
5544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            Vector<LineInfo> m_lineInfo;
555635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
5564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            Vector<CallReturnOffsetToBytecodeOffset> m_callReturnIndexVector;
557635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
558635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        };
55981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if COMPILER(MSVC)
560ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        friend void WTF::deleteOwnedPtr<RareData>(RareData*);
561ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif
562635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        OwnPtr<RareData> m_rareData;
563635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
564635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
565635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Program code is not marked by any function, so we make the global object
566635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // responsible for marking it.
567635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
568231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    class GlobalCodeBlock : public CodeBlock {
569635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    public:
570dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        GlobalCodeBlock(ScriptExecutable* ownerExecutable, CodeType codeType, JSGlobalObject* globalObject, PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset)
571dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            : CodeBlock(ownerExecutable, codeType, globalObject, sourceProvider, sourceOffset, &m_unsharedSymbolTable, false)
572635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
573635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
574635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
575635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    private:
576231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SymbolTable m_unsharedSymbolTable;
577635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
578635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
579231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    class ProgramCodeBlock : public GlobalCodeBlock {
580635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    public:
581231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ProgramCodeBlock(ProgramExecutable* ownerExecutable, CodeType codeType, JSGlobalObject* globalObject, PassRefPtr<SourceProvider> sourceProvider)
582dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            : GlobalCodeBlock(ownerExecutable, codeType, globalObject, sourceProvider, 0)
583231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        {
584231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
585231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    };
586231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
587231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    class EvalCodeBlock : public GlobalCodeBlock {
588231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    public:
589231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        EvalCodeBlock(EvalExecutable* ownerExecutable, JSGlobalObject* globalObject, PassRefPtr<SourceProvider> sourceProvider, int baseScopeDepth)
590dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            : GlobalCodeBlock(ownerExecutable, EvalCode, globalObject, sourceProvider, 0)
591635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , m_baseScopeDepth(baseScopeDepth)
592635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
593635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
594635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
595635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int baseScopeDepth() const { return m_baseScopeDepth; }
596635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
597231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        const Identifier& variable(unsigned index) { return m_variables[index]; }
598231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        unsigned numVariables() { return m_variables.size(); }
599231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void adoptVariables(Vector<Identifier>& variables)
600231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        {
601231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            ASSERT(m_variables.isEmpty());
602231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            m_variables.swap(variables);
603231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
604231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
605635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    private:
606635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int m_baseScopeDepth;
607231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        Vector<Identifier> m_variables;
608231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    };
609231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
610231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    class FunctionCodeBlock : public CodeBlock {
611231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    public:
612231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // Rather than using the usual RefCounted::create idiom for SharedSymbolTable we just use new
613231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // as we need to initialise the CodeBlock before we could initialise any RefPtr to hold the shared
614231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // symbol table, so we just pass as a raw pointer with a ref count of 1.  We then manually deref
615231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // in the destructor.
616dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        FunctionCodeBlock(FunctionExecutable* ownerExecutable, CodeType codeType, JSGlobalObject* globalObject, PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset, bool isConstructor)
61728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            : CodeBlock(ownerExecutable, codeType, globalObject, sourceProvider, sourceOffset, SharedSymbolTable::create().leakRef(), isConstructor)
618231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        {
619231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
620231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ~FunctionCodeBlock()
621231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        {
622231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            sharedSymbolTable()->deref();
623231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
624635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
625635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    inline Register& ExecState::r(int index)
6270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
6280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CodeBlock* codeBlock = this->codeBlock();
6290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (codeBlock->isConstantRegisterIndex(index))
6302bde8e466a4451c7319e3a072d118917957d6554Steve Block            return *reinterpret_cast<Register*>(&codeBlock->constantRegister(index));
6310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return this[index];
6320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
6330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    inline Register& ExecState::uncheckedR(int index)
6354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    {
6364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ASSERT(index < FirstConstantRegisterIndex);
6374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return this[index];
6384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
6394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
640635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace JSC
641635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
642635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // CodeBlock_h
643