OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |