22
22
*/
23
23
package com .oracle .truffle .espresso .classfile ;
24
24
25
- import com .oracle .truffle .espresso .classfile .descriptors .ByteSequence ;
26
- import com .oracle .truffle .espresso .classfile .descriptors .ModifiedUtf8 ;
27
- import com .oracle .truffle .espresso .classfile .descriptors .Signatures ;
28
- import com .oracle .truffle .espresso .classfile .descriptors .Symbol ;
29
- import com .oracle .truffle .espresso .classfile .descriptors .Symbol .Name ;
30
- import com .oracle .truffle .espresso .classfile .descriptors .Symbol .Signature ;
31
- import com .oracle .truffle .espresso .classfile .descriptors .Symbol .Type ;
32
- import com .oracle .truffle .espresso .classfile .descriptors .Types ;
33
- import com .oracle .truffle .espresso .classfile .descriptors .ValidationException ;
25
+ import static com .oracle .truffle .espresso .classfile .ConstantPool .Tag .MODULE ;
26
+ import static com .oracle .truffle .espresso .classfile .ConstantPool .Tag .PACKAGE ;
27
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_ABSTRACT ;
28
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_ANNOTATION ;
29
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_CALLER_SENSITIVE ;
30
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_DONT_INLINE ;
31
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_ENUM ;
32
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_FINAL ;
33
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_FINALIZER ;
34
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_FORCE_INLINE ;
35
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_HIDDEN ;
36
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_INTERFACE ;
37
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_LAMBDA_FORM_COMPILED ;
38
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_MODULE ;
39
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_NATIVE ;
40
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_PRIVATE ;
41
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_PROTECTED ;
42
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_PUBLIC ;
43
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_SCOPED ;
44
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_STABLE ;
45
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_STATIC ;
46
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_STRICT ;
47
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_SUPER ;
48
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_SYNCHRONIZED ;
49
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_SYNTHETIC ;
50
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_VARARGS ;
51
+ import static com .oracle .truffle .espresso .classfile .Constants .ACC_VOLATILE ;
52
+ import static com .oracle .truffle .espresso .classfile .Constants .JVM_RECOGNIZED_CLASS_MODIFIERS ;
53
+ import static com .oracle .truffle .espresso .classfile .Constants .JVM_RECOGNIZED_METHOD_MODIFIERS ;
54
+
55
+ import java .io .IOException ;
56
+ import java .lang .reflect .Modifier ;
57
+ import java .util .ArrayList ;
58
+ import java .util .Arrays ;
59
+ import java .util .HashSet ;
60
+ import java .util .Objects ;
61
+ import java .util .Set ;
62
+
63
+ import org .graalvm .collections .EconomicMap ;
64
+
34
65
import com .oracle .truffle .espresso .classfile .ConstantPool .Tag ;
35
66
import com .oracle .truffle .espresso .classfile .attributes .Attribute ;
36
67
import com .oracle .truffle .espresso .classfile .attributes .BootstrapMethodsAttribute ;
68
99
import com .oracle .truffle .espresso .classfile .constantpool .PoolConstant ;
69
100
import com .oracle .truffle .espresso .classfile .constantpool .StringConstant ;
70
101
import com .oracle .truffle .espresso .classfile .constantpool .Utf8Constant ;
102
+ import com .oracle .truffle .espresso .classfile .descriptors .ByteSequence ;
103
+ import com .oracle .truffle .espresso .classfile .descriptors .ModifiedUtf8 ;
104
+ import com .oracle .truffle .espresso .classfile .descriptors .Signatures ;
105
+ import com .oracle .truffle .espresso .classfile .descriptors .Symbol ;
106
+ import com .oracle .truffle .espresso .classfile .descriptors .Symbol .Name ;
107
+ import com .oracle .truffle .espresso .classfile .descriptors .Symbol .Signature ;
108
+ import com .oracle .truffle .espresso .classfile .descriptors .Symbol .Type ;
109
+ import com .oracle .truffle .espresso .classfile .descriptors .Types ;
110
+ import com .oracle .truffle .espresso .classfile .descriptors .ValidationException ;
71
111
import com .oracle .truffle .espresso .classfile .perf .DebugCloseable ;
72
112
import com .oracle .truffle .espresso .classfile .perf .DebugCounter ;
73
113
import com .oracle .truffle .espresso .classfile .perf .DebugTimer ;
74
- import org .graalvm .collections .EconomicMap ;
75
-
76
- import java .io .IOException ;
77
- import java .lang .reflect .Modifier ;
78
- import java .util .ArrayList ;
79
- import java .util .Arrays ;
80
- import java .util .HashSet ;
81
- import java .util .Objects ;
82
- import java .util .Set ;
83
-
84
- import static com .oracle .truffle .espresso .classfile .ConstantPool .Tag .MODULE ;
85
- import static com .oracle .truffle .espresso .classfile .ConstantPool .Tag .PACKAGE ;
86
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_ABSTRACT ;
87
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_ANNOTATION ;
88
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_CALLER_SENSITIVE ;
89
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_DONT_INLINE ;
90
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_ENUM ;
91
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_FINAL ;
92
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_FINALIZER ;
93
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_FORCE_INLINE ;
94
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_HIDDEN ;
95
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_INTERFACE ;
96
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_LAMBDA_FORM_COMPILED ;
97
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_MODULE ;
98
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_NATIVE ;
99
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_PRIVATE ;
100
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_PROTECTED ;
101
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_PUBLIC ;
102
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_SCOPED ;
103
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_STABLE ;
104
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_STATIC ;
105
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_STRICT ;
106
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_SUPER ;
107
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_SYNCHRONIZED ;
108
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_SYNTHETIC ;
109
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_VARARGS ;
110
- import static com .oracle .truffle .espresso .classfile .Constants .ACC_VOLATILE ;
111
- import static com .oracle .truffle .espresso .classfile .Constants .JVM_RECOGNIZED_CLASS_MODIFIERS ;
112
- import static com .oracle .truffle .espresso .classfile .Constants .JVM_RECOGNIZED_METHOD_MODIFIERS ;
113
114
114
115
@ SuppressWarnings ("try" )
115
116
public final class ClassfileParser {
@@ -180,6 +181,7 @@ public final class ClassfileParser {
180
181
181
182
private final boolean loaderIsBootOrPlatform ;
182
183
private final boolean isHidden ;
184
+ private final boolean forceAllowVMAnnotations ;
183
185
184
186
private Symbol <Type > classType ;
185
187
@@ -195,19 +197,21 @@ public final class ClassfileParser {
195
197
private ImmutableConstantPool pool ;
196
198
private final boolean validate ;
197
199
198
- private ClassfileParser (ParsingContext parsingContext , ClassfileStream stream , boolean verifiable , boolean loaderIsBootOrPlatform , Symbol <Type > requestedClassType , boolean isHidden ) {
200
+ private ClassfileParser (ParsingContext parsingContext , ClassfileStream stream , boolean verifiable , boolean loaderIsBootOrPlatform , Symbol <Type > requestedClassType , boolean isHidden ,
201
+ boolean forceAllowVMAnnotations ) {
199
202
this .requestedClassType = requestedClassType ;
200
203
this .parsingContext = parsingContext ;
201
204
this .stream = Objects .requireNonNull (stream );
202
205
this .verifiable = verifiable ;
203
206
this .loaderIsBootOrPlatform = loaderIsBootOrPlatform ;
204
207
this .isHidden = isHidden ;
208
+ this .forceAllowVMAnnotations = forceAllowVMAnnotations ;
205
209
this .validate = true ; // always validate
206
210
}
207
211
208
212
// Note: only used for reading the class name from class bytes
209
213
private ClassfileParser (ParsingContext parsingContext , ClassfileStream stream ) {
210
- this (parsingContext , stream , false , false , null , false );
214
+ this (parsingContext , stream , false , false , null , false , false );
211
215
}
212
216
213
217
void handleBadConstant (Tag tag , ClassfileStream s ) {
@@ -247,9 +251,9 @@ void checkDynamicConstantSupport(Tag tag) {
247
251
}
248
252
}
249
253
250
- public static ParserKlass parse (ParsingContext parsingContext , ClassfileStream stream , boolean verifiable , boolean loaderIsBootOrPlatform , Symbol <Type > requestedClassType , boolean isHidden )
251
- throws ValidationException {
252
- return new ClassfileParser (parsingContext , stream , verifiable , loaderIsBootOrPlatform , requestedClassType , isHidden ).parseClass ();
254
+ public static ParserKlass parse (ParsingContext parsingContext , ClassfileStream stream , boolean verifiable , boolean loaderIsBootOrPlatform , Symbol <Type > requestedClassType , boolean isHidden ,
255
+ boolean forceAllowVMAnnotations ) throws ValidationException {
256
+ return new ClassfileParser (parsingContext , stream , verifiable , loaderIsBootOrPlatform , requestedClassType , isHidden , forceAllowVMAnnotations ).parseClass ();
253
257
}
254
258
255
259
private ParserKlass parseClass () throws ValidationException {
@@ -883,7 +887,7 @@ RuntimeVisibleAnnotationsAttribute parseRuntimeVisibleAnnotations(int attributeS
883
887
byte [] data = stream .readByteArray (attributeSize );
884
888
ClassfileStream subStream = new ClassfileStream (data , stream .getClasspathFile ());
885
889
int flags = 0 ;
886
- if (loaderIsBootOrPlatform ) {
890
+ if (loaderIsBootOrPlatform || forceAllowVMAnnotations ) {
887
891
flags = switch (location ) {
888
892
case Method -> parseMethodVMAnnotations (subStream );
889
893
case Field -> parseFieldVMAnnotations (subStream );
0 commit comments