Changeset 150690 in webkit


Ignore:
Timestamp:
May 25, 2013 1:17:29 PM (11 years ago)
Author:
mark.lam@apple.com
Message:

Remove Interpreter::retrieveLastCaller().
https://bugs.webkit.org/show_bug.cgi?id=116753.

Reviewed by Geoffrey Garen.

This is part of the refactoring effort to get rid of functions walking
the JS stack in their own way.

../JavaScriptCore:

  • API/JSContextRef.cpp:

(JSContextCreateBacktrace):

  • interpreter/CallFrame.cpp:
  • interpreter/Interpreter.cpp:

(JSC::Interpreter::Interpreter):
(JSC::Interpreter::getStackTrace):
(JSC::Interpreter::addStackTraceIfNecessary):

  • interpreter/Interpreter.h:

(StackFrame):
(JSC::StackFrame::StackFrame):
(Interpreter):

  • jsc.cpp:

(functionJSCStack):

  • profiler/ProfileGenerator.cpp:

(JSC::ProfileGenerator::addParentForConsoleStart):

../WebCore:

No new tests.

  • bindings/js/JSXMLHttpRequestCustom.cpp:

(WebCore::JSXMLHttpRequest::send):

  • bindings/js/ScriptCallStackFactory.cpp:

(WebCore::createScriptCallStack):

