Changeset 34065 in webkit for trunk/JavaScriptCore/VM/Machine.cpp


Ignore:
Timestamp:
May 23, 2008, 1:56:21 AM (17 years ago)
Author:
[email protected]
Message:

<rdar://problem/5951561> Turn on JavaScript Profiler

Reviewed by Kevin McCullough

Flipped the switch on the profiler, rearranged how we
signal the the profiler is active so that calls aren't
needed in the general case.

Also fixed the entry point for Machine::execute(FunctionBodyNode..)
to correctly indicate function exit.

Results in a 0.7-1.0% regression in SunSpider :-(

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/VM/Machine.cpp

    r34037 r34065  
    438438}
    439439
     440static NEVER_INLINE JSValue* callEval(ExecState* exec, JSObject* thisObj, ScopeChainNode* scopeChain, RegisterFile* registerFile, Register* r, int argv, int argc, JSValue*& exceptionValue)
     441{
    440442#if JAVASCRIPT_PROFILING
    441 static NEVER_INLINE JSValue* callEval(ExecState* exec, JSObject* evalFunction, JSObject* thisObj, ScopeChainNode* scopeChain, RegisterFile* registerFile, Register* r, int argv, int argc, JSValue*& exceptionValue)
    442 {
    443     Profiler::profiler()->willExecute(exec, evalFunction);
    444 #else
    445 static NEVER_INLINE JSValue* callEval(ExecState* exec, JSObject* thisObj, ScopeChainNode* scopeChain, RegisterFile* registerFile, Register* r, int argv, int argc, JSValue*& exceptionValue)
    446 {
     443    Profiler** profiler = Profiler::enabledProfilerReference();
     444    JSObject* evalFunction = scopeChain->globalObject()->evalFunction();
     445    if (*profiler)
     446        (*profiler)->willExecute(exec, evalFunction);
    447447#endif
    448448
     
    472472    JSValue* result = machine().execute(evalNode.get(), exec, thisObj, registerFile, r - (*registerFile->basePointer()) + argv + argc, scopeChain, &exceptionValue);
    473473
    474     Profiler::profiler()->didExecute(exec, evalFunction);
     474    if ((*profiler))
     475        (*profiler)->didExecute(exec, evalFunction);
    475476
    476477    return result;
     
    608609
    609610#if JAVASCRIPT_PROFILING
    610     Profiler::profiler()->didExecute(exec, callFrame[Callee].u.jsObject);
     611    if (Profiler* profiler = *Profiler::enabledProfilerReference())
     612        profiler->didExecute(exec, callFrame[Callee].u.jsObject);
    611613#endif
    612614    return true;
     
    658660    }
    659661
    660 #if JAVASCRIPT_PROFILING
    661     Profiler::profiler()->willExecute(exec, programNode->sourceURL(), programNode->lineNo());
    662 #endif
    663 
    664662    RegisterFile* registerFile = registerFileStack->pushGlobalRegisterFile();
    665663    ASSERT(registerFile->numGlobalSlots());
     
    674672    if (codeBlock->needsFullScopeChain)
    675673        scopeChain = scopeChain->copy();
    676    
     674
     675#if JAVASCRIPT_PROFILING
     676    Profiler** profiler = Profiler::enabledProfilerReference();
     677    if (*profiler)
     678        (*profiler)->willExecute(exec, programNode->sourceURL(), programNode->lineNo());
     679#endif
     680
    677681    ExecState newExec(exec, this, registerFile, scopeChain, -1);
    678682
     
    684688
    685689#if JAVASCRIPT_PROFILING
    686     Profiler::profiler()->didExecute(exec, programNode->sourceURL(), programNode->lineNo());
     690    if (*profiler)
     691        (*profiler)->didExecute(exec, programNode->sourceURL(), programNode->lineNo());
    687692#endif
    688693
     
    696701        return 0;
    697702    }
    698 
    699 #if JAVASCRIPT_PROFILING
    700     Profiler::profiler()->willExecute(exec, function);
    701 #endif
    702703
    703704    RegisterFile* registerFile = registerFileStack->current();
     
    738739
    739740    ExecState newExec(exec, this, registerFile, scopeChain, callFrameOffset);
     741   
     742#if JAVASCRIPT_PROFILING
     743    Profiler** profiler = Profiler::enabledProfilerReference();
     744    if (*profiler)
     745        (*profiler)->willExecute(exec, function);
     746#endif
    740747
    741748    m_reentryDepth++;
     
    743750    m_reentryDepth--;
    744751
     752#if JAVASCRIPT_PROFILING
     753    if (*profiler)
     754        (*profiler)->didExecute(exec, function);
     755#endif
    745756    registerFile->shrink(oldSize);
    746757    return result;
     
    753764        return 0;
    754765    }
    755 
    756 #if JAVASCRIPT_PROFILING
    757     Profiler::profiler()->willExecute(exec, evalNode->sourceURL(), evalNode->lineNo());
    758 #endif
    759766
    760767    EvalCodeBlock* codeBlock = &evalNode->code(scopeChain);
     
    798805        scopeChain = scopeChain->copy();
    799806
     807#if JAVASCRIPT_PROFILING
     808    Profiler** profiler = Profiler::enabledProfilerReference();
     809    if (*profiler)
     810        (*profiler)->willExecute(exec, evalNode->sourceURL(), evalNode->lineNo());
     811#endif
     812
    800813    ExecState newExec(exec, this, registerFile, scopeChain, -1);
    801814
     
    807820
    808821#if JAVASCRIPT_PROFILING
    809     Profiler::profiler()->didExecute(exec, evalNode->sourceURL(), evalNode->lineNo());
     822    if (*profiler)
     823        (*profiler)->didExecute(exec, evalNode->sourceURL(), evalNode->lineNo());
    810824#endif
    811825
     
    880894    JSValue* exceptionValue = 0;
    881895    Instruction* handlerVPC = 0;
    882    
     896
    883897    Register** registerBase = registerFile->basePointer();
    884898    Instruction* vPC = codeBlock->instructions.begin();
    885899    JSValue** k = codeBlock->jsValues.data();
     900#if JAVASCRIPT_PROFILING
     901    Profiler** enabledProfilerReference = Profiler::enabledProfilerReference();
     902   
     903#if HAVE(COMPUTED_GOTO)
     904    // Yet another hack around GCC's various foibles, in this case fetching the
     905    // profiler reference results in a regression.  Removing this indirection
     906    // results in a 0.8% regression.
     907    goto *(&&profilerFetchHack);
     908    profilerFetchHack:
     909#endif
     910   
     911#endif
    886912   
    887913    registerFile->setSafeForReentry(false);
     
    18561882
    18571883            registerFile->setSafeForReentry(true);
    1858 #if JAVASCRIPT_PROFILING
    1859             JSValue* result = callEval(exec, static_cast<JSObject*>(funcVal), thisObject, scopeChain, registerFile, r, argv, argc, exceptionValue);
    1860 #else
     1884
    18611885            JSValue* result = callEval(exec, thisObject, scopeChain, registerFile, r, argv, argc, exceptionValue);
    1862 #endif
     1886
    18631887            registerFile->setSafeForReentry(false);
    18641888            r = (*registerBase) + registerOffset;
     
    19011925        if (callType == CallTypeJS) {
    19021926#if JAVASCRIPT_PROFILING
    1903             Profiler::profiler()->willExecute(exec, static_cast<JSObject*>(v));
     1927            if (*enabledProfilerReference)
     1928                (*enabledProfilerReference)->willExecute(exec, static_cast<JSObject*>(v));
    19041929#endif
    19051930            int registerOffset = r - (*registerBase);
     
    19291954        if (callType == CallTypeNative) {
    19301955#if JAVASCRIPT_PROFILING
    1931             Profiler::profiler()->willExecute(exec, static_cast<JSObject*>(v));
     1956            if (*enabledProfilerReference)
     1957                (*enabledProfilerReference)->willExecute(exec, static_cast<JSObject*>(v));
    19321958#endif
    19331959            int registerOffset = r - (*registerBase);
     
    19461972
    19471973#if JAVASCRIPT_PROFILING
    1948             Profiler::profiler()->didExecute(exec, static_cast<JSObject*>(v));
     1974            if (*enabledProfilerReference)
     1975                (*enabledProfilerReference)->didExecute(exec, static_cast<JSObject*>(v));
    19491976#endif
    19501977            VM_CHECK_EXCEPTION();
     
    19952022       
    19962023#if JAVASCRIPT_PROFILING
    1997         Profiler::profiler()->didExecute(exec, callFrame[Callee].u.jsObject);
     2024        if (*enabledProfilerReference)
     2025            (*enabledProfilerReference)->didExecute(exec, callFrame[Callee].u.jsObject);
    19982026#endif
    19992027        NEXT_OPCODE;
     
    20152043        if (constructType == ConstructTypeJS) {
    20162044#if JAVASCRIPT_PROFILING
    2017             Profiler::profiler()->willExecute(exec, constructor);
     2045            if (*enabledProfilerReference)
     2046                (*enabledProfilerReference)->willExecute(exec, constructor);
    20182047#endif
    20192048            int registerOffset = r - (*registerBase);
     
    20512080        if (constructType == ConstructTypeNative) {
    20522081#if JAVASCRIPT_PROFILING
    2053             Profiler::profiler()->willExecute(exec, constructor);
     2082            if (*enabledProfilerReference)
     2083                (*enabledProfilerReference)->willExecute(exec, constructor);
    20542084#endif
    20552085            int registerOffset = r - (*registerBase);
     
    20652095
    20662096#if JAVASCRIPT_PROFILING
    2067             Profiler::profiler()->didExecute(exec, constructor);
     2097            if (*enabledProfilerReference)
     2098                (*enabledProfilerReference)->didExecute(exec, constructor);
    20682099#endif
    20692100            ++vPC;
Note: See TracChangeset for help on using the changeset viewer.