Changeset 150690 in webkit
- Timestamp:
- May 25, 2013 1:17:29 PM (11 years ago)
- Location:
- branches/dfgFourthTier/Source
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/dfgFourthTier/Source/JavaScriptCore/API/JSContextRef.cpp
r149636 r150690 179 179 unsigned count = 0; 180 180 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++) { 210 185 if (!builder.isEmpty()) 211 186 builder.append('\n'); 212 187 builder.append('#'); 213 builder.appendNumber(count );188 builder.appendNumber(count++); 214 189 builder.append(' '); 215 builder.append( functionName);190 builder.append(stackTrace[i].friendlyFunctionName(exec)); 216 191 builder.appendLiteral("() at "); 217 builder.append( urlString);192 builder.append(stackTrace[i].friendlySourceURL()); 218 193 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 224 197 return OpaqueJSString::create(builder.toString()).leakRef(); 225 198 } -
branches/dfgFourthTier/Source/JavaScriptCore/ChangeLog
r150661 r150690 1 2013-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 1 27 2013-05-24 Filip Pizlo <fpizlo@apple.com> 2 28 -
branches/dfgFourthTier/Source/JavaScriptCore/interpreter/CallFrame.cpp
r139541 r150690 34 34 35 35 #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 47 36 JSStack* CallFrame::stack() 48 37 { -
branches/dfgFourthTier/Source/JavaScriptCore/interpreter/Interpreter.cpp
r150657 r150690 340 340 Interpreter::Interpreter(VM& vm) 341 341 : m_sampleEntryDepth(0) 342 , m_vm(vm) 342 343 , m_stack(vm) 343 344 , m_errorHandlingModeReentry(0) … … 685 686 } 686 687 687 void Interpreter::getStackTrace(VM* vm, Vector<StackFrame>& results) 688 { 689 CallFrame* callFrame = vm->topCallFrame->removeHostCallFrameFlag(); 688 void Interpreter::getStackTrace(Vector<StackFrame>& results, unsigned maxStackSize) 689 { 690 VM& vm = m_vm; 691 CallFrame* callFrame = vm.topCallFrame->removeHostCallFrameFlag(); 690 692 if (!callFrame || callFrame == CallFrame::noCaller()) 691 693 return; 692 int line = getLineNumberForCallFrame( vm, callFrame);694 int line = getLineNumberForCallFrame(&vm, callFrame); 693 695 694 696 callFrame = callFrame->trueCallFrameFromVMCode(); 695 697 696 while (callFrame && callFrame != CallFrame::noCaller() ) {698 while (callFrame && callFrame != CallFrame::noCaller() && maxStackSize--) { 697 699 String sourceURL; 698 700 if (callFrame->codeBlock()) { 699 701 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); 701 703 results.append(s); 702 704 } 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()); 704 706 results.append(s); 705 707 } 706 708 unsigned unusedBytecodeOffset = 0; 707 callFrame = getCallerInfo( vm, callFrame, line, unusedBytecodeOffset);709 callFrame = getCallerInfo(&vm, callFrame, line, unusedBytecodeOffset); 708 710 } 709 711 } … … 717 719 718 720 Vector<StackFrame> stackTrace; 719 getStackTrace(&callFrame->vm(),stackTrace);721 vm->interpreter->getStackTrace(stackTrace); 720 722 721 723 if (stackTrace.isEmpty()) … … 1414 1416 } 1415 1417 1416 void Interpreter::retrieveLastCaller(CallFrame* callFrame, int& lineNumber, intptr_t& sourceID, String& sourceURL, JSValue& function) const1417 {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 1437 1418 CallFrame* Interpreter::findFunctionCallFrameFromVMCode(CallFrame* callFrame, JSFunction* function) 1438 1419 { -
branches/dfgFourthTier/Source/JavaScriptCore/interpreter/Interpreter.h
r149636 r150690 82 82 int line; 83 83 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 84 100 String toString(CallFrame* callFrame) const 85 101 { … … 224 240 JSValue retrieveArgumentsFromVMCode(CallFrame*, JSFunction*) const; 225 241 JSValue retrieveCallerFromVMCode(CallFrame*, JSFunction*) const; 226 JS_EXPORT_PRIVATE void retrieveLastCaller(CallFrame*, int& lineNumber, intptr_t& sourceID, String& sourceURL, JSValue& function) const;227 242 228 243 void getArgumentsData(CallFrame*, JSFunction*&, ptrdiff_t& firstParameterIndex, Register*& argv, int& argc); … … 233 248 NEVER_INLINE void debug(CallFrame*, DebugHookID, int firstLine, int lastLine, int charPosition); 234 249 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); 236 251 static void addStackTraceIfNecessary(CallFrame*, JSObject* error); 237 252 … … 271 286 OwnPtr<SamplingTool> m_sampler; 272 287 288 VM& m_vm; 273 289 JSStack m_stack; 274 290 int m_errorHandlingModeReentry; -
branches/dfgFourthTier/Source/JavaScriptCore/jsc.cpp
r148697 r150690 328 328 329 329 Vector<StackFrame> stackTrace; 330 Interpreter::getStackTrace(&exec->vm(),stackTrace);330 exec->interpreter()->getStackTrace(stackTrace); 331 331 int i = 0; 332 332 -
branches/dfgFourthTier/Source/JavaScriptCore/profiler/ProfileGenerator.cpp
r149636 r150690 59 59 void ProfileGenerator::addParentForConsoleStart(ExecState* exec) 60 60 { 61 int lineNumber; 62 intptr_t sourceID; 63 String sourceURL; 64 JSValue function; 61 Vector<StackFrame> stackTrace; 62 exec->interpreter()->getStackTrace(stackTrace, 2); 65 63 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()); 68 65 m_head->insertNode(m_currentNode.get()); 69 66 } -
branches/dfgFourthTier/Source/WebCore/ChangeLog
r149649 r150690 1 2013-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 1 18 2013-05-06 Geoffrey Garen <ggaren@apple.com> 2 19 -
branches/dfgFourthTier/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp
r127751 r150690 134 134 } 135 135 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); 143 140 144 141 setDOMException(exec, ec); -
branches/dfgFourthTier/Source/WebCore/bindings/js/ScriptCallStackFactory.cpp
r148697 r150690 59 59 if (JSC::ExecState* exec = JSMainThreadExecState::currentState()) { 60 60 Vector<StackFrame> stackTrace; 61 Interpreter::getStackTrace(&exec->vm(),stackTrace);61 exec->interpreter()->getStackTrace(stackTrace); 62 62 for (Vector<StackFrame>::const_iterator iter = stackTrace.begin(); iter < stackTrace.end(); iter++) { 63 63 frames.append(ScriptCallFrame(iter->friendlyFunctionName(exec), iter->friendlySourceURL(), iter->friendlyLineNumber())); … … 78 78 { 79 79 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())); 104 87 return ScriptCallStack::create(frames); 105 88 }
Note: See TracChangeset
for help on using the changeset viewer.