Commit 51a9926e authored by ggaren@apple.com's avatar ggaren@apple.com

Rolled out 147820 and 147818 because they caused plugins tests to ASSERT

https://bugs.webkit.org/show_bug.cgi?id=114094

Reviewed by Anders Carlsson.

Source/JavaScriptCore: 

* API/JSContextRef.cpp:
(JSContextCreateBacktrace):
* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::emitDebugHook):
* interpreter/Interpreter.cpp:
(JSC):
(JSC::Interpreter::dumpRegisters):
(JSC::Interpreter::unwindCallFrame):
(JSC::getLineNumberForCallFrame):
(JSC::getCallerInfo):
(JSC::Interpreter::getStackTrace):
(JSC::Interpreter::addStackTraceIfNecessary):
(JSC::Interpreter::retrieveCallerFromVMCode):
* interpreter/Interpreter.h:
(StackFrame):
(JSC::StackFrame::toString):
(JSC::StackFrame::friendlyLineNumber):
(Interpreter):
* runtime/Error.cpp:
(JSC::throwError):
* runtime/JSGlobalData.h:
(JSC):
(JSGlobalData):
* runtime/JSGlobalObject.cpp:
(JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope):

Source/WebCore: 

* bindings/js/ScriptCallStackFactory.cpp:
(WebCore::createScriptCallStack):
* inspector/ScriptCallFrame.cpp:
(WebCore::ScriptCallFrame::isEqual):
* inspector/ScriptCallFrame.h:
(ScriptCallFrame):
(WebCore::ScriptCallFrame::lineNumber):

Tools: 

* Scripts/run-jsc:


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@147846 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent a77121fc
......@@ -36,7 +36,6 @@
#include "JSGlobalObject.h"
#include "JSObject.h"
#include "Operations.h"
#include "SourceProvider.h"
#include <wtf/text/StringBuilder.h>
#include <wtf/text/StringHash.h>
......@@ -176,38 +175,51 @@ JSStringRef JSContextCreateBacktrace(JSContextRef ctx, unsigned maxStackSize)
{
ExecState* exec = toJS(ctx);
JSLockHolder lock(exec);
StringBuilder builder;
Vector<StackFrame> stackTrace;
Interpreter::getStackTrace(&exec->globalData(), stackTrace, maxStackSize);
for (size_t i = 0; i < stackTrace.size(); i++) {
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;
String functionName;
StackFrame& frame = stackTrace[i];
JSValue function = frame.callee.get();
if (frame.callee)
functionName = frame.friendlyFunctionName(exec);
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 (i)
if (count)
break;
}
unsigned lineNumber = frame.line();
unsigned lineNumber = signedLineNumber >= 0 ? signedLineNumber : 0;
if (!builder.isEmpty())
builder.append('\n');
builder.append('#');
builder.appendNumber(i);
builder.appendNumber(count);
builder.append(' ');
builder.append(functionName);
builder.appendLiteral("() at ");
builder.append(urlString);
if (frame.codeType != StackFrameNativeCode) {
builder.append(':');
builder.appendNumber(lineNumber);
}
if (!function)
builder.append(':');
builder.appendNumber(lineNumber);
if (!function || ++count == maxStackSize)
break;
callFrame = callFrame->callerFrame();
}
return OpaqueJSString::create(builder.toString()).leakRef();
}
......
2013-04-06 Geoffrey Garen <ggaren@apple.com>
Rolled out 147820 and 147818 because they caused plugins tests to ASSERT
https://bugs.webkit.org/show_bug.cgi?id=114094
Reviewed by Anders Carlsson.
* API/JSContextRef.cpp:
(JSContextCreateBacktrace):
* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::emitDebugHook):
* interpreter/Interpreter.cpp:
(JSC):
(JSC::Interpreter::dumpRegisters):
(JSC::Interpreter::unwindCallFrame):
(JSC::getLineNumberForCallFrame):
(JSC::getCallerInfo):
(JSC::Interpreter::getStackTrace):
(JSC::Interpreter::addStackTraceIfNecessary):
(JSC::Interpreter::retrieveCallerFromVMCode):
* interpreter/Interpreter.h:
(StackFrame):
(JSC::StackFrame::toString):
(JSC::StackFrame::friendlyLineNumber):
(Interpreter):
* runtime/Error.cpp:
(JSC::throwError):
* runtime/JSGlobalData.h:
(JSC):
(JSGlobalData):
* runtime/JSGlobalObject.cpp:
(JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope):
2013-04-06 Patrick Gansterer <paroga@webkit.org>
Unreviewed build fix after r146932.
......@@ -2055,7 +2055,6 @@ void BytecodeGenerator::emitDebugHook(DebugHookID debugHookID, int firstLine, in
if (!m_shouldEmitDebugHooks)
return;
#endif
emitExpressionInfo(charPosition, 0, 0);
emitOpcode(op_debug);
instructions().append(debugHookID);
instructions().append(firstLine);
......
......@@ -199,7 +199,7 @@ Interpreter::StackPolicy::StackPolicy(Interpreter& interpreter, const StackBound
}
static CallFrame* getCallerInfo(JSGlobalData*, CallFrame*, unsigned& bytecodeOffset, CodeBlock*& callerOut);
static CallFrame* getCallerInfo(JSGlobalData*, CallFrame*, int& lineNumber, unsigned& bytecodeOffset, CodeBlock*& callerOut);
// Returns the depth of the scope chain within a given call frame.
static int depth(CodeBlock* codeBlock, JSScope* sc)
......@@ -422,9 +422,8 @@ void Interpreter::dumpRegisters(CallFrame* callFrame)
#endif
unsigned bytecodeOffset = 0;
int line = 0;
CodeBlock* callerCodeBlock = 0;
getCallerInfo(&callFrame->globalData(), callFrame, bytecodeOffset, callerCodeBlock);
line = callerCodeBlock->lineNumberForBytecodeOffset(bytecodeOffset);
CodeBlock* unusedCallerCodeBlock = 0;
getCallerInfo(&callFrame->globalData(), callFrame, line, bytecodeOffset, unusedCallerCodeBlock);
dataLogF("[ReturnVPC] | %10p | %d (line %d)\n", it, bytecodeOffset, line);
++it;
dataLogF("[CodeBlock] | %10p | %p \n", it, callFrame->codeBlock());
......@@ -508,7 +507,8 @@ NEVER_INLINE bool Interpreter::unwindCallFrame(CallFrame*& callFrame, JSValue ex
callFrame->globalData().topCallFrame = callerFrame;
if (callerFrame->hasHostCallFrameFlag())
return false;
callFrame = getCallerInfo(&callFrame->globalData(), callFrame, bytecodeOffset, codeBlock);
int unusedLineNumber = 0;
callFrame = getCallerInfo(&callFrame->globalData(), callFrame, unusedLineNumber, bytecodeOffset, codeBlock);
return true;
}
......@@ -564,25 +564,27 @@ static void appendSourceToError(CallFrame* callFrame, ErrorInstance* exception,
exception->putDirect(*globalData, globalData->propertyNames->message, jsString(globalData, message));
}
static unsigned getBytecodeOffsetForCallFrame(CallFrame* callFrame)
static int getLineNumberForCallFrame(JSGlobalData* globalData, CallFrame* callFrame)
{
UNUSED_PARAM(globalData);
callFrame = callFrame->removeHostCallFrameFlag();
CodeBlock* codeBlock = callFrame->codeBlock();
if (!codeBlock)
return 0;
#if ENABLE(JIT)
return -1;
#if ENABLE(JIT) || ENABLE(LLINT)
#if ENABLE(DFG_JIT)
if (codeBlock->getJITType() == JITCode::DFGJIT)
return codeBlock->codeOrigin(callFrame->codeOriginIndexForDFG()).bytecodeIndex;
return codeBlock->lineNumberForBytecodeOffset(codeBlock->codeOrigin(callFrame->codeOriginIndexForDFG()).bytecodeIndex);
#endif
return callFrame->bytecodeOffsetForNonDFGCode();
return codeBlock->lineNumberForBytecodeOffset(callFrame->bytecodeOffsetForNonDFGCode());
#endif
}
static CallFrame* getCallerInfo(JSGlobalData* globalData, CallFrame* callFrame, unsigned& bytecodeOffset, CodeBlock*& caller)
static CallFrame* getCallerInfo(JSGlobalData* globalData, CallFrame* callFrame, int& lineNumber, unsigned& bytecodeOffset, CodeBlock*& caller)
{
ASSERT_UNUSED(globalData, globalData);
bytecodeOffset = 0;
lineNumber = -1;
ASSERT(!callFrame->hasHostCallFrameFlag());
CallFrame* callerFrame = callFrame->codeBlock() ? callFrame->trueCallerFrame() : callFrame->callerFrame()->removeHostCallFrameFlag();
bool callframeIsHost = callerFrame->addHostCallFrameFlag() == callFrame->callerFrame();
......@@ -652,6 +654,7 @@ static CallFrame* getCallerInfo(JSGlobalData* globalData, CallFrame* callFrame,
RELEASE_ASSERT(callerCodeBlock);
caller = callerCodeBlock;
lineNumber = callerCodeBlock->lineNumberForBytecodeOffset(bytecodeOffset);
return callerFrame;
}
......@@ -677,97 +680,51 @@ static StackFrameCodeType getStackFrameCodeType(CallFrame* callFrame)
return StackFrameGlobalCode;
}
unsigned StackFrame::line()
{
return codeBlock ? codeBlock->lineNumberForBytecodeOffset(bytecodeOffset) + lineOffset : 0;
}
unsigned StackFrame::column()
{
if (!code)
return 0;
int divot = 0;
int unusedStartOffset = 0;
int unusedEndOffset = 0;
expressionInfo(divot, unusedStartOffset, unusedEndOffset);
return code->charPositionToColumnNumber(divot);
}
void StackFrame::expressionInfo(int& divot, int& startOffset, int& endOffset)
{
codeBlock->expressionRangeForBytecodeOffset(bytecodeOffset, divot, startOffset, endOffset);
divot += startOffset;
}
String StackFrame::toString(CallFrame* callFrame)
{
StringBuilder traceBuild;
String functionName = friendlyFunctionName(callFrame);
String sourceURL = friendlySourceURL();
traceBuild.append(functionName);
if (!sourceURL.isEmpty()) {
if (!functionName.isEmpty())
traceBuild.append('@');
traceBuild.append(sourceURL);
if (codeType != StackFrameNativeCode) {
traceBuild.append(':');
traceBuild.appendNumber(line());
}
}
return traceBuild.toString().impl();
}
void Interpreter::getStackTrace(JSGlobalData* globalData, Vector<StackFrame>& results, size_t maxStackSize)
void Interpreter::getStackTrace(JSGlobalData* globalData, Vector<StackFrame>& results)
{
CallFrame* callFrame = globalData->topCallFrame->removeHostCallFrameFlag();
if (!callFrame || callFrame == CallFrame::noCaller())
return;
unsigned bytecodeOffset = getBytecodeOffsetForCallFrame(callFrame);
int line = getLineNumberForCallFrame(globalData, callFrame);
callFrame = callFrame->trueCallFrameFromVMCode();
if (!callFrame)
return;
CodeBlock* callerCodeBlock = callFrame->codeBlock();
while (callFrame && callFrame != CallFrame::noCaller() && maxStackSize--) {
while (callFrame && callFrame != CallFrame::noCaller()) {
String sourceURL;
if (callerCodeBlock) {
if (callFrame->codeBlock()) {
sourceURL = getSourceURLFromCallFrame(callFrame);
StackFrame s = {
Strong<JSObject>(*globalData, callFrame->callee()),
getStackFrameCodeType(callFrame),
Strong<ExecutableBase>(*globalData, callerCodeBlock->ownerExecutable()),
Strong<UnlinkedCodeBlock>(*globalData, callerCodeBlock->unlinkedCodeBlock()),
callerCodeBlock->source(),
callerCodeBlock->ownerExecutable()->lineNo(),
callerCodeBlock->sourceOffset(),
bytecodeOffset,
sourceURL
};
StackFrame s = { Strong<JSObject>(*globalData, callFrame->callee()), getStackFrameCodeType(callFrame), Strong<ExecutableBase>(*globalData, callFrame->codeBlock()->ownerExecutable()), line, sourceURL};
results.append(s);
} else {
StackFrame s = { Strong<JSObject>(*globalData, callFrame->callee()), StackFrameNativeCode, Strong<ExecutableBase>(), Strong<UnlinkedCodeBlock>(), 0, 0, 0, 0, String()};
StackFrame s = { Strong<JSObject>(*globalData, callFrame->callee()), StackFrameNativeCode, Strong<ExecutableBase>(), -1, String()};
results.append(s);
}
callFrame = getCallerInfo(globalData, callFrame, bytecodeOffset, callerCodeBlock);
unsigned unusedBytecodeOffset = 0;
CodeBlock* unusedCallerCodeBlock = 0;
callFrame = getCallerInfo(globalData, callFrame, line, unusedBytecodeOffset, unusedCallerCodeBlock);
}
}
void Interpreter::addStackTraceIfNecessary(CallFrame* callFrame, JSValue error)
void Interpreter::addStackTraceIfNecessary(CallFrame* callFrame, JSObject* error)
{
JSGlobalData* globalData = &callFrame->globalData();
ASSERT(callFrame == globalData->topCallFrame || callFrame == callFrame->lexicalGlobalObject()->globalExec() || callFrame == callFrame->dynamicGlobalObject()->globalExec());
if (error->hasProperty(callFrame, globalData->propertyNames->stack))
return;
Vector<StackFrame> stackTrace;
getStackTrace(&callFrame->globalData(), stackTrace);
if (stackTrace.isEmpty() || !error.isObject())
if (stackTrace.isEmpty())
return;
JSObject* errorObject = asObject(error);
JSGlobalObject* globalObject = 0;
if (isTerminatedExecutionException(error) || isInterruptedExecutionException(error))
globalObject = globalData->dynamicGlobalObject;
else
globalObject = errorObject->globalObject();
globalObject = error->globalObject();
// FIXME: JSStringJoiner could be more efficient than StringBuilder here.
StringBuilder builder;
......@@ -776,10 +733,8 @@ void Interpreter::addStackTraceIfNecessary(CallFrame* callFrame, JSValue error)
if (i != stackTrace.size() - 1)
builder.append('\n');
}
if (errorObject->hasProperty(callFrame, globalData->propertyNames->stack))
return;
errorObject->putDirect(*globalData, globalData->propertyNames->stack, jsString(globalData, builder.toString()), ReadOnly | DontDelete);
error->putDirect(*globalData, globalData->propertyNames->stack, jsString(globalData, builder.toString()), ReadOnly | DontDelete);
}
NEVER_INLINE HandlerInfo* Interpreter::throwException(CallFrame*& callFrame, JSValue& exceptionValue, unsigned bytecodeOffset)
......@@ -1422,9 +1377,10 @@ JSValue Interpreter::retrieveCallerFromVMCode(CallFrame* callFrame, JSFunction*
if (!functionCallFrame)
return jsNull();
int lineNumber;
unsigned bytecodeOffset;
CodeBlock* unusedCallerCodeBlock = 0;
CallFrame* callerFrame = getCallerInfo(&callFrame->globalData(), functionCallFrame, bytecodeOffset, unusedCallerCodeBlock);
CallFrame* callerFrame = getCallerInfo(&callFrame->globalData(), functionCallFrame, lineNumber, bytecodeOffset, unusedCallerCodeBlock);
if (!callerFrame)
return jsNull();
JSValue caller = callerFrame->callee();
......@@ -1434,7 +1390,7 @@ JSValue Interpreter::retrieveCallerFromVMCode(CallFrame* callFrame, JSFunction*
// Skip over function bindings.
ASSERT(caller.isObject());
while (asObject(caller)->inherits(&JSBoundFunction::s_info)) {
callerFrame = getCallerInfo(&callFrame->globalData(), callerFrame, bytecodeOffset, unusedCallerCodeBlock);
callerFrame = getCallerInfo(&callFrame->globalData(), callerFrame, lineNumber, bytecodeOffset, unusedCallerCodeBlock);
if (!callerFrame)
return jsNull();
caller = callerFrame->callee();
......
......@@ -79,13 +79,25 @@ namespace JSC {
Strong<JSObject> callee;
StackFrameCodeType codeType;
Strong<ExecutableBase> executable;
Strong<UnlinkedCodeBlock> codeBlock;
RefPtr<SourceProvider> code;
int lineOffset;
unsigned characterOffset;
unsigned bytecodeOffset;
int line;
String sourceURL;
JS_EXPORT_PRIVATE String toString(CallFrame*);
String toString(CallFrame* callFrame) const
{
StringBuilder traceBuild;
String functionName = friendlyFunctionName(callFrame);
String sourceURL = friendlySourceURL();
traceBuild.append(functionName);
if (!sourceURL.isEmpty()) {
if (!functionName.isEmpty())
traceBuild.append('@');
traceBuild.append(sourceURL);
if (line > -1) {
traceBuild.append(':');
traceBuild.appendNumber(line);
}
}
return traceBuild.toString().impl();
}
String friendlySourceURL() const
{
String traceLine;
......@@ -125,9 +137,10 @@ namespace JSC {
}
return traceLine.isNull() ? emptyString() : traceLine;
}
JS_EXPORT_PRIVATE unsigned line();
JS_EXPORT_PRIVATE unsigned column();
JS_EXPORT_PRIVATE void expressionInfo(int& divot, int& startOffset, int& endOffset);
unsigned friendlyLineNumber() const
{
return line > -1 ? line : 0;
}
};
class TopCallFrameSetter {
......@@ -219,8 +232,8 @@ namespace JSC {
NEVER_INLINE HandlerInfo* throwException(CallFrame*&, JSValue&, unsigned bytecodeOffset);
NEVER_INLINE void debug(CallFrame*, DebugHookID, int firstLine, int lastLine, int column);
static const String getTraceLine(CallFrame*, StackFrameCodeType, const String&, int);
JS_EXPORT_PRIVATE static void getStackTrace(JSGlobalData*, Vector<StackFrame>& results, size_t maxStackSize = std::numeric_limits<size_t>::max());
static void addStackTraceIfNecessary(CallFrame*, JSValue error);
JS_EXPORT_PRIVATE static void getStackTrace(JSGlobalData*, Vector<StackFrame>& results);
static void addStackTraceIfNecessary(CallFrame*, JSObject* error);
void dumpSampleData(ExecState* exec);
void startSampling();
......
......@@ -155,7 +155,8 @@ bool hasErrorInfo(ExecState* exec, JSObject* error)
JSValue throwError(ExecState* exec, JSValue error)
{
Interpreter::addStackTraceIfNecessary(exec, error);
if (error.isObject())
return throwError(exec, asObject(error));
exec->globalData().exception = error;
return error;
}
......
......@@ -54,7 +54,6 @@
#include <wtf/BumpPointerAllocator.h>
#include <wtf/Forward.h>
#include <wtf/HashMap.h>
#include <wtf/RefCountedArray.h>
#include <wtf/SimpleStats.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/ThreadSpecific.h>
......@@ -82,7 +81,6 @@ namespace JSC {
class RegExpCache;
class SourceProvider;
class SourceProviderCache;
struct StackFrame;
class Stringifier;
class Structure;
#if ENABLE(REGEXP_TRACING)
......@@ -330,7 +328,6 @@ namespace JSC {
Terminator terminator;
JSValue exception;
RefCountedArray<StackFrame> exceptionStack;
const ClassInfo* const jsArrayClassInfo;
const ClassInfo* const jsFinalObjectClassInfo;
......
......@@ -597,8 +597,6 @@ DynamicGlobalObjectScope::DynamicGlobalObjectScope(JSGlobalData& globalData, JSG
// to observe time zone changes.
globalData.resetDateCache();
}
// Clear the exception stack between entries
globalData.exceptionStack = RefCountedArray<StackFrame>();
}
void slowValidateCell(JSGlobalObject* globalObject)
......
2013-04-06 Geoffrey Garen <ggaren@apple.com>
Rolled out 147820 and 147818 because they caused plugins tests to ASSERT
https://bugs.webkit.org/show_bug.cgi?id=114094
Reviewed by Anders Carlsson.
* bindings/js/ScriptCallStackFactory.cpp:
(WebCore::createScriptCallStack):
* inspector/ScriptCallFrame.cpp:
(WebCore::ScriptCallFrame::isEqual):
* inspector/ScriptCallFrame.h:
(ScriptCallFrame):
(WebCore::ScriptCallFrame::lineNumber):
2013-04-06 Anders Carlsson <andersca@apple.com>
Remove VisitedLinks.{cpp|h}
......@@ -58,15 +58,18 @@ PassRefPtr<ScriptCallStack> createScriptCallStack(size_t maxStackSize, bool empt
Vector<ScriptCallFrame> frames;
if (JSC::ExecState* exec = JSMainThreadExecState::currentState()) {
Vector<StackFrame> stackTrace;
Interpreter::getStackTrace(&exec->globalData(), stackTrace, maxStackSize);
for (size_t i = 0; i < stackTrace.size(); i++)
frames.append(ScriptCallFrame(stackTrace[i].friendlyFunctionName(exec), stackTrace[i].friendlySourceURL(), stackTrace[i].line(), stackTrace[i].column()));
Interpreter::getStackTrace(&exec->globalData(), 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)
break;
}
}
if (frames.isEmpty() && !emptyIsAllowed) {
// No frames found. It may happen in the case where
// a bound function is called from native code for example.
// Fallback to setting lineNumber to 0, and source and function name to "undefined".
frames.append(ScriptCallFrame("undefined", "undefined", 0, 0));
frames.append(ScriptCallFrame("undefined", "undefined", 0));
}
return ScriptCallStack::create(frames);
}
......@@ -74,18 +77,30 @@ PassRefPtr<ScriptCallStack> createScriptCallStack(size_t maxStackSize, bool empt
PassRefPtr<ScriptCallStack> createScriptCallStack(JSC::ExecState* exec, size_t maxStackSize)
{
Vector<ScriptCallFrame> frames;
Vector<StackFrame> stackTrace;
Interpreter::getStackTrace(&exec->globalData(), stackTrace, maxStackSize + 1);
for (size_t i = 1; i < stackTrace.size(); i++) {
// This early exit is necessary to maintain our old behaviour
// but the stack trace we produce now is complete and handles all
// ways in which code may be running
if (!stackTrace[i].callee && frames.size())
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;
String functionName = stackTrace[i].friendlyFunctionName(exec);
frames.append(ScriptCallFrame(functionName, stackTrace[i].sourceURL, stackTrace[i].line(), stackTrace[i].column()));
callFrame = callFrame->callerFrame();
}
return ScriptCallStack::create(frames);
}
......
......@@ -53,8 +53,7 @@ bool ScriptCallFrame::isEqual(const ScriptCallFrame& o) const
{
return m_functionName == o.m_functionName
&& m_scriptName == o.m_scriptName
&& m_lineNumber == o.m_lineNumber
&& m_column == o.m_column;
&& m_lineNumber == o.m_lineNumber;
}
#if ENABLE(INSPECTOR)
......
......@@ -44,13 +44,12 @@ class InspectorObject;
class ScriptCallFrame {
public:
ScriptCallFrame(const String& functionName, const String& scriptName, unsigned lineNumber, unsigned column);
ScriptCallFrame(const String& functionName, const String& scriptName, unsigned lineNumber, unsigned column = 0);
~ScriptCallFrame();
const String& functionName() const { return m_functionName; }
const String& sourceURL() const { return m_scriptName; }
unsigned lineNumber() const { return m_lineNumber; }
unsigned columnNumber() const { return m_column; }
bool isEqual(const ScriptCallFrame&) const;
......
2013-04-06 Geoffrey Garen <ggaren@apple.com>
Rolled out 147820 and 147818 because they caused plugins tests to ASSERT
https://bugs.webkit.org/show_bug.cgi?id=114094
Reviewed by Anders Carlsson.
* Scripts/run-jsc:
2013-04-05 Ojan Vafai <ojan@chromium.org>
Move the flakiness dashboard to the new instance at webkit-test-results.appspot.com
......@@ -42,6 +42,7 @@ my $count = 1;
my $verbose = 0;
GetOptions("count|c=i" => \$count,
"verbose|v" => \$verbose);
die "$usage\n" if (@ARGV < 1);
my $jsc = jscProductDir() . "/jsc @ARGV";
$jsc .= " 2> " . File::Spec->devnull() unless $verbose;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment