| Index: src/scopeinfo.cc
|
| diff --git a/src/scopeinfo.cc b/src/scopeinfo.cc
|
| index 59e707dc5258b2e8953d358686957ca5e010bfaa..25491f59e8165fa00220e5b51e6da7ecd6d620b2 100644
|
| --- a/src/scopeinfo.cc
|
| +++ b/src/scopeinfo.cc
|
| @@ -148,10 +148,13 @@ Handle<ScopeInfo> ScopeInfo::Create(Scope* scope) {
|
| scope_info->set(index++, *context_locals[i]->name());
|
| }
|
|
|
| - // Add context locals' modes.
|
| - ASSERT(index == scope_info->ContextLocalModeEntriesIndex());
|
| + // Add context locals' info.
|
| + ASSERT(index == scope_info->ContextLocalInfoEntriesIndex());
|
| for (int i = 0; i < num_context_locals; ++i) {
|
| - scope_info->set(index++, Smi::FromInt(context_locals[i]->mode()));
|
| + Variable* var = context_locals[i];
|
| + uint32_t value = ContextLocalMode::encode(var->mode()) |
|
| + ContextLocalInitFlag::encode(var->initialization_flag());
|
| + scope_info->set(index++, Smi::FromInt(value));
|
| }
|
|
|
| // If present, add the function variable name and its index.
|
| @@ -305,8 +308,17 @@ Handle<String> ScopeInfo::context_local_name(int var) {
|
|
|
| VariableMode ScopeInfo::context_local_mode(int var) {
|
| ASSERT(0 <= var && var < num_context_locals());
|
| - int info_index = ContextLocalModeEntriesIndex() + var;
|
| - return static_cast<VariableMode>(Smi::cast(get(info_index))->value());
|
| + int info_index = ContextLocalInfoEntriesIndex() + var;
|
| + int value = Smi::cast(get(info_index))->value();
|
| + return ContextLocalMode::decode(value);
|
| +}
|
| +
|
| +
|
| +InitializationFlag ScopeInfo::context_local_init_flag(int var) {
|
| + ASSERT(0 <= var && var < num_context_locals());
|
| + int info_index = ContextLocalInfoEntriesIndex() + var;
|
| + int value = Smi::cast(get(info_index))->value();
|
| + return ContextLocalInitFlag::decode(value);
|
| }
|
|
|
|
|
| @@ -325,11 +337,13 @@ int ScopeInfo::StackSlotIndex(String* name) {
|
| }
|
|
|
|
|
| -int ScopeInfo::ContextSlotIndex(String* name, VariableMode* mode) {
|
| +int ScopeInfo::ContextSlotIndex(String* name,
|
| + VariableMode* mode,
|
| + InitializationFlag* init_flag) {
|
| ASSERT(name->IsSymbol());
|
| if (length() > 0) {
|
| ContextSlotCache* context_slot_cache = GetIsolate()->context_slot_cache();
|
| - int result = context_slot_cache->Lookup(this, name, mode);
|
| + int result = context_slot_cache->Lookup(this, name, mode, init_flag);
|
| if (result != ContextSlotCache::kNotFound) {
|
| ASSERT(result < NumberOfContextSlots());
|
| return result;
|
| @@ -341,14 +355,17 @@ int ScopeInfo::ContextSlotIndex(String* name, VariableMode* mode) {
|
| if (name == get(i)) {
|
| int var = i - start;
|
| VariableMode mode_value = context_local_mode(var);
|
| + InitializationFlag init_flag_value = context_local_init_flag(var);
|
| if (mode != NULL) *mode = mode_value;
|
| + if (init_flag != NULL) *init_flag = init_flag_value;
|
| result = Context::MIN_CONTEXT_SLOTS + var;
|
| - context_slot_cache->Update(this, name, mode_value, result);
|
| + context_slot_cache->Update(
|
| + this, name, mode_value, init_flag_value, result);
|
| ASSERT(result < NumberOfContextSlots());
|
| return result;
|
| }
|
| }
|
| - context_slot_cache->Update(this, name, INTERNAL, -1);
|
| + context_slot_cache->Update(this, name, INTERNAL, NEEDS_INITIALIZATION, -1);
|
| }
|
| return -1;
|
| }
|
| @@ -403,13 +420,13 @@ int ScopeInfo::ContextLocalNameEntriesIndex() {
|
| }
|
|
|
|
|
| -int ScopeInfo::ContextLocalModeEntriesIndex() {
|
| +int ScopeInfo::ContextLocalInfoEntriesIndex() {
|
| return ContextLocalNameEntriesIndex() + num_context_locals();
|
| }
|
|
|
|
|
| int ScopeInfo::FunctionNameEntryIndex() {
|
| - return ContextLocalModeEntriesIndex() + num_context_locals();
|
| + return ContextLocalInfoEntriesIndex() + num_context_locals();
|
| }
|
|
|
|
|
| @@ -423,12 +440,14 @@ int ContextSlotCache::Hash(Object* data, String* name) {
|
|
|
| int ContextSlotCache::Lookup(Object* data,
|
| String* name,
|
| - VariableMode* mode) {
|
| + VariableMode* mode,
|
| + InitializationFlag* init_flag) {
|
| int index = Hash(data, name);
|
| Key& key = keys_[index];
|
| if ((key.data == data) && key.name->Equals(name)) {
|
| Value result(values_[index]);
|
| if (mode != NULL) *mode = result.mode();
|
| + if (init_flag != NULL) *init_flag = result.initialization_flag();
|
| return result.index() + kNotFound;
|
| }
|
| return kNotFound;
|
| @@ -438,6 +457,7 @@ int ContextSlotCache::Lookup(Object* data,
|
| void ContextSlotCache::Update(Object* data,
|
| String* name,
|
| VariableMode mode,
|
| + InitializationFlag init_flag,
|
| int slot_index) {
|
| String* symbol;
|
| ASSERT(slot_index > kNotFound);
|
| @@ -447,9 +467,9 @@ void ContextSlotCache::Update(Object* data,
|
| key.data = data;
|
| key.name = symbol;
|
| // Please note value only takes a uint as index.
|
| - values_[index] = Value(mode, slot_index - kNotFound).raw();
|
| + values_[index] = Value(mode, init_flag, slot_index - kNotFound).raw();
|
| #ifdef DEBUG
|
| - ValidateEntry(data, name, mode, slot_index);
|
| + ValidateEntry(data, name, mode, init_flag, slot_index);
|
| #endif
|
| }
|
| }
|
| @@ -465,6 +485,7 @@ void ContextSlotCache::Clear() {
|
| void ContextSlotCache::ValidateEntry(Object* data,
|
| String* name,
|
| VariableMode mode,
|
| + InitializationFlag init_flag,
|
| int slot_index) {
|
| String* symbol;
|
| if (HEAP->LookupSymbolIfExists(name, &symbol)) {
|
| @@ -474,6 +495,7 @@ void ContextSlotCache::ValidateEntry(Object* data,
|
| ASSERT(key.name->Equals(name));
|
| Value result(values_[index]);
|
| ASSERT(result.mode() == mode);
|
| + ASSERT(result.initialization_flag() == init_flag);
|
| ASSERT(result.index() + kNotFound == slot_index);
|
| }
|
| }
|
|
|