13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_FRAMES_INL_H_ 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_FRAMES_INL_H_ 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "frames.h" 3244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "isolate.h" 3344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "v8memory.h" 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#if V8_TARGET_ARCH_IA32 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "ia32/frames-ia32.h" 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#elif V8_TARGET_ARCH_X64 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "x64/frames-x64.h" 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#elif V8_TARGET_ARCH_ARM 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "arm/frames-arm.h" 413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu#elif V8_TARGET_ARCH_MIPS 423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu#include "mips/frames-mips.h" 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#error Unsupported target architecture. 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Address StackHandler::address() const { 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Address>(const_cast<StackHandler*>(this)); 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline StackHandler* StackHandler::next() const { 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int offset = StackHandlerConstants::kNextOffset; 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return FromAddress(Memory::Address_at(address() + offset)); 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline bool StackHandler::includes(Address address) const { 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Address start = this->address(); 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Address end = start + StackHandlerConstants::kSize; 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return start <= address && address <= end; 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monseninline void StackHandler::Iterate(ObjectVisitor* v, Code* holder) const { 7069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch v->VisitPointer(context_address()); 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch v->VisitPointer(code_address()); 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline StackHandler* StackHandler::FromAddress(Address address) { 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<StackHandler*>(address); 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline bool StackHandler::is_js_entry() const { 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return kind() == JS_ENTRY; 823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline bool StackHandler::is_catch() const { 863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return kind() == CATCH; 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline bool StackHandler::is_finally() const { 913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return kind() == FINALLY; 923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline StackHandler::Kind StackHandler::kind() const { 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int offset = StackHandlerConstants::kStateOffset; 973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return KindField::decode(Memory::unsigned_at(address() + offset)); 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochinline Object** StackHandler::context_address() const { 10269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch const int offset = StackHandlerConstants::kContextOffset; 10369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return reinterpret_cast<Object**>(address() + offset); 10469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 10569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline Object** StackHandler::code_address() const { 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const int offset = StackHandlerConstants::kCodeOffset; 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return reinterpret_cast<Object**>(address() + offset); 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochinline StackFrame::StackFrame(StackFrameIterator* iterator) 1148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : iterator_(iterator), isolate_(iterator_->isolate()) { 1158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 1168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline StackHandler* StackFrame::top_handler() const { 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return iterator_->handler(); 120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline Code* StackFrame::LookupCode() const { 1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return GetContainingCode(isolate(), pc()); 1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockinline Code* StackFrame::GetContainingCode(Isolate* isolate, Address pc) { 1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return isolate->inner_pointer_to_code_cache()->GetCacheEntry(pc)->code; 1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline EntryFrame::EntryFrame(StackFrameIterator* iterator) 1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : StackFrame(iterator) { 1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline EntryConstructFrame::EntryConstructFrame(StackFrameIterator* iterator) 1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : EntryFrame(iterator) { 1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline ExitFrame::ExitFrame(StackFrameIterator* iterator) 1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : StackFrame(iterator) { 1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline StandardFrame::StandardFrame(StackFrameIterator* iterator) 1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : StackFrame(iterator) { 15044f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 15144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 15244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Object* StandardFrame::GetExpression(int index) const { 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Memory::Object_at(GetExpressionAddress(index)); 155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline void StandardFrame::SetExpression(int index, Object* value) { 159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Memory::Object_at(GetExpressionAddress(index)) = value; 160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Object* StandardFrame::context() const { 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int offset = StandardFrameConstants::kContextOffset; 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Memory::Object_at(fp() + offset); 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Address StandardFrame::caller_fp() const { 170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Memory::Address_at(fp() + StandardFrameConstants::kCallerFPOffset); 171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Address StandardFrame::caller_pc() const { 175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Memory::Address_at(ComputePCAddress(fp())); 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Address StandardFrame::ComputePCAddress(Address fp) { 180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return fp + StandardFrameConstants::kCallerPCOffset; 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline bool StandardFrame::IsArgumentsAdaptorFrame(Address fp) { 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* marker = 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Memory::Object_at(fp + StandardFrameConstants::kContextOffset); 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return marker == Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR); 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline bool StandardFrame::IsConstructFrame(Address fp) { 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* marker = 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Memory::Object_at(fp + StandardFrameConstants::kMarkerOffset); 1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return marker == Smi::FromInt(StackFrame::CONSTRUCT); 1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline JavaScriptFrame::JavaScriptFrame(StackFrameIterator* iterator) 1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : StandardFrame(iterator) { 200592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 201592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 202592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2038b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochAddress JavaScriptFrame::GetParameterSlot(int index) const { 2048b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch int param_count = ComputeParametersCount(); 2058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(-1 <= index && index < param_count); 2068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch int parameter_offset = (param_count - index - 1) * kPointerSize; 2078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return caller_sp() + parameter_offset; 2088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 2098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2118b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochObject* JavaScriptFrame::GetParameter(int index) const { 2128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return Memory::Object_at(GetParameterSlot(index)); 2138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 2148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Object* JavaScriptFrame::receiver() const { 2178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return GetParameter(-1); 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline void JavaScriptFrame::set_receiver(Object* value) { 2228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Memory::Object_at(GetParameterSlot(-1)) = value; 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline bool JavaScriptFrame::has_adapted_arguments() const { 227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsArgumentsAdaptorFrame(caller_fp()); 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Object* JavaScriptFrame::function() const { 232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* result = function_slot_object(); 233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(result->IsJSFunction()); 234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline OptimizedFrame::OptimizedFrame(StackFrameIterator* iterator) 2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : JavaScriptFrame(iterator) { 2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline ArgumentsAdaptorFrame::ArgumentsAdaptorFrame( 2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StackFrameIterator* iterator) : JavaScriptFrame(iterator) { 2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline InternalFrame::InternalFrame(StackFrameIterator* iterator) 2493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : StandardFrame(iterator) { 2503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline ConstructFrame::ConstructFrame(StackFrameIterator* iterator) 2543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : InternalFrame(iterator) { 2553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Iterator> 2598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochinline JavaScriptFrameIteratorTemp<Iterator>::JavaScriptFrameIteratorTemp( 2608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Isolate* isolate) 2618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : iterator_(isolate) { 2628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (!done()) Advance(); 2638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 2648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<typename Iterator> 2673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline JavaScriptFrameIteratorTemp<Iterator>::JavaScriptFrameIteratorTemp( 2683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Isolate* isolate, ThreadLocalTop* top) 2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : iterator_(isolate, top) { 2703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!done()) Advance(); 2713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochtemplate<typename Iterator> 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline JavaScriptFrame* JavaScriptFrameIteratorTemp<Iterator>::frame() const { 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // TODO(1233797): The frame hierarchy needs to change. It's 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // problematic that we can't use the safe-cast operator to cast to 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the JavaScript frame type, because we may encounter arguments 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // adaptor frames. 280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block StackFrame* frame = iterator_.frame(); 281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(frame->is_java_script() || frame->is_arguments_adaptor()); 282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<JavaScriptFrame*>(frame); 283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Iterator> 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJavaScriptFrameIteratorTemp<Iterator>::JavaScriptFrameIteratorTemp( 2888b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Isolate* isolate, StackFrame::Id id) 2898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : iterator_(isolate) { 2908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch AdvanceToId(id); 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Iterator> 295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JavaScriptFrameIteratorTemp<Iterator>::Advance() { 296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block do { 297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block iterator_.Advance(); 298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } while (!iterator_.done() && !iterator_.frame()->is_java_script()); 299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Iterator> 303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JavaScriptFrameIteratorTemp<Iterator>::AdvanceToArgumentsFrame() { 304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!frame()->has_adapted_arguments()) return; 305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block iterator_.Advance(); 306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(iterator_.frame()->is_arguments_adaptor()); 307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Iterator> 3118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid JavaScriptFrameIteratorTemp<Iterator>::AdvanceToId(StackFrame::Id id) { 3128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch while (!done()) { 3138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Advance(); 3148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (frame()->id() == id) return; 3158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 3168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 3178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochtemplate<typename Iterator> 320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JavaScriptFrameIteratorTemp<Iterator>::Reset() { 321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block iterator_.Reset(); 322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!done()) Advance(); 323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_FRAMES_INL_H_ 329