| Index: src/interpreter/constant-array-builder.cc
|
| diff --git a/src/interpreter/constant-array-builder.cc b/src/interpreter/constant-array-builder.cc
|
| index 425bfc6cbcb1856d515761c3da8e1c5c9c03da53..7c37586417601ed587c38c9830d041077c6b0517 100644
|
| --- a/src/interpreter/constant-array-builder.cc
|
| +++ b/src/interpreter/constant-array-builder.cc
|
| @@ -71,7 +71,10 @@ STATIC_CONST_MEMBER_DEFINITION const size_t
|
| ConstantArrayBuilder::k32BitCapacity;
|
|
|
| ConstantArrayBuilder::ConstantArrayBuilder(Isolate* isolate, Zone* zone)
|
| - : isolate_(isolate), constants_map_(zone) {
|
| + : isolate_(isolate),
|
| + constants_map_(zone),
|
| + smi_map_(zone),
|
| + smi_pairs_(zone) {
|
| idx_slice_[0] =
|
| new (zone) ConstantArraySlice(zone, 0, k8BitCapacity, OperandSize::kByte);
|
| idx_slice_[1] = new (zone) ConstantArraySlice(
|
| @@ -113,6 +116,12 @@ Handle<Object> ConstantArrayBuilder::At(size_t index) const {
|
| }
|
|
|
| Handle<FixedArray> ConstantArrayBuilder::ToFixedArray() {
|
| + // First insert reserved SMI values.
|
| + for (auto reserved_smi : smi_pairs_) {
|
| + InsertAllocatedEntry(reserved_smi.second,
|
| + handle(reserved_smi.first, isolate_));
|
| + }
|
| +
|
| Handle<FixedArray> fixed_array = isolate_->factory()->NewFixedArray(
|
| static_cast<int>(size()), PretenureFlag::TENURED);
|
| int array_index = 0;
|
| @@ -209,13 +218,21 @@ OperandSize ConstantArrayBuilder::CreateReservedEntry() {
|
| return OperandSize::kNone;
|
| }
|
|
|
| +ConstantArrayBuilder::index_t ConstantArrayBuilder::AllocateReservedEntry(
|
| + Smi* value) {
|
| + index_t index = static_cast<index_t>(AllocateEntry());
|
| + smi_map_[value] = index;
|
| + smi_pairs_.push_back(std::make_pair(value, index));
|
| + return index;
|
| +}
|
| +
|
| size_t ConstantArrayBuilder::CommitReservedEntry(OperandSize operand_size,
|
| - Handle<Object> object) {
|
| + Smi* value) {
|
| DiscardReservedEntry(operand_size);
|
| size_t index;
|
| - auto entry = constants_map_.find(object.address());
|
| - if (entry == constants_map_.end()) {
|
| - index = AllocateEntry(object);
|
| + auto entry = smi_map_.find(value);
|
| + if (entry == smi_map_.end()) {
|
| + index = AllocateReservedEntry(value);
|
| } else {
|
| ConstantArraySlice* slice = OperandSizeToSlice(operand_size);
|
| index = entry->second;
|
| @@ -223,9 +240,9 @@ size_t ConstantArrayBuilder::CommitReservedEntry(OperandSize operand_size,
|
| // The object is already in the constant array, but may have an
|
| // index too big for the reserved operand_size. So, duplicate
|
| // entry with the smaller operand size.
|
| - index = slice->Allocate(object);
|
| - constants_map_[object.address()] = static_cast<index_t>(index);
|
| + index = AllocateReservedEntry(value);
|
| }
|
| + DCHECK_LE(index, slice->max_index());
|
| }
|
| return index;
|
| }
|
|
|