< prev index next >

src/hotspot/share/classfile/javaClasses.cpp

Print this page




3976   // Allocate result
3977   oop result = SystemDictionary::AccessControlContext_klass()->allocate_instance(CHECK_0);
3978   // Fill in values
3979   result->obj_field_put(_context_offset, context());
3980   result->obj_field_put(_privilegedContext_offset, privileged_context());
3981   result->bool_field_put(_isPrivileged_offset, isPrivileged);
3982   // whitelist AccessControlContexts created by the JVM if present
3983   if (_isAuthorized_offset != -1) {
3984     result->bool_field_put(_isAuthorized_offset, true);
3985   }
3986   return result;
3987 }
3988 
3989 
3990 // Support for java_lang_ClassLoader
3991 
3992 bool java_lang_ClassLoader::offsets_computed = false;
3993 int  java_lang_ClassLoader::_loader_data_offset = -1;
3994 int  java_lang_ClassLoader::parallelCapable_offset = -1;
3995 int  java_lang_ClassLoader::name_offset = -1;

3996 int  java_lang_ClassLoader::unnamedModule_offset = -1;
3997 
3998 ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) {
3999   assert(loader != NULL && oopDesc::is_oop(loader), "loader must be oop");
4000   return HeapAccess<>::load_at(loader, _loader_data_offset);
4001 }
4002 
4003 ClassLoaderData* java_lang_ClassLoader::cmpxchg_loader_data(ClassLoaderData* new_data, oop loader, ClassLoaderData* expected_data) {
4004   assert(loader != NULL && oopDesc::is_oop(loader), "loader must be oop");
4005   return HeapAccess<>::atomic_cmpxchg_at(new_data, loader, _loader_data_offset, expected_data);
4006 }
4007 
4008 #define CLASSLOADER_FIELDS_DO(macro) \
4009   macro(parallelCapable_offset, k1, "parallelLockMap",      concurrenthashmap_signature, false); \
4010   macro(name_offset,            k1, vmSymbols::name_name(), string_signature, false); \

4011   macro(unnamedModule_offset,   k1, "unnamedModule",        module_signature, false); \
4012   macro(parent_offset,          k1, "parent",               classloader_signature, false)
4013 
4014 void java_lang_ClassLoader::compute_offsets() {
4015   assert(!offsets_computed, "offsets should be initialized only once");
4016   offsets_computed = true;
4017 
4018   InstanceKlass* k1 = SystemDictionary::ClassLoader_klass();
4019   CLASSLOADER_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4020 
4021   CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
4022 }
4023 
4024 #if INCLUDE_CDS
4025 void java_lang_ClassLoader::serialize(SerializeClosure* f) {
4026   CLASSLOADER_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4027   CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
4028 }
4029 #endif
4030 
4031 oop java_lang_ClassLoader::parent(oop loader) {
4032   assert(is_instance(loader), "loader must be oop");
4033   return loader->obj_field(parent_offset);
4034 }
4035 


4036 oop java_lang_ClassLoader::name(oop loader) {
4037   assert(is_instance(loader), "loader must be oop");
4038   return loader->obj_field(name_offset);
4039 }
4040 











4041 bool java_lang_ClassLoader::isAncestor(oop loader, oop cl) {
4042   assert(is_instance(loader), "loader must be oop");
4043   assert(cl == NULL || is_instance(cl), "cl argument must be oop");
4044   oop acl = loader;
4045   debug_only(jint loop_count = 0);
4046   // This loop taken verbatim from ClassLoader.java:
4047   do {
4048     acl = parent(acl);
4049     if (oopDesc::equals(cl, acl)) {
4050       return true;
4051     }
4052     assert(++loop_count > 0, "loop_count overflow");
4053   } while (acl != NULL);
4054   return false;
4055 }
4056 
4057 bool java_lang_ClassLoader::is_instance(oop obj) {
4058   return obj != NULL && is_subclass(obj->klass());
4059 }
4060 


