< prev index next >
src/hotspot/share/classfile/systemDictionary.hpp
Print this page
rev 58565 : 8238358: Implementation of JEP 371: Hidden Classes
Reviewed-by: duke
Contributed-by: mandy.chung@oracle.com, lois.foltan@oracle.com, david.holmes@oracle.com, harold.seigel@oracle.com, serguei.spitsyn@oracle.com, alex.buckley@oracle.com, jamsheed.c.m@oracle.com
@@ -32,10 +32,57 @@
#include "runtime/mutexLocker.hpp"
#include "runtime/reflectionUtils.hpp"
#include "runtime/signature.hpp"
#include "utilities/hashtable.hpp"
+class ClassInstanceInfo : public StackObj {
+ private:
+ InstanceKlass* _dynamic_nest_host;
+ Handle _class_data;
+
+ public:
+ ClassInstanceInfo() {
+ _dynamic_nest_host = NULL;
+ _class_data = Handle();
+ }
+ ClassInstanceInfo(InstanceKlass* dynamic_nest_host, Handle class_data) {
+ _dynamic_nest_host = dynamic_nest_host;
+ _class_data = class_data;
+ }
+
+ InstanceKlass* dynamic_nest_host() const { return _dynamic_nest_host; }
+ Handle class_data() const { return _class_data; }
+ friend class ClassLoadInfo;
+};
+
+class ClassLoadInfo : public StackObj {
+ private:
+ Handle _protection_domain;
+ const InstanceKlass* _unsafe_anonymous_host;
+ GrowableArray<Handle>* _cp_patches;
+ ClassInstanceInfo _class_hidden_info;
+ bool _is_hidden;
+ bool _is_strong_hidden;
+ bool _can_access_vm_annotations;
+
+ public:
+ ClassLoadInfo();
+ ClassLoadInfo(Handle protection_domain);
+ ClassLoadInfo(Handle protection_domain, const InstanceKlass* unsafe_anonymous_host,
+ GrowableArray<Handle>* cp_patches, InstanceKlass* dynamic_nest_host,
+ Handle class_data, bool is_hidden, bool is_strong_hidden,
+ bool can_access_vm_annotations);
+
+ Handle protection_domain() const { return _protection_domain; }
+ const InstanceKlass* unsafe_anonymous_host() const { return _unsafe_anonymous_host; }
+ GrowableArray<Handle>* cp_patches() const { return _cp_patches; }
+ const ClassInstanceInfo* class_hidden_info_ptr() const { return &_class_hidden_info; }
+ bool is_hidden() const { return _is_hidden; }
+ bool is_strong_hidden() const { return _is_strong_hidden; }
+ bool can_access_vm_annotations() const { return _can_access_vm_annotations; }
+};
+
// The dictionary in each ClassLoaderData stores all loaded classes, either
// initiatied by its class loader or defined by its class loader:
//
// class loader -> ClassLoaderData -> [class, protection domain set]
//
@@ -269,32 +316,17 @@
Handle class_loader,
Handle protection_domain,
bool is_superclass,
TRAPS);
- // Parse new stream. This won't update the dictionary or
- // class hierarchy, simply parse the stream. Used by JVMTI RedefineClasses.
- // Also used by Unsafe_DefineAnonymousClass
+ // Parse new stream. This won't update the dictionary or class
+ // hierarchy, simply parse the stream. Used by JVMTI RedefineClasses
+ // and by Unsafe_DefineAnonymousClass and jvm_lookup_define_class.
static InstanceKlass* parse_stream(Symbol* class_name,
Handle class_loader,
- Handle protection_domain,
ClassFileStream* st,
- TRAPS) {
- return parse_stream(class_name,
- class_loader,
- protection_domain,
- st,
- NULL, // unsafe_anonymous_host
- NULL, // cp_patches
- THREAD);
- }
- static InstanceKlass* parse_stream(Symbol* class_name,
- Handle class_loader,
- Handle protection_domain,
- ClassFileStream* st,
- const InstanceKlass* unsafe_anonymous_host,
- GrowableArray<Handle>* cp_patches,
+ const ClassLoadInfo& cl_info,
TRAPS);
// Resolve from stream (called by jni_DefineClass and JVM_DefineClass)
static InstanceKlass* resolve_from_stream(Symbol* class_name,
Handle class_loader,
@@ -528,10 +560,15 @@
static void delete_resolution_error(ConstantPool* pool);
static Symbol* find_resolution_error(const constantPoolHandle& pool, int which,
Symbol** message);
+ // Record a nest host resolution/validation error
+ static void add_nest_host_error(const constantPoolHandle& pool, int which,
+ const char* message);
+ static const char* find_nest_host_error(const constantPoolHandle& pool, int which);
+
static ProtectionDomainCacheEntry* cache_get(Handle protection_domain);
protected:
enum Constants {
< prev index next >