| Index: runtime/vm/code_generator.cc
|
| diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
|
| index 1bfee23396d3931222eebda5d9f656a888fd7298..a5a597f39afe165340ba84cfffeb10ae51696528 100644
|
| --- a/runtime/vm/code_generator.cc
|
| +++ b/runtime/vm/code_generator.cc
|
| @@ -1853,6 +1853,31 @@ double DartModulo(double left, double right) {
|
| }
|
|
|
|
|
| +static intptr_t GetListLength(const Object& value) {
|
| + const intptr_t cid = value.GetClassId();
|
| + ASSERT(RawObject::IsBuiltinListClassId(cid));
|
| + // Extract list length.
|
| + if (value.IsTypedData()) {
|
| + const TypedData& list = TypedData::Cast(value);
|
| + return list.Length();
|
| + } else if (value.IsArray()) {
|
| + const Array& list = Array::Cast(value);
|
| + return list.Length();
|
| + } else if (value.IsGrowableObjectArray()) {
|
| + // List length is variable.
|
| + return Field::kNoFixedLength;
|
| + } else if (value.IsExternalTypedData()) {
|
| + // TODO(johnmccutchan): Enable for external typed data.
|
| + return Field::kNoFixedLength;
|
| + } else if (RawObject::IsTypedDataViewClassId(cid)) {
|
| + // TODO(johnmccutchan): Enable for typed data views.
|
| + return Field::kNoFixedLength;
|
| + }
|
| + UNIMPLEMENTED();
|
| + return Field::kNoFixedLength;
|
| +}
|
| +
|
| +
|
| // Update global type feedback recorded for a field recording the assignment
|
| // of the given value.
|
| // Arg0: Field object;
|
| @@ -1861,8 +1886,14 @@ DEFINE_RUNTIME_ENTRY(UpdateFieldCid, 2) {
|
| ASSERT(arguments.ArgCount() == kUpdateFieldCidRuntimeEntry.argument_count());
|
| const Field& field = Field::CheckedHandle(arguments.ArgAt(0));
|
| const Object& value = Object::Handle(arguments.ArgAt(1));
|
| -
|
| - field.UpdateCid(value.GetClassId());
|
| + const intptr_t cid = value.GetClassId();
|
| + field.UpdateCid(cid);
|
| + intptr_t list_length = Field::kNoFixedLength;
|
| + if ((field.guarded_cid() != kDynamicCid) &&
|
| + field.is_final() && RawObject::IsBuiltinListClassId(cid)) {
|
| + list_length = GetListLength(value);
|
| + }
|
| + field.UpdateLength(list_length);
|
| }
|
|
|
| } // namespace dart
|
|
|