Changeset 39354 in webkit for trunk/JavaScriptCore/bytecode


Ignore:
Timestamp:
Dec 16, 2008, 10:30:17 PM (16 years ago)
Author:
[email protected]
Message:

2008-12-16 Sam Weinig <[email protected]>

Reviewed by Geoffrey Garen.

Fix for https://bugs.webkit.org/show_bug.cgi?id=22838
Remove dependency on the bytecode Instruction buffer in Interpreter::throwException
Part of <rdar://problem/6428342>

  • bytecode/CodeBlock.cpp: (JSC::CodeBlock::functionRegisterForBytecodeOffset): Added. Function to get a function Register index in a callFrame for a bytecode offset. (JSC::CodeBlock::shrinkToFit): Shrink m_getByIdExceptionInfo and m_functionRegisterInfos.
  • bytecode/CodeBlock.h: (JSC::FunctionRegisterInfo::FunctionRegisterInfo): Added. (JSC::CodeBlock::addFunctionRegisterInfo):
  • bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::emitCall):
  • interpreter/Interpreter.cpp: (JSC::Interpreter::throwException): Use functionRegisterForBytecodeOffset in JIT mode.
Location:
trunk/JavaScriptCore/bytecode
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/bytecode/CodeBlock.cpp

    r39284 r39354  
    14281428}
    14291429
     1430#if ENABLE(JIT)
     1431bool CodeBlock::functionRegisterForBytecodeOffset(unsigned bytecodeOffset, int& functionRegisterIndex)
     1432{
     1433    ASSERT(bytecodeOffset < m_instructions.size());
     1434
     1435    if (!m_rareData || !m_rareData->m_functionRegisterInfos.size())
     1436        return false;
     1437
     1438    int low = 0;
     1439    int high = m_rareData->m_functionRegisterInfos.size();
     1440    while (low < high) {
     1441        int mid = low + (high - low) / 2;
     1442        if (m_rareData->m_functionRegisterInfos[mid].bytecodeOffset <= bytecodeOffset)
     1443            low = mid + 1;
     1444        else
     1445            high = mid;
     1446    }
     1447
     1448    if (!low || m_rareData->m_functionRegisterInfos[low - 1].bytecodeOffset != bytecodeOffset)
     1449        return false;
     1450
     1451    functionRegisterIndex = m_rareData->m_functionRegisterInfos[low - 1].functionRegisterIndex;
     1452    return true;
     1453}
     1454#endif
     1455
    14301456void CodeBlock::shrinkToFit()
    14311457{
     
    14441470    m_expressionInfo.shrinkToFit();
    14451471    m_lineInfo.shrinkToFit();
     1472    m_getByIdExceptionInfo.shrinkToFit();
    14461473
    14471474    m_identifiers.shrinkToFit();
     
    14571484        m_rareData->m_characterSwitchJumpTables.shrinkToFit();
    14581485        m_rareData->m_stringSwitchJumpTables.shrinkToFit();
     1486#if ENABLE(JIT)
     1487        m_rareData->m_functionRegisterInfos.shrinkToFit();
     1488#endif
    14591489    }
    14601490}
  • trunk/JavaScriptCore/bytecode/CodeBlock.h

    r39285 r39354  
    129129    };
    130130
     131    struct FunctionRegisterInfo {
     132        FunctionRegisterInfo(unsigned bytecodeOffset, int functionRegisterIndex)
     133            : bytecodeOffset(bytecodeOffset)
     134            , functionRegisterIndex(functionRegisterIndex)
     135        {
     136        }
     137
     138        unsigned bytecodeOffset;
     139        int functionRegisterIndex;
     140    };
     141
    131142    struct GlobalResolveInfo {
    132143        GlobalResolveInfo()
     
    291302            return binaryChop<PC, void*, getNativePC>(m_pcVector.begin(), m_pcVector.size(), nativePC)->bytecodeIndex;
    292303        }
     304
     305        bool functionRegisterForBytecodeOffset(unsigned bytecodeOffset, int& functionRegisterIndex);
    293306#endif
    294307
     
    350363        void addCallLinkInfo() { m_callLinkInfos.append(CallLinkInfo()); }
    351364        CallLinkInfo& callLinkInfo(int index) { return m_callLinkInfos[index]; }
     365
     366        void addFunctionRegisterInfo(unsigned bytecodeOffset, int functionIndex) { createRareDataIfNecessary(); m_rareData->m_functionRegisterInfos.append(FunctionRegisterInfo(bytecodeOffset, functionIndex)); }
    352367
    353368        Vector<PC>& pcVector() { return m_pcVector; }
     
    481496
    482497            EvalCodeCache m_evalCodeCache;
     498
     499#if ENABLE(JIT)
     500            Vector<FunctionRegisterInfo> m_functionRegisterInfos;
     501#endif
    483502        };
    484503
Note: See TracChangeset for help on using the changeset viewer.