2209 klass = klass->array_klass_or_null(fd.dimension());
2210 }
2211 } else {
2212 MutexLocker mu(SystemDictionary_lock, THREAD);
2213 // Non-array classes are easy: simply check the constraint table.
2214 klass = constraints()->find_constrained_klass(class_name, class_loader);
2215 }
2216
2217 return klass;
2218 }
2219
2220
2221 bool SystemDictionary::add_loader_constraint(Symbol* class_name,
2222 Handle class_loader1,
2223 Handle class_loader2,
2224 Thread* THREAD) {
2225 ClassLoaderData* loader_data1 = class_loader_data(class_loader1);
2226 ClassLoaderData* loader_data2 = class_loader_data(class_loader2);
2227
2228 Symbol* constraint_name = NULL;
2229 if (!FieldType::is_array(class_name)) {
2230 constraint_name = class_name;
2231 } else {
2232 // For array classes, their Klass*s are not kept in the
2233 // constraint table. The element classes are.
2234 FieldArrayInfo fd;
2235 BasicType t = FieldType::get_array_info(class_name, fd, CHECK_(false));
2236 // primitive types always pass
2237 if (t != T_OBJECT) {
2238 return true;
2239 } else {
2240 constraint_name = fd.object_key();
2241 }
2242 }
2243
2244 Dictionary* dictionary1 = loader_data1->dictionary();
2245 unsigned int d_hash1 = dictionary1->compute_hash(constraint_name);
2246
2247 Dictionary* dictionary2 = loader_data2->dictionary();
2248 unsigned int d_hash2 = dictionary2->compute_hash(constraint_name);
2249
2250 {
2251 MutexLocker mu_s(SystemDictionary_lock, THREAD);
2252 InstanceKlass* klass1 = find_class(d_hash1, constraint_name, dictionary1);
2253 InstanceKlass* klass2 = find_class(d_hash2, constraint_name, dictionary2);
2254 return constraints()->add_entry(constraint_name, klass1, class_loader1,
|
2209 klass = klass->array_klass_or_null(fd.dimension());
2210 }
2211 } else {
2212 MutexLocker mu(SystemDictionary_lock, THREAD);
2213 // Non-array classes are easy: simply check the constraint table.
2214 klass = constraints()->find_constrained_klass(class_name, class_loader);
2215 }
2216
2217 return klass;
2218 }
2219
2220
2221 bool SystemDictionary::add_loader_constraint(Symbol* class_name,
2222 Handle class_loader1,
2223 Handle class_loader2,
2224 Thread* THREAD) {
2225 ClassLoaderData* loader_data1 = class_loader_data(class_loader1);
2226 ClassLoaderData* loader_data2 = class_loader_data(class_loader2);
2227
2228 Symbol* constraint_name = NULL;
2229 // Needs to be in same scope as constraint_name in case a Symbol is created and
2230 // assigned to constraint_name.
2231 FieldArrayInfo fd;
2232 if (!FieldType::is_array(class_name)) {
2233 constraint_name = class_name;
2234 } else {
2235 // For array classes, their Klass*s are not kept in the
2236 // constraint table. The element classes are.
2237 BasicType t = FieldType::get_array_info(class_name, fd, CHECK_(false));
2238 // primitive types always pass
2239 if (t != T_OBJECT) {
2240 return true;
2241 } else {
2242 constraint_name = fd.object_key();
2243 }
2244 }
2245
2246 Dictionary* dictionary1 = loader_data1->dictionary();
2247 unsigned int d_hash1 = dictionary1->compute_hash(constraint_name);
2248
2249 Dictionary* dictionary2 = loader_data2->dictionary();
2250 unsigned int d_hash2 = dictionary2->compute_hash(constraint_name);
2251
2252 {
2253 MutexLocker mu_s(SystemDictionary_lock, THREAD);
2254 InstanceKlass* klass1 = find_class(d_hash1, constraint_name, dictionary1);
2255 InstanceKlass* klass2 = find_class(d_hash2, constraint_name, dictionary2);
2256 return constraints()->add_entry(constraint_name, klass1, class_loader1,
|