Chromium Code Reviews| Index: runtime/vm/code_generator.cc |
| diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc |
| index 7aaf5bc0cb39a1f88c90c58d377980cf6a1d6898..584563f19a6b510ab57a3d466b9edf515e418668 100644 |
| --- a/runtime/vm/code_generator.cc |
| +++ b/runtime/vm/code_generator.cc |
| @@ -1861,6 +1861,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::kNoLength; |
|
srdjan
2013/08/16 22:26:01
It may be easier to understand if renamed to kNoFi
Cutch
2013/08/19 21:52:01
Done.
|
| + } else if (value.IsExternalTypedData()) { |
| + // TODO(johnmccutchan): Enable for external typed data. |
| + return Field::kNoLength; |
| + } else if (RawObject::IsTypedDataViewClassId(cid)) { |
| + // TODO(johnmccutchan): Enable for typed data views. |
| + return Field::kNoLength; |
| + } |
| + UNIMPLEMENTED(); |
| + return Field::kNoLength; |
| +} |
| + |
| + |
| // Update global type feedback recorded for a field recording the assignment |
| // of the given value. |
| // Arg0: Field object; |
| @@ -1869,8 +1894,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::kNoLength; |
| + if ((field.guarded_cid() != kDynamicCid) && |
| + field.is_final() && RawObject::IsBuiltinListClassId(cid)) { |
| + list_length = GetListLength(value); |
| + } |
| + field.UpdateLength(list_length); |
| } |
| } // namespace dart |