@@ -47,39 +47,49 @@ default int getCachedParserKlassCount() {
47
47
return 0 ;
48
48
}
49
49
50
- static ParserKlass parseKlass (ClassRegistry .ClassDefinitionInfo info , ClassLoadingEnv env , StaticObject loader , Symbol <Type > typeOrNull , byte [] bytes ) {
50
+ /**
51
+ * Like {@link #parseKlass} but throws host exceptions that must be caught an handled by the
52
+ * called.
53
+ *
54
+ * @throws ValidationException a descriptor validation caused a class format error.
55
+ * @throws ParserException various exceptions, see subclasses.
56
+ */
57
+ static ParserKlass parseKlassWithHostErrors (ClassRegistry .ClassDefinitionInfo info , ClassLoadingEnv env , StaticObject loader , Symbol <Type > typeOrNull , byte [] bytes ) throws ValidationException {
51
58
boolean verifiable = EspressoVerifier .needsVerify (env .getLanguage (), loader );
52
59
boolean loaderIsBootOrPlatform = env .loaderIsBootOrPlatform (loader );
53
- Meta meta = env .getMeta ();
54
- try {
55
- // Classes from trusted class loaders can create strongly referenced symbols directly
56
- // during parsing.
57
- boolean ensureStrongSymbols = env .loaderIsBootOrPlatform (loader ) || env .loaderIsAppLoader (loader );
58
- ParsingContext parsingContext = ClassLoadingEnv .createParsingContext (env , ensureStrongSymbols );
60
+ // Classes from trusted class loaders can create strongly referenced symbols directly
61
+ // during parsing.
62
+ boolean ensureStrongSymbols = env .loaderIsBootOrPlatform (loader ) || env .loaderIsAppLoader (loader );
63
+ ParsingContext parsingContext = ClassLoadingEnv .createParsingContext (env , ensureStrongSymbols );
59
64
60
- // Trusted classes do not need validation/verification.
61
- boolean validate = verifiable ;
62
- ParserKlass parserKlass = ClassfileParser .parse (parsingContext , new ClassfileStream (bytes , null ), verifiable , loaderIsBootOrPlatform , typeOrNull , info .isHidden ,
63
- info .forceAllowVMAnnotations , validate );
64
- if (info .isHidden ) {
65
- Symbol <Type > requestedClassType = typeOrNull ;
66
- assert requestedClassType != null ;
67
- long hiddenKlassId = env .getNewKlassId ();
68
- Symbol <Name > thisKlassName = parsingContext .getOrCreateName (TypeSymbols .hiddenClassName (requestedClassType , hiddenKlassId ));
69
- Symbol <Type > thisKlassType = parsingContext .getOrCreateTypeFromName (thisKlassName );
70
- var pool = parserKlass .getConstantPool ().patchForHiddenClass (parserKlass .getThisKlassIndex (), thisKlassName );
71
- var classFlags = parserKlass .getFlags () | Constants .ACC_IS_HIDDEN_CLASS ;
72
- return new ParserKlass (pool , classFlags , thisKlassName , thisKlassType ,
73
- parserKlass .getSuperKlass (), parserKlass .getSuperInterfaces (),
74
- parserKlass .getMethods (), parserKlass .getFields (),
75
- parserKlass .getAttributes (),
76
- parserKlass .getThisKlassIndex (),
77
- parserKlass .getMajorVersion (), parserKlass .getMinorVersion (),
78
- parserKlass .getHiddenKlassId ());
79
- }
65
+ // Trusted classes do not need validation/verification.
66
+ boolean validate = verifiable ;
67
+ ParserKlass parserKlass = ClassfileParser .parse (parsingContext , new ClassfileStream (bytes , null ), verifiable , loaderIsBootOrPlatform , typeOrNull , info .isHidden ,
68
+ info .forceAllowVMAnnotations , validate );
69
+ if (info .isHidden ) {
70
+ Symbol <Type > requestedClassType = typeOrNull ;
71
+ assert requestedClassType != null ;
72
+ long hiddenKlassId = env .getNewKlassId ();
73
+ Symbol <Name > thisKlassName = parsingContext .getOrCreateName (TypeSymbols .hiddenClassName (requestedClassType , hiddenKlassId ));
74
+ Symbol <Type > thisKlassType = parsingContext .getOrCreateTypeFromName (thisKlassName );
75
+ var pool = parserKlass .getConstantPool ().patchForHiddenClass (parserKlass .getThisKlassIndex (), thisKlassName );
76
+ var classFlags = parserKlass .getFlags () | Constants .ACC_IS_HIDDEN_CLASS ;
77
+ return new ParserKlass (pool , classFlags , thisKlassName , thisKlassType ,
78
+ parserKlass .getSuperKlass (), parserKlass .getSuperInterfaces (),
79
+ parserKlass .getMethods (), parserKlass .getFields (),
80
+ parserKlass .getAttributes (),
81
+ parserKlass .getThisKlassIndex (),
82
+ parserKlass .getMajorVersion (), parserKlass .getMinorVersion (),
83
+ parserKlass .getHiddenKlassId ());
84
+ }
80
85
81
- return parserKlass ;
86
+ return parserKlass ;
87
+ }
82
88
89
+ static ParserKlass parseKlass (ClassRegistry .ClassDefinitionInfo info , ClassLoadingEnv env , StaticObject loader , Symbol <Type > typeOrNull , byte [] bytes ) {
90
+ Meta meta = env .getMeta ();
91
+ try {
92
+ return parseKlassWithHostErrors (info , env , loader , typeOrNull , bytes );
83
93
} catch (ValidationException | ParserException .ClassFormatError validationOrBadFormat ) {
84
94
throw meta .throwExceptionWithMessage (meta .java_lang_ClassFormatError , validationOrBadFormat .getMessage ());
85
95
} catch (ParserException .UnsupportedClassVersionError unsupportedClassVersionError ) {
0 commit comments