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 47using namespace JSC; 48 49namespace WebCore { 50 51PassRefPtr<ScriptCallStack> createScriptCallStack(size_t, bool) 52{ 53 return 0; 54} 55 56PassRefPtr<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 86PassRefPtr<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