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

Unified Diff: runtime/vm/class_finalizer.cc

Issue 13472019: - Create an all static TypedDataView class which uses implicit field offset (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 9 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 | « runtime/vm/class_finalizer.h ('k') | runtime/vm/dart_api_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/class_finalizer.cc
===================================================================
--- runtime/vm/class_finalizer.cc (revision 20947)
+++ runtime/vm/class_finalizer.cc (working copy)
@@ -167,6 +167,7 @@
if (FLAG_use_cha) {
RemoveOptimizedCode(added_subclasses_to_cids);
}
+ VerifyImplicitFieldOffsets();
regis 2013/04/09 20:27:39 I am getting a crash here in the case class finali
siva 2013/04/09 21:30:29 I guess in your case a type error occurred before
return retval;
}
@@ -1973,4 +1974,58 @@
ReportError(error);
}
+
+void ClassFinalizer::VerifyImplicitFieldOffsets() {
+#ifdef DEBUG
+ const ClassTable& class_table = *(Isolate::Current()->class_table());
+ Class& cls = Class::Handle();
+ Array& fields_array = Array::Handle();
+ Field& field = Field::Handle();
+ String& name = String::Handle();
+ String& expected_name = String::Handle();
+
+ // First verify field offsets of all the TypedDataView classes.
+ for (intptr_t cid = kTypedDataInt8ArrayViewCid;
+ cid <= kTypedDataFloat32x4ArrayViewCid;
+ cid++) {
+ cls = class_table.At(cid); // Get the TypedDataView class.
+ cls = cls.SuperClass(); // Get it's super class '_TypedListView'.
+ fields_array ^= cls.fields();
+ ASSERT(fields_array.Length() == TypedDataView::NumberOfFields());
+ field ^= fields_array.At(0);
+ ASSERT(field.Offset() == TypedDataView::data_offset());
+ name ^= field.name();
+ expected_name ^= String::New("_typeddata");
+ ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name));
+ field ^= fields_array.At(1);
+ ASSERT(field.Offset() == TypedDataView::offset_in_bytes_offset());
+ name ^= field.name();
+ ASSERT(name.Equals("offsetInBytes"));
+ field ^= fields_array.At(2);
+ ASSERT(field.Offset() == TypedDataView::length_offset());
+ name ^= field.name();
+ ASSERT(name.Equals("length"));
+ }
+
+ // Now verify field offsets of '_ByteDataView' class.
+ cls = class_table.At(kByteDataViewCid);
+ fields_array ^= cls.fields();
+ ASSERT(fields_array.Length() == TypedDataView::NumberOfFields());
+ field ^= fields_array.At(0);
+ ASSERT(field.Offset() == TypedDataView::data_offset());
+ name ^= field.name();
+ expected_name ^= String::New("_typeddata");
+ ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name));
+ field ^= fields_array.At(1);
+ ASSERT(field.Offset() == TypedDataView::offset_in_bytes_offset());
+ name ^= field.name();
+ expected_name ^= String::New("_offset");
+ ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name));
+ field ^= fields_array.At(2);
+ ASSERT(field.Offset() == TypedDataView::length_offset());
+ name ^= field.name();
+ ASSERT(name.Equals("length"));
+#endif
+}
+
} // namespace dart
« no previous file with comments | « runtime/vm/class_finalizer.h ('k') | runtime/vm/dart_api_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698