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