OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/code-stub-assembler.h" | 5 #include "src/code-stub-assembler.h" |
6 #include "src/code-factory.h" | 6 #include "src/code-factory.h" |
7 #include "src/frames-inl.h" | 7 #include "src/frames-inl.h" |
8 #include "src/frames.h" | 8 #include "src/frames.h" |
9 #include "src/ic/handler-configuration.h" | 9 #include "src/ic/handler-configuration.h" |
10 #include "src/ic/stub-cache.h" | 10 #include "src/ic/stub-cache.h" |
(...skipping 1015 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1026 | 1026 |
1027 Node* CodeStubAssembler::LoadMapDescriptors(Node* map) { | 1027 Node* CodeStubAssembler::LoadMapDescriptors(Node* map) { |
1028 return LoadObjectField(map, Map::kDescriptorsOffset); | 1028 return LoadObjectField(map, Map::kDescriptorsOffset); |
1029 } | 1029 } |
1030 | 1030 |
1031 Node* CodeStubAssembler::LoadMapPrototype(Node* map) { | 1031 Node* CodeStubAssembler::LoadMapPrototype(Node* map) { |
1032 return LoadObjectField(map, Map::kPrototypeOffset); | 1032 return LoadObjectField(map, Map::kPrototypeOffset); |
1033 } | 1033 } |
1034 | 1034 |
1035 Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) { | 1035 Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) { |
1036 return LoadObjectField(map, Map::kInstanceSizeOffset, MachineType::Uint8()); | 1036 return ChangeUint32ToWord( |
| 1037 LoadObjectField(map, Map::kInstanceSizeOffset, MachineType::Uint8())); |
1037 } | 1038 } |
1038 | 1039 |
1039 Node* CodeStubAssembler::LoadMapInobjectProperties(Node* map) { | 1040 Node* CodeStubAssembler::LoadMapInobjectProperties(Node* map) { |
1040 // See Map::GetInObjectProperties() for details. | 1041 // See Map::GetInObjectProperties() for details. |
1041 STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); | 1042 STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); |
1042 Assert(Int32GreaterThanOrEqual(LoadMapInstanceType(map), | 1043 Assert(Int32GreaterThanOrEqual(LoadMapInstanceType(map), |
1043 Int32Constant(FIRST_JS_OBJECT_TYPE))); | 1044 Int32Constant(FIRST_JS_OBJECT_TYPE))); |
1044 return LoadObjectField( | 1045 return ChangeUint32ToWord(LoadObjectField( |
1045 map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, | 1046 map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, |
1046 MachineType::Uint8()); | 1047 MachineType::Uint8())); |
| 1048 } |
| 1049 |
| 1050 Node* CodeStubAssembler::LoadMapConstructorFunctionIndex(Node* map) { |
| 1051 // See Map::GetConstructorFunctionIndex() for details. |
| 1052 STATIC_ASSERT(FIRST_PRIMITIVE_TYPE == FIRST_TYPE); |
| 1053 Assert(Int32LessThanOrEqual(LoadMapInstanceType(map), |
| 1054 Int32Constant(LAST_PRIMITIVE_TYPE))); |
| 1055 return ChangeUint32ToWord(LoadObjectField( |
| 1056 map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, |
| 1057 MachineType::Uint8())); |
1047 } | 1058 } |
1048 | 1059 |
1049 Node* CodeStubAssembler::LoadMapConstructor(Node* map) { | 1060 Node* CodeStubAssembler::LoadMapConstructor(Node* map) { |
1050 Variable result(this, MachineRepresentation::kTagged); | 1061 Variable result(this, MachineRepresentation::kTagged); |
1051 result.Bind(LoadObjectField(map, Map::kConstructorOrBackPointerOffset)); | 1062 result.Bind(LoadObjectField(map, Map::kConstructorOrBackPointerOffset)); |
1052 | 1063 |
1053 Label done(this), loop(this, &result); | 1064 Label done(this), loop(this, &result); |
1054 Goto(&loop); | 1065 Goto(&loop); |
1055 Bind(&loop); | 1066 Bind(&loop); |
1056 { | 1067 { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1131 int additional_offset, ParameterMode parameter_mode) { | 1142 int additional_offset, ParameterMode parameter_mode) { |
1132 int32_t header_size = | 1143 int32_t header_size = |
1133 FixedDoubleArray::kHeaderSize + additional_offset - kHeapObjectTag; | 1144 FixedDoubleArray::kHeaderSize + additional_offset - kHeapObjectTag; |
1134 Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_DOUBLE_ELEMENTS, | 1145 Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_DOUBLE_ELEMENTS, |
1135 parameter_mode, header_size); | 1146 parameter_mode, header_size); |
1136 return Load(machine_type, object, offset); | 1147 return Load(machine_type, object, offset); |
1137 } | 1148 } |
1138 | 1149 |
1139 Node* CodeStubAssembler::LoadNativeContext(Node* context) { | 1150 Node* CodeStubAssembler::LoadNativeContext(Node* context) { |
1140 return LoadFixedArrayElement(context, | 1151 return LoadFixedArrayElement(context, |
1141 Int32Constant(Context::NATIVE_CONTEXT_INDEX)); | 1152 IntPtrConstant(Context::NATIVE_CONTEXT_INDEX)); |
1142 } | 1153 } |
1143 | 1154 |
1144 Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind, | 1155 Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind, |
1145 Node* native_context) { | 1156 Node* native_context) { |
1146 return LoadFixedArrayElement(native_context, | 1157 return LoadFixedArrayElement(native_context, |
1147 Int32Constant(Context::ArrayMapIndex(kind))); | 1158 IntPtrConstant(Context::ArrayMapIndex(kind))); |
1148 } | 1159 } |
1149 | 1160 |
1150 Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) { | 1161 Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) { |
1151 return StoreObjectFieldNoWriteBarrier(object, HeapNumber::kValueOffset, value, | 1162 return StoreObjectFieldNoWriteBarrier(object, HeapNumber::kValueOffset, value, |
1152 MachineRepresentation::kFloat64); | 1163 MachineRepresentation::kFloat64); |
1153 } | 1164 } |
1154 | 1165 |
1155 Node* CodeStubAssembler::StoreObjectField( | 1166 Node* CodeStubAssembler::StoreObjectField( |
1156 Node* object, int offset, Node* value) { | 1167 Node* object, int offset, Node* value) { |
1157 return Store(MachineRepresentation::kTagged, object, | 1168 return Store(MachineRepresentation::kTagged, object, |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1404 Node* value = LoadRoot(value_root_index); | 1415 Node* value = LoadRoot(value_root_index); |
1405 | 1416 |
1406 int const first_element_offset = FixedArray::kHeaderSize - kHeapObjectTag; | 1417 int const first_element_offset = FixedArray::kHeaderSize - kHeapObjectTag; |
1407 int32_t to; | 1418 int32_t to; |
1408 bool constant_to = ToInt32Constant(to_node, to); | 1419 bool constant_to = ToInt32Constant(to_node, to); |
1409 int32_t from; | 1420 int32_t from; |
1410 bool constant_from = ToInt32Constant(from_node, from); | 1421 bool constant_from = ToInt32Constant(from_node, from); |
1411 if (constant_to && constant_from && | 1422 if (constant_to && constant_from && |
1412 (to - from) <= kElementLoopUnrollThreshold) { | 1423 (to - from) <= kElementLoopUnrollThreshold) { |
1413 for (int i = from; i < to; ++i) { | 1424 for (int i = from; i < to; ++i) { |
| 1425 Node* index = IntPtrConstant(i); |
1414 if (is_double) { | 1426 if (is_double) { |
1415 Node* offset = ElementOffsetFromIndex(Int32Constant(i), kind, mode, | 1427 Node* offset = ElementOffsetFromIndex(index, kind, INTPTR_PARAMETERS, |
1416 first_element_offset); | 1428 first_element_offset); |
1417 // Don't use doubles to store the hole double, since manipulating the | 1429 // Don't use doubles to store the hole double, since manipulating the |
1418 // signaling NaN used for the hole in C++, e.g. with bit_cast, will | 1430 // signaling NaN used for the hole in C++, e.g. with bit_cast, will |
1419 // change its value on ia32 (the x87 stack is used to return values | 1431 // change its value on ia32 (the x87 stack is used to return values |
1420 // and stores to the stack silently clear the signalling bit). | 1432 // and stores to the stack silently clear the signalling bit). |
1421 // | 1433 // |
1422 // TODO(danno): When we have a Float32/Float64 wrapper class that | 1434 // TODO(danno): When we have a Float32/Float64 wrapper class that |
1423 // preserves double bits during manipulation, remove this code/change | 1435 // preserves double bits during manipulation, remove this code/change |
1424 // this to an indexed Float64 store. | 1436 // this to an indexed Float64 store. |
1425 if (Is64()) { | 1437 if (Is64()) { |
1426 StoreNoWriteBarrier(MachineRepresentation::kWord64, array, offset, | 1438 StoreNoWriteBarrier(MachineRepresentation::kWord64, array, offset, |
1427 double_hole); | 1439 double_hole); |
1428 } else { | 1440 } else { |
1429 StoreNoWriteBarrier(MachineRepresentation::kWord32, array, offset, | 1441 StoreNoWriteBarrier(MachineRepresentation::kWord32, array, offset, |
1430 double_hole); | 1442 double_hole); |
1431 offset = ElementOffsetFromIndex(Int32Constant(i), kind, mode, | 1443 offset = ElementOffsetFromIndex(index, kind, INTPTR_PARAMETERS, |
1432 first_element_offset + kPointerSize); | 1444 first_element_offset + kPointerSize); |
1433 StoreNoWriteBarrier(MachineRepresentation::kWord32, array, offset, | 1445 StoreNoWriteBarrier(MachineRepresentation::kWord32, array, offset, |
1434 double_hole); | 1446 double_hole); |
1435 } | 1447 } |
1436 } else { | 1448 } else { |
1437 StoreFixedArrayElement(array, Int32Constant(i), value, | 1449 StoreFixedArrayElement(array, index, value, SKIP_WRITE_BARRIER, |
1438 SKIP_WRITE_BARRIER); | 1450 INTPTR_PARAMETERS); |
1439 } | 1451 } |
1440 } | 1452 } |
1441 } else { | 1453 } else { |
1442 Variable current(this, MachineRepresentation::kTagged); | 1454 Variable current(this, MachineRepresentation::kTagged); |
1443 Label test(this); | 1455 Label test(this); |
1444 Label decrement(this, ¤t); | 1456 Label decrement(this, ¤t); |
1445 Label done(this); | 1457 Label done(this); |
1446 Node* limit = | 1458 Node* limit = |
1447 IntPtrAdd(array, ElementOffsetFromIndex(from_node, kind, mode)); | 1459 IntPtrAdd(array, ElementOffsetFromIndex(from_node, kind, mode)); |
1448 current.Bind(IntPtrAdd(array, ElementOffsetFromIndex(to_node, kind, mode))); | 1460 current.Bind(IntPtrAdd(array, ElementOffsetFromIndex(to_node, kind, mode))); |
1449 | 1461 |
1450 Branch(WordEqual(current.value(), limit), &done, &decrement); | 1462 Branch(WordEqual(current.value(), limit), &done, &decrement); |
1451 | 1463 |
1452 Bind(&decrement); | 1464 Bind(&decrement); |
1453 current.Bind(IntPtrSub( | 1465 current.Bind(IntPtrSub( |
1454 current.value(), | 1466 current.value(), |
1455 Int32Constant(IsFastDoubleElementsKind(kind) ? kDoubleSize | 1467 IntPtrConstant(IsFastDoubleElementsKind(kind) ? kDoubleSize |
1456 : kPointerSize))); | 1468 : kPointerSize))); |
1457 if (is_double) { | 1469 if (is_double) { |
1458 // Don't use doubles to store the hole double, since manipulating the | 1470 // Don't use doubles to store the hole double, since manipulating the |
1459 // signaling NaN used for the hole in C++, e.g. with bit_cast, will | 1471 // signaling NaN used for the hole in C++, e.g. with bit_cast, will |
1460 // change its value on ia32 (the x87 stack is used to return values | 1472 // change its value on ia32 (the x87 stack is used to return values |
1461 // and stores to the stack silently clear the signalling bit). | 1473 // and stores to the stack silently clear the signalling bit). |
1462 // | 1474 // |
1463 // TODO(danno): When we have a Float32/Float64 wrapper class that | 1475 // TODO(danno): When we have a Float32/Float64 wrapper class that |
1464 // preserves double bits during manipulation, remove this code/change | 1476 // preserves double bits during manipulation, remove this code/change |
1465 // this to an indexed Float64 store. | 1477 // this to an indexed Float64 store. |
1466 if (Is64()) { | 1478 if (Is64()) { |
(...skipping 21 matching lines...) Expand all Loading... |
1488 compiler::Node* from_array, | 1500 compiler::Node* from_array, |
1489 compiler::Node* to_array, | 1501 compiler::Node* to_array, |
1490 compiler::Node* element_count, | 1502 compiler::Node* element_count, |
1491 WriteBarrierMode barrier_mode, | 1503 WriteBarrierMode barrier_mode, |
1492 ParameterMode mode) { | 1504 ParameterMode mode) { |
1493 Label test(this); | 1505 Label test(this); |
1494 Label done(this); | 1506 Label done(this); |
1495 bool double_elements = IsFastDoubleElementsKind(kind); | 1507 bool double_elements = IsFastDoubleElementsKind(kind); |
1496 bool needs_write_barrier = | 1508 bool needs_write_barrier = |
1497 barrier_mode == UPDATE_WRITE_BARRIER && !IsFastObjectElementsKind(kind); | 1509 barrier_mode == UPDATE_WRITE_BARRIER && !IsFastObjectElementsKind(kind); |
1498 Node* limit_offset = ElementOffsetFromIndex( | 1510 Node* limit_offset = |
1499 IntPtrConstant(0), kind, mode, FixedArray::kHeaderSize - kHeapObjectTag); | 1511 ElementOffsetFromIndex(IntPtrOrSmiConstant(0, mode), kind, mode, |
| 1512 FixedArray::kHeaderSize - kHeapObjectTag); |
1500 Variable current_offset(this, MachineType::PointerRepresentation()); | 1513 Variable current_offset(this, MachineType::PointerRepresentation()); |
1501 current_offset.Bind(ElementOffsetFromIndex( | 1514 current_offset.Bind(ElementOffsetFromIndex( |
1502 element_count, kind, mode, FixedArray::kHeaderSize - kHeapObjectTag)); | 1515 element_count, kind, mode, FixedArray::kHeaderSize - kHeapObjectTag)); |
1503 Label decrement(this, ¤t_offset); | 1516 Label decrement(this, ¤t_offset); |
1504 | 1517 |
1505 Branch(WordEqual(current_offset.value(), limit_offset), &done, &decrement); | 1518 Branch(WordEqual(current_offset.value(), limit_offset), &done, &decrement); |
1506 | 1519 |
1507 Bind(&decrement); | 1520 Bind(&decrement); |
1508 { | 1521 { |
1509 current_offset.Bind(IntPtrSub( | 1522 current_offset.Bind(IntPtrSub( |
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2596 var_details->Bind(details); | 2609 var_details->Bind(details); |
2597 | 2610 |
2598 Node* location = BitFieldDecode<PropertyDetails::LocationField>(details); | 2611 Node* location = BitFieldDecode<PropertyDetails::LocationField>(details); |
2599 | 2612 |
2600 Label if_in_field(this), if_in_descriptor(this), done(this); | 2613 Label if_in_field(this), if_in_descriptor(this), done(this); |
2601 Branch(Word32Equal(location, Int32Constant(kField)), &if_in_field, | 2614 Branch(Word32Equal(location, Int32Constant(kField)), &if_in_field, |
2602 &if_in_descriptor); | 2615 &if_in_descriptor); |
2603 Bind(&if_in_field); | 2616 Bind(&if_in_field); |
2604 { | 2617 { |
2605 Node* field_index = | 2618 Node* field_index = |
2606 BitFieldDecode<PropertyDetails::FieldIndexField>(details); | 2619 BitFieldDecodeWord<PropertyDetails::FieldIndexField>(details); |
2607 Node* representation = | 2620 Node* representation = |
2608 BitFieldDecode<PropertyDetails::RepresentationField>(details); | 2621 BitFieldDecode<PropertyDetails::RepresentationField>(details); |
2609 | 2622 |
2610 Node* inobject_properties = LoadMapInobjectProperties(map); | 2623 Node* inobject_properties = LoadMapInobjectProperties(map); |
2611 | 2624 |
2612 Label if_inobject(this), if_backing_store(this); | 2625 Label if_inobject(this), if_backing_store(this); |
2613 Variable var_double_value(this, MachineRepresentation::kFloat64); | 2626 Variable var_double_value(this, MachineRepresentation::kFloat64); |
2614 Label rebox_double(this, &var_double_value); | 2627 Label rebox_double(this, &var_double_value); |
2615 BranchIfInt32LessThan(field_index, inobject_properties, &if_inobject, | 2628 BranchIfUintPtrLessThan(field_index, inobject_properties, &if_inobject, |
2616 &if_backing_store); | 2629 &if_backing_store); |
2617 Bind(&if_inobject); | 2630 Bind(&if_inobject); |
2618 { | 2631 { |
2619 Comment("if_inobject"); | 2632 Comment("if_inobject"); |
2620 Node* field_offset = ChangeInt32ToIntPtr( | 2633 Node* field_offset = |
2621 Int32Mul(Int32Sub(LoadMapInstanceSize(map), | 2634 IntPtrMul(IntPtrSub(LoadMapInstanceSize(map), |
2622 Int32Sub(inobject_properties, field_index)), | 2635 IntPtrSub(inobject_properties, field_index)), |
2623 Int32Constant(kPointerSize))); | 2636 IntPtrConstant(kPointerSize)); |
2624 | 2637 |
2625 Label if_double(this), if_tagged(this); | 2638 Label if_double(this), if_tagged(this); |
2626 BranchIfWord32NotEqual(representation, | 2639 BranchIfWord32NotEqual(representation, |
2627 Int32Constant(Representation::kDouble), &if_tagged, | 2640 Int32Constant(Representation::kDouble), &if_tagged, |
2628 &if_double); | 2641 &if_double); |
2629 Bind(&if_tagged); | 2642 Bind(&if_tagged); |
2630 { | 2643 { |
2631 var_value->Bind(LoadObjectField(object, field_offset)); | 2644 var_value->Bind(LoadObjectField(object, field_offset)); |
2632 Goto(&done); | 2645 Goto(&done); |
2633 } | 2646 } |
2634 Bind(&if_double); | 2647 Bind(&if_double); |
2635 { | 2648 { |
2636 if (FLAG_unbox_double_fields) { | 2649 if (FLAG_unbox_double_fields) { |
2637 var_double_value.Bind( | 2650 var_double_value.Bind( |
2638 LoadObjectField(object, field_offset, MachineType::Float64())); | 2651 LoadObjectField(object, field_offset, MachineType::Float64())); |
2639 } else { | 2652 } else { |
2640 Node* mutable_heap_number = LoadObjectField(object, field_offset); | 2653 Node* mutable_heap_number = LoadObjectField(object, field_offset); |
2641 var_double_value.Bind(LoadHeapNumberValue(mutable_heap_number)); | 2654 var_double_value.Bind(LoadHeapNumberValue(mutable_heap_number)); |
2642 } | 2655 } |
2643 Goto(&rebox_double); | 2656 Goto(&rebox_double); |
2644 } | 2657 } |
2645 } | 2658 } |
2646 Bind(&if_backing_store); | 2659 Bind(&if_backing_store); |
2647 { | 2660 { |
2648 Comment("if_backing_store"); | 2661 Comment("if_backing_store"); |
2649 Node* properties = LoadProperties(object); | 2662 Node* properties = LoadProperties(object); |
2650 field_index = Int32Sub(field_index, inobject_properties); | 2663 field_index = IntPtrSub(field_index, inobject_properties); |
2651 Node* value = LoadFixedArrayElement(properties, field_index); | 2664 Node* value = LoadFixedArrayElement(properties, field_index); |
2652 | 2665 |
2653 Label if_double(this), if_tagged(this); | 2666 Label if_double(this), if_tagged(this); |
2654 BranchIfWord32NotEqual(representation, | 2667 BranchIfWord32NotEqual(representation, |
2655 Int32Constant(Representation::kDouble), &if_tagged, | 2668 Int32Constant(Representation::kDouble), &if_tagged, |
2656 &if_double); | 2669 &if_double); |
2657 Bind(&if_tagged); | 2670 Bind(&if_tagged); |
2658 { | 2671 { |
2659 var_value->Bind(value); | 2672 var_value->Bind(value); |
2660 Goto(&done); | 2673 Goto(&done); |
(...skipping 1433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4094 Node* handler = | 4107 Node* handler = |
4095 LoadFixedArrayElement(p->vector, p->slot, kPointerSize, SMI_PARAMETERS); | 4108 LoadFixedArrayElement(p->vector, p->slot, kPointerSize, SMI_PARAMETERS); |
4096 GotoIf(WordEqual(handler, LoadRoot(Heap::kuninitialized_symbolRootIndex)), | 4109 GotoIf(WordEqual(handler, LoadRoot(Heap::kuninitialized_symbolRootIndex)), |
4097 &miss); | 4110 &miss); |
4098 | 4111 |
4099 // In this case {handler} must be a Code object. | 4112 // In this case {handler} must be a Code object. |
4100 AssertInstanceType(handler, CODE_TYPE); | 4113 AssertInstanceType(handler, CODE_TYPE); |
4101 LoadWithVectorDescriptor descriptor(isolate()); | 4114 LoadWithVectorDescriptor descriptor(isolate()); |
4102 Node* native_context = LoadNativeContext(p->context); | 4115 Node* native_context = LoadNativeContext(p->context); |
4103 Node* receiver = LoadFixedArrayElement( | 4116 Node* receiver = LoadFixedArrayElement( |
4104 native_context, Int32Constant(Context::EXTENSION_INDEX)); | 4117 native_context, IntPtrConstant(Context::EXTENSION_INDEX), 0, |
| 4118 INTPTR_PARAMETERS); |
4105 Node* fake_name = IntPtrConstant(0); | 4119 Node* fake_name = IntPtrConstant(0); |
4106 TailCallStub(descriptor, handler, p->context, receiver, fake_name, p->slot, | 4120 TailCallStub(descriptor, handler, p->context, receiver, fake_name, p->slot, |
4107 p->vector); | 4121 p->vector); |
4108 } | 4122 } |
4109 Bind(&miss); | 4123 Bind(&miss); |
4110 { | 4124 { |
4111 TailCallRuntime(Runtime::kLoadGlobalIC_Miss, p->context, p->slot, | 4125 TailCallRuntime(Runtime::kLoadGlobalIC_Miss, p->context, p->slot, |
4112 p->vector); | 4126 p->vector); |
4113 } | 4127 } |
4114 } | 4128 } |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4193 Heap::kTheHoleValueRootIndex); | 4207 Heap::kTheHoleValueRootIndex); |
4194 | 4208 |
4195 // Store the WeakCell in the feedback vector. | 4209 // Store the WeakCell in the feedback vector. |
4196 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, | 4210 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, |
4197 CodeStubAssembler::SMI_PARAMETERS); | 4211 CodeStubAssembler::SMI_PARAMETERS); |
4198 return cell; | 4212 return cell; |
4199 } | 4213 } |
4200 | 4214 |
4201 } // namespace internal | 4215 } // namespace internal |
4202 } // namespace v8 | 4216 } // namespace v8 |
OLD | NEW |