< prev index next >

src/hotspot/share/classfile/systemDictionary.cpp

Print this page




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,


< prev index next >