4094 }
4095 
4096 oop java_lang_ClassLoader::non_reflection_class_loader(oop loader) {
4097   // See whether this is one of the class loaders associated with
4098   // the generated bytecodes for reflection, and if so, "magically"
4099   // delegate to its parent to prevent class loading from occurring
4100   // in places where applications using reflection didn't expect it.
4101   if (is_reflection_class_loader(loader)) {
4102     return parent(loader);
4103   }
4104   return loader;
4105 }
4106 
4107 oop java_lang_ClassLoader::unnamedModule(oop loader) {
4108   assert(is_instance(loader), "loader must be oop");
4109   return loader->obj_field(unnamedModule_offset);
4110 }
4111 
4112 // Caller needs ResourceMark.
4113 const char* java_lang_ClassLoader::describe_external(const oop loader) {




4114   if (loader == NULL) {
4115     return "<bootstrap>";
4116   }
4117 
4118   bool well_known_loader = SystemDictionary::is_system_class_loader(loader) ||
4119                            SystemDictionary::is_platform_class_loader(loader);
4120 
4121   const char* name = NULL;
4122   oop nameOop = java_lang_ClassLoader::name(loader);
4123   if (nameOop != NULL) {
4124     name = java_lang_String::as_utf8_string(nameOop);
4125   }
4126   if (name == NULL) {
4127     // Use placeholder for missing name to have fixed message format.
4128     name = "<unnamed>";
4129   }
4130 
4131   stringStream ss;
4132   ss.print("\"%s\" (instance of %s", name, loader->klass()->external_name());
4133   if (!well_known_loader) {
4134     const char* parentName = NULL;
4135     oop pl = java_lang_ClassLoader::parent(loader);


4136     if (pl != NULL) {
4137       oop parentNameOop = java_lang_ClassLoader::name(pl);
4138       if (parentNameOop != NULL) {
4139         parentName = java_lang_String::as_utf8_string(parentNameOop);
4140       }
4141       if (parentName == NULL) {
4142         parentName = "<unnamed>";
4143       }
4144       ss.print(", child of \"%s\" %s", parentName, pl->klass()->external_name());
4145     } else {
4146       ss.print(", child of <bootstrap>");

4147     }
4148   }
4149   ss.print(")");
4150 
4151   return ss.as_string();
4152 }
4153 
4154 // Support for java_lang_System
4155 //
4156 #define SYSTEM_FIELDS_DO(macro) \
4157   macro(static_in_offset,  k, "in",  input_stream_signature, true); \
4158   macro(static_out_offset, k, "out", print_stream_signature, true); \
4159   macro(static_err_offset, k, "err", print_stream_signature, true); \
4160   macro(static_security_offset, k, "security", security_manager_signature, true)
4161 
4162 void java_lang_System::compute_offsets() {
4163   InstanceKlass* k = SystemDictionary::System_klass();
4164   SYSTEM_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4165 }
4166 




3976   // Allocate result
3977   oop result = SystemDictionary::AccessControlContext_klass()->allocate_instance(CHECK_0);
3978   // Fill in values
3979   result->obj_field_put(_context_offset, context());
3980   result->obj_field_put(_privilegedContext_offset, privileged_context());
3981   result->bool_field_put(_isPrivileged_offset, isPrivileged);
3982   // whitelist AccessControlContexts created by the JVM if present
3983   if (_isAuthorized_offset != -1) {
3984     result->bool_field_put(_isAuthorized_offset, true);
3985   }
3986   return result;
3987 }
3988 
3989 
3990 // Support for java_lang_ClassLoader
3991 
3992 bool java_lang_ClassLoader::offsets_computed = false;
3993 int  java_lang_ClassLoader::_loader_data_offset = -1;
3994 int  java_lang_ClassLoader::parallelCapable_offset = -1;
3995 int  java_lang_ClassLoader::name_offset = -1;
3996 int  java_lang_ClassLoader::nameAndId_offset = -1;
3997 int  java_lang_ClassLoader::unnamedModule_offset = -1;
3998 
3999 ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) {
4000   assert(loader != NULL && oopDesc::is_oop(loader), "loader must be oop");
4001   return HeapAccess<>::load_at(loader, _loader_data_offset);
4002 }
4003 
4004 ClassLoaderData* java_lang_ClassLoader::cmpxchg_loader_data(ClassLoaderData* new_data, oop loader, ClassLoaderData* expected_data) {
4005   assert(loader != NULL && oopDesc::is_oop(loader), "loader must be oop");
4006   return HeapAccess<>::atomic_cmpxchg_at(new_data, loader, _loader_data_offset, expected_data);
4007 }
4008 
4009 #define CLASSLOADER_FIELDS_DO(macro) \
4010   macro(parallelCapable_offset, k1, "parallelLockMap",      concurrenthashmap_signature, false); \
4011   macro(name_offset,            k1, vmSymbols::name_name(), string_signature, false); \
4012   macro(nameAndId_offset,       k1, "nameAndId",            string_signature, false); \
4013   macro(unnamedModule_offset,   k1, "unnamedModule",        module_signature, false); \
4014   macro(parent_offset,          k1, "parent",               classloader_signature, false)
4015 
4016 void java_lang_ClassLoader::compute_offsets() {
4017   assert(!offsets_computed, "offsets should be initialized only once");
4018   offsets_computed = true;
4019 
4020   InstanceKlass* k1 = SystemDictionary::ClassLoader_klass();
4021   CLASSLOADER_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4022 
4023   CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
4024 }
4025 
4026 #if INCLUDE_CDS
4027 void java_lang_ClassLoader::serialize(SerializeClosure* f) {
4028   CLASSLOADER_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4029   CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
4030 }
4031 #endif
4032 
4033 oop java_lang_ClassLoader::parent(oop loader) {
4034   assert(is_instance(loader), "loader must be oop");
4035   return loader->obj_field(parent_offset);
4036 }
4037 
4038 // Returns the name field of this class loader.  If the name field has not 
4039 // been set, null will be returned.  
4040 oop java_lang_ClassLoader::name(oop loader) {
4041   assert(is_instance(loader), "loader must be oop");
4042   return loader->obj_field(name_offset);
4043 }
4044 
4045 // Returns the nameAndId field of this class loader. The format is
4046 // as follows:
4047 //   If the defining loader has a name explicitly set then '<loader-name>' @<id>
4048 //   If the defining loader has no name then <qualified-class-name> @<id>
4049 //   If built-in loader, then omit '@<id>' as there is only one instance.
4050 // Use ClassLoader::loader_name_id() to obtain this String as a char*.
4051 oop java_lang_ClassLoader::nameAndId(oop loader) {
4052   assert(is_instance(loader), "loader must be oop");
4053   return loader->obj_field(nameAndId_offset);
4054 }
4055 
4056 bool java_lang_ClassLoader::isAncestor(oop loader, oop cl) {
4057   assert(is_instance(loader), "loader must be oop");
4058   assert(cl == NULL || is_instance(cl), "cl argument must be oop");
4059   oop acl = loader;
4060   debug_only(jint loop_count = 0);
4061   // This loop taken verbatim from ClassLoader.java:
4062   do {
4063     acl = parent(acl);
4064     if (oopDesc::equals(cl, acl)) {
4065       return true;
4066     }
4067     assert(++loop_count > 0, "loop_count overflow");
4068   } while (acl != NULL);
4069   return false;
4070 }
4071 
4072 bool java_lang_ClassLoader::is_instance(oop obj) {
4073   return obj != NULL && is_subclass(obj->klass());
4074 }
4075 


4109 }
4110 
4111 oop java_lang_ClassLoader::non_reflection_class_loader(oop loader) {
4112   // See whether this is one of the class loaders associated with
4113   // the generated bytecodes for reflection, and if so, "magically"
4114   // delegate to its parent to prevent class loading from occurring
4115   // in places where applications using reflection didn't expect it.
4116   if (is_reflection_class_loader(loader)) {
4117     return parent(loader);
4118   }
4119   return loader;
4120 }
4121 
4122 oop java_lang_ClassLoader::unnamedModule(oop loader) {
4123   assert(is_instance(loader), "loader must be oop");
4124   return loader->obj_field(unnamedModule_offset);
4125 }
4126 
4127 // Caller needs ResourceMark.
4128 const char* java_lang_ClassLoader::describe_external(const oop loader) {
4129   ClassLoaderData *cld = ClassLoaderData::class_loader_data(loader);
4130   const char* name = cld->loader_name_and_id();
4131 
4132   // bootstrap loader
4133   if (loader == NULL) {
4134     return name;
4135   }
4136 
4137   bool well_known_loader = SystemDictionary::is_system_class_loader(loader) ||
4138                            SystemDictionary::is_platform_class_loader(loader);
4139 










4140   stringStream ss;
4141   ss.print("%s (instance of %s", name, loader->klass()->external_name());
4142   if (!well_known_loader) {

4143     oop pl = java_lang_ClassLoader::parent(loader);
4144     ClassLoaderData *pl_cld = ClassLoaderData::class_loader_data(pl);
4145     const char* parentName = pl_cld->loader_name_and_id();
4146     if (pl != NULL) {
4147       ss.print(", child of %s %s", parentName, pl->klass()->external_name());







4148     } else {
4149       // bootstrap loader
4150       ss.print(", child of %s", parentName);
4151     }
4152   }
4153   ss.print(")");
4154 
4155   return ss.as_string();
4156 }
4157 
4158 // Support for java_lang_System
4159 //
4160 #define SYSTEM_FIELDS_DO(macro) \
4161   macro(static_in_offset,  k, "in",  input_stream_signature, true); \
4162   macro(static_out_offset, k, "out", print_stream_signature, true); \
4163   macro(static_err_offset, k, "err", print_stream_signature, true); \
4164   macro(static_security_offset, k, "security", security_manager_signature, true)
4165 
4166 void java_lang_System::compute_offsets() {
4167   InstanceKlass* k = SystemDictionary::System_klass();
4168   SYSTEM_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4169 }
4170 


< prev index next >