Location:
branches/dfgFourthTier/Source
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • branches/dfgFourthTier/Source/JavaScriptCore/API/JSContextRef.cpp

    r149636 r150690  
    179179    unsigned count = 0;
    180180    StringBuilder builder;
    181     CallFrame* callFrame = exec;
    182     String functionName;
    183     if (exec->callee()) {
    184         if (asObject(exec->callee())->inherits(&InternalFunction::s_info)) {
    185             functionName = asInternalFunction(exec->callee())->name(exec);
    186             builder.appendLiteral("#0 ");
    187             builder.append(functionName);
    188             builder.appendLiteral("() ");
    189             count++;
    190         }
    191     }
    192     while (true) {
    193         RELEASE_ASSERT(callFrame);
    194         int signedLineNumber;
    195         intptr_t sourceID;
    196         String urlString;
    197         JSValue function;
    198 
    199         exec->interpreter()->retrieveLastCaller(callFrame, signedLineNumber, sourceID, urlString, function);
    200 
    201         if (function)
    202             functionName = jsCast<JSFunction*>(function)->name(exec);
    203         else {
    204             // Caller is unknown, but if frame is empty we should still add the frame, because
    205             // something called us, and gave us arguments.
    206             if (count)
    207                 break;
    208         }
    209         unsigned lineNumber = signedLineNumber >= 0 ? signedLineNumber : 0;
     181    Vector<StackFrame> stackTrace;
     182    exec->interpreter()->getStackTrace(stackTrace, maxStackSize);
     183    maxStackSize = stackTrace.size();
     184    for (size_t i = 0; i < maxStackSize; i++) {
    210185        if (!builder.isEmpty())
    211186            builder.append('\n');
    212187        builder.append('#');
    213         builder.appendNumber(count);
     188        builder.appendNumber(count++);
    214189        builder.append(' ');
    215         builder.append(functionName);
     190        builder.append(stackTrace[i].friendlyFunctionName(exec));
    216191        builder.appendLiteral("() at ");
    217         builder.append(urlString);
     192        builder.append(stackTrace[i].friendlySourceURL());
    218193        builder.append(':');
    219         builder.appendNumber(lineNumber);
    220         if (!function || ++count == maxStackSize)
    221             break;
    222         callFrame = callFrame->callerFrame();
    223     }
     194        builder.appendNumber(stackTrace[i].friendlyLineNumber());
     195    }
     196
    224197    return OpaqueJSString::create(builder.toString()).leakRef();
    225198}
  • branches/dfgFourthTier/Source/JavaScriptCore/ChangeLog

    r150661 r150690  
     12013-05-25  Mark Lam  <mark.lam@apple.com>
     2
     3        Remove Interpreter::retrieveLastCaller().
     4        https://bugs.webkit.org/show_bug.cgi?id=116753.
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        This is part of the refactoring effort to get rid of functions walking
     9        the JS stack in their own way.
     10
     11        * API/JSContextRef.cpp:
     12        (JSContextCreateBacktrace):
     13        * interpreter/CallFrame.cpp:
     14        * interpreter/Interpreter.cpp:
     15        (JSC::Interpreter::Interpreter):
     16        (JSC::Interpreter::getStackTrace):
     17        (JSC::Interpreter::addStackTraceIfNecessary):
     18        * interpreter/Interpreter.h:
     19        (StackFrame):
     20        (JSC::StackFrame::StackFrame):
     21        (Interpreter):
     22        * jsc.cpp:
     23        (functionJSCStack):
     24        * profiler/ProfileGenerator.cpp:
     25        (JSC::ProfileGenerator::addParentForConsoleStart):
     26
    1272013-05-24  Filip Pizlo  <fpizlo@apple.com>
    228
  • branches/dfgFourthTier/Source/JavaScriptCore/interpreter/CallFrame.cpp

    r139541 r150690  
    3434
    3535#ifndef NDEBUG
    36 void CallFrame::dumpCaller()
    37 {
    38     int signedLineNumber;
    39     intptr_t sourceID;
    40     String urlString;
    41     JSValue function;
    42    
    43     interpreter()->retrieveLastCaller(this, signedLineNumber, sourceID, urlString, function);
    44     dataLogF("Callpoint => %s:%d\n", urlString.utf8().data(), signedLineNumber);
    45 }
    46 
    4736JSStack* CallFrame::stack()
    4837{
  • branches/dfgFourthTier/Source/JavaScriptCore/interpreter/Interpreter.cpp

    r150657 r150690  
    340340Interpreter::Interpreter(VM& vm)
    341341    : m_sampleEntryDepth(0)
     342    , m_vm(vm)
    342343    , m_stack(vm)
    343344    , m_errorHandlingModeReentry(0)
     
    685686}
    686687
    687 void Interpreter::getStackTrace(VM* vm, Vector<StackFrame>& results)
    688 {
    689     CallFrame* callFrame = vm->topCallFrame->removeHostCallFrameFlag();
     688void Interpreter::getStackTrace(Vector<StackFrame>& results, unsigned maxStackSize)
     689{
     690    VM& vm = m_vm;
     691    CallFrame* callFrame = vm.topCallFrame->removeHostCallFrameFlag();
    690692    if (!callFrame || callFrame == CallFrame::noCaller())
    691693        return;
    692     int line = getLineNumberForCallFrame(vm, callFrame);
     694    int line = getLineNumberForCallFrame(&vm, callFrame);
    693695
    694696    callFrame = callFrame->trueCallFrameFromVMCode();
    695697
    696     while (callFrame && callFrame != CallFrame::noCaller()) {
     698    while (callFrame && callFrame != CallFrame::noCaller() && maxStackSize--) {
    697699        String sourceURL;
    698700        if (callFrame->codeBlock()) {
    699701            sourceURL = getSourceURLFromCallFrame(callFrame);
    700             StackFrame s = { Strong<JSObject>(*vm, callFrame->callee()), getStackFrameCodeType(callFrame), Strong<ExecutableBase>(*vm, callFrame->codeBlock()->ownerExecutable()), line, sourceURL};
     702            StackFrame s(Strong<JSObject>(vm, callFrame->callee()), getStackFrameCodeType(callFrame), Strong<ExecutableBase>(vm, callFrame->codeBlock()->ownerExecutable()), line, sourceURL);
    701703            results.append(s);
    702704        } else {
    703             StackFrame s = { Strong<JSObject>(*vm, callFrame->callee()), StackFrameNativeCode, Strong<ExecutableBase>(), -1, String()};
     705            StackFrame s(Strong<JSObject>(vm, callFrame->callee()), StackFrameNativeCode, Strong<ExecutableBase>(), -1, String());
    704706            results.append(s);
    705707        }
    706708        unsigned unusedBytecodeOffset = 0;
    707         callFrame = getCallerInfo(vm, callFrame, line, unusedBytecodeOffset);
     709        callFrame = getCallerInfo(&vm, callFrame, line, unusedBytecodeOffset);
    708710    }
    709711}
     
    717719
    718720    Vector<StackFrame> stackTrace;
    719     getStackTrace(&callFrame->vm(), stackTrace);
     721    vm->interpreter->getStackTrace(stackTrace);
    720722   
    721723    if (stackTrace.isEmpty())
     
    14141416}
    14151417
    1416 void Interpreter::retrieveLastCaller(CallFrame* callFrame, int& lineNumber, intptr_t& sourceID, String& sourceURL, JSValue& function) const
    1417 {
    1418     function = JSValue();
    1419     lineNumber = -1;
    1420     sourceURL = String();
    1421 
    1422     CallFrame* callerFrame = callFrame->callerFrame();
    1423     if (callerFrame->hasHostCallFrameFlag())
    1424         return;
    1425 
    1426     CodeBlock* callerCodeBlock = callerFrame->codeBlock();
    1427     if (!callerCodeBlock)
    1428         return;
    1429     unsigned bytecodeOffset = 0;
    1430     bytecodeOffset = callerCodeBlock->bytecodeOffset(callerFrame, callFrame->returnPC());
    1431     lineNumber = callerCodeBlock->lineNumberForBytecodeOffset(bytecodeOffset - 1);
    1432     sourceID = callerCodeBlock->ownerExecutable()->sourceID();
    1433     sourceURL = callerCodeBlock->ownerExecutable()->sourceURL();
    1434     function = callerFrame->callee();
    1435 }
    1436 
    14371418CallFrame* Interpreter::findFunctionCallFrameFromVMCode(CallFrame* callFrame, JSFunction* function)
    14381419{
  • branches/dfgFourthTier/Source/JavaScriptCore/interpreter/Interpreter.h

    r149636 r150690  
    8282        int line;
    8383        String sourceURL;
     84
     85        StackFrame()
     86            : codeType(StackFrameNativeCode)
     87            , line(0)
     88        {
     89        }
     90
     91        StackFrame(Strong<JSObject> otherCallee, StackFrameCodeType otherCodeType, Strong<ExecutableBase> otherExecutable, int otherLine, String otherSourceURL)
     92            : callee(otherCallee)
     93            , codeType(otherCodeType)
     94            , executable(otherExecutable)
     95            , line(otherLine)
     96            , sourceURL(otherSourceURL)
     97        {
     98        }
     99
    84100        String toString(CallFrame* callFrame) const
    85101        {
     
    224240        JSValue retrieveArgumentsFromVMCode(CallFrame*, JSFunction*) const;
    225241        JSValue retrieveCallerFromVMCode(CallFrame*, JSFunction*) const;
    226         JS_EXPORT_PRIVATE void retrieveLastCaller(CallFrame*, int& lineNumber, intptr_t& sourceID, String& sourceURL, JSValue& function) const;
    227242       
    228243        void getArgumentsData(CallFrame*, JSFunction*&, ptrdiff_t& firstParameterIndex, Register*& argv, int& argc);
     
    233248        NEVER_INLINE void debug(CallFrame*, DebugHookID, int firstLine, int lastLine, int charPosition);
    234249        static const String getTraceLine(CallFrame*, StackFrameCodeType, const String&, int);
    235         JS_EXPORT_PRIVATE static void getStackTrace(VM*, Vector<StackFrame>& results);
     250        JS_EXPORT_PRIVATE void getStackTrace(Vector<StackFrame>& results, unsigned maxStackSize = UINT_MAX);
    236251        static void addStackTraceIfNecessary(CallFrame*, JSObject* error);
    237252
     
    271286        OwnPtr<SamplingTool> m_sampler;
    272287
     288        VM& m_vm;
    273289        JSStack m_stack;
    274290        int m_errorHandlingModeReentry;
  • branches/dfgFourthTier/Source/JavaScriptCore/jsc.cpp

    r148697 r150690  
    328328
    329329    Vector<StackFrame> stackTrace;
    330     Interpreter::getStackTrace(&exec->vm(), stackTrace);
     330    exec->interpreter()->getStackTrace(stackTrace);
    331331    int i = 0;
    332332
  • branches/dfgFourthTier/Source/JavaScriptCore/profiler/ProfileGenerator.cpp

    r149636 r150690  
    5959void ProfileGenerator::addParentForConsoleStart(ExecState* exec)
    6060{
    61     int lineNumber;
    62     intptr_t sourceID;
    63     String sourceURL;
    64     JSValue function;
     61    Vector<StackFrame> stackTrace;
     62    exec->interpreter()->getStackTrace(stackTrace, 2);
    6563
    66     exec->interpreter()->retrieveLastCaller(exec, lineNumber, sourceID, sourceURL, function);
    67     m_currentNode = ProfileNode::create(exec, LegacyProfiler::createCallIdentifier(exec, function, sourceURL, lineNumber), m_head.get(), m_head.get());
     64    m_currentNode = ProfileNode::create(exec, LegacyProfiler::createCallIdentifier(exec, stackTrace[1].callee.get(), stackTrace[1].sourceURL, stackTrace[1].line), m_head.get(), m_head.get());
    6865    m_head->insertNode(m_currentNode.get());
    6966}
  • branches/dfgFourthTier/Source/WebCore/ChangeLog

    r149649 r150690  
     12013-05-25  Mark Lam  <mark.lam@apple.com>
     2
     3        Remove Interpreter::retrieveLastCaller().
     4        https://bugs.webkit.org/show_bug.cgi?id=116753.
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        This is part of the refactoring effort to get rid of functions walking
     9        the JS stack in their own way.
     10
     11        No new tests.
     12
     13        * bindings/js/JSXMLHttpRequestCustom.cpp:
     14        (WebCore::JSXMLHttpRequest::send):
     15        * bindings/js/ScriptCallStackFactory.cpp:
     16        (WebCore::createScriptCallStack):
     17
    1182013-05-06  Geoffrey Garen  <ggaren@apple.com>
    219
  • branches/dfgFourthTier/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp

    r127751 r150690  
    134134    }
    135135
    136     int signedLineNumber;
    137     intptr_t sourceID;
    138     String sourceURL;
    139     JSValue function;
    140     exec->interpreter()->retrieveLastCaller(exec, signedLineNumber, sourceID, sourceURL, function);
    141     impl()->setLastSendLineNumber(signedLineNumber >= 0 ? signedLineNumber : 0);
    142     impl()->setLastSendURL(sourceURL);
     136    Vector<StackFrame> stackTrace(2);
     137    exec->interpreter()->getStackTrace(stackTrace, 2);
     138    impl()->setLastSendLineNumber(stackTrace[1].line);
     139    impl()->setLastSendURL(stackTrace[1].sourceURL);
    143140
    144141    setDOMException(exec, ec);
  • branches/dfgFourthTier/Source/WebCore/bindings/js/ScriptCallStackFactory.cpp

    r148697 r150690  
    5959    if (JSC::ExecState* exec = JSMainThreadExecState::currentState()) {
    6060        Vector<StackFrame> stackTrace;
    61         Interpreter::getStackTrace(&exec->vm(), stackTrace);
     61        exec->interpreter()->getStackTrace(stackTrace);
    6262        for (Vector<StackFrame>::const_iterator iter = stackTrace.begin(); iter < stackTrace.end(); iter++) {
    6363            frames.append(ScriptCallFrame(iter->friendlyFunctionName(exec), iter->friendlySourceURL(), iter->friendlyLineNumber()));
     
    7878{
    7979    Vector<ScriptCallFrame> frames;
    80     CallFrame* callFrame = exec;
    81     while (true) {
    82         ASSERT(callFrame);
    83         int signedLineNumber;
    84         intptr_t sourceID;
    85         String urlString;
    86         JSValue function;
    87 
    88         exec->interpreter()->retrieveLastCaller(callFrame, signedLineNumber, sourceID, urlString, function);
    89         String functionName;
    90         if (function)
    91             functionName = jsCast<JSFunction*>(function)->name(exec);
    92         else {
    93             // Caller is unknown, but if frames is empty we should still add the frame, because
    94             // something called us, and gave us arguments.
    95             if (!frames.isEmpty())
    96                 break;
    97         }
    98         unsigned lineNumber = signedLineNumber >= 0 ? signedLineNumber : 0;
    99         frames.append(ScriptCallFrame(functionName, urlString, lineNumber));
    100         if (!function || frames.size() == maxStackSize)
    101             break;
    102         callFrame = callFrame->callerFrame();
    103     }
     80    Vector<StackFrame> stackTrace;
     81    maxStackSize++;
     82    exec->interpreter()->getStackTrace(stackTrace, maxStackSize);
     83    maxStackSize = stackTrace.size();
     84    for (size_t i = 1; i < maxStackSize; i++)
     85        frames.append(ScriptCallFrame(stackTrace[i].friendlyFunctionName(exec),
     86            stackTrace[i].friendlySourceURL(), stackTrace[i].friendlyLineNumber()));
    10487    return ScriptCallStack::create(frames);
    10588}
Note: See TracChangeset for help on using the changeset viewer.