Changeset 39354 in webkit for trunk/JavaScriptCore


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
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r39351 r39354  
     12008-12-16  Sam Weinig  <[email protected]>
     2
     3        Reviewed by Geoffrey Garen.
     4
     5        Fix for https://bugs.webkit.org/show_bug.cgi?id=22838
     6        Remove dependency on the bytecode Instruction buffer in Interpreter::throwException
     7        Part of <rdar://problem/6428342>
     8
     9        * bytecode/CodeBlock.cpp:
     10        (JSC::CodeBlock::functionRegisterForBytecodeOffset): Added. Function to get
     11        a function Register index in a callFrame for a bytecode offset.
     12        (JSC::CodeBlock::shrinkToFit): Shrink m_getByIdExceptionInfo and m_functionRegisterInfos.
     13        * bytecode/CodeBlock.h:
     14        (JSC::FunctionRegisterInfo::FunctionRegisterInfo): Added.
     15        (JSC::CodeBlock::addFunctionRegisterInfo):
     16        * bytecompiler/BytecodeGenerator.cpp:
     17        (JSC::BytecodeGenerator::emitCall):
     18        * interpreter/Interpreter.cpp:
     19        (JSC::Interpreter::throwException): Use functionRegisterForBytecodeOffset in JIT
     20        mode.
     21
    1222008-12-16  Sam Weinig  <[email protected]>
    223
  • 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
  • trunk/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp

    r39255 r39354  
    12571257        emitOpcode(op_profile_will_call);
    12581258        instructions().append(func->index());
     1259
     1260#if ENABLE(JIT)
     1261        m_codeBlock->addFunctionRegisterInfo(instructions().size(), func->index());
     1262#endif
    12591263    }
    12601264
  • trunk/JavaScriptCore/interpreter/Interpreter.cpp

    r39351 r39354  
    833833    // we'll never reach the relevant op_profile_did_call.
    834834    if (Profiler* profiler = *Profiler::enabledProfilerReference()) {
     835#if !ENABLE(JIT)
    835836        if (isCallBytecode(codeBlock->instructions()[bytecodeOffset].u.opcode))
    836837            profiler->didExecute(callFrame, callFrame[codeBlock->instructions()[bytecodeOffset + 2].u.operand].jsValue(callFrame));
    837838        else if (codeBlock->instructions()[bytecodeOffset + 8].u.opcode == getOpcode(op_construct))
    838839            profiler->didExecute(callFrame, callFrame[codeBlock->instructions()[bytecodeOffset + 10].u.operand].jsValue(callFrame));
     840#else
     841        int functionRegisterIndex;
     842        if (codeBlock->functionRegisterForBytecodeOffset(bytecodeOffset, functionRegisterIndex))
     843            profiler->didExecute(callFrame, callFrame[functionRegisterIndex].jsValue(callFrame));
     844#endif
    839845    }
    840846
Note: See TracChangeset for help on using the changeset viewer.