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