⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 codeblock.h

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 H
📖 第 1 页 / 共 2 页
字号:
            if (pos != lastPos) {                m_linkedCallerList[pos] = m_linkedCallerList[lastPos];                m_linkedCallerList[pos]->position = pos;            }            m_linkedCallerList.shrink(lastPos);        }        StructureStubInfo& getStubInfo(void* returnAddress)        {            return *(binaryChop<StructureStubInfo, void*, getStructureStubInfoReturnLocation>(m_structureStubInfos.begin(), m_structureStubInfos.size(), returnAddress));        }        CallLinkInfo& getCallLinkInfo(void* returnAddress)        {            return *(binaryChop<CallLinkInfo, void*, getCallLinkInfoReturnLocation>(m_callLinkInfos.begin(), m_callLinkInfos.size(), returnAddress));        }        unsigned getBytecodeIndex(CallFrame* callFrame, void* nativePC)        {            reparseForExceptionInfoIfNecessary(callFrame);            return binaryChop<CallReturnOffsetToBytecodeIndex, unsigned, getCallReturnOffset>(m_exceptionInfo->m_callReturnIndexVector.begin(), m_exceptionInfo->m_callReturnIndexVector.size(), m_jitCode.code.offsetOf(nativePC))->bytecodeIndex;        }                bool functionRegisterForBytecodeOffset(unsigned bytecodeOffset, int& functionRegisterIndex);#endif        void setIsNumericCompareFunction(bool isNumericCompareFunction) { m_isNumericCompareFunction = isNumericCompareFunction; }        bool isNumericCompareFunction() { return m_isNumericCompareFunction; }        Vector<Instruction>& instructions() { return m_instructions; }#ifndef NDEBUG        void setInstructionCount(unsigned instructionCount) { m_instructionCount = instructionCount; }#endif#if ENABLE(JIT)        void setJITCode(JITCodeRef& jitCode);        JITCode jitCode() { return m_jitCode.code; }        ExecutablePool* executablePool() { return m_jitCode.executablePool.get(); }#endif        ScopeNode* ownerNode() const { return m_ownerNode; }        void setGlobalData(JSGlobalData* globalData) { m_globalData = globalData; }        void setThisRegister(int thisRegister) { m_thisRegister = thisRegister; }        int thisRegister() const { return m_thisRegister; }        void setNeedsFullScopeChain(bool needsFullScopeChain) { m_needsFullScopeChain = needsFullScopeChain; }        bool needsFullScopeChain() const { return m_needsFullScopeChain; }        void setUsesEval(bool usesEval) { m_usesEval = usesEval; }        bool usesEval() const { return m_usesEval; }        void setUsesArguments(bool usesArguments) { m_usesArguments = usesArguments; }        bool usesArguments() const { return m_usesArguments; }        CodeType codeType() const { return m_codeType; }        SourceProvider* source() const { return m_source.get(); }        unsigned sourceOffset() const { return m_sourceOffset; }        size_t numberOfJumpTargets() const { return m_jumpTargets.size(); }        void addJumpTarget(unsigned jumpTarget) { m_jumpTargets.append(jumpTarget); }        unsigned jumpTarget(int index) const { return m_jumpTargets[index]; }        unsigned lastJumpTarget() const { return m_jumpTargets.last(); }#if !ENABLE(JIT)        void addPropertyAccessInstruction(unsigned propertyAccessInstruction) { m_propertyAccessInstructions.append(propertyAccessInstruction); }        void addGlobalResolveInstruction(unsigned globalResolveInstruction) { m_globalResolveInstructions.append(globalResolveInstruction); }        bool hasGlobalResolveInstructionAtBytecodeOffset(unsigned bytecodeOffset);#else        size_t numberOfStructureStubInfos() const { return m_structureStubInfos.size(); }        void addStructureStubInfo(const StructureStubInfo& stubInfo) { m_structureStubInfos.append(stubInfo); }        StructureStubInfo& structureStubInfo(int index) { return m_structureStubInfos[index]; }        void addGlobalResolveInfo(unsigned globalResolveInstruction) { m_globalResolveInfos.append(GlobalResolveInfo(globalResolveInstruction)); }        GlobalResolveInfo& globalResolveInfo(int index) { return m_globalResolveInfos[index]; }        bool hasGlobalResolveInfoAtBytecodeOffset(unsigned bytecodeOffset);        size_t numberOfCallLinkInfos() const { return m_callLinkInfos.size(); }        void addCallLinkInfo() { m_callLinkInfos.append(CallLinkInfo()); }        CallLinkInfo& callLinkInfo(int index) { return m_callLinkInfos[index]; }        void addFunctionRegisterInfo(unsigned bytecodeOffset, int functionIndex) { createRareDataIfNecessary(); m_rareData->m_functionRegisterInfos.append(FunctionRegisterInfo(bytecodeOffset, functionIndex)); }#endif        // Exception handling support        size_t numberOfExceptionHandlers() const { return m_rareData ? m_rareData->m_exceptionHandlers.size() : 0; }        void addExceptionHandler(const HandlerInfo& hanler) { createRareDataIfNecessary(); return m_rareData->m_exceptionHandlers.append(hanler); }        HandlerInfo& exceptionHandler(int index) { ASSERT(m_rareData); return m_rareData->m_exceptionHandlers[index]; }        bool hasExceptionInfo() const { return m_exceptionInfo; }        void clearExceptionInfo() { m_exceptionInfo.clear(); }        void addExpressionInfo(const ExpressionRangeInfo& expressionInfo) { ASSERT(m_exceptionInfo); m_exceptionInfo->m_expressionInfo.append(expressionInfo); }        void addGetByIdExceptionInfo(const GetByIdExceptionInfo& info) { ASSERT(m_exceptionInfo); m_exceptionInfo->m_getByIdExceptionInfo.append(info); }        size_t numberOfLineInfos() const { ASSERT(m_exceptionInfo); return m_exceptionInfo->m_lineInfo.size(); }        void addLineInfo(const LineInfo& lineInfo) { ASSERT(m_exceptionInfo); m_exceptionInfo->m_lineInfo.append(lineInfo); }        LineInfo& lastLineInfo() { ASSERT(m_exceptionInfo); return m_exceptionInfo->m_lineInfo.last(); }#if ENABLE(JIT)        Vector<CallReturnOffsetToBytecodeIndex>& callReturnIndexVector() { ASSERT(m_exceptionInfo); return m_exceptionInfo->m_callReturnIndexVector; }#endif        // Constant Pool        size_t numberOfIdentifiers() const { return m_identifiers.size(); }        void addIdentifier(const Identifier& i) { return m_identifiers.append(i); }        Identifier& identifier(int index) { return m_identifiers[index]; }        size_t numberOfConstantRegisters() const { return m_constantRegisters.size(); }        void addConstantRegister(const Register& r) { return m_constantRegisters.append(r); }        Register& constantRegister(int index) { return m_constantRegisters[index]; }        unsigned addFunctionExpression(FuncExprNode* n) { unsigned size = m_functionExpressions.size(); m_functionExpressions.append(n); return size; }        FuncExprNode* functionExpression(int index) const { return m_functionExpressions[index].get(); }        unsigned addFunction(FuncDeclNode* n) { createRareDataIfNecessary(); unsigned size = m_rareData->m_functions.size(); m_rareData->m_functions.append(n); return size; }        FuncDeclNode* function(int index) const { ASSERT(m_rareData); return m_rareData->m_functions[index].get(); }        bool hasFunctions() const { return m_functionExpressions.size() || (m_rareData && m_rareData->m_functions.size()); }        unsigned addUnexpectedConstant(JSValuePtr v) { createRareDataIfNecessary(); unsigned size = m_rareData->m_unexpectedConstants.size(); m_rareData->m_unexpectedConstants.append(v); return size; }        JSValuePtr unexpectedConstant(int index) const { ASSERT(m_rareData); return m_rareData->m_unexpectedConstants[index]; }        unsigned addRegExp(RegExp* r) { createRareDataIfNecessary(); unsigned size = m_rareData->m_regexps.size(); m_rareData->m_regexps.append(r); return size; }        RegExp* regexp(int index) const { ASSERT(m_rareData); return m_rareData->m_regexps[index].get(); }        // Jump Tables        size_t numberOfImmediateSwitchJumpTables() const { return m_rareData ? m_rareData->m_immediateSwitchJumpTables.size() : 0; }        SimpleJumpTable& addImmediateSwitchJumpTable() { createRareDataIfNecessary(); m_rareData->m_immediateSwitchJumpTables.append(SimpleJumpTable()); return m_rareData->m_immediateSwitchJumpTables.last(); }        SimpleJumpTable& immediateSwitchJumpTable(int tableIndex) { ASSERT(m_rareData); return m_rareData->m_immediateSwitchJumpTables[tableIndex]; }        size_t numberOfCharacterSwitchJumpTables() const { return m_rareData ? m_rareData->m_characterSwitchJumpTables.size() : 0; }        SimpleJumpTable& addCharacterSwitchJumpTable() { createRareDataIfNecessary(); m_rareData->m_characterSwitchJumpTables.append(SimpleJumpTable()); return m_rareData->m_characterSwitchJumpTables.last(); }        SimpleJumpTable& characterSwitchJumpTable(int tableIndex) { ASSERT(m_rareData); return m_rareData->m_characterSwitchJumpTables[tableIndex]; }        size_t numberOfStringSwitchJumpTables() const { return m_rareData ? m_rareData->m_stringSwitchJumpTables.size() : 0; }        StringJumpTable& addStringSwitchJumpTable() { createRareDataIfNecessary(); m_rareData->m_stringSwitchJumpTables.append(StringJumpTable()); return m_rareData->m_stringSwitchJumpTables.last(); }        StringJumpTable& stringSwitchJumpTable(int tableIndex) { ASSERT(m_rareData); return m_rareData->m_stringSwitchJumpTables[tableIndex]; }        SymbolTable& symbolTable() { return m_symbolTable; }        EvalCodeCache& evalCodeCache() { createRareDataIfNecessary(); return m_rareData->m_evalCodeCache; }        void shrinkToFit();        // FIXME: Make these remaining members private.        int m_numCalleeRegisters;        // NOTE: numConstants holds the number of constant registers allocated        // by the code generator, not the number of constant registers used.        // (Duplicate constants are uniqued during code generation, and spare        // constant registers may be allocated.)        int m_numConstants;        int m_numVars;        int m_numParameters;    private:#if !defined(NDEBUG) || ENABLE(OPCODE_SAMPLING)        void dump(ExecState*, const Vector<Instruction>::const_iterator& begin, Vector<Instruction>::const_iterator&) const;#endif        void reparseForExceptionInfoIfNecessary(CallFrame*);        void createRareDataIfNecessary()        {            if (!m_rareData)                m_rareData.set(new RareData);        }        ScopeNode* m_ownerNode;        JSGlobalData* m_globalData;        Vector<Instruction> m_instructions;#ifndef NDEBUG        unsigned m_instructionCount;#endif#if ENABLE(JIT)        JITCodeRef m_jitCode;#endif        int m_thisRegister;        bool m_needsFullScopeChain;        bool m_usesEval;        bool m_usesArguments;        bool m_isNumericCompareFunction;        CodeType m_codeType;        RefPtr<SourceProvider> m_source;        unsigned m_sourceOffset;#if !ENABLE(JIT)        Vector<unsigned> m_propertyAccessInstructions;        Vector<unsigned> m_globalResolveInstructions;#else        Vector<StructureStubInfo> m_structureStubInfos;        Vector<GlobalResolveInfo> m_globalResolveInfos;        Vector<CallLinkInfo> m_callLinkInfos;        Vector<CallLinkInfo*> m_linkedCallerList;#endif        Vector<unsigned> m_jumpTargets;        // Constant Pool        Vector<Identifier> m_identifiers;        Vector<Register> m_constantRegisters;        Vector<RefPtr<FuncExprNode> > m_functionExpressions;        SymbolTable m_symbolTable;        struct ExceptionInfo {            Vector<ExpressionRangeInfo> m_expressionInfo;            Vector<LineInfo> m_lineInfo;            Vector<GetByIdExceptionInfo> m_getByIdExceptionInfo;#if ENABLE(JIT)            Vector<CallReturnOffsetToBytecodeIndex> m_callReturnIndexVector;#endif        };        OwnPtr<ExceptionInfo> m_exceptionInfo;        struct RareData {            Vector<HandlerInfo> m_exceptionHandlers;            // Rare Constants            Vector<RefPtr<FuncDeclNode> > m_functions;            Vector<JSValuePtr> m_unexpectedConstants;            Vector<RefPtr<RegExp> > m_regexps;            // Jump Tables            Vector<SimpleJumpTable> m_immediateSwitchJumpTables;            Vector<SimpleJumpTable> m_characterSwitchJumpTables;            Vector<StringJumpTable> m_stringSwitchJumpTables;            EvalCodeCache m_evalCodeCache;#if ENABLE(JIT)            Vector<FunctionRegisterInfo> m_functionRegisterInfos;#endif        };        OwnPtr<RareData> m_rareData;    };    // Program code is not marked by any function, so we make the global object    // responsible for marking it.    class ProgramCodeBlock : public CodeBlock {    public:        ProgramCodeBlock(ScopeNode* ownerNode, CodeType codeType, JSGlobalObject* globalObject, PassRefPtr<SourceProvider> sourceProvider)            : CodeBlock(ownerNode, codeType, sourceProvider, 0)            , m_globalObject(globalObject)        {            m_globalObject->codeBlocks().add(this);        }        ~ProgramCodeBlock()        {            if (m_globalObject)                m_globalObject->codeBlocks().remove(this);        }        void clearGlobalObject() { m_globalObject = 0; }    private:        JSGlobalObject* m_globalObject; // For program and eval nodes, the global object that marks the constant pool.    };    class EvalCodeBlock : public ProgramCodeBlock {    public:        EvalCodeBlock(ScopeNode* ownerNode, JSGlobalObject* globalObject, PassRefPtr<SourceProvider> sourceProvider, int baseScopeDepth)            : ProgramCodeBlock(ownerNode, EvalCode, globalObject, sourceProvider)            , m_baseScopeDepth(baseScopeDepth)        {        }        int baseScopeDepth() const { return m_baseScopeDepth; }    private:        int m_baseScopeDepth;    };} // namespace JSC#endif // CodeBlock_h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -