comparison src/share/vm/oops/annotations.hpp @ 7457:35431a769282

8004823: Add VM support for type annotation reflection Reviewed-by: dholmes, coleenp Contributed-by: joel.franck@oracle.com
author stefank
date Thu, 20 Dec 2012 10:22:19 +0100
parents da91efe96a93
children 16fb9f942703
comparison
equal deleted inserted replaced
7456:7d42f3b08300 7457:35431a769282
36 class outputStream; 36 class outputStream;
37 37
38 typedef Array<u1> AnnotationArray; 38 typedef Array<u1> AnnotationArray;
39 39
40 // Class to hold the various types of annotations. The only metadata that points 40 // Class to hold the various types of annotations. The only metadata that points
41 // to this is InstanceKlass. 41 // to this is InstanceKlass, or another Annotations instance if this is a
42 // a type_annotation instance.
42 43
43 class Annotations: public MetaspaceObj { 44 class Annotations: public MetaspaceObj {
44 45
45 // Annotations for this class, or null if none. 46 // Annotations for this class, or null if none.
46 AnnotationArray* _class_annotations; 47 AnnotationArray* _class_annotations;
56 Array<AnnotationArray*>* _methods_parameter_annotations; 57 Array<AnnotationArray*>* _methods_parameter_annotations;
57 // Annotation objects (byte arrays) for methods' default values, or null if no 58 // Annotation objects (byte arrays) for methods' default values, or null if no
58 // such annotations. 59 // such annotations.
59 // Index is the idnum, which is initially the same as the methods array index. 60 // Index is the idnum, which is initially the same as the methods array index.
60 Array<AnnotationArray*>* _methods_default_annotations; 61 Array<AnnotationArray*>* _methods_default_annotations;
62 // Type annotations for this class, or null if none.
63 Annotations* _type_annotations;
61 64
62 // Constructor where some some values are known to not be null 65 // Constructor where some some values are known to not be null
63 Annotations(Array<AnnotationArray*>* fa, Array<AnnotationArray*>* ma, 66 Annotations(Array<AnnotationArray*>* fa, Array<AnnotationArray*>* ma,
64 Array<AnnotationArray*>* mpa, Array<AnnotationArray*>* mda) : 67 Array<AnnotationArray*>* mpa, Array<AnnotationArray*>* mda) :
65 _class_annotations(NULL), 68 _class_annotations(NULL),
66 _fields_annotations(fa), 69 _fields_annotations(fa),
67 _methods_annotations(ma), 70 _methods_annotations(ma),
68 _methods_parameter_annotations(mpa), 71 _methods_parameter_annotations(mpa),
69 _methods_default_annotations(mda) {} 72 _methods_default_annotations(mda),
73 _type_annotations(NULL) {}
70 74
71 public: 75 public:
72 // Allocate instance of this class 76 // Allocate instance of this class
73 static Annotations* allocate(ClassLoaderData* loader_data, TRAPS); 77 static Annotations* allocate(ClassLoaderData* loader_data, TRAPS);
74 static Annotations* allocate(ClassLoaderData* loader_data, 78 static Annotations* allocate(ClassLoaderData* loader_data,
79 void deallocate_contents(ClassLoaderData* loader_data); 83 void deallocate_contents(ClassLoaderData* loader_data);
80 DEBUG_ONLY(bool on_stack() { return false; }) // for template 84 DEBUG_ONLY(bool on_stack() { return false; }) // for template
81 static int size() { return sizeof(Annotations) / wordSize; } 85 static int size() { return sizeof(Annotations) / wordSize; }
82 86
83 // Constructor to initialize to null 87 // Constructor to initialize to null
84 Annotations() : _class_annotations(NULL), _fields_annotations(NULL), 88 Annotations() : _class_annotations(NULL),
89 _fields_annotations(NULL),
85 _methods_annotations(NULL), 90 _methods_annotations(NULL),
86 _methods_parameter_annotations(NULL), 91 _methods_parameter_annotations(NULL),
87 _methods_default_annotations(NULL) {} 92 _methods_default_annotations(NULL),
93 _type_annotations(NULL) {}
88 94
89 AnnotationArray* class_annotations() const { return _class_annotations; } 95 AnnotationArray* class_annotations() const { return _class_annotations; }
90 Array<AnnotationArray*>* fields_annotations() const { return _fields_annotations; } 96 Array<AnnotationArray*>* fields_annotations() const { return _fields_annotations; }
91 Array<AnnotationArray*>* methods_annotations() const { return _methods_annotations; } 97 Array<AnnotationArray*>* methods_annotations() const { return _methods_annotations; }
92 Array<AnnotationArray*>* methods_parameter_annotations() const { return _methods_parameter_annotations; } 98 Array<AnnotationArray*>* methods_parameter_annotations() const { return _methods_parameter_annotations; }
93 Array<AnnotationArray*>* methods_default_annotations() const { return _methods_default_annotations; } 99 Array<AnnotationArray*>* methods_default_annotations() const { return _methods_default_annotations; }
100 Annotations* type_annotations() const { return _type_annotations; }
94 101
95 void set_class_annotations(AnnotationArray* md) { _class_annotations = md; } 102 void set_class_annotations(AnnotationArray* md) { _class_annotations = md; }
96 void set_fields_annotations(Array<AnnotationArray*>* md) { _fields_annotations = md; } 103 void set_fields_annotations(Array<AnnotationArray*>* md) { _fields_annotations = md; }
97 void set_methods_annotations(Array<AnnotationArray*>* md) { _methods_annotations = md; } 104 void set_methods_annotations(Array<AnnotationArray*>* md) { _methods_annotations = md; }
98 void set_methods_parameter_annotations(Array<AnnotationArray*>* md) { _methods_parameter_annotations = md; } 105 void set_methods_parameter_annotations(Array<AnnotationArray*>* md) { _methods_parameter_annotations = md; }
99 void set_methods_default_annotations(Array<AnnotationArray*>* md) { _methods_default_annotations = md; } 106 void set_methods_default_annotations(Array<AnnotationArray*>* md) { _methods_default_annotations = md; }
107 void set_type_annotations(Annotations* annos) { _type_annotations = annos; }
100 108
101 // Redefine classes support 109 // Redefine classes support
102 AnnotationArray* get_method_annotations_of(int idnum) 110 AnnotationArray* get_method_annotations_of(int idnum)
103 { return get_method_annotations_from(idnum, _methods_annotations); } 111 { return get_method_annotations_from(idnum, _methods_annotations); }
104 112
127 static typeArrayOop make_java_array(AnnotationArray* annotations, TRAPS); 135 static typeArrayOop make_java_array(AnnotationArray* annotations, TRAPS);
128 136
129 inline AnnotationArray* get_method_annotations_from(int idnum, Array<AnnotationArray*>* annos); 137 inline AnnotationArray* get_method_annotations_from(int idnum, Array<AnnotationArray*>* annos);
130 void set_annotations(Array<AnnotationArray*>* md, Array<AnnotationArray*>** md_p) { *md_p = md; } 138 void set_annotations(Array<AnnotationArray*>* md, Array<AnnotationArray*>** md_p) { *md_p = md; }
131 139
140 bool is_klass() const { return false; }
132 private: 141 private:
133 void set_methods_annotations_of(instanceKlassHandle ik, 142 void set_methods_annotations_of(instanceKlassHandle ik,
134 int idnum, AnnotationArray* anno, 143 int idnum, AnnotationArray* anno,
135 Array<AnnotationArray*>** md_p, TRAPS); 144 Array<AnnotationArray*>** md_p, TRAPS);
136 145