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

Side by Side Diff: runtime/vm/object.cc

Issue 2632253002: VM: [Kernel] Partial support for metadata annotations (Closed)
Patch Set: Created 3 years, 11 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
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/become.h" 10 #include "vm/become.h"
(...skipping 11 matching lines...) Expand all
22 #include "vm/debugger.h" 22 #include "vm/debugger.h"
23 #include "vm/deopt_instructions.h" 23 #include "vm/deopt_instructions.h"
24 #include "vm/disassembler.h" 24 #include "vm/disassembler.h"
25 #include "vm/double_conversion.h" 25 #include "vm/double_conversion.h"
26 #include "vm/exceptions.h" 26 #include "vm/exceptions.h"
27 #include "vm/growable_array.h" 27 #include "vm/growable_array.h"
28 #include "vm/hash_table.h" 28 #include "vm/hash_table.h"
29 #include "vm/heap.h" 29 #include "vm/heap.h"
30 #include "vm/intrinsifier.h" 30 #include "vm/intrinsifier.h"
31 #include "vm/isolate_reload.h" 31 #include "vm/isolate_reload.h"
32 #include "vm/kernel_to_il.h"
32 #include "vm/object_store.h" 33 #include "vm/object_store.h"
33 #include "vm/parser.h" 34 #include "vm/parser.h"
34 #include "vm/precompiler.h" 35 #include "vm/precompiler.h"
35 #include "vm/profiler.h" 36 #include "vm/profiler.h"
36 #include "vm/resolver.h" 37 #include "vm/resolver.h"
37 #include "vm/reusable_handles.h" 38 #include "vm/reusable_handles.h"
38 #include "vm/runtime_entry.h" 39 #include "vm/runtime_entry.h"
39 #include "vm/scopes.h" 40 #include "vm/scopes.h"
40 #include "vm/stack_frame.h" 41 #include "vm/stack_frame.h"
41 #include "vm/symbols.h" 42 #include "vm/symbols.h"
(...skipping 9616 matching lines...) Expand 10 before | Expand all | Expand 10 after
9658 GrowableHandlePtrArray<const String> pieces(zone, 3); 9659 GrowableHandlePtrArray<const String> pieces(zone, 3);
9659 pieces.Add(cname); 9660 pieces.Add(cname);
9660 pieces.Add(Symbols::At()); 9661 pieces.Add(Symbols::At());
9661 pieces.Add(String::Handle(param.name())); 9662 pieces.Add(String::Handle(param.name()));
9662 return Symbols::FromConcatAll(thread, pieces); 9663 return Symbols::FromConcatAll(thread, pieces);
9663 } 9664 }
9664 9665
9665 9666
9666 void Library::AddMetadata(const Object& owner, 9667 void Library::AddMetadata(const Object& owner,
9667 const String& name, 9668 const String& name,
9668 TokenPosition token_pos) const { 9669 TokenPosition token_pos,
9670 kernel::TreeNode* kernel_node) const {
9669 Thread* thread = Thread::Current(); 9671 Thread* thread = Thread::Current();
9670 ASSERT(thread->IsMutatorThread()); 9672 ASSERT(thread->IsMutatorThread());
9671 Zone* zone = thread->zone(); 9673 Zone* zone = thread->zone();
9672 const String& metaname = String::Handle(zone, Symbols::New(thread, name)); 9674 const String& metaname = String::Handle(zone, Symbols::New(thread, name));
9673 const Field& field = 9675 const Field& field =
9674 Field::Handle(zone, Field::NewTopLevel(metaname, 9676 Field::Handle(zone, Field::NewTopLevel(metaname,
9675 false, // is_final 9677 false, // is_final
9676 false, // is_const 9678 false, // is_const
9677 owner, token_pos)); 9679 owner, token_pos));
9678 field.SetFieldType(Object::dynamic_type()); 9680 field.SetFieldType(Object::dynamic_type());
9679 field.set_is_reflectable(false); 9681 field.set_is_reflectable(false);
9680 field.SetStaticValue(Array::empty_array(), true); 9682 field.SetStaticValue(Array::empty_array(), true);
9683 field.set_kernel_field(kernel_node);
9681 GrowableObjectArray& metadata = 9684 GrowableObjectArray& metadata =
9682 GrowableObjectArray::Handle(zone, this->metadata()); 9685 GrowableObjectArray::Handle(zone, this->metadata());
9683 metadata.Add(field, Heap::kOld); 9686 metadata.Add(field, Heap::kOld);
9684 } 9687 }
9685 9688
9686 9689
9687 void Library::AddClassMetadata(const Class& cls, 9690 void Library::AddClassMetadata(const Class& cls,
9688 const Object& tl_owner, 9691 const Object& tl_owner,
9689 TokenPosition token_pos) const { 9692 TokenPosition token_pos,
9693 kernel::TreeNode* kernel_node) const {
9690 Thread* thread = Thread::Current(); 9694 Thread* thread = Thread::Current();
9691 Zone* zone = thread->zone(); 9695 Zone* zone = thread->zone();
9692 // We use the toplevel class as the owner of a class's metadata field because 9696 // We use the toplevel class as the owner of a class's metadata field because
9693 // a class's metadata is in scope of the library, not the class. 9697 // a class's metadata is in scope of the library, not the class.
9694 AddMetadata(tl_owner, 9698 AddMetadata(tl_owner,
9695 String::Handle(zone, MakeClassMetaName(thread, zone, cls)), 9699 String::Handle(zone, MakeClassMetaName(thread, zone, cls)),
9696 token_pos); 9700 token_pos, kernel_node);
9697 } 9701 }
9698 9702
9699 9703
9700 void Library::AddFieldMetadata(const Field& field, 9704 void Library::AddFieldMetadata(const Field& field,
9701 TokenPosition token_pos) const { 9705 TokenPosition token_pos,
9706 kernel::TreeNode* kernel_node) const {
9702 Thread* thread = Thread::Current(); 9707 Thread* thread = Thread::Current();
9703 Zone* zone = thread->zone(); 9708 Zone* zone = thread->zone();
9704 AddMetadata(Object::Handle(zone, field.RawOwner()), 9709 AddMetadata(Object::Handle(zone, field.RawOwner()),
9705 String::Handle(zone, MakeFieldMetaName(thread, zone, field)), 9710 String::Handle(zone, MakeFieldMetaName(thread, zone, field)),
9706 token_pos); 9711 token_pos, kernel_node);
9707 } 9712 }
9708 9713
9709 9714
9710 void Library::AddFunctionMetadata(const Function& func, 9715 void Library::AddFunctionMetadata(const Function& func,
9711 TokenPosition token_pos) const { 9716 TokenPosition token_pos,
9717 kernel::TreeNode* kernel_node) const {
9712 Thread* thread = Thread::Current(); 9718 Thread* thread = Thread::Current();
9713 Zone* zone = thread->zone(); 9719 Zone* zone = thread->zone();
9714 AddMetadata(Object::Handle(zone, func.RawOwner()), 9720 AddMetadata(Object::Handle(zone, func.RawOwner()),
9715 String::Handle(zone, MakeFunctionMetaName(thread, zone, func)), 9721 String::Handle(zone, MakeFunctionMetaName(thread, zone, func)),
9716 token_pos); 9722 token_pos, kernel_node);
9717 } 9723 }
9718 9724
9719 9725
9720 void Library::AddTypeParameterMetadata(const TypeParameter& param, 9726 void Library::AddTypeParameterMetadata(const TypeParameter& param,
9721 TokenPosition token_pos) const { 9727 TokenPosition token_pos) const {
9722 Thread* thread = Thread::Current(); 9728 Thread* thread = Thread::Current();
9723 Zone* zone = thread->zone(); 9729 Zone* zone = thread->zone();
9724 AddMetadata( 9730 AddMetadata(
9725 Class::Handle(zone, param.parameterized_class()), 9731 Class::Handle(zone, param.parameterized_class()),
9726 String::Handle(zone, MakeTypeParameterMetaName(thread, zone, param)), 9732 String::Handle(zone, MakeTypeParameterMetaName(thread, zone, param)),
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
9778 } 9784 }
9779 const String& metaname = String::Handle(MakeMetadataName(obj)); 9785 const String& metaname = String::Handle(MakeMetadataName(obj));
9780 Field& field = Field::Handle(GetMetadataField(metaname)); 9786 Field& field = Field::Handle(GetMetadataField(metaname));
9781 if (field.IsNull()) { 9787 if (field.IsNull()) {
9782 // There is no metadata for this object. 9788 // There is no metadata for this object.
9783 return Object::empty_array().raw(); 9789 return Object::empty_array().raw();
9784 } 9790 }
9785 Object& metadata = Object::Handle(); 9791 Object& metadata = Object::Handle();
9786 metadata = field.StaticValue(); 9792 metadata = field.StaticValue();
9787 if (field.StaticValue() == Object::empty_array().raw()) { 9793 if (field.StaticValue() == Object::empty_array().raw()) {
9788 metadata = Parser::ParseMetadata(field); 9794 kernel::TreeNode* kernel_node =
9795 reinterpret_cast<kernel::TreeNode*>(field.kernel_field());
9796
9797 if (kernel_node != NULL) {
9798 metadata = kernel::EvaluateMetadata(kernel_node);
9799 } else {
9800 metadata = Parser::ParseMetadata(field);
9801 }
9789 if (metadata.IsArray()) { 9802 if (metadata.IsArray()) {
9790 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); 9803 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw());
9791 field.SetStaticValue(Array::Cast(metadata), true); 9804 field.SetStaticValue(Array::Cast(metadata), true);
9792 } 9805 }
9793 } 9806 }
9794 return metadata.raw(); 9807 return metadata.raw();
9795 } 9808 }
9796 9809
9797 9810
9798 static bool ShouldBePrivate(const String& name) { 9811 static bool ShouldBePrivate(const String& name) {
(...skipping 13184 matching lines...) Expand 10 before | Expand all | Expand 10 after
22983 return UserTag::null(); 22996 return UserTag::null();
22984 } 22997 }
22985 22998
22986 22999
22987 const char* UserTag::ToCString() const { 23000 const char* UserTag::ToCString() const {
22988 const String& tag_label = String::Handle(label()); 23001 const String& tag_label = String::Handle(label());
22989 return tag_label.ToCString(); 23002 return tag_label.ToCString();
22990 } 23003 }
22991 23004
22992 } // namespace dart 23005 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698