blob: 93734f5a16c2b4842915cc83b46a0c8a77f25eb3 [file] [log] [blame]
Ben Murdoch257744e2011-11-30 15:57:28 +00001// Copyright 2011 the V8 project authors. All rights reserved.
Steve Blocka7e24c12009-10-30 11:49:00 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#ifndef V8_SCOPEINFO_H_
29#define V8_SCOPEINFO_H_
30
Ben Murdoch257744e2011-11-30 15:57:28 +000031#include "allocation.h"
Steve Blocka7e24c12009-10-30 11:49:00 +000032#include "variables.h"
Steve Block6ded16b2010-05-10 14:33:55 +010033#include "zone-inl.h"
Steve Blocka7e24c12009-10-30 11:49:00 +000034
35namespace v8 {
36namespace internal {
37
Ben Murdoch3bec4d22010-07-22 14:51:16 +010038// Cache for mapping (data, property name) into context slot index.
Steve Blocka7e24c12009-10-30 11:49:00 +000039// The cache contains both positive and negative results.
40// Slot index equals -1 means the property is absent.
41// Cleared at startup and prior to mark sweep collection.
42class ContextSlotCache {
43 public:
Ben Murdoch3bec4d22010-07-22 14:51:16 +010044 // Lookup context slot index for (data, name).
Steve Blocka7e24c12009-10-30 11:49:00 +000045 // If absent, kNotFound is returned.
Steve Block44f0eee2011-05-26 01:26:41 +010046 int Lookup(Object* data,
47 String* name,
Ben Murdoch3ef787d2012-04-12 10:51:47 +010048 VariableMode* mode,
49 InitializationFlag* init_flag);
Steve Blocka7e24c12009-10-30 11:49:00 +000050
51 // Update an element in the cache.
Steve Block44f0eee2011-05-26 01:26:41 +010052 void Update(Object* data,
53 String* name,
Ben Murdoch3ef787d2012-04-12 10:51:47 +010054 VariableMode mode,
55 InitializationFlag init_flag,
Steve Block44f0eee2011-05-26 01:26:41 +010056 int slot_index);
Steve Blocka7e24c12009-10-30 11:49:00 +000057
58 // Clear the cache.
Steve Block44f0eee2011-05-26 01:26:41 +010059 void Clear();
Steve Blocka7e24c12009-10-30 11:49:00 +000060
61 static const int kNotFound = -2;
Ben Murdoch589d6972011-11-30 16:04:58 +000062
Steve Blocka7e24c12009-10-30 11:49:00 +000063 private:
Steve Block44f0eee2011-05-26 01:26:41 +010064 ContextSlotCache() {
65 for (int i = 0; i < kLength; ++i) {
66 keys_[i].data = NULL;
67 keys_[i].name = NULL;
68 values_[i] = kNotFound;
69 }
70 }
71
Ben Murdoch3bec4d22010-07-22 14:51:16 +010072 inline static int Hash(Object* data, String* name);
Steve Blocka7e24c12009-10-30 11:49:00 +000073
74#ifdef DEBUG
Steve Block44f0eee2011-05-26 01:26:41 +010075 void ValidateEntry(Object* data,
76 String* name,
Ben Murdoch3ef787d2012-04-12 10:51:47 +010077 VariableMode mode,
78 InitializationFlag init_flag,
Steve Block44f0eee2011-05-26 01:26:41 +010079 int slot_index);
Steve Blocka7e24c12009-10-30 11:49:00 +000080#endif
81
82 static const int kLength = 256;
83 struct Key {
Ben Murdoch3bec4d22010-07-22 14:51:16 +010084 Object* data;
Steve Blocka7e24c12009-10-30 11:49:00 +000085 String* name;
86 };
87
88 struct Value {
Ben Murdoch3ef787d2012-04-12 10:51:47 +010089 Value(VariableMode mode,
90 InitializationFlag init_flag,
91 int index) {
Steve Blocka7e24c12009-10-30 11:49:00 +000092 ASSERT(ModeField::is_valid(mode));
Ben Murdoch3ef787d2012-04-12 10:51:47 +010093 ASSERT(InitField::is_valid(init_flag));
Steve Blocka7e24c12009-10-30 11:49:00 +000094 ASSERT(IndexField::is_valid(index));
Ben Murdoch3ef787d2012-04-12 10:51:47 +010095 value_ = ModeField::encode(mode) |
96 IndexField::encode(index) |
97 InitField::encode(init_flag);
Steve Blocka7e24c12009-10-30 11:49:00 +000098 ASSERT(mode == this->mode());
Ben Murdoch3ef787d2012-04-12 10:51:47 +010099 ASSERT(init_flag == this->initialization_flag());
Steve Blocka7e24c12009-10-30 11:49:00 +0000100 ASSERT(index == this->index());
101 }
102
Ben Murdoch8b112d22011-06-08 16:22:53 +0100103 explicit inline Value(uint32_t value) : value_(value) {}
Steve Blocka7e24c12009-10-30 11:49:00 +0000104
105 uint32_t raw() { return value_; }
106
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100107 VariableMode mode() { return ModeField::decode(value_); }
108
109 InitializationFlag initialization_flag() {
110 return InitField::decode(value_);
111 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000112
113 int index() { return IndexField::decode(value_); }
114
115 // Bit fields in value_ (type, shift, size). Must be public so the
116 // constants can be embedded in generated code.
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100117 class ModeField: public BitField<VariableMode, 0, 3> {};
118 class InitField: public BitField<InitializationFlag, 3, 1> {};
119 class IndexField: public BitField<int, 4, 32-4> {};
120
Steve Blocka7e24c12009-10-30 11:49:00 +0000121 private:
122 uint32_t value_;
123 };
124
Steve Block44f0eee2011-05-26 01:26:41 +0100125 Key keys_[kLength];
126 uint32_t values_[kLength];
127
128 friend class Isolate;
129 DISALLOW_COPY_AND_ASSIGN(ContextSlotCache);
Steve Blocka7e24c12009-10-30 11:49:00 +0000130};
131
132
133} } // namespace v8::internal
134
135#endif // V8_SCOPEINFO_H_