Title: [150690] branches/dfgFourthTier/Source
Revision
150690
Author
mark....@apple.com
Date
2013-05-25 13:17:29 -0700 (Sat, 25 May 2013)

Log 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.

../_javascript_Core: 

* 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):

Modified Paths

Diff

Modified: branches/dfgFourthTier/Source/_javascript_Core/API/JSContextRef.cpp (150689 => 150690)


--- branches/dfgFourthTier/Source/_javascript_Core/API/JSContextRef.cpp	2013-05-25 18:35:45 UTC (rev 150689)
+++ branches/dfgFourthTier/Source/_javascript_Core/API/JSContextRef.cpp	2013-05-25 20:17:29 UTC (rev 150690)
@@ -178,49 +178,22 @@
 
     unsigned count = 0;
     StringBuilder builder;
-    CallFrame* callFrame = exec;
-    String functionName;
-    if (exec->callee()) {
-        if (asObject(exec->callee())->inherits(&InternalFunction::s_info)) {
-            functionName = asInternalFunction(exec->callee())->name(exec);
-            builder.appendLiteral("#0 ");
-            builder.append(functionName);
-            builder.appendLiteral("() ");
-            count++;
-        }
-    }
-    while (true) {
-        RELEASE_ASSERT(callFrame);
-        int signedLineNumber;
-        intptr_t sourceID;
-        String urlString;
-        JSValue function;
-
-        exec->interpreter()->retrieveLastCaller(callFrame, signedLineNumber, sourceID, urlString, function);
-
-        if (function)
-            functionName = jsCast<JSFunction*>(function)->name(exec);
-        else {
-            // Caller is unknown, but if frame is empty we should still add the frame, because
-            // something called us, and gave us arguments.
-            if (count)
-                break;
-        }
-        unsigned lineNumber = signedLineNumber >= 0 ? signedLineNumber : 0;
+    Vector<StackFrame> stackTrace;
+    exec->interpreter()->getStackTrace(stackTrace, maxStackSize);
+    maxStackSize = stackTrace.size();
+    for (size_t i = 0; i < maxStackSize; i++) {
         if (!builder.isEmpty())
             builder.append('\n');
         builder.append('#');
-        builder.appendNumber(count);
+        builder.appendNumber(count++);
         builder.append(' ');
-        builder.append(functionName);
+        builder.append(stackTrace[i].friendlyFunctionName(exec));
         builder.appendLiteral("() at ");
-        builder.append(urlString);
+        builder.append(stackTrace[i].friendlySourceURL());
         builder.append(':');
-        builder.appendNumber(lineNumber);
-        if (!function || ++count == maxStackSize)
-            break;
-        callFrame = callFrame->callerFrame();
+        builder.appendNumber(stackTrace[i].friendlyLineNumber());
     }
+
     return OpaqueJSString::create(builder.toString()).leakRef();
 }
 

Modified: branches/dfgFourthTier/Source/_javascript_Core/ChangeLog (150689 => 150690)


--- branches/dfgFourthTier/Source/_javascript_Core/ChangeLog	2013-05-25 18:35:45 UTC (rev 150689)
+++ branches/dfgFourthTier/Source/_javascript_Core/ChangeLog	2013-05-25 20:17:29 UTC (rev 150690)
@@ -1,3 +1,29 @@
+2013-05-25  Mark Lam  <mark....@apple.com>
+
+        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.
+
+        * 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):
+
 2013-05-24  Filip Pizlo  <fpi...@apple.com>
 
         fourthTier: FTL boolify should support ObjectOrOtherUse

Modified: branches/dfgFourthTier/Source/_javascript_Core/interpreter/CallFrame.cpp (150689 => 150690)


--- branches/dfgFourthTier/Source/_javascript_Core/interpreter/CallFrame.cpp	2013-05-25 18:35:45 UTC (rev 150689)
+++ branches/dfgFourthTier/Source/_javascript_Core/interpreter/CallFrame.cpp	2013-05-25 20:17:29 UTC (rev 150690)
@@ -33,17 +33,6 @@
 namespace JSC {
 
 #ifndef NDEBUG
-void CallFrame::dumpCaller()
-{
-    int signedLineNumber;
-    intptr_t sourceID;
-    String urlString;
-    JSValue function;
-    
-    interpreter()->retrieveLastCaller(this, signedLineNumber, sourceID, urlString, function);
-    dataLogF("Callpoint => %s:%d\n", urlString.utf8().data(), signedLineNumber);
-}
-
 JSStack* CallFrame::stack()
 {
     return &interpreter()->stack();

Modified: branches/dfgFourthTier/Source/_javascript_Core/interpreter/Interpreter.cpp (150689 => 150690)


--- branches/dfgFourthTier/Source/_javascript_Core/interpreter/Interpreter.cpp	2013-05-25 18:35:45 UTC (rev 150689)
+++ branches/dfgFourthTier/Source/_javascript_Core/interpreter/Interpreter.cpp	2013-05-25 20:17:29 UTC (rev 150690)
@@ -339,6 +339,7 @@
 
 Interpreter::Interpreter(VM& vm)
     : m_sampleEntryDepth(0)
+    , m_vm(vm)
     , m_stack(vm)
     , m_errorHandlingModeReentry(0)
 #if !ASSERT_DISABLED
@@ -684,27 +685,28 @@
     return StackFrameGlobalCode;
 }
 
-void Interpreter::getStackTrace(VM* vm, Vector<StackFrame>& results)
+void Interpreter::getStackTrace(Vector<StackFrame>& results, unsigned maxStackSize)
 {
-    CallFrame* callFrame = vm->topCallFrame->removeHostCallFrameFlag();
+    VM& vm = m_vm;
+    CallFrame* callFrame = vm.topCallFrame->removeHostCallFrameFlag();
     if (!callFrame || callFrame == CallFrame::noCaller()) 
         return;
-    int line = getLineNumberForCallFrame(vm, callFrame);
+    int line = getLineNumberForCallFrame(&vm, callFrame);
 
     callFrame = callFrame->trueCallFrameFromVMCode();
 
-    while (callFrame && callFrame != CallFrame::noCaller()) {
+    while (callFrame && callFrame != CallFrame::noCaller() && maxStackSize--) {
         String sourceURL;
         if (callFrame->codeBlock()) {
             sourceURL = getSourceURLFromCallFrame(callFrame);
-            StackFrame s = { Strong<JSObject>(*vm, callFrame->callee()), getStackFrameCodeType(callFrame), Strong<ExecutableBase>(*vm, callFrame->codeBlock()->ownerExecutable()), line, sourceURL};
+            StackFrame s(Strong<JSObject>(vm, callFrame->callee()), getStackFrameCodeType(callFrame), Strong<ExecutableBase>(vm, callFrame->codeBlock()->ownerExecutable()), line, sourceURL);
             results.append(s);
         } else {
-            StackFrame s = { Strong<JSObject>(*vm, callFrame->callee()), StackFrameNativeCode, Strong<ExecutableBase>(), -1, String()};
+            StackFrame s(Strong<JSObject>(vm, callFrame->callee()), StackFrameNativeCode, Strong<ExecutableBase>(), -1, String());
             results.append(s);
         }
         unsigned unusedBytecodeOffset = 0;
-        callFrame = getCallerInfo(vm, callFrame, line, unusedBytecodeOffset);
+        callFrame = getCallerInfo(&vm, callFrame, line, unusedBytecodeOffset);
     }
 }
 
@@ -716,7 +718,7 @@
         return;
 
     Vector<StackFrame> stackTrace;
-    getStackTrace(&callFrame->vm(), stackTrace);
+    vm->interpreter->getStackTrace(stackTrace);
     
     if (stackTrace.isEmpty())
         return;
@@ -1413,27 +1415,6 @@
     return caller;
 }
 
-void Interpreter::retrieveLastCaller(CallFrame* callFrame, int& lineNumber, intptr_t& sourceID, String& sourceURL, JSValue& function) const
-{
-    function = JSValue();
-    lineNumber = -1;
-    sourceURL = String();
-
-    CallFrame* callerFrame = callFrame->callerFrame();
-    if (callerFrame->hasHostCallFrameFlag())
-        return;
-
-    CodeBlock* callerCodeBlock = callerFrame->codeBlock();
-    if (!callerCodeBlock)
-        return;
-    unsigned bytecodeOffset = 0;
-    bytecodeOffset = callerCodeBlock->bytecodeOffset(callerFrame, callFrame->returnPC());
-    lineNumber = callerCodeBlock->lineNumberForBytecodeOffset(bytecodeOffset - 1);
-    sourceID = callerCodeBlock->ownerExecutable()->sourceID();
-    sourceURL = callerCodeBlock->ownerExecutable()->sourceURL();
-    function = callerFrame->callee();
-}
-
 CallFrame* Interpreter::findFunctionCallFrameFromVMCode(CallFrame* callFrame, JSFunction* function)
 {
     for (CallFrame* candidate = callFrame->trueCallFrameFromVMCode(); candidate; candidate = candidate->trueCallerFrame()) {

Modified: branches/dfgFourthTier/Source/_javascript_Core/interpreter/Interpreter.h (150689 => 150690)


--- branches/dfgFourthTier/Source/_javascript_Core/interpreter/Interpreter.h	2013-05-25 18:35:45 UTC (rev 150689)
+++ branches/dfgFourthTier/Source/_javascript_Core/interpreter/Interpreter.h	2013-05-25 20:17:29 UTC (rev 150690)
@@ -81,6 +81,22 @@
         Strong<ExecutableBase> executable;
         int line;
         String sourceURL;
+
+        StackFrame()
+            : codeType(StackFrameNativeCode)
+            , line(0)
+        {
+        }
+
+        StackFrame(Strong<JSObject> otherCallee, StackFrameCodeType otherCodeType, Strong<ExecutableBase> otherExecutable, int otherLine, String otherSourceURL)
+            : callee(otherCallee)
+            , codeType(otherCodeType)
+            , executable(otherExecutable)
+            , line(otherLine)
+            , sourceURL(otherSourceURL)
+        {
+        }
+
         String toString(CallFrame* callFrame) const
         {
             StringBuilder traceBuild;
@@ -223,7 +239,6 @@
 
         JSValue retrieveArgumentsFromVMCode(CallFrame*, JSFunction*) const;
         JSValue retrieveCallerFromVMCode(CallFrame*, JSFunction*) const;
-        JS_EXPORT_PRIVATE void retrieveLastCaller(CallFrame*, int& lineNumber, intptr_t& sourceID, String& sourceURL, JSValue& function) const;
         
         void getArgumentsData(CallFrame*, JSFunction*&, ptrdiff_t& firstParameterIndex, Register*& argv, int& argc);
         
@@ -232,7 +247,7 @@
         NEVER_INLINE HandlerInfo* throwException(CallFrame*&, JSValue&, unsigned bytecodeOffset);
         NEVER_INLINE void debug(CallFrame*, DebugHookID, int firstLine, int lastLine, int charPosition);
         static const String getTraceLine(CallFrame*, StackFrameCodeType, const String&, int);
-        JS_EXPORT_PRIVATE static void getStackTrace(VM*, Vector<StackFrame>& results);
+        JS_EXPORT_PRIVATE void getStackTrace(Vector<StackFrame>& results, unsigned maxStackSize = UINT_MAX);
         static void addStackTraceIfNecessary(CallFrame*, JSObject* error);
 
         void dumpSampleData(ExecState* exec);
@@ -270,6 +285,7 @@
         int m_sampleEntryDepth;
         OwnPtr<SamplingTool> m_sampler;
 
+        VM& m_vm;
         JSStack m_stack;
         int m_errorHandlingModeReentry;
         

Modified: branches/dfgFourthTier/Source/_javascript_Core/jsc.cpp (150689 => 150690)


--- branches/dfgFourthTier/Source/_javascript_Core/jsc.cpp	2013-05-25 18:35:45 UTC (rev 150689)
+++ branches/dfgFourthTier/Source/_javascript_Core/jsc.cpp	2013-05-25 20:17:29 UTC (rev 150690)
@@ -327,7 +327,7 @@
     trace.appendLiteral("--> Stack trace:\n");
 
     Vector<StackFrame> stackTrace;
-    Interpreter::getStackTrace(&exec->vm(), stackTrace);
+    exec->interpreter()->getStackTrace(stackTrace);
     int i = 0;
 
     for (Vector<StackFrame>::iterator iter = stackTrace.begin(); iter < stackTrace.end(); iter++) {

Modified: branches/dfgFourthTier/Source/_javascript_Core/profiler/ProfileGenerator.cpp (150689 => 150690)


--- branches/dfgFourthTier/Source/_javascript_Core/profiler/ProfileGenerator.cpp	2013-05-25 18:35:45 UTC (rev 150689)
+++ branches/dfgFourthTier/Source/_javascript_Core/profiler/ProfileGenerator.cpp	2013-05-25 20:17:29 UTC (rev 150690)
@@ -58,13 +58,10 @@
 
 void ProfileGenerator::addParentForConsoleStart(ExecState* exec)
 {
-    int lineNumber;
-    intptr_t sourceID;
-    String sourceURL;
-    JSValue function;
+    Vector<StackFrame> stackTrace;
+    exec->interpreter()->getStackTrace(stackTrace, 2);
 
-    exec->interpreter()->retrieveLastCaller(exec, lineNumber, sourceID, sourceURL, function);
-    m_currentNode = ProfileNode::create(exec, LegacyProfiler::createCallIdentifier(exec, function, sourceURL, lineNumber), m_head.get(), m_head.get());
+    m_currentNode = ProfileNode::create(exec, LegacyProfiler::createCallIdentifier(exec, stackTrace[1].callee.get(), stackTrace[1].sourceURL, stackTrace[1].line), m_head.get(), m_head.get());
     m_head->insertNode(m_currentNode.get());
 }
 

Modified: branches/dfgFourthTier/Source/WebCore/ChangeLog (150689 => 150690)


--- branches/dfgFourthTier/Source/WebCore/ChangeLog	2013-05-25 18:35:45 UTC (rev 150689)
+++ branches/dfgFourthTier/Source/WebCore/ChangeLog	2013-05-25 20:17:29 UTC (rev 150690)
@@ -1,3 +1,20 @@
+2013-05-25  Mark Lam  <mark....@apple.com>
+
+        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.
+
+        No new tests.
+
+        * bindings/js/JSXMLHttpRequestCustom.cpp:
+        (WebCore::JSXMLHttpRequest::send):
+        * bindings/js/ScriptCallStackFactory.cpp:
+        (WebCore::createScriptCallStack):
+
 2013-05-06  Geoffrey Garen  <gga...@apple.com>
 
         Cherry-pick merged some patches to the FTL branch.

Modified: branches/dfgFourthTier/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp (150689 => 150690)


--- branches/dfgFourthTier/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp	2013-05-25 18:35:45 UTC (rev 150689)
+++ branches/dfgFourthTier/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp	2013-05-25 20:17:29 UTC (rev 150690)
@@ -133,13 +133,10 @@
             impl()->send(val.toString(exec)->value(exec), ec);
     }
 
-    int signedLineNumber;
-    intptr_t sourceID;
-    String sourceURL;
-    JSValue function;
-    exec->interpreter()->retrieveLastCaller(exec, signedLineNumber, sourceID, sourceURL, function);
-    impl()->setLastSendLineNumber(signedLineNumber >= 0 ? signedLineNumber : 0);
-    impl()->setLastSendURL(sourceURL);
+    Vector<StackFrame> stackTrace(2);
+    exec->interpreter()->getStackTrace(stackTrace, 2);
+    impl()->setLastSendLineNumber(stackTrace[1].line);
+    impl()->setLastSendURL(stackTrace[1].sourceURL);
 
     setDOMException(exec, ec);
     return jsUndefined();

Modified: branches/dfgFourthTier/Source/WebCore/bindings/js/ScriptCallStackFactory.cpp (150689 => 150690)


--- branches/dfgFourthTier/Source/WebCore/bindings/js/ScriptCallStackFactory.cpp	2013-05-25 18:35:45 UTC (rev 150689)
+++ branches/dfgFourthTier/Source/WebCore/bindings/js/ScriptCallStackFactory.cpp	2013-05-25 20:17:29 UTC (rev 150690)
@@ -58,7 +58,7 @@
     Vector<ScriptCallFrame> frames;
     if (JSC::ExecState* exec = JSMainThreadExecState::currentState()) {
         Vector<StackFrame> stackTrace;
-        Interpreter::getStackTrace(&exec->vm(), stackTrace);
+        exec->interpreter()->getStackTrace(stackTrace);
         for (Vector<StackFrame>::const_iterator iter = stackTrace.begin(); iter < stackTrace.end(); iter++) {
             frames.append(ScriptCallFrame(iter->friendlyFunctionName(exec), iter->friendlySourceURL(), iter->friendlyLineNumber()));
             if (frames.size() >= maxStackSize)
@@ -77,30 +77,13 @@
 PassRefPtr<ScriptCallStack> createScriptCallStack(JSC::ExecState* exec, size_t maxStackSize)
 {
     Vector<ScriptCallFrame> frames;
-    CallFrame* callFrame = exec;
-    while (true) {
-        ASSERT(callFrame);
-        int signedLineNumber;
-        intptr_t sourceID;
-        String urlString;
-        JSValue function;
-
-        exec->interpreter()->retrieveLastCaller(callFrame, signedLineNumber, sourceID, urlString, function);
-        String functionName;
-        if (function)
-            functionName = jsCast<JSFunction*>(function)->name(exec);
-        else {
-            // Caller is unknown, but if frames is empty we should still add the frame, because
-            // something called us, and gave us arguments.
-            if (!frames.isEmpty())
-                break;
-        }
-        unsigned lineNumber = signedLineNumber >= 0 ? signedLineNumber : 0;
-        frames.append(ScriptCallFrame(functionName, urlString, lineNumber));
-        if (!function || frames.size() == maxStackSize)
-            break;
-        callFrame = callFrame->callerFrame();
-    }
+    Vector<StackFrame> stackTrace;
+    maxStackSize++;
+    exec->interpreter()->getStackTrace(stackTrace, maxStackSize);
+    maxStackSize = stackTrace.size();
+    for (size_t i = 1; i < maxStackSize; i++)
+        frames.append(ScriptCallFrame(stackTrace[i].friendlyFunctionName(exec),
+            stackTrace[i].friendlySourceURL(), stackTrace[i].friendlyLineNumber()));
     return ScriptCallStack::create(frames);
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to