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

Unified Diff: runtime/vm/object.cc

Issue 16780008: Reified metadata in the VM (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 6 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
Index: runtime/vm/object.cc
===================================================================
--- runtime/vm/object.cc (revision 23883)
+++ runtime/vm/object.cc (working copy)
@@ -5991,6 +5991,137 @@
}
+static RawString* MakeClassMetaName(const Class& cls) {
+ String& cname = String::Handle(cls.Name());
+ return String::Concat(Symbols::At(), cname);
+}
+
+
+static RawString* MakeFieldMetaName(const Field& field) {
+ const String& cname =
+ String::Handle(MakeClassMetaName(Class::Handle(field.origin())));
+ String& fname = String::Handle(field.name());
+ fname = String::Concat(Symbols::At(), fname);
+ return String::Concat(cname, fname);
siva 2013/06/12 00:16:52 Maybe more efficient to use ConcatAll String name
hausner 2013/06/12 01:10:05 I am not terribly concerned about speed here. Conc
+}
+
+
+static RawString* MakeFunctionMetaName(const Function& func) {
+ const String& cname =
+ String::Handle(MakeClassMetaName(Class::Handle(func.origin())));
+ String& fname = String::Handle(func.name());
+ fname = String::Concat(Symbols::At(), fname);
+ return String::Concat(cname, fname);
siva 2013/06/12 00:16:52 Ditto here.
+}
+
+
+void Library::AddClassMetadata(const Class& cls, intptr_t token_pos) const {
+ String& metaname = String::Handle(MakeClassMetaName(cls));
+ metaname = Symbols::New(metaname);
+ Field& meta_field =
+ Field::Handle(Field::New(metaname,
+ true, // is_static
+ false, // is_final
+ false, // is_const
+ cls,
+ token_pos));
+ meta_field.set_type(Type::Handle(Type::DynamicType()));
+ meta_field.set_value(Array::empty_array());
+ GrowableObjectArray& metadata =
+ GrowableObjectArray::Handle(this->metadata());
+ metadata.Add(meta_field, Heap::kOld);
siva 2013/06/12 00:16:52 Seems like the above code could be abstracted into
hausner 2013/06/12 01:10:05 Done.
+}
+
+
+void Library::AddFieldMetadata(const Field& field,
+ intptr_t token_pos) const {
+ String& metaname = String::Handle(MakeFieldMetaName(field));
+ metaname = Symbols::New(metaname);
+ Field& meta_field =
+ Field::Handle(Field::New(metaname,
+ true, // is_static
+ false, // is_final
+ false, // is_const
+ Class::Handle(field.origin()),
+ token_pos));
+ meta_field.set_type(Type::Handle(Type::DynamicType()));
+ meta_field.set_value(Array::empty_array());
+ GrowableObjectArray& metadata = GrowableObjectArray::Handle(this->metadata());
+ metadata.Add(meta_field, Heap::kOld);
+}
+
+
+void Library::AddFunctionMetadata(const Function& func,
+ intptr_t token_pos) const {
+ String& metaname = String::Handle(MakeFunctionMetaName(func));
+ metaname = Symbols::New(metaname);
+ Field& meta_field =
+ Field::Handle(Field::New(metaname,
+ true, // is_static
+ false, // is_final
+ false, // is_const
+ Class::Handle(func.origin()),
+ token_pos));
+ meta_field.set_type(Type::Handle(Type::DynamicType()));
+ meta_field.set_value(Object::empty_array());
+ GrowableObjectArray& metadata = GrowableObjectArray::Handle(this->metadata());
+ metadata.Add(meta_field, Heap::kOld);
+}
+
+
+RawString* Library::MakeMetadataName(const Object& obj) const {
+ if (obj.IsClass()) {
+ return MakeClassMetaName(Class::Cast(obj));
+ } else if (obj.IsField()) {
+ return MakeFieldMetaName(Field::Cast(obj));
+ } else if (obj.IsFunction()) {
+ return MakeFunctionMetaName(Function::Cast(obj));
+ }
+ UNIMPLEMENTED();
+ return String::null();
+}
+
+
+RawField* Library::GetMetadataField(const String& metaname) const {
+ const GrowableObjectArray& metadata =
+ GrowableObjectArray::Handle(this->metadata());
+ Field& entry = Field::Handle();
+ String& entryname = String::Handle();
+ intptr_t num_entries = metadata.Length();
+ for (intptr_t i = 0; i < num_entries; i++) {
+ entry ^= metadata.At(i);
+ entryname = entry.name();
+ if (entryname.Equals(metaname)) {
+ return entry.raw();
+ }
+ }
+ return Field::null();
+}
+
+
+RawObject* Library::GetMetadata(const Object& obj) const {
+ if (!obj.IsClass() && !obj.IsField() && !obj.IsFunction()) {
+ return Object::null();
+ }
+ const String& metaname = String::Handle(MakeMetadataName(obj));
+ Field& field = Field::Handle(GetMetadataField(metaname));
+ if (field.IsNull()) {
+ // There is no metadata for this object.
+ return Object::empty_array().raw();;
+ }
+ Object& metadata = Object::Handle();
+ metadata = field.value();
+ if (field.value() == Object::empty_array().raw()) {
+ metadata = Parser::ParseMetadata(Class::Handle(field.owner()),
+ field.token_pos());
+ if (metadata.IsArray()) {
siva 2013/06/12 00:16:52 ASSERT(Array::Cast(metadata).raw() != Object::empt
hausner 2013/06/12 01:10:05 Done.
+ field.set_value(Array::Cast(metadata));
+ }
+ }
+ return metadata.raw();
+}
+
+
void Library::GrowDictionary(const Array& dict, intptr_t dict_size) const {
// TODO(iposva): Avoid exponential growth.
intptr_t new_dict_size = dict_size * 2;
@@ -6529,6 +6660,7 @@
result.StorePointer(&result.raw_ptr()->url_, url.raw());
result.raw_ptr()->private_key_ = Scanner::AllocatePrivateKey(result);
result.raw_ptr()->dictionary_ = Object::empty_array().raw();
+ result.raw_ptr()->metadata_ = GrowableObjectArray::New(4, Heap::kOld);
siva 2013/06/12 00:16:52 result.StorePointer(&result.raw_ptr()->metadata_,
result.raw_ptr()->anonymous_classes_ = Object::empty_array().raw();
result.raw_ptr()->num_anonymous_ = 0;
result.raw_ptr()->imports_ = Object::empty_array().raw();

Powered by Google App Engine
This is Rietveld 408576698