scopeinfo.h revision 8b112d2025046f85ef7f6be087c6129c872ebad2
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_SCOPEINFO_H_
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_SCOPEINFO_H_
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "variables.h"
326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "zone-inl.h"
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Scope information represents information about a functions's
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// scopes (currently only one, because we don't do any inlining)
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// and the allocation of the scope's variables. Scope information
403bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch// is stored in a compressed form in FixedArray objects and is used
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// at runtime (stack dumps, deoptimization, etc.).
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Historical note: In other VMs built by this team, ScopeInfo was
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// usually called DebugInfo since the information was used (among
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// other things) for on-demand debugging (Self, Smalltalk). However,
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DebugInfo seems misleading, since this information is primarily used
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// in debugging-unrelated contexts.
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Forward defined as
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// template <class Allocator = FreeStoreAllocationPolicy> class ScopeInfo;
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<class Allocator>
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ScopeInfo BASE_EMBEDDED {
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Create a ScopeInfo instance from a scope.
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  explicit ScopeInfo(Scope* scope);
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
573bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  // Create a ScopeInfo instance from SerializedScopeInfo.
583bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  explicit ScopeInfo(SerializedScopeInfo* data);
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
603bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  // Creates a SerializedScopeInfo holding the serialized scope info.
613bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  Handle<SerializedScopeInfo> Serialize();
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // --------------------------------------------------------------------------
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Lookup
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
660d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  Handle<String> function_name() const { return function_name_; }
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
680d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  Handle<String> parameter_name(int i) const { return parameters_[i]; }
690d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  int number_of_parameters() const { return parameters_.length(); }
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
710d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  Handle<String> stack_slot_name(int i) const { return stack_slots_[i]; }
720d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  int number_of_stack_slots() const { return stack_slots_.length(); }
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<String> context_slot_name(int i) const {
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return context_slots_[i - Context::MIN_CONTEXT_SLOTS];
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int number_of_context_slots() const {
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int l = context_slots_.length();
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return l == 0 ? 0 : l + Context::MIN_CONTEXT_SLOTS;
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<String> LocalName(int i) const;
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int NumberOfLocals() const;
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // --------------------------------------------------------------------------
863bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  // Debugging support
873bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
883bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch#ifdef DEBUG
893bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  void Print();
903bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch#endif
913bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
923bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch private:
933bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  Handle<String> function_name_;
943bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  bool calls_eval_;
953bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  List<Handle<String>, Allocator > parameters_;
963bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  List<Handle<String>, Allocator > stack_slots_;
973bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  List<Handle<String>, Allocator > context_slots_;
983bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  List<Variable::Mode, Allocator > context_modes_;
993bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch};
1003bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
1013bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
1023bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch// This object provides quick access to scope info details for runtime
1033bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch// routines w/o the need to explicitly create a ScopeInfo object.
1043bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdochclass SerializedScopeInfo : public FixedArray {
1053bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch public :
1063bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
1073bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  static SerializedScopeInfo* cast(Object* object) {
1083bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch    ASSERT(object->IsFixedArray());
1093bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch    return reinterpret_cast<SerializedScopeInfo*>(object);
1103bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  }
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Does this scope call eval?
1133bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  bool CallsEval();
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Does this scope have an arguments shadow?
116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasArgumentsShadow() {
11744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return StackSlotIndex(GetHeap()->arguments_shadow_symbol()) >= 0;
118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Return the number of stack slots for code.
1213bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  int NumberOfStackSlots();
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Return the number of context slots for code.
1243bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  int NumberOfContextSlots();
1259dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
1269dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  // Return if this has context slots besides MIN_CONTEXT_SLOTS;
1273bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  bool HasHeapAllocatedLocals();
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1293bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  // Lookup support for serialized scope info. Returns the
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // the stack slot index for a given slot name if the slot is
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // present; otherwise returns a value < 0. The name must be a symbol
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // (canonicalized).
1333bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  int StackSlotIndex(String* name);
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1353bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  // Lookup support for serialized scope info. Returns the
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // context slot index for a given slot name if the slot is present; otherwise
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // returns a value < 0. The name must be a symbol (canonicalized).
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // If the slot is present and mode != NULL, sets *mode to the corresponding
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // mode for that variable.
1403bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  int ContextSlotIndex(String* name, Variable::Mode* mode);
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1423bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  // Lookup support for serialized scope info. Returns the
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // parameter index for a given parameter name if the parameter is present;
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // otherwise returns a value < 0. The name must be a symbol (canonicalized).
1453bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  int ParameterIndex(String* name);
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1473bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  // Lookup support for serialized scope info. Returns the
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // function context slot index if the function name is present (named
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // function expressions, only), otherwise returns a value < 0. The name
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // must be a symbol (canonicalized).
1513bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  int FunctionContextSlotIndex(String* name);
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1533bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  static Handle<SerializedScopeInfo> Create(Scope* scope);
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1553bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  // Serializes empty scope info.
1563bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  static SerializedScopeInfo* Empty();
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private:
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1603bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  inline Object** ContextEntriesAddr();
1613bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
1623bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  inline Object** ParameterEntriesAddr();
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1643bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  inline Object** StackSlotEntriesAddr();
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1683bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch// Cache for mapping (data, property name) into context slot index.
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The cache contains both positive and negative results.
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Slot index equals -1 means the property is absent.
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Cleared at startup and prior to mark sweep collection.
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ContextSlotCache {
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
1743bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  // Lookup context slot index for (data, name).
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // If absent, kNotFound is returned.
17644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int Lookup(Object* data,
17744f0eee88ff00398ff7f715fab053374d808c90dSteve Block             String* name,
17844f0eee88ff00398ff7f715fab053374d808c90dSteve Block             Variable::Mode* mode);
179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Update an element in the cache.
18144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Update(Object* data,
18244f0eee88ff00398ff7f715fab053374d808c90dSteve Block              String* name,
18344f0eee88ff00398ff7f715fab053374d808c90dSteve Block              Variable::Mode mode,
18444f0eee88ff00398ff7f715fab053374d808c90dSteve Block              int slot_index);
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Clear the cache.
18744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Clear();
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kNotFound = -2;
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private:
19144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ContextSlotCache() {
19244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    for (int i = 0; i < kLength; ++i) {
19344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      keys_[i].data = NULL;
19444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      keys_[i].name = NULL;
19544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      values_[i] = kNotFound;
19644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
19744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
19844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1993bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  inline static int Hash(Object* data, String* name);
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
20244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ValidateEntry(Object* data,
20344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     String* name,
20444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     Variable::Mode mode,
20544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     int slot_index);
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kLength = 256;
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  struct Key {
2103bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch    Object* data;
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    String* name;
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  struct Value {
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Value(Variable::Mode mode, int index) {
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      ASSERT(ModeField::is_valid(mode));
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      ASSERT(IndexField::is_valid(index));
218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      value_ = ModeField::encode(mode) | IndexField::encode(index);
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      ASSERT(mode == this->mode());
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      ASSERT(index == this->index());
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    explicit inline Value(uint32_t value) : value_(value) {}
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    uint32_t raw() { return value_; }
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Variable::Mode mode() { return ModeField::decode(value_); }
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int index() { return IndexField::decode(value_); }
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Bit fields in value_ (type, shift, size). Must be public so the
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // constants can be embedded in generated code.
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    class ModeField:  public BitField<Variable::Mode, 0, 3> {};
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    class IndexField: public BitField<int,            3, 32-3> {};
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block   private:
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    uint32_t value_;
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
23944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Key keys_[kLength];
24044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  uint32_t values_[kLength];
24144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
24244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class Isolate;
24344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DISALLOW_COPY_AND_ASSIGN(ContextSlotCache);
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_SCOPEINFO_H_
250