Changeset 147846 in webkit for trunk/Source/JavaScriptCore/API/JSContextRef.cpp
- Timestamp:
- Apr 6, 2013, 11:24:37 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/API/JSContextRef.cpp
r147818 r147846 37 37 #include "JSObject.h" 38 38 #include "Operations.h" 39 #include "SourceProvider.h"40 39 #include <wtf/text/StringBuilder.h> 41 40 #include <wtf/text/StringHash.h> … … 177 176 ExecState* exec = toJS(ctx); 178 177 JSLockHolder lock(exec); 178 179 unsigned count = 0; 179 180 StringBuilder builder; 180 Vector<StackFrame> stackTrace; 181 Interpreter::getStackTrace(&exec->globalData(), stackTrace, maxStackSize); 182 183 for (size_t i = 0; i < stackTrace.size(); i++) { 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; 184 196 String urlString; 185 String functionName; 186 StackFrame& frame = stackTrace[i]; 187 JSValue function = frame.callee.get(); 188 if (frame.callee) 189 functionName = frame.friendlyFunctionName(exec); 197 JSValue function; 198 199 exec->interpreter()->retrieveLastCaller(callFrame, signedLineNumber, sourceID, urlString, function); 200 201 if (function) 202 functionName = jsCast<JSFunction*>(function)->name(exec); 190 203 else { 191 204 // Caller is unknown, but if frame is empty we should still add the frame, because 192 205 // something called us, and gave us arguments. 193 if ( i)206 if (count) 194 207 break; 195 208 } 196 unsigned lineNumber = frame.line();209 unsigned lineNumber = signedLineNumber >= 0 ? signedLineNumber : 0; 197 210 if (!builder.isEmpty()) 198 211 builder.append('\n'); 199 212 builder.append('#'); 200 builder.appendNumber( i);213 builder.appendNumber(count); 201 214 builder.append(' '); 202 215 builder.append(functionName); 203 216 builder.appendLiteral("() at "); 204 217 builder.append(urlString); 205 if (frame.codeType != StackFrameNativeCode) { 206 builder.append(':'); 207 builder.appendNumber(lineNumber); 208 } 209 if (!function) 218 builder.append(':'); 219 builder.appendNumber(lineNumber); 220 if (!function || ++count == maxStackSize) 210 221 break; 222 callFrame = callFrame->callerFrame(); 211 223 } 212 224 return OpaqueJSString::create(builder.toString()).leakRef();
Note:
See TracChangeset
for help on using the changeset viewer.