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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 5973 matching lines...) Expand 10 before | Expand all | Expand 10 after
5984 } 5984 }
5985 5985
5986 5986
5987 void Library::SetLoadError() const { 5987 void Library::SetLoadError() const {
5988 // Should not be already loaded or just allocated. 5988 // Should not be already loaded or just allocated.
5989 ASSERT(LoadInProgress()); 5989 ASSERT(LoadInProgress());
5990 raw_ptr()->load_state_ = RawLibrary::kLoadError; 5990 raw_ptr()->load_state_ = RawLibrary::kLoadError;
5991 } 5991 }
5992 5992
5993 5993
5994 static RawString* MakeClassMetaName(const Class& cls) {
5995 String& cname = String::Handle(cls.Name());
5996 return String::Concat(Symbols::At(), cname);
5997 }
5998
5999
6000 static RawString* MakeFieldMetaName(const Field& field) {
6001 const String& cname =
6002 String::Handle(MakeClassMetaName(Class::Handle(field.origin())));
6003 String& fname = String::Handle(field.name());
6004 fname = String::Concat(Symbols::At(), fname);
6005 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
6006 }
6007
6008
6009 static RawString* MakeFunctionMetaName(const Function& func) {
6010 const String& cname =
6011 String::Handle(MakeClassMetaName(Class::Handle(func.origin())));
6012 String& fname = String::Handle(func.name());
6013 fname = String::Concat(Symbols::At(), fname);
6014 return String::Concat(cname, fname);
siva 2013/06/12 00:16:52 Ditto here.
6015 }
6016
6017
6018 void Library::AddClassMetadata(const Class& cls, intptr_t token_pos) const {
6019 String& metaname = String::Handle(MakeClassMetaName(cls));
6020 metaname = Symbols::New(metaname);
6021 Field& meta_field =
6022 Field::Handle(Field::New(metaname,
6023 true, // is_static
6024 false, // is_final
6025 false, // is_const
6026 cls,
6027 token_pos));
6028 meta_field.set_type(Type::Handle(Type::DynamicType()));
6029 meta_field.set_value(Array::empty_array());
6030 GrowableObjectArray& metadata =
6031 GrowableObjectArray::Handle(this->metadata());
6032 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.
6033 }
6034
6035
6036 void Library::AddFieldMetadata(const Field& field,
6037 intptr_t token_pos) const {
6038 String& metaname = String::Handle(MakeFieldMetaName(field));
6039 metaname = Symbols::New(metaname);
6040 Field& meta_field =
6041 Field::Handle(Field::New(metaname,
6042 true, // is_static
6043 false, // is_final
6044 false, // is_const
6045 Class::Handle(field.origin()),
6046 token_pos));
6047 meta_field.set_type(Type::Handle(Type::DynamicType()));
6048 meta_field.set_value(Array::empty_array());
6049 GrowableObjectArray& metadata = GrowableObjectArray::Handle(this->metadata());
6050 metadata.Add(meta_field, Heap::kOld);
6051 }
6052
6053
6054 void Library::AddFunctionMetadata(const Function& func,
6055 intptr_t token_pos) const {
6056 String& metaname = String::Handle(MakeFunctionMetaName(func));
6057 metaname = Symbols::New(metaname);
6058 Field& meta_field =
6059 Field::Handle(Field::New(metaname,
6060 true, // is_static
6061 false, // is_final
6062 false, // is_const
6063 Class::Handle(func.origin()),
6064 token_pos));
6065 meta_field.set_type(Type::Handle(Type::DynamicType()));
6066 meta_field.set_value(Object::empty_array());
6067 GrowableObjectArray& metadata = GrowableObjectArray::Handle(this->metadata());
6068 metadata.Add(meta_field, Heap::kOld);
6069 }
6070
6071
6072 RawString* Library::MakeMetadataName(const Object& obj) const {
6073 if (obj.IsClass()) {
6074 return MakeClassMetaName(Class::Cast(obj));
6075 } else if (obj.IsField()) {
6076 return MakeFieldMetaName(Field::Cast(obj));
6077 } else if (obj.IsFunction()) {
6078 return MakeFunctionMetaName(Function::Cast(obj));
6079 }
6080 UNIMPLEMENTED();
6081 return String::null();
6082 }
6083
6084
6085 RawField* Library::GetMetadataField(const String& metaname) const {
6086 const GrowableObjectArray& metadata =
6087 GrowableObjectArray::Handle(this->metadata());
6088 Field& entry = Field::Handle();
6089 String& entryname = String::Handle();
6090 intptr_t num_entries = metadata.Length();
6091 for (intptr_t i = 0; i < num_entries; i++) {
6092 entry ^= metadata.At(i);
6093 entryname = entry.name();
6094 if (entryname.Equals(metaname)) {
6095 return entry.raw();
6096 }
6097 }
6098 return Field::null();
6099 }
6100
6101
6102 RawObject* Library::GetMetadata(const Object& obj) const {
6103 if (!obj.IsClass() && !obj.IsField() && !obj.IsFunction()) {
6104 return Object::null();
6105 }
6106 const String& metaname = String::Handle(MakeMetadataName(obj));
6107 Field& field = Field::Handle(GetMetadataField(metaname));
6108 if (field.IsNull()) {
6109 // There is no metadata for this object.
6110 return Object::empty_array().raw();;
6111 }
6112 Object& metadata = Object::Handle();
6113 metadata = field.value();
6114 if (field.value() == Object::empty_array().raw()) {
6115 metadata = Parser::ParseMetadata(Class::Handle(field.owner()),
6116 field.token_pos());
6117 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.
6118 field.set_value(Array::Cast(metadata));
6119 }
6120 }
6121 return metadata.raw();
6122 }
6123
6124
5994 void Library::GrowDictionary(const Array& dict, intptr_t dict_size) const { 6125 void Library::GrowDictionary(const Array& dict, intptr_t dict_size) const {
5995 // TODO(iposva): Avoid exponential growth. 6126 // TODO(iposva): Avoid exponential growth.
5996 intptr_t new_dict_size = dict_size * 2; 6127 intptr_t new_dict_size = dict_size * 2;
5997 const Array& new_dict = 6128 const Array& new_dict =
5998 Array::Handle(Array::New(new_dict_size + 1, Heap::kOld)); 6129 Array::Handle(Array::New(new_dict_size + 1, Heap::kOld));
5999 // Rehash all elements from the original dictionary 6130 // Rehash all elements from the original dictionary
6000 // to the newly allocated array. 6131 // to the newly allocated array.
6001 Object& entry = Class::Handle(); 6132 Object& entry = Class::Handle();
6002 String& entry_name = String::Handle(); 6133 String& entry_name = String::Handle();
6003 Object& new_entry = Object::Handle(); 6134 Object& new_entry = Object::Handle();
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
6522 } 6653 }
6523 6654
6524 6655
6525 RawLibrary* Library::NewLibraryHelper(const String& url, 6656 RawLibrary* Library::NewLibraryHelper(const String& url,
6526 bool import_core_lib) { 6657 bool import_core_lib) {
6527 const Library& result = Library::Handle(Library::New()); 6658 const Library& result = Library::Handle(Library::New());
6528 result.StorePointer(&result.raw_ptr()->name_, url.raw()); 6659 result.StorePointer(&result.raw_ptr()->name_, url.raw());
6529 result.StorePointer(&result.raw_ptr()->url_, url.raw()); 6660 result.StorePointer(&result.raw_ptr()->url_, url.raw());
6530 result.raw_ptr()->private_key_ = Scanner::AllocatePrivateKey(result); 6661 result.raw_ptr()->private_key_ = Scanner::AllocatePrivateKey(result);
6531 result.raw_ptr()->dictionary_ = Object::empty_array().raw(); 6662 result.raw_ptr()->dictionary_ = Object::empty_array().raw();
6663 result.raw_ptr()->metadata_ = GrowableObjectArray::New(4, Heap::kOld);
siva 2013/06/12 00:16:52 result.StorePointer(&result.raw_ptr()->metadata_,
6532 result.raw_ptr()->anonymous_classes_ = Object::empty_array().raw(); 6664 result.raw_ptr()->anonymous_classes_ = Object::empty_array().raw();
6533 result.raw_ptr()->num_anonymous_ = 0; 6665 result.raw_ptr()->num_anonymous_ = 0;
6534 result.raw_ptr()->imports_ = Object::empty_array().raw(); 6666 result.raw_ptr()->imports_ = Object::empty_array().raw();
6535 result.raw_ptr()->exports_ = Object::empty_array().raw(); 6667 result.raw_ptr()->exports_ = Object::empty_array().raw();
6536 result.raw_ptr()->loaded_scripts_ = Array::null(); 6668 result.raw_ptr()->loaded_scripts_ = Array::null();
6537 result.set_native_entry_resolver(NULL); 6669 result.set_native_entry_resolver(NULL);
6538 result.raw_ptr()->corelib_imported_ = true; 6670 result.raw_ptr()->corelib_imported_ = true;
6539 result.set_debuggable(false); 6671 result.set_debuggable(false);
6540 result.raw_ptr()->load_state_ = RawLibrary::kAllocated; 6672 result.raw_ptr()->load_state_ = RawLibrary::kAllocated;
6541 result.raw_ptr()->index_ = -1; 6673 result.raw_ptr()->index_ = -1;
(...skipping 6855 matching lines...) Expand 10 before | Expand all | Expand 10 after
13397 space); 13529 space);
13398 return reinterpret_cast<RawWeakProperty*>(raw); 13530 return reinterpret_cast<RawWeakProperty*>(raw);
13399 } 13531 }
13400 13532
13401 13533
13402 const char* WeakProperty::ToCString() const { 13534 const char* WeakProperty::ToCString() const {
13403 return "_WeakProperty"; 13535 return "_WeakProperty";
13404 } 13536 }
13405 13537
13406 } // namespace dart 13538 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698