1 /*
2 * Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package org.openjdk.asmtools.jasm;
24
25 import static org.openjdk.asmtools.jasm.RuntimeConstants.DEPRECATED_ATTRIBUTE;
26 import static org.openjdk.asmtools.jasm.RuntimeConstants.SYNTHETIC_ATTRIBUTE;
27 import org.openjdk.asmtools.jasm.Tables.AttrTag;
28 import java.util.ArrayList;
29
30 /**
31 * The common base structure for field_info, method_info, and component_info
32 */
33 abstract public class MemberData {
34
35 protected int access;
36 protected AttrData syntheticAttr, deprecatedAttr;
37 protected DataVectorAttr<AnnotationData> annotAttrVis = null;
38 protected DataVectorAttr<AnnotationData> annotAttrInv = null;
39 protected DataVectorAttr<TypeAnnotationData> type_annotAttrVis = null;
40 protected DataVectorAttr<TypeAnnotationData> type_annotAttrInv = null;
41 protected ClassData cls;
42 protected AttrData signatureAttr;
43
44 public MemberData(ClassData cls, int access) {
45 this.cls = cls;
46 init(access);
47 }
48
49 public MemberData(ClassData cls) {
50 this.cls = cls;
51 }
52
53 public void init(int access) {
54 this.access = access;
55 }
56
57 public void createPseudoMod() {
58 // If a member has a Pseudo-modifier
59
60 // create the appropriate marker attributes,
61 // and clear the PseudoModifiers from the access flags.
62 if (Modifiers.isSyntheticPseudoMod(access)) {
63 syntheticAttr = new AttrData(cls, AttrTag.ATT_Synthetic.parsekey());
64 access &= ~SYNTHETIC_ATTRIBUTE;
65 }
66 if (Modifiers.isDeprecatedPseudoMod(access)) {
67 deprecatedAttr = new AttrData(cls, AttrTag.ATT_Deprecated.parsekey());
68 access &= ~DEPRECATED_ATTRIBUTE;
69 }
70 }
71
72 public void setSignatureAttr(ConstantPool.ConstCell value_cpx) {
73 signatureAttr = new CPXAttr(cls, Tables.AttrTag.ATT_Signature.parsekey(), value_cpx);
74 }
75
76 protected abstract DataVector getAttrVector();
77
78 protected final DataVector getDataVector(Data... extraAttrs) {
79 DataVector attrs = new DataVector();
80 for( Data extra : extraAttrs ) {
81 if (extra != null) {
82 attrs.add(extra);
83 }
84 }
85 // common set for [ FieldData, MethodData, RecordData ]
86 if (annotAttrVis != null) {
87 attrs.add(annotAttrVis);
88 }
89 if (annotAttrInv != null) {
90 attrs.add(annotAttrInv);
91 }
92 if (type_annotAttrVis != null) {
93 attrs.add(type_annotAttrVis);
94 }
95 if (type_annotAttrInv != null) {
96 attrs.add(type_annotAttrInv);
97 }
98 return attrs;
99 }
100
101 public void addAnnotations(ArrayList<AnnotationData> list) {
102 for (AnnotationData item : list) {
103 boolean invisible = item.invisible;
104 if (item instanceof TypeAnnotationData) {
105 // Type Annotations
106 TypeAnnotationData ta = (TypeAnnotationData) item;
107 if (invisible) {
108 if (type_annotAttrInv == null) {
109 type_annotAttrInv = new DataVectorAttr(cls,
110 AttrTag.ATT_RuntimeInvisibleTypeAnnotations.parsekey());
111 }
112 type_annotAttrInv.add(ta);
113 } else {
114 if (type_annotAttrVis == null) {
115 type_annotAttrVis = new DataVectorAttr(cls,
116 AttrTag.ATT_RuntimeVisibleTypeAnnotations.parsekey());
117 }
118 type_annotAttrVis.add(ta);
119 }
120 } else {
121 // Regular Annotations
122 if (invisible) {
123 if (annotAttrInv == null) {
124 annotAttrInv = new DataVectorAttr(cls,
125 AttrTag.ATT_RuntimeInvisibleAnnotations.parsekey());
126 }
127 annotAttrInv.add(item);
128 } else {
129 if (annotAttrVis == null) {
130 annotAttrVis = new DataVectorAttr(cls,
131 AttrTag.ATT_RuntimeVisibleAnnotations.parsekey());
132 }
133 annotAttrVis.add(item);
134 }
135 }
136 }
137 }
138 }