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