Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(663)

Unified Diff: runtime/vm/code_generator.cc

Issue 22851003: Initial support for length guards on final fields. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | runtime/vm/flow_graph_builder.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « no previous file | runtime/vm/flow_graph_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698