| Index: src/scopeinfo.cc
|
| diff --git a/src/scopeinfo.cc b/src/scopeinfo.cc
|
| index d62bc4129588196d3f3faf6d7c1fd035b39bbaa6..99d4c38297890a22631e33a1aa1aa3cce1add481 100644
|
| --- a/src/scopeinfo.cc
|
| +++ b/src/scopeinfo.cc
|
| @@ -18,9 +18,14 @@ Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone,
|
| // Collect stack and context locals.
|
| ZoneList<Variable*> stack_locals(scope->StackLocalCount(), zone);
|
| ZoneList<Variable*> context_locals(scope->ContextLocalCount(), zone);
|
| - scope->CollectStackAndContextLocals(&stack_locals, &context_locals);
|
| + ZoneList<Variable*> strong_mode_free_variables(0, zone);
|
| +
|
| + scope->CollectStackAndContextLocals(&stack_locals, &context_locals,
|
| + &strong_mode_free_variables);
|
| const int stack_local_count = stack_locals.length();
|
| const int context_local_count = context_locals.length();
|
| + const int strong_mode_free_variable_count =
|
| + strong_mode_free_variables.length();
|
| // Make sure we allocate the correct amount.
|
| DCHECK(scope->StackLocalCount() == stack_local_count);
|
| DCHECK(scope->ContextLocalCount() == context_local_count);
|
| @@ -49,9 +54,10 @@ Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone,
|
|
|
| const bool has_function_name = function_name_info != NONE;
|
| const int parameter_count = scope->num_parameters();
|
| - const int length = kVariablePartIndex
|
| - + parameter_count + stack_local_count + 2 * context_local_count
|
| - + (has_function_name ? 2 : 0);
|
| + const int length = kVariablePartIndex + parameter_count + stack_local_count +
|
| + 2 * context_local_count +
|
| + 3 * strong_mode_free_variable_count +
|
| + (has_function_name ? 2 : 0);
|
|
|
| Factory* factory = isolate->factory();
|
| Handle<ScopeInfo> scope_info = factory->NewScopeInfo(length);
|
| @@ -71,6 +77,7 @@ Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone,
|
| scope_info->SetParameterCount(parameter_count);
|
| scope_info->SetStackLocalCount(stack_local_count);
|
| scope_info->SetContextLocalCount(context_local_count);
|
| + scope_info->SetStrongModeFreeVariableCount(strong_mode_free_variable_count);
|
|
|
| int index = kVariablePartIndex;
|
| // Add parameters.
|
| @@ -113,6 +120,25 @@ Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone,
|
| scope_info->set(index++, Smi::FromInt(value));
|
| }
|
|
|
| + DCHECK(index == scope_info->StrongModeFreeVariableNameEntriesIndex());
|
| + for (int i = 0; i < strong_mode_free_variable_count; ++i) {
|
| + scope_info->set(index++, *strong_mode_free_variables[i]->name());
|
| + }
|
| +
|
| + DCHECK(index == scope_info->StrongModeFreeVariablePositionEntriesIndex());
|
| + for (int i = 0; i < strong_mode_free_variable_count; ++i) {
|
| + // Unfortunately, the source code positions are stored as int even though
|
| + // int32_t would be enough (given the maximum source code length).
|
| + Handle<Object> start_position = factory->NewNumberFromInt(
|
| + static_cast<int32_t>(strong_mode_free_variables[i]
|
| + ->strong_mode_reference_start_position()));
|
| + scope_info->set(index++, *start_position);
|
| + Handle<Object> end_position = factory->NewNumberFromInt(
|
| + static_cast<int32_t>(strong_mode_free_variables[i]
|
| + ->strong_mode_reference_end_position()));
|
| + scope_info->set(index++, *end_position);
|
| + }
|
| +
|
| // If present, add the function variable name and its index.
|
| DCHECK(index == scope_info->FunctionNameEntryIndex());
|
| if (has_function_name) {
|
| @@ -285,6 +311,35 @@ bool ScopeInfo::LocalIsSynthetic(int var) {
|
| }
|
|
|
|
|
| +String* ScopeInfo::StrongModeFreeVariableName(int var) {
|
| + DCHECK(0 <= var && var < StrongModeFreeVariableCount());
|
| + int info_index = StrongModeFreeVariableNameEntriesIndex() + var;
|
| + return String::cast(get(info_index));
|
| +}
|
| +
|
| +
|
| +int ScopeInfo::StrongModeFreeVariableStartPosition(int var) {
|
| + DCHECK(0 <= var && var < StrongModeFreeVariableCount());
|
| + int info_index = StrongModeFreeVariablePositionEntriesIndex() + var * 2;
|
| + int32_t value = 0;
|
| + bool ok = get(info_index)->ToInt32(&value);
|
| + USE(ok);
|
| + DCHECK(ok);
|
| + return value;
|
| +}
|
| +
|
| +
|
| +int ScopeInfo::StrongModeFreeVariableEndPosition(int var) {
|
| + DCHECK(0 <= var && var < StrongModeFreeVariableCount());
|
| + int info_index = StrongModeFreeVariablePositionEntriesIndex() + var * 2 + 1;
|
| + int32_t value = 0;
|
| + bool ok = get(info_index)->ToInt32(&value);
|
| + USE(ok);
|
| + DCHECK(ok);
|
| + return value;
|
| +}
|
| +
|
| +
|
| int ScopeInfo::StackSlotIndex(String* name) {
|
| DCHECK(name->IsInternalizedString());
|
| if (length() > 0) {
|
| @@ -432,11 +487,23 @@ int ScopeInfo::ContextLocalInfoEntriesIndex() {
|
| }
|
|
|
|
|
| -int ScopeInfo::FunctionNameEntryIndex() {
|
| +int ScopeInfo::StrongModeFreeVariableNameEntriesIndex() {
|
| return ContextLocalInfoEntriesIndex() + ContextLocalCount();
|
| }
|
|
|
|
|
| +int ScopeInfo::StrongModeFreeVariablePositionEntriesIndex() {
|
| + return StrongModeFreeVariableNameEntriesIndex() +
|
| + StrongModeFreeVariableCount();
|
| +}
|
| +
|
| +
|
| +int ScopeInfo::FunctionNameEntryIndex() {
|
| + return StrongModeFreeVariablePositionEntriesIndex() +
|
| + 2 * StrongModeFreeVariableCount();
|
| +}
|
| +
|
| +
|
| int ContextSlotCache::Hash(Object* data, String* name) {
|
| // Uses only lower 32 bits if pointers are larger.
|
| uintptr_t addr_hash =
|
|
|