Index: src/interpreter/bytecode-generator.cc |
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
index 547258a55373fe21e13e726587b8bfe6eee16bfa..eeeb7479ebc309d7ae87a98d18880211c6a36568 100644 |
--- a/src/interpreter/bytecode-generator.cc |
+++ b/src/interpreter/bytecode-generator.cc |
@@ -496,24 +496,24 @@ class BytecodeGenerator::GlobalDeclarationsBuilder final : public ZoneObject { |
constant_pool_entry_(0), |
has_constant_pool_entry_(false) {} |
- void AddFunctionDeclaration(FeedbackVectorSlot slot, FunctionLiteral* func) { |
+ void AddFunctionDeclaration(Handle<String> name, FeedbackVectorSlot slot, |
+ FunctionLiteral* func) { |
DCHECK(!slot.IsInvalid()); |
- declarations_.push_back(std::make_pair(slot, func)); |
+ declarations_.push_back(Declaration(name, slot, func)); |
} |
- void AddUndefinedDeclaration(FeedbackVectorSlot slot) { |
+ void AddUndefinedDeclaration(Handle<String> name, FeedbackVectorSlot slot) { |
DCHECK(!slot.IsInvalid()); |
- declarations_.push_back(std::make_pair(slot, nullptr)); |
+ declarations_.push_back(Declaration(name, slot, nullptr)); |
} |
- Handle<FixedArray> AllocateDeclarationPairs(CompilationInfo* info) { |
+ Handle<FixedArray> AllocateDeclarations(CompilationInfo* info) { |
DCHECK(has_constant_pool_entry_); |
int array_index = 0; |
- Handle<FixedArray> pairs = info->isolate()->factory()->NewFixedArray( |
- static_cast<int>(declarations_.size() * 2), TENURED); |
- for (std::pair<FeedbackVectorSlot, FunctionLiteral*> declaration : |
- declarations_) { |
- FunctionLiteral* func = declaration.second; |
+ Handle<FixedArray> data = info->isolate()->factory()->NewFixedArray( |
+ static_cast<int>(declarations_.size() * 3), TENURED); |
+ for (const Declaration& declaration : declarations_) { |
+ FunctionLiteral* func = declaration.func; |
Handle<Object> initial_value; |
if (func == nullptr) { |
initial_value = info->isolate()->factory()->undefined_value(); |
@@ -526,10 +526,11 @@ class BytecodeGenerator::GlobalDeclarationsBuilder final : public ZoneObject { |
// will set stack overflow. |
if (initial_value.is_null()) return Handle<FixedArray>(); |
- pairs->set(array_index++, Smi::FromInt(declaration.first.ToInt())); |
- pairs->set(array_index++, *initial_value); |
+ data->set(array_index++, *declaration.name); |
+ data->set(array_index++, Smi::FromInt(declaration.slot.ToInt())); |
+ data->set(array_index++, *initial_value); |
} |
- return pairs; |
+ return data; |
} |
size_t constant_pool_entry() { |
@@ -547,7 +548,17 @@ class BytecodeGenerator::GlobalDeclarationsBuilder final : public ZoneObject { |
bool empty() { return declarations_.empty(); } |
private: |
- ZoneVector<std::pair<FeedbackVectorSlot, FunctionLiteral*>> declarations_; |
+ struct Declaration { |
+ Declaration() : slot(FeedbackVectorSlot::Invalid()), func(nullptr) {} |
+ Declaration(Handle<String> name, FeedbackVectorSlot slot, |
+ FunctionLiteral* func) |
+ : name(name), slot(slot), func(func) {} |
+ |
+ Handle<String> name; |
+ FeedbackVectorSlot slot; |
+ FunctionLiteral* func; |
+ }; |
+ ZoneVector<Declaration> declarations_; |
size_t constant_pool_entry_; |
bool has_constant_pool_entry_; |
}; |
@@ -589,7 +600,7 @@ void BytecodeGenerator::AllocateDeferredConstants() { |
// Build global declaration pair arrays. |
for (GlobalDeclarationsBuilder* globals_builder : global_declarations_) { |
Handle<FixedArray> declarations = |
- globals_builder->AllocateDeclarationPairs(info()); |
+ globals_builder->AllocateDeclarations(info()); |
if (declarations.is_null()) return SetStackOverflow(); |
builder()->InsertConstantPoolEntryAt(globals_builder->constant_pool_entry(), |
declarations); |
@@ -795,7 +806,7 @@ void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) { |
case VariableLocation::UNALLOCATED: { |
DCHECK(!variable->binding_needs_init()); |
FeedbackVectorSlot slot = decl->proxy()->VariableFeedbackSlot(); |
- globals_builder()->AddUndefinedDeclaration(slot); |
+ globals_builder()->AddUndefinedDeclaration(variable->name(), slot); |
break; |
} |
case VariableLocation::LOCAL: |
@@ -849,7 +860,8 @@ void BytecodeGenerator::VisitFunctionDeclaration(FunctionDeclaration* decl) { |
switch (variable->location()) { |
case VariableLocation::UNALLOCATED: { |
FeedbackVectorSlot slot = decl->proxy()->VariableFeedbackSlot(); |
- globals_builder()->AddFunctionDeclaration(slot, decl->fun()); |
+ globals_builder()->AddFunctionDeclaration(variable->name(), slot, |
+ decl->fun()); |
break; |
} |
case VariableLocation::PARAMETER: |