| 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:
|
|
|