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);
}