Index: src/scopeinfo.cc |
diff --git a/src/scopeinfo.cc b/src/scopeinfo.cc |
index 787e647267258edc8019d2a07229f9ea1125bff8..b379f5efea7c501d51b8c447e906246eb7692b4d 100644 |
--- a/src/scopeinfo.cc |
+++ b/src/scopeinfo.cc |
@@ -97,8 +97,10 @@ Handle<ScopeInfo> ScopeInfo::Create(Scope* scope, Zone* zone) { |
ASSERT(index == scope_info->ContextLocalInfoEntriesIndex()); |
for (int i = 0; i < context_local_count; ++i) { |
Variable* var = context_locals[i]; |
- uint32_t value = ContextLocalMode::encode(var->mode()) | |
- ContextLocalInitFlag::encode(var->initialization_flag()); |
+ uint32_t value = |
+ ContextLocalMode::encode(var->mode()) | |
+ ContextLocalInitFlag::encode(var->initialization_flag()) | |
+ ContextLocalMaybeAssignedFlag::encode(var->maybe_assigned()); |
scope_info->set(index++, Smi::FromInt(value)); |
} |
@@ -255,6 +257,14 @@ InitializationFlag ScopeInfo::ContextLocalInitFlag(int var) { |
} |
+MaybeAssignedFlag ScopeInfo::ContextLocalMaybeAssignedFlag(int var) { |
+ ASSERT(0 <= var && var < ContextLocalCount()); |
+ int info_index = ContextLocalInfoEntriesIndex() + var; |
+ int value = Smi::cast(get(info_index))->value(); |
+ return ContextLocalMaybeAssignedFlag::decode(value); |
+} |
+ |
+ |
bool ScopeInfo::LocalIsSynthetic(int var) { |
ASSERT(0 <= var && var < LocalCount()); |
// There's currently no flag stored on the ScopeInfo to indicate that a |
@@ -282,17 +292,17 @@ int ScopeInfo::StackSlotIndex(String* name) { |
int ScopeInfo::ContextSlotIndex(Handle<ScopeInfo> scope_info, |
- Handle<String> name, |
- VariableMode* mode, |
- InitializationFlag* init_flag) { |
+ Handle<String> name, VariableMode* mode, |
+ InitializationFlag* init_flag, |
+ MaybeAssignedFlag* maybe_assigned_flag) { |
ASSERT(name->IsInternalizedString()); |
ASSERT(mode != NULL); |
ASSERT(init_flag != NULL); |
if (scope_info->length() > 0) { |
ContextSlotCache* context_slot_cache = |
scope_info->GetIsolate()->context_slot_cache(); |
- int result = |
- context_slot_cache->Lookup(*scope_info, *name, mode, init_flag); |
+ int result = context_slot_cache->Lookup(*scope_info, *name, mode, init_flag, |
+ maybe_assigned_flag); |
if (result != ContextSlotCache::kNotFound) { |
ASSERT(result < scope_info->ContextLength()); |
return result; |
@@ -306,15 +316,17 @@ int ScopeInfo::ContextSlotIndex(Handle<ScopeInfo> scope_info, |
int var = i - start; |
*mode = scope_info->ContextLocalMode(var); |
*init_flag = scope_info->ContextLocalInitFlag(var); |
+ *maybe_assigned_flag = scope_info->ContextLocalMaybeAssignedFlag(var); |
result = Context::MIN_CONTEXT_SLOTS + var; |
- context_slot_cache->Update(scope_info, name, *mode, *init_flag, result); |
+ context_slot_cache->Update(scope_info, name, *mode, *init_flag, |
+ *maybe_assigned_flag, result); |
ASSERT(result < scope_info->ContextLength()); |
return result; |
} |
} |
- // Cache as not found. Mode and init flag don't matter. |
- context_slot_cache->Update( |
- scope_info, name, INTERNAL, kNeedsInitialization, -1); |
+ // Cache as not found. Mode, init flag and maybe assigned flag don't matter. |
+ context_slot_cache->Update(scope_info, name, INTERNAL, kNeedsInitialization, |
+ kNotAssigned, -1); |
} |
return -1; |
} |
@@ -413,26 +425,26 @@ int ContextSlotCache::Hash(Object* data, String* name) { |
} |
-int ContextSlotCache::Lookup(Object* data, |
- String* name, |
- VariableMode* mode, |
- InitializationFlag* init_flag) { |
+int ContextSlotCache::Lookup(Object* data, String* name, VariableMode* mode, |
+ InitializationFlag* init_flag, |
+ MaybeAssignedFlag* maybe_assigned_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(); |
+ if (maybe_assigned_flag != NULL) |
+ *maybe_assigned_flag = result.maybe_assigned_flag(); |
return result.index() + kNotFound; |
} |
return kNotFound; |
} |
-void ContextSlotCache::Update(Handle<Object> data, |
- Handle<String> name, |
- VariableMode mode, |
- InitializationFlag init_flag, |
+void ContextSlotCache::Update(Handle<Object> data, Handle<String> name, |
+ VariableMode mode, InitializationFlag init_flag, |
+ MaybeAssignedFlag maybe_assigned_flag, |
int slot_index) { |
DisallowHeapAllocation no_gc; |
Handle<String> internalized_name; |
@@ -444,9 +456,10 @@ void ContextSlotCache::Update(Handle<Object> data, |
key.data = *data; |
key.name = *internalized_name; |
// Please note value only takes a uint as index. |
- values_[index] = Value(mode, init_flag, slot_index - kNotFound).raw(); |
+ values_[index] = Value(mode, init_flag, maybe_assigned_flag, |
+ slot_index - kNotFound).raw(); |
#ifdef DEBUG |
- ValidateEntry(data, name, mode, init_flag, slot_index); |
+ ValidateEntry(data, name, mode, init_flag, maybe_assigned_flag, slot_index); |
#endif |
} |
} |
@@ -459,10 +472,10 @@ void ContextSlotCache::Clear() { |
#ifdef DEBUG |
-void ContextSlotCache::ValidateEntry(Handle<Object> data, |
- Handle<String> name, |
+void ContextSlotCache::ValidateEntry(Handle<Object> data, Handle<String> name, |
VariableMode mode, |
InitializationFlag init_flag, |
+ MaybeAssignedFlag maybe_assigned_flag, |
int slot_index) { |
DisallowHeapAllocation no_gc; |
Handle<String> internalized_name; |
@@ -475,6 +488,7 @@ void ContextSlotCache::ValidateEntry(Handle<Object> data, |
Value result(values_[index]); |
ASSERT(result.mode() == mode); |
ASSERT(result.initialization_flag() == init_flag); |
+ ASSERT(result.maybe_assigned_flag() == maybe_assigned_flag); |
ASSERT(result.index() + kNotFound == slot_index); |
} |
} |