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 |