Index: src/scopeinfo.cc |
diff --git a/src/scopeinfo.cc b/src/scopeinfo.cc |
index 99d4c38297890a22631e33a1aa1aa3cce1add481..e7edbcd34298fa104350550d8ea502d659805c2f 100644 |
--- a/src/scopeinfo.cc |
+++ b/src/scopeinfo.cc |
@@ -27,7 +27,6 @@ Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone, |
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); |
bool simple_parameter_list = |
@@ -54,8 +53,8 @@ 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 + |
+ const int length = kVariablePartIndex + parameter_count + |
+ (1 + stack_local_count) + 2 * context_local_count + |
3 * strong_mode_free_variable_count + |
(has_function_name ? 2 : 0); |
@@ -89,9 +88,17 @@ Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone, |
// Add stack locals' names. We are assuming that the stack locals' |
// slots are allocated in increasing order, so we can simply add |
// them to the ScopeInfo object. |
+ int first_slot_index; |
+ if (stack_local_count > 0) { |
+ first_slot_index = stack_locals[0]->index(); |
+ } else { |
+ first_slot_index = 0; |
+ } |
+ DCHECK(index == scope_info->StackLocalFirstSlotIndex()); |
+ scope_info->set(index++, Smi::FromInt(first_slot_index)); |
DCHECK(index == scope_info->StackLocalEntriesIndex()); |
for (int i = 0; i < stack_local_count; ++i) { |
- DCHECK(stack_locals[i]->index() == i); |
+ DCHECK(stack_locals[i]->index() == first_slot_index + i); |
scope_info->set(index++, *stack_locals[i]->name()); |
} |
@@ -145,16 +152,12 @@ Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone, |
int var_index = scope->function()->proxy()->var()->index(); |
scope_info->set(index++, *scope->function()->proxy()->name()); |
scope_info->set(index++, Smi::FromInt(var_index)); |
- DCHECK(function_name_info != STACK || |
- (var_index == scope_info->StackLocalCount() && |
- var_index == scope_info->StackSlotCount() - 1)); |
DCHECK(function_name_info != CONTEXT || |
var_index == scope_info->ContextLength() - 1); |
} |
DCHECK(index == scope_info->length()); |
DCHECK(scope->num_parameters() == scope_info->ParameterCount()); |
- DCHECK(scope->num_stack_slots() == scope_info->StackSlotCount()); |
DCHECK(scope->num_heap_slots() == scope_info->ContextLength() || |
(scope->num_heap_slots() == kVariablePartIndex && |
scope_info->ContextLength() == 0)); |
@@ -269,6 +272,13 @@ String* ScopeInfo::StackLocalName(int var) { |
} |
+int ScopeInfo::StackLocalIndex(int var) { |
+ DCHECK(0 <= var && var < StackLocalCount()); |
+ int first_slot_index = Smi::cast(get(StackLocalFirstSlotIndex()))->value(); |
+ return first_slot_index + var; |
+} |
+ |
+ |
String* ScopeInfo::ContextLocalName(int var) { |
DCHECK(0 <= var && var < ContextLocalCount()); |
int info_index = ContextLocalNameEntriesIndex() + var; |
@@ -343,11 +353,12 @@ int ScopeInfo::StrongModeFreeVariableEndPosition(int var) { |
int ScopeInfo::StackSlotIndex(String* name) { |
DCHECK(name->IsInternalizedString()); |
if (length() > 0) { |
+ int first_slot_index = Smi::cast(get(StackLocalFirstSlotIndex()))->value(); |
int start = StackLocalEntriesIndex(); |
int end = StackLocalEntriesIndex() + StackLocalCount(); |
for (int i = start; i < end; ++i) { |
if (name == get(i)) { |
- return i - start; |
+ return i - start + first_slot_index; |
} |
} |
} |
@@ -453,7 +464,7 @@ bool ScopeInfo::CopyContextLocalsToScopeObject(Handle<ScopeInfo> scope_info, |
if (scope_info->LocalIsSynthetic(first_context_var + i)) continue; |
int context_index = Context::MIN_CONTEXT_SLOTS + i; |
Handle<Object> value = Handle<Object>(context->get(context_index), isolate); |
- // Do not reflect variables under TDZ in scope object. |
+ // Reflect variables under TDZ as undefined in scope object. |
if (value->IsTheHole()) continue; |
RETURN_ON_EXCEPTION_VALUE( |
isolate, Runtime::DefineObjectProperty( |
@@ -472,11 +483,16 @@ int ScopeInfo::ParameterEntriesIndex() { |
} |
-int ScopeInfo::StackLocalEntriesIndex() { |
+int ScopeInfo::StackLocalFirstSlotIndex() { |
return ParameterEntriesIndex() + ParameterCount(); |
} |
+int ScopeInfo::StackLocalEntriesIndex() { |
+ return StackLocalFirstSlotIndex() + 1; |
+} |
+ |
+ |
int ScopeInfo::ContextLocalNameEntriesIndex() { |
return StackLocalEntriesIndex() + StackLocalCount(); |
} |