hotspot/src/share/vm/prims/jvm.cpp
changeset 2332 5c7b6f4ce0a1
parent 2105 347008ce7984
child 2343 6113864ecd70
equal deleted inserted replaced
2259:d3c946e7f127 2332:5c7b6f4ce0a1
  1240            klassOop ik = cp->klass_at(ioff, CHECK_NULL);
  1240            klassOop ik = cp->klass_at(ioff, CHECK_NULL);
  1241            instanceKlassHandle inner_klass (THREAD, ik);
  1241            instanceKlassHandle inner_klass (THREAD, ik);
  1242 
  1242 
  1243            // Throws an exception if outer klass has not declared k as
  1243            // Throws an exception if outer klass has not declared k as
  1244            // an inner klass
  1244            // an inner klass
  1245            Reflection::check_for_inner_class(k, inner_klass, CHECK_NULL);
  1245            Reflection::check_for_inner_class(k, inner_klass, true, CHECK_NULL);
  1246 
  1246 
  1247            result->obj_at_put(members, inner_klass->java_mirror());
  1247            result->obj_at_put(members, inner_klass->java_mirror());
  1248            members++;
  1248            members++;
  1249         }
  1249         }
  1250       }
  1250       }
  1263   return (jobjectArray)JNIHandles::make_local(env, result());
  1263   return (jobjectArray)JNIHandles::make_local(env, result());
  1264 JVM_END
  1264 JVM_END
  1265 
  1265 
  1266 
  1266 
  1267 JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
  1267 JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
  1268   const int inner_class_info_index = 0;
  1268 {
  1269   const int outer_class_info_index = 1;
       
  1270 
       
  1271   // ofClass is a reference to a java_lang_Class object.
  1269   // ofClass is a reference to a java_lang_Class object.
  1272   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
  1270   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
  1273       ! Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_instance()) {
  1271       ! Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_instance()) {
  1274     return NULL;
  1272     return NULL;
  1275   }
  1273   }
  1276 
  1274 
  1277   instanceKlassHandle k(thread, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)));
  1275   symbolOop simple_name = NULL;
       
  1276   klassOop outer_klass
       
  1277     = instanceKlass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass))
       
  1278                           )->compute_enclosing_class(simple_name, CHECK_NULL);
       
  1279   if (outer_klass == NULL)  return NULL;  // already a top-level class
       
  1280   if (simple_name == NULL)  return NULL;  // an anonymous class (inside a method)
       
  1281   return (jclass) JNIHandles::make_local(env, Klass::cast(outer_klass)->java_mirror());
       
  1282 }
       
  1283 JVM_END
       
  1284 
       
  1285 // should be in instanceKlass.cpp, but is here for historical reasons
       
  1286 klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k,
       
  1287                                                      symbolOop& simple_name_result, TRAPS) {
       
  1288   Thread* thread = THREAD;
       
  1289   const int inner_class_info_index = inner_class_inner_class_info_offset;
       
  1290   const int outer_class_info_index = inner_class_outer_class_info_offset;
  1278 
  1291 
  1279   if (k->inner_classes()->length() == 0) {
  1292   if (k->inner_classes()->length() == 0) {
  1280     // No inner class info => no declaring class
  1293     // No inner class info => no declaring class
  1281     return NULL;
  1294     return NULL;
  1282   }
  1295   }
  1286   int i_length = i_icls->length();
  1299   int i_length = i_icls->length();
  1287 
  1300 
  1288   bool found = false;
  1301   bool found = false;
  1289   klassOop ok;
  1302   klassOop ok;
  1290   instanceKlassHandle outer_klass;
  1303   instanceKlassHandle outer_klass;
       
  1304   bool inner_is_member = false;
       
  1305   int simple_name_index = 0;
  1291 
  1306 
  1292   // Find inner_klass attribute
  1307   // Find inner_klass attribute
  1293   for(int i = 0; i < i_length && !found; i+= 4) {
  1308   for (int i = 0; i < i_length && !found; i += inner_class_next_offset) {
  1294     int ioff = i_icls->ushort_at(i + inner_class_info_index);
  1309     int ioff = i_icls->ushort_at(i + inner_class_info_index);
  1295     int ooff = i_icls->ushort_at(i + outer_class_info_index);
  1310     int ooff = i_icls->ushort_at(i + outer_class_info_index);
  1296 
  1311     int noff = i_icls->ushort_at(i + inner_class_inner_name_offset);
  1297     if (ioff != 0 && ooff != 0) {
  1312     if (ioff != 0) {
  1298       // Check to see if the name matches the class we're looking for
  1313       // Check to see if the name matches the class we're looking for
  1299       // before attempting to find the class.
  1314       // before attempting to find the class.
  1300       if (i_cp->klass_name_at_matches(k, ioff)) {
  1315       if (i_cp->klass_name_at_matches(k, ioff)) {
  1301         klassOop inner_klass = i_cp->klass_at(ioff, CHECK_NULL);
  1316         klassOop inner_klass = i_cp->klass_at(ioff, CHECK_NULL);
  1302         if (k() == inner_klass) {
  1317         found = (k() == inner_klass);
  1303           found = true;
  1318         if (found && ooff != 0) {
  1304           ok = i_cp->klass_at(ooff, CHECK_NULL);
  1319           ok = i_cp->klass_at(ooff, CHECK_NULL);
  1305           outer_klass = instanceKlassHandle(thread, ok);
  1320           outer_klass = instanceKlassHandle(thread, ok);
       
  1321           simple_name_index = noff;
       
  1322           inner_is_member = true;
  1306         }
  1323         }
  1307       }
  1324       }
  1308     }
  1325     }
  1309   }
  1326   }
  1310 
  1327 
       
  1328   if (found && outer_klass.is_null()) {
       
  1329     // It may be anonymous; try for that.
       
  1330     int encl_method_class_idx = k->enclosing_method_class_index();
       
  1331     if (encl_method_class_idx != 0) {
       
  1332       ok = i_cp->klass_at(encl_method_class_idx, CHECK_NULL);
       
  1333       outer_klass = instanceKlassHandle(thread, ok);
       
  1334       inner_is_member = false;
       
  1335     }
       
  1336   }
       
  1337 
  1311   // If no inner class attribute found for this class.
  1338   // If no inner class attribute found for this class.
  1312   if (!found) return NULL;
  1339   if (outer_klass.is_null())  return NULL;
  1313 
  1340 
  1314   // Throws an exception if outer klass has not declared k as an inner klass
  1341   // Throws an exception if outer klass has not declared k as an inner klass
  1315   Reflection::check_for_inner_class(outer_klass, k, CHECK_NULL);
  1342   // We need evidence that each klass knows about the other, or else
  1316 
  1343   // the system could allow a spoof of an inner class to gain access rights.
  1317   return (jclass)JNIHandles::make_local(env, outer_klass->java_mirror());
  1344   Reflection::check_for_inner_class(outer_klass, k, inner_is_member, CHECK_NULL);
  1318 JVM_END
  1345 
  1319 
  1346   simple_name_result = (inner_is_member ? i_cp->symbol_at(simple_name_index) : symbolOop(NULL));
       
  1347   return outer_klass();
       
  1348 }
  1320 
  1349 
  1321 JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls))
  1350 JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls))
  1322   assert (cls != NULL, "illegal class");
  1351   assert (cls != NULL, "illegal class");
  1323   JVMWrapper("JVM_GetClassSignature");
  1352   JVMWrapper("JVM_GetClassSignature");
  1324   JvmtiVMObjectAllocEventCollector oam;
  1353   JvmtiVMObjectAllocEventCollector oam;