Skip to content

Commit ce5de77

Browse files
[GR-59807] Restore support for ACCESS_VM_ANNOTATION.
PullRequest: graal/19313
2 parents 48a3929 + 950a103 commit ce5de77

File tree

2 files changed

+59
-55
lines changed

2 files changed

+59
-55
lines changed

espresso/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/ClassfileParser.java

Lines changed: 58 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,46 @@
2222
*/
2323
package com.oracle.truffle.espresso.classfile;
2424

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+
3465
import com.oracle.truffle.espresso.classfile.ConstantPool.Tag;
3566
import com.oracle.truffle.espresso.classfile.attributes.Attribute;
3667
import com.oracle.truffle.espresso.classfile.attributes.BootstrapMethodsAttribute;
@@ -68,48 +99,18 @@
6899
import com.oracle.truffle.espresso.classfile.constantpool.PoolConstant;
69100
import com.oracle.truffle.espresso.classfile.constantpool.StringConstant;
70101
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;
71111
import com.oracle.truffle.espresso.classfile.perf.DebugCloseable;
72112
import com.oracle.truffle.espresso.classfile.perf.DebugCounter;
73113
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;
113114

114115
@SuppressWarnings("try")
115116
public final class ClassfileParser {
@@ -180,6 +181,7 @@ public final class ClassfileParser {
180181

181182
private final boolean loaderIsBootOrPlatform;
182183
private final boolean isHidden;
184+
private final boolean forceAllowVMAnnotations;
183185

184186
private Symbol<Type> classType;
185187

@@ -195,19 +197,21 @@ public final class ClassfileParser {
195197
private ImmutableConstantPool pool;
196198
private final boolean validate;
197199

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) {
199202
this.requestedClassType = requestedClassType;
200203
this.parsingContext = parsingContext;
201204
this.stream = Objects.requireNonNull(stream);
202205
this.verifiable = verifiable;
203206
this.loaderIsBootOrPlatform = loaderIsBootOrPlatform;
204207
this.isHidden = isHidden;
208+
this.forceAllowVMAnnotations = forceAllowVMAnnotations;
205209
this.validate = true; // always validate
206210
}
207211

208212
// Note: only used for reading the class name from class bytes
209213
private ClassfileParser(ParsingContext parsingContext, ClassfileStream stream) {
210-
this(parsingContext, stream, false, false, null, false);
214+
this(parsingContext, stream, false, false, null, false, false);
211215
}
212216

213217
void handleBadConstant(Tag tag, ClassfileStream s) {
@@ -247,9 +251,9 @@ void checkDynamicConstantSupport(Tag tag) {
247251
}
248252
}
249253

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();
253257
}
254258

255259
private ParserKlass parseClass() throws ValidationException {
@@ -883,7 +887,7 @@ RuntimeVisibleAnnotationsAttribute parseRuntimeVisibleAnnotations(int attributeS
883887
byte[] data = stream.readByteArray(attributeSize);
884888
ClassfileStream subStream = new ClassfileStream(data, stream.getClasspathFile());
885889
int flags = 0;
886-
if (loaderIsBootOrPlatform) {
890+
if (loaderIsBootOrPlatform || forceAllowVMAnnotations) {
887891
flags = switch (location) {
888892
case Method -> parseMethodVMAnnotations(subStream);
889893
case Field -> parseFieldVMAnnotations(subStream);

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/preinit/ParserKlassProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ static ParserKlass parseKlass(ClassRegistry.ClassDefinitionInfo info, ClassLoadi
5050
boolean loaderIsBootOrPlatform = env.loaderIsBootOrPlatform(loader);
5151
Meta meta = env.getMeta();
5252
try {
53-
return ClassfileParser.parse(env.getParsingContext(), new ClassfileStream(bytes, null), verifiable, loaderIsBootOrPlatform, typeOrNull, info.isHidden);
53+
return ClassfileParser.parse(env.getParsingContext(), new ClassfileStream(bytes, null), verifiable, loaderIsBootOrPlatform, typeOrNull, info.isHidden, info.forceAllowVMAnnotations);
5454
} catch (ValidationException | ParserException.ClassFormatError validationOrBadFormat) {
5555
throw meta.throwExceptionWithMessage(meta.java_lang_ClassFormatError, validationOrBadFormat.getMessage());
5656
} catch (ParserException.UnsupportedClassVersionError unsupportedClassVersionError) {

0 commit comments

Comments
 (0)