1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2006-2008 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 { 7080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen StackFrame::IteratePc(v, pc_address(), holder); 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline StackHandler* StackHandler::FromAddress(Address address) { 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<StackHandler*>(address); 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline StackHandler::State StackHandler::state() const { 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int offset = StackHandlerConstants::kStateOffset; 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<State>(Memory::int_at(address() + offset)); 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monseninline Address* StackHandler::pc_address() const { 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int offset = StackHandlerConstants::kPCOffset; 8780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen return reinterpret_cast<Address*>(address() + offset); 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochinline StackFrame::StackFrame(StackFrameIterator* iterator) 928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : iterator_(iterator), isolate_(iterator_->isolate()) { 938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline StackHandler* StackFrame::top_handler() const { 97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return iterator_->handler(); 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockinline Code* StackFrame::GetContainingCode(Isolate* isolate, Address pc) { 10244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return isolate->pc_to_code_cache()->GetCacheEntry(pc)->code; 10344f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 10444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 10544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Object* StandardFrame::GetExpression(int index) const { 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Memory::Object_at(GetExpressionAddress(index)); 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline void StandardFrame::SetExpression(int index, Object* value) { 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Memory::Object_at(GetExpressionAddress(index)) = value; 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Object* StandardFrame::context() const { 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int offset = StandardFrameConstants::kContextOffset; 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Memory::Object_at(fp() + offset); 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Address StandardFrame::caller_fp() const { 123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Memory::Address_at(fp() + StandardFrameConstants::kCallerFPOffset); 124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Address StandardFrame::caller_pc() const { 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Memory::Address_at(ComputePCAddress(fp())); 129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Address StandardFrame::ComputePCAddress(Address fp) { 133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return fp + StandardFrameConstants::kCallerPCOffset; 134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline bool StandardFrame::IsArgumentsAdaptorFrame(Address fp) { 138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* marker = 139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Memory::Object_at(fp + StandardFrameConstants::kContextOffset); 140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return marker == Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR); 141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline bool StandardFrame::IsConstructFrame(Address fp) { 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* marker = 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Memory::Object_at(fp + StandardFrameConstants::kMarkerOffset); 147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return marker == Smi::FromInt(CONSTRUCT); 148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1518b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochAddress JavaScriptFrame::GetParameterSlot(int index) const { 1528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch int param_count = ComputeParametersCount(); 1538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(-1 <= index && index < param_count); 1548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch int parameter_offset = (param_count - index - 1) * kPointerSize; 1558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return caller_sp() + parameter_offset; 1568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 1578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1598b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochObject* JavaScriptFrame::GetParameter(int index) const { 1608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return Memory::Object_at(GetParameterSlot(index)); 1618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 1628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Object* JavaScriptFrame::receiver() const { 1658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return GetParameter(-1); 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline void JavaScriptFrame::set_receiver(Object* value) { 1708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Memory::Object_at(GetParameterSlot(-1)) = value; 171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline bool JavaScriptFrame::has_adapted_arguments() const { 175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsArgumentsAdaptorFrame(caller_fp()); 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Object* JavaScriptFrame::function() const { 180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* result = function_slot_object(); 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(result->IsJSFunction()); 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Iterator> 1878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochinline JavaScriptFrameIteratorTemp<Iterator>::JavaScriptFrameIteratorTemp( 1888b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Isolate* isolate) 1898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : iterator_(isolate) { 1908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (!done()) Advance(); 1918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 1928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochtemplate<typename Iterator> 194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline JavaScriptFrame* JavaScriptFrameIteratorTemp<Iterator>::frame() const { 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // TODO(1233797): The frame hierarchy needs to change. It's 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // problematic that we can't use the safe-cast operator to cast to 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the JavaScript frame type, because we may encounter arguments 198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // adaptor frames. 199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block StackFrame* frame = iterator_.frame(); 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(frame->is_java_script() || frame->is_arguments_adaptor()); 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<JavaScriptFrame*>(frame); 202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Iterator> 206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJavaScriptFrameIteratorTemp<Iterator>::JavaScriptFrameIteratorTemp( 2078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Isolate* isolate, StackFrame::Id id) 2088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : iterator_(isolate) { 2098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch AdvanceToId(id); 210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Iterator> 214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JavaScriptFrameIteratorTemp<Iterator>::Advance() { 215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block do { 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block iterator_.Advance(); 217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } while (!iterator_.done() && !iterator_.frame()->is_java_script()); 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Iterator> 222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JavaScriptFrameIteratorTemp<Iterator>::AdvanceToArgumentsFrame() { 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!frame()->has_adapted_arguments()) return; 224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block iterator_.Advance(); 225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(iterator_.frame()->is_arguments_adaptor()); 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Iterator> 2308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid JavaScriptFrameIteratorTemp<Iterator>::AdvanceToId(StackFrame::Id id) { 2318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch while (!done()) { 2328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Advance(); 2338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (frame()->id() == id) return; 2348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 2358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 2368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochtemplate<typename Iterator> 239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JavaScriptFrameIteratorTemp<Iterator>::Reset() { 240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block iterator_.Reset(); 241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!done()) Advance(); 242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_FRAMES_INL_H_ 248