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