Changeset 147858 in webkit
- Timestamp:
- Apr 6, 2013, 3:47:56 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/API/JSContextRef.cpp
r147846 r147858 37 37 #include "JSObject.h" 38 38 #include "Operations.h" 39 #include "SourceProvider.h" 39 40 #include <wtf/text/StringBuilder.h> 40 41 #include <wtf/text/StringHash.h> … … 176 177 ExecState* exec = toJS(ctx); 177 178 JSLockHolder lock(exec); 178 179 unsigned count = 0;180 179 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; 180 Vector<StackFrame> stackTrace; 181 Interpreter::getStackTrace(&exec->globalData(), stackTrace, maxStackSize); 182 183 for (size_t i = 0; i < stackTrace.size(); i++) { 196 184 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); 185 String functionName; 186 StackFrame& frame = stackTrace[i]; 187 JSValue function = frame.callee.get(); 188 if (frame.callee) 189 functionName = frame.friendlyFunctionName(exec); 203 190 else { 204 191 // Caller is unknown, but if frame is empty we should still add the frame, because 205 192 // something called us, and gave us arguments. 206 if ( count)193 if (i) 207 194 break; 208 195 } 209 unsigned lineNumber = signedLineNumber >= 0 ? signedLineNumber : 0;196 unsigned lineNumber = frame.line(); 210 197 if (!builder.isEmpty()) 211 198 builder.append('\n'); 212 199 builder.append('#'); 213 builder.appendNumber( count);200 builder.appendNumber(i); 214 201 builder.append(' '); 215 202 builder.append(functionName); 216 203 builder.appendLiteral("() at "); 217 204 builder.append(urlString); 218 builder.append(':'); 219 builder.appendNumber(lineNumber); 220 if (!function || ++count == maxStackSize) 205 if (frame.codeType != StackFrameNativeCode) { 206 builder.append(':'); 207 builder.appendNumber(lineNumber); 208 } 209 if (!function) 221 210 break; 222 callFrame = callFrame->callerFrame();223 211 } 224 212 return OpaqueJSString::create(builder.toString()).leakRef(); -
trunk/Source/JavaScriptCore/ChangeLog
r147857 r147858 1 2013-04-06 Oliver Hunt <[email protected]> 2 3 Unify the many and varied stack trace mechanisms, and make the result sane. 4 https://bugs.webkit.org/show_bug.cgi?id=114072 5 6 Reviewed by Filip Pizlo. 7 8 Makes JSC::StackFrame record the bytecode offset and other necessary data 9 rather than requiring us to perform eager evaluation of the line number, etc. 10 Then remove most of the users of retrieveLastCaller, as most of them were 11 using it to create a stack trace in a fairly incomplete and inefficient way. 12 13 StackFrame now also has a couple of helpers to get the line and column info. 14 15 * API/JSContextRef.cpp: 16 (JSContextCreateBacktrace): 17 * bytecompiler/BytecodeGenerator.cpp: 18 (JSC::BytecodeGenerator::emitDebugHook): 19 * interpreter/Interpreter.cpp: 20 (JSC): 21 (JSC::Interpreter::dumpRegisters): 22 (JSC::Interpreter::unwindCallFrame): 23 (JSC::getBytecodeOffsetForCallFrame): 24 (JSC::getCallerInfo): 25 (JSC::StackFrame::line): 26 (JSC::StackFrame::column): 27 (JSC::StackFrame::expressionInfo): 28 (JSC::StackFrame::toString): 29 (JSC::Interpreter::getStackTrace): 30 (JSC::Interpreter::addStackTraceIfNecessary): 31 (JSC::Interpreter::retrieveCallerFromVMCode): 32 * interpreter/Interpreter.h: 33 (StackFrame): 34 (Interpreter): 35 * runtime/Error.cpp: 36 (JSC::throwError): 37 * runtime/JSGlobalData.h: 38 (JSC): 39 (JSGlobalData): 40 * runtime/JSGlobalObject.cpp: 41 (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): 42 1 43 2013-04-06 Geoffrey Garen <[email protected]> 2 44 -
trunk/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def
r147849 r147858 238 238 ?getConstructData@JSCell@JSC@@SA?AW4ConstructType@2@PAV12@AATConstructData@2@@Z 239 239 ?getID@SourceProvider@JSC@@AAEXXZ 240 ?getStackTrace@Interpreter@JSC@@SAXPAVJSGlobalData@2@AAV?$Vector@UStackFrame@JSC@@$0A@@WTF@@@Z241 240 ?getObject@JSCell@JSC@@QAEPAVJSObject@2@XZ 242 241 ?getObjectType@MemoryInstrumentation@WTF@@CAPBDPAVMemoryObjectInfo@2@@Z -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r147846 r147858 2056 2056 return; 2057 2057 #endif 2058 emitExpressionInfo(charPosition, 0, 0); 2058 2059 emitOpcode(op_debug); 2059 2060 instructions().append(debugHookID); -
trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp
r147851 r147858 200 200 201 201 202 static CallFrame* getCallerInfo(JSGlobalData*, CallFrame*, int& lineNumber,unsigned& bytecodeOffset, CodeBlock*& callerOut);202 static CallFrame* getCallerInfo(JSGlobalData*, CallFrame*, unsigned& bytecodeOffset, CodeBlock*& callerOut); 203 203 204 204 // Returns the depth of the scope chain within a given call frame. … … 423 423 unsigned bytecodeOffset = 0; 424 424 int line = 0; 425 CodeBlock* unusedCallerCodeBlock = 0; 426 getCallerInfo(&callFrame->globalData(), callFrame, line, bytecodeOffset, unusedCallerCodeBlock); 425 CodeBlock* callerCodeBlock = 0; 426 getCallerInfo(&callFrame->globalData(), callFrame, bytecodeOffset, callerCodeBlock); 427 line = callerCodeBlock->lineNumberForBytecodeOffset(bytecodeOffset); 427 428 dataLogF("[ReturnVPC] | %10p | %d (line %d)\n", it, bytecodeOffset, line); 428 429 ++it; … … 508 509 if (callerFrame->hasHostCallFrameFlag()) 509 510 return false; 510 int unusedLineNumber = 0; 511 callFrame = getCallerInfo(&callFrame->globalData(), callFrame, unusedLineNumber, bytecodeOffset, codeBlock); 511 callFrame = getCallerInfo(&callFrame->globalData(), callFrame, bytecodeOffset, codeBlock); 512 512 return true; 513 513 } … … 565 565 } 566 566 567 static int getLineNumberForCallFrame(JSGlobalData* globalData, CallFrame* callFrame) 568 { 569 UNUSED_PARAM(globalData); 567 static unsigned getBytecodeOffsetForCallFrame(CallFrame* callFrame) 568 { 570 569 callFrame = callFrame->removeHostCallFrameFlag(); 571 570 CodeBlock* codeBlock = callFrame->codeBlock(); 572 571 if (!codeBlock) 573 return -1;574 #if ENABLE(JIT) || ENABLE(LLINT)572 return 0; 573 #if ENABLE(JIT) 575 574 #if ENABLE(DFG_JIT) 576 575 if (codeBlock->getJITType() == JITCode::DFGJIT) 577 return codeBlock-> lineNumberForBytecodeOffset(codeBlock->codeOrigin(callFrame->codeOriginIndexForDFG()).bytecodeIndex);578 #endif 579 return c odeBlock->lineNumberForBytecodeOffset(callFrame->bytecodeOffsetForNonDFGCode());576 return codeBlock->codeOrigin(callFrame->codeOriginIndexForDFG()).bytecodeIndex; 577 #endif 578 return callFrame->bytecodeOffsetForNonDFGCode(); 580 579 #else 581 580 return 0; … … 583 582 } 584 583 585 static CallFrame* getCallerInfo(JSGlobalData* globalData, CallFrame* callFrame, int& lineNumber,unsigned& bytecodeOffset, CodeBlock*& caller)584 static CallFrame* getCallerInfo(JSGlobalData* globalData, CallFrame* callFrame, unsigned& bytecodeOffset, CodeBlock*& caller) 586 585 { 587 586 ASSERT_UNUSED(globalData, globalData); 588 587 bytecodeOffset = 0; 589 lineNumber = -1;590 588 ASSERT(!callFrame->hasHostCallFrameFlag()); 591 589 CallFrame* callerFrame = callFrame->codeBlock() ? callFrame->trueCallerFrame() : callFrame->callerFrame()->removeHostCallFrameFlag(); … … 657 655 RELEASE_ASSERT(callerCodeBlock); 658 656 caller = callerCodeBlock; 659 lineNumber = callerCodeBlock->lineNumberForBytecodeOffset(bytecodeOffset);660 657 return callerFrame; 661 658 } … … 683 680 } 684 681 685 void Interpreter::getStackTrace(JSGlobalData* globalData, Vector<StackFrame>& results) 682 unsigned StackFrame::line() 683 { 684 return codeBlock ? codeBlock->lineNumberForBytecodeOffset(bytecodeOffset) + lineOffset : 0; 685 } 686 687 unsigned StackFrame::column() 688 { 689 if (!code) 690 return 0; 691 int divot = 0; 692 int unusedStartOffset = 0; 693 int unusedEndOffset = 0; 694 expressionInfo(divot, unusedStartOffset, unusedEndOffset); 695 return code->charPositionToColumnNumber(divot); 696 } 697 698 void StackFrame::expressionInfo(int& divot, int& startOffset, int& endOffset) 699 { 700 codeBlock->expressionRangeForBytecodeOffset(bytecodeOffset, divot, startOffset, endOffset); 701 divot += startOffset; 702 } 703 704 String StackFrame::toString(CallFrame* callFrame) 705 { 706 StringBuilder traceBuild; 707 String functionName = friendlyFunctionName(callFrame); 708 String sourceURL = friendlySourceURL(); 709 traceBuild.append(functionName); 710 if (!sourceURL.isEmpty()) { 711 if (!functionName.isEmpty()) 712 traceBuild.append('@'); 713 traceBuild.append(sourceURL); 714 if (codeType != StackFrameNativeCode) { 715 traceBuild.append(':'); 716 traceBuild.appendNumber(line()); 717 } 718 } 719 return traceBuild.toString().impl(); 720 } 721 722 void Interpreter::getStackTrace(JSGlobalData* globalData, Vector<StackFrame>& results, size_t maxStackSize) 686 723 { 687 724 CallFrame* callFrame = globalData->topCallFrame->removeHostCallFrameFlag(); 688 725 if (!callFrame || callFrame == CallFrame::noCaller()) 689 726 return; 690 int line = getLineNumberForCallFrame(globalData, callFrame); 691 727 unsigned bytecodeOffset = getBytecodeOffsetForCallFrame(callFrame); 692 728 callFrame = callFrame->trueCallFrameFromVMCode(); 693 729 if (!callFrame) 694 730 return; 695 696 while (callFrame && callFrame != CallFrame::noCaller()) { 731 CodeBlock* callerCodeBlock = callFrame->codeBlock(); 732 733 while (callFrame && callFrame != CallFrame::noCaller() && maxStackSize--) { 697 734 String sourceURL; 698 if (call Frame->codeBlock()) {735 if (callerCodeBlock) { 699 736 sourceURL = getSourceURLFromCallFrame(callFrame); 700 StackFrame s = { Strong<JSObject>(*globalData, callFrame->callee()), getStackFrameCodeType(callFrame), Strong<ExecutableBase>(*globalData, callFrame->codeBlock()->ownerExecutable()), line, sourceURL}; 737 StackFrame s = { 738 Strong<JSObject>(*globalData, callFrame->callee()), 739 getStackFrameCodeType(callFrame), 740 Strong<ExecutableBase>(*globalData, callerCodeBlock->ownerExecutable()), 741 Strong<UnlinkedCodeBlock>(*globalData, callerCodeBlock->unlinkedCodeBlock()), 742 callerCodeBlock->source(), 743 callerCodeBlock->ownerExecutable()->lineNo(), 744 callerCodeBlock->sourceOffset(), 745 bytecodeOffset, 746 sourceURL 747 }; 701 748 results.append(s); 702 749 } else { 703 StackFrame s = { Strong<JSObject>(*globalData, callFrame->callee()), StackFrameNativeCode, Strong<ExecutableBase>(), -1, String()};750 StackFrame s = { Strong<JSObject>(*globalData, callFrame->callee()), StackFrameNativeCode, Strong<ExecutableBase>(), Strong<UnlinkedCodeBlock>(), 0, 0, 0, 0, String()}; 704 751 results.append(s); 705 752 } 706 unsigned unusedBytecodeOffset = 0; 707 CodeBlock* unusedCallerCodeBlock = 0; 708 callFrame = getCallerInfo(globalData, callFrame, line, unusedBytecodeOffset, unusedCallerCodeBlock); 709 } 710 } 711 712 void Interpreter::addStackTraceIfNecessary(CallFrame* callFrame, JSObject* error) 753 callFrame = getCallerInfo(globalData, callFrame, bytecodeOffset, callerCodeBlock); 754 } 755 } 756 757 void Interpreter::addStackTraceIfNecessary(CallFrame* callFrame, JSValue error) 713 758 { 714 759 JSGlobalData* globalData = &callFrame->globalData(); 715 760 ASSERT(callFrame == globalData->topCallFrame || callFrame == callFrame->lexicalGlobalObject()->globalExec() || callFrame == callFrame->dynamicGlobalObject()->globalExec()); 716 if (error->hasProperty(callFrame, globalData->propertyNames->stack))717 return;718 761 719 762 Vector<StackFrame> stackTrace; 720 763 getStackTrace(&callFrame->globalData(), stackTrace); 721 764 722 if (stackTrace.isEmpty() )765 if (stackTrace.isEmpty() || !error.isObject()) 723 766 return; 724 767 JSObject* errorObject = asObject(error); 725 768 JSGlobalObject* globalObject = 0; 726 769 if (isTerminatedExecutionException(error) || isInterruptedExecutionException(error)) 727 770 globalObject = globalData->dynamicGlobalObject; 728 771 else 729 globalObject = error ->globalObject();772 globalObject = errorObject->globalObject(); 730 773 731 774 // FIXME: JSStringJoiner could be more efficient than StringBuilder here. … … 736 779 builder.append('\n'); 737 780 } 738 739 error->putDirect(*globalData, globalData->propertyNames->stack, jsString(globalData, builder.toString()), ReadOnly | DontDelete); 781 782 if (errorObject->hasProperty(callFrame, globalData->propertyNames->stack)) 783 return; 784 errorObject->putDirect(*globalData, globalData->propertyNames->stack, jsString(globalData, builder.toString()), ReadOnly | DontDelete); 740 785 } 741 786 … … 1380 1425 return jsNull(); 1381 1426 1382 int lineNumber;1383 1427 unsigned bytecodeOffset; 1384 1428 CodeBlock* unusedCallerCodeBlock = 0; 1385 CallFrame* callerFrame = getCallerInfo(&callFrame->globalData(), functionCallFrame, lineNumber,bytecodeOffset, unusedCallerCodeBlock);1429 CallFrame* callerFrame = getCallerInfo(&callFrame->globalData(), functionCallFrame, bytecodeOffset, unusedCallerCodeBlock); 1386 1430 if (!callerFrame) 1387 1431 return jsNull(); … … 1393 1437 ASSERT(caller.isObject()); 1394 1438 while (asObject(caller)->inherits(&JSBoundFunction::s_info)) { 1395 callerFrame = getCallerInfo(&callFrame->globalData(), callerFrame, lineNumber,bytecodeOffset, unusedCallerCodeBlock);1439 callerFrame = getCallerInfo(&callFrame->globalData(), callerFrame, bytecodeOffset, unusedCallerCodeBlock); 1396 1440 if (!callerFrame) 1397 1441 return jsNull(); -
trunk/Source/JavaScriptCore/interpreter/Interpreter.h
r147846 r147858 80 80 StackFrameCodeType codeType; 81 81 Strong<ExecutableBase> executable; 82 int line; 82 Strong<UnlinkedCodeBlock> codeBlock; 83 RefPtr<SourceProvider> code; 84 int lineOffset; 85 unsigned characterOffset; 86 unsigned bytecodeOffset; 83 87 String sourceURL; 84 String toString(CallFrame* callFrame) const 85 { 86 StringBuilder traceBuild; 87 String functionName = friendlyFunctionName(callFrame); 88 String sourceURL = friendlySourceURL(); 89 traceBuild.append(functionName); 90 if (!sourceURL.isEmpty()) { 91 if (!functionName.isEmpty()) 92 traceBuild.append('@'); 93 traceBuild.append(sourceURL); 94 if (line > -1) { 95 traceBuild.append(':'); 96 traceBuild.appendNumber(line); 97 } 98 } 99 return traceBuild.toString().impl(); 100 } 88 JS_EXPORT_PRIVATE String toString(CallFrame*); 101 89 String friendlySourceURL() const 102 90 { … … 138 126 return traceLine.isNull() ? emptyString() : traceLine; 139 127 } 140 unsigned friendlyLineNumber() const 141 { 142 return line > -1 ? line : 0; 143 } 128 JS_EXPORT_PRIVATE unsigned line(); 129 JS_EXPORT_PRIVATE unsigned column(); 130 JS_EXPORT_PRIVATE void expressionInfo(int& divot, int& startOffset, int& endOffset); 144 131 }; 145 132 … … 233 220 NEVER_INLINE void debug(CallFrame*, DebugHookID, int firstLine, int lastLine, int column); 234 221 static const String getTraceLine(CallFrame*, StackFrameCodeType, const String&, int); 235 JS_EXPORT_PRIVATE static void getStackTrace(JSGlobalData*, Vector<StackFrame>& results );236 static void addStackTraceIfNecessary(CallFrame*, JS Object*error);222 JS_EXPORT_PRIVATE static void getStackTrace(JSGlobalData*, Vector<StackFrame>& results, size_t maxStackSize = std::numeric_limits<size_t>::max()); 223 static void addStackTraceIfNecessary(CallFrame*, JSValue error); 237 224 238 225 void dumpSampleData(ExecState* exec); -
trunk/Source/JavaScriptCore/runtime/Error.cpp
r147846 r147858 156 156 JSValue throwError(ExecState* exec, JSValue error) 157 157 { 158 if (error.isObject()) 159 return throwError(exec, asObject(error)); 158 Interpreter::addStackTraceIfNecessary(exec, error); 160 159 exec->globalData().exception = error; 161 160 return error; -
trunk/Source/JavaScriptCore/runtime/JSGlobalData.h
r147846 r147858 55 55 #include <wtf/Forward.h> 56 56 #include <wtf/HashMap.h> 57 #include <wtf/RefCountedArray.h> 57 58 #include <wtf/SimpleStats.h> 58 59 #include <wtf/ThreadSafeRefCounted.h> … … 82 83 class SourceProvider; 83 84 class SourceProviderCache; 85 struct StackFrame; 84 86 class Stringifier; 85 87 class Structure; … … 329 331 330 332 JSValue exception; 333 RefCountedArray<StackFrame> exceptionStack; 331 334 332 335 const ClassInfo* const jsArrayClassInfo; -
trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp
r147846 r147858 598 598 globalData.resetDateCache(); 599 599 } 600 // Clear the exception stack between entries 601 globalData.exceptionStack = RefCountedArray<StackFrame>(); 600 602 } 601 603 -
trunk/Source/WebCore/ChangeLog
r147857 r147858 1 2013-04-06 Oliver Hunt <[email protected]> 2 3 Unify the many and varied stack trace mechanisms, and make the result sane. 4 https://bugs.webkit.org/show_bug.cgi?id=114072 5 6 Reviewed by Filip Pizlo. 7 8 Now that we've fleshed out the StackFrames from Interpreter::getStackTrace 9 WebCore can just ask us for a stack trace rather than implementing its own 10 stack walking. 11 12 * bindings/js/ScriptCallStackFactory.cpp: 13 (WebCore::createScriptCallStack): 14 * inspector/ScriptCallFrame.cpp: 15 (WebCore::ScriptCallFrame::isEqual): 16 * inspector/ScriptCallFrame.h: 17 (ScriptCallFrame): 18 (WebCore::ScriptCallFrame::columnNumber): 19 1 20 2013-04-06 Geoffrey Garen <[email protected]> 2 21 -
trunk/Source/WebCore/bindings/js/ScriptCallStackFactory.cpp
r147846 r147858 59 59 if (JSC::ExecState* exec = JSMainThreadExecState::currentState()) { 60 60 Vector<StackFrame> stackTrace; 61 Interpreter::getStackTrace(&exec->globalData(), stackTrace); 62 for (Vector<StackFrame>::const_iterator iter = stackTrace.begin(); iter < stackTrace.end(); iter++) { 63 frames.append(ScriptCallFrame(iter->friendlyFunctionName(exec), iter->friendlySourceURL(), iter->friendlyLineNumber())); 64 if (frames.size() >= maxStackSize) 65 break; 66 } 61 Interpreter::getStackTrace(&exec->globalData(), stackTrace, maxStackSize); 62 for (size_t i = 0; i < stackTrace.size(); i++) 63 frames.append(ScriptCallFrame(stackTrace[i].friendlyFunctionName(exec), stackTrace[i].friendlySourceURL(), stackTrace[i].line(), stackTrace[i].column())); 67 64 } 68 65 if (frames.isEmpty() && !emptyIsAllowed) { … … 70 67 // a bound function is called from native code for example. 71 68 // Fallback to setting lineNumber to 0, and source and function name to "undefined". 72 frames.append(ScriptCallFrame("undefined", "undefined", 0 ));69 frames.append(ScriptCallFrame("undefined", "undefined", 0, 0)); 73 70 } 74 71 return ScriptCallStack::create(frames); … … 78 75 { 79 76 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; 77 Vector<StackFrame> stackTrace; 78 Interpreter::getStackTrace(&exec->globalData(), stackTrace, maxStackSize + 1); 79 for (size_t i = stackTrace.size() == 1 ? 0 : 1; i < stackTrace.size(); i++) { 80 // This early exit is necessary to maintain our old behaviour 81 // but the stack trace we produce now is complete and handles all 82 // ways in which code may be running 83 if (!stackTrace[i].callee && frames.size()) 84 break; 87 85 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(); 86 String functionName = stackTrace[i].friendlyFunctionName(exec); 87 frames.append(ScriptCallFrame(functionName, stackTrace[i].sourceURL, stackTrace[i].line(), stackTrace[i].column())); 103 88 } 89 104 90 return ScriptCallStack::create(frames); 105 91 } -
trunk/Source/WebCore/inspector/ScriptCallFrame.cpp
r147846 r147858 54 54 return m_functionName == o.m_functionName 55 55 && m_scriptName == o.m_scriptName 56 && m_lineNumber == o.m_lineNumber; 56 && m_lineNumber == o.m_lineNumber 57 && m_column == o.m_column; 57 58 } 58 59 -
trunk/Source/WebCore/inspector/ScriptCallFrame.h
r147846 r147858 45 45 class ScriptCallFrame { 46 46 public: 47 ScriptCallFrame(const String& functionName, const String& scriptName, unsigned lineNumber, unsigned column = 0);47 ScriptCallFrame(const String& functionName, const String& scriptName, unsigned lineNumber, unsigned column); 48 48 ~ScriptCallFrame(); 49 49 … … 51 51 const String& sourceURL() const { return m_scriptName; } 52 52 unsigned lineNumber() const { return m_lineNumber; } 53 unsigned columnNumber() const { return m_column; } 53 54 54 55 bool isEqual(const ScriptCallFrame&) const; -
trunk/Tools/ChangeLog
r147854 r147858 1 2013-04-06 Oliver Hunt <[email protected]> 2 3 Unify the many and varied stack trace mechanisms, and make the result sane. 4 https://bugs.webkit.org/show_bug.cgi?id=114072 5 6 Reviewed by Filip Pizlo. 7 8 The commandline jsc executable no longer requires arguments, so 9 I've made run-jsc work without them. 10 11 * Scripts/run-jsc: 12 1 13 2013-04-06 Ed Bartosh <[email protected]> 2 14 -
trunk/Tools/Scripts/run-jsc
r147846 r147858 43 43 GetOptions("count|c=i" => \$count, 44 44 "verbose|v" => \$verbose); 45 die "$usage\n" if (@ARGV < 1);46 45 47 46 my $jsc = jscProductDir() . "/jsc @ARGV";
Note:
See TracChangeset
for help on using the changeset viewer.