@@ -1499,17 +1499,9 @@ class MaglevFrameTranslationBuilder {
14991499 return kNotDuplicated ;
15001500 }
15011501
1502- void BuildHeapNumber (const VirtualObject* vobject) {
1503- DCHECK_EQ (vobject->object_type (), vobj::ObjectType::kHeapNumber );
1504- ValueNode* value_node = vobject->get (HeapNumber::kValueOffset );
1505- return BuildHeapNumber (value_node->Cast <Float64Constant>()->value ());
1506- }
1507-
1508- void BuildHeapNumber (Float64 number) {
1509- DirectHandle<Object> value =
1510- local_isolate_->factory ()->NewHeapNumberFromBits <AllocationType::kOld >(
1511- number.get_bits ());
1512- translation_array_builder_->StoreLiteral (GetDeoptLiteral (*value));
1502+ int CreateUnduplicatableId () {
1503+ object_ids_.push_back (kNotDuplicated );
1504+ return kNotDuplicated ;
15131505 }
15141506
15151507 void BuildNestedValue (const ValueNode* value,
@@ -1564,12 +1556,16 @@ class MaglevFrameTranslationBuilder {
15641556 const InputLocation*& input_location,
15651557 const VirtualObjectList& virtual_objects) {
15661558 vobj::ObjectType object_type = object->object_type ();
1567- if (object_type == vobj::ObjectType::kHeapNumber ) {
1568- // TODO(jgruber): Could we use the standard path below instead?
1569- return BuildHeapNumber (object);
1570- }
1559+ DCHECK_NOT_NULL (object->allocation ());
1560+ // HeapNumbers may be mutable object fields; each materialization must
1561+ // create a fresh box, so they are never deduplicated.
1562+ // TODO(victorgomes): Constrain which objects may contain mutable
1563+ // HeapNumbers. Immutable HeapNumbers can be stored as a literal object
1564+ // instead of a captured object.
15711565 int dup_id =
1572- GetDuplicatedId (reinterpret_cast <intptr_t >(object->allocation ()));
1566+ object_type == vobj::ObjectType::kHeapNumber
1567+ ? CreateUnduplicatableId ()
1568+ : GetDuplicatedId (reinterpret_cast <intptr_t >(object->allocation ()));
15731569 if (dup_id != kNotDuplicated ) {
15741570 translation_array_builder_->DuplicateObject (dup_id);
15751571 object->ForEachNestedRuntimeInput (
@@ -1708,7 +1704,7 @@ class MaglevFrameTranslationBuilder {
17081704 IdentityMap<int , base::DefaultAllocationPolicy>* protected_deopt_literals_;
17091705 IdentityMap<int , base::DefaultAllocationPolicy>* deopt_literals_;
17101706
1711- static const int kNotDuplicated = -1 ;
1707+ static constexpr int kNotDuplicated = -1 ;
17121708 std::vector<intptr_t > object_ids_;
17131709};
17141710
0 commit comments