1 /* 2 * Copyright (c) 2010 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "ScriptCallStackFactory.h" 33 34 #include "JSDOMBinding.h" 35 #include "ScriptArguments.h" 36 #include "ScriptCallFrame.h" 37 #include "ScriptCallStack.h" 38 #include "ScriptValue.h" 39 #include <interpreter/CallFrame.h> 40 #include <interpreter/Interpreter.h> 41 #include <runtime/ArgList.h> 42 #include <runtime/JSFunction.h> 43 #include <runtime/JSGlobalData.h> 44 #include <runtime/JSValue.h> 45 #include <runtime/UString.h> 46 47 using namespace JSC; 48 49 namespace WebCore { 50 51 PassRefPtr<ScriptCallStack> createScriptCallStack(size_t, bool) 52 { 53 return 0; 54 } 55 56 PassRefPtr<ScriptCallStack> createScriptCallStack(JSC::ExecState* exec, size_t maxStackSize) 57 { 58 Vector<ScriptCallFrame> frames; 59 CallFrame* callFrame = exec; 60 while (true) { 61 ASSERT(callFrame); 62 int signedLineNumber; 63 intptr_t sourceID; 64 UString urlString; 65 JSValue function; 66 67 exec->interpreter()->retrieveLastCaller(callFrame, signedLineNumber, sourceID, urlString, function); 68 UString functionName; 69 if (function) 70 functionName = asFunction(function)->name(exec); 71 else { 72 // Caller is unknown, but if frames is empty we should still add the frame, because 73 // something called us, and gave us arguments. 74 if (!frames.isEmpty()) 75 break; 76 } 77 unsigned lineNumber = signedLineNumber >= 0 ? signedLineNumber : 0; 78 frames.append(ScriptCallFrame(ustringToString(functionName), ustringToString(urlString), lineNumber)); 79 if (!function || frames.size() == maxStackSize) 80 break; 81 callFrame = callFrame->callerFrame(); 82 } 83 return ScriptCallStack::create(frames); 84 } 85 86 PassRefPtr<ScriptArguments> createScriptArguments(JSC::ExecState* exec, unsigned skipArgumentCount) 87 { 88 Vector<ScriptValue> arguments; 89 size_t argumentCount = exec->argumentCount(); 90 for (size_t i = skipArgumentCount; i < argumentCount; ++i) 91 arguments.append(ScriptValue(exec->globalData(), exec->argument(i))); 92 return ScriptArguments::create(exec, arguments); 93 } 94 95 } // namespace WebCore 96