comparison src/share/vm/runtime/reflection.cpp @ 1162:d749b1813f40

Merge
author trims
date Fri, 15 Jan 2010 14:25:44 -0800
parents cd37471eaecc
children c18cbe5936b8
comparison
equal deleted inserted replaced
1130:1bc68593a110 1162:d749b1813f40
1 /* 1 /*
2 * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. 2 * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
447 } 447 }
448 // New (1.4) reflection implementation. Allow all accesses from 448 // New (1.4) reflection implementation. Allow all accesses from
449 // sun/reflect/MagicAccessorImpl subclasses to succeed trivially. 449 // sun/reflect/MagicAccessorImpl subclasses to succeed trivially.
450 if ( JDK_Version::is_gte_jdk14x_version() 450 if ( JDK_Version::is_gte_jdk14x_version()
451 && UseNewReflection 451 && UseNewReflection
452 && Klass::cast(current_class)->is_subclass_of(SystemDictionary::reflect_magic_klass())) { 452 && Klass::cast(current_class)->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
453 return true; 453 return true;
454 } 454 }
455 455
456 return can_relax_access_check_for(current_class, new_class, classloader_only); 456 return can_relax_access_check_for(current_class, new_class, classloader_only);
457 } 457 }
478 478
479 // If either is on the other's host_klass chain, access is OK, 479 // If either is on the other's host_klass chain, access is OK,
480 // because one is inside the other. 480 // because one is inside the other.
481 if (under_host_klass(accessor_ik, accessee) || 481 if (under_host_klass(accessor_ik, accessee) ||
482 under_host_klass(accessee_ik, accessor)) 482 under_host_klass(accessee_ik, accessor))
483 return true;
484
485 // Adapter frames can access anything.
486 if (MethodHandleCompiler::klass_is_method_handle_adapter_holder(accessor))
487 // This is an internal adapter frame from the MethodHandleCompiler.
483 return true; 488 return true;
484 489
485 if (RelaxAccessControlCheck || 490 if (RelaxAccessControlCheck ||
486 (accessor_ik->major_version() < JAVA_1_5_VERSION && 491 (accessor_ik->major_version() < JAVA_1_5_VERSION &&
487 accessee_ik->major_version() < JAVA_1_5_VERSION)) { 492 accessee_ik->major_version() < JAVA_1_5_VERSION)) {
539 544
540 // New (1.4) reflection implementation. Allow all accesses from 545 // New (1.4) reflection implementation. Allow all accesses from
541 // sun/reflect/MagicAccessorImpl subclasses to succeed trivially. 546 // sun/reflect/MagicAccessorImpl subclasses to succeed trivially.
542 if ( JDK_Version::is_gte_jdk14x_version() 547 if ( JDK_Version::is_gte_jdk14x_version()
543 && UseNewReflection 548 && UseNewReflection
544 && Klass::cast(current_class)->is_subclass_of(SystemDictionary::reflect_magic_klass())) { 549 && Klass::cast(current_class)->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
545 return true; 550 return true;
546 } 551 }
547 552
548 return can_relax_access_check_for( 553 return can_relax_access_check_for(
549 current_class, field_class, classloader_only); 554 current_class, field_class, classloader_only);
629 } 634 }
630 635
631 636
632 objArrayHandle Reflection::get_parameter_types(methodHandle method, int parameter_count, oop* return_type, TRAPS) { 637 objArrayHandle Reflection::get_parameter_types(methodHandle method, int parameter_count, oop* return_type, TRAPS) {
633 // Allocate array holding parameter types (java.lang.Class instances) 638 // Allocate array holding parameter types (java.lang.Class instances)
634 objArrayOop m = oopFactory::new_objArray(SystemDictionary::class_klass(), parameter_count, CHECK_(objArrayHandle())); 639 objArrayOop m = oopFactory::new_objArray(SystemDictionary::Class_klass(), parameter_count, CHECK_(objArrayHandle()));
635 objArrayHandle mirrors (THREAD, m); 640 objArrayHandle mirrors (THREAD, m);
636 int index = 0; 641 int index = 0;
637 // Collect parameter types 642 // Collect parameter types
638 symbolHandle signature (THREAD, method->signature()); 643 symbolHandle signature (THREAD, method->signature());
639 SignatureStream ss(signature); 644 SignatureStream ss(signature);
1306 if (java_lang_Class::is_primitive(mirror)) return NULL; 1311 if (java_lang_Class::is_primitive(mirror)) return NULL;
1307 klassOop klass = java_lang_Class::as_klassOop(mirror); 1312 klassOop klass = java_lang_Class::as_klassOop(mirror);
1308 if (Klass::cast(klass)->oop_is_array() && which == MEMBER_DECLARED) return NULL; 1313 if (Klass::cast(klass)->oop_is_array() && which == MEMBER_DECLARED) return NULL;
1309 1314
1310 if (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) { 1315 if (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) {
1311 klass = SystemDictionary::object_klass(); 1316 klass = SystemDictionary::Object_klass();
1312 } 1317 }
1313 instanceKlassHandle h_k(THREAD, klass); 1318 instanceKlassHandle h_k(THREAD, klass);
1314 1319
1315 // Ensure klass is linked (need not be initialized) 1320 // Ensure klass is linked (need not be initialized)
1316 h_k->link_class(CHECK_NULL); 1321 h_k->link_class(CHECK_NULL);
1373 1378
1374 objArrayOop Reflection::reflect_methods(oop mirror, jint which, TRAPS) { 1379 objArrayOop Reflection::reflect_methods(oop mirror, jint which, TRAPS) {
1375 // Exclude primitive types 1380 // Exclude primitive types
1376 if (java_lang_Class::is_primitive(mirror) || 1381 if (java_lang_Class::is_primitive(mirror) ||
1377 (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array() && (which == MEMBER_DECLARED))) { 1382 (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array() && (which == MEMBER_DECLARED))) {
1378 klassOop klass = SystemDictionary::reflect_method_klass(); 1383 klassOop klass = SystemDictionary::reflect_Method_klass();
1379 return oopFactory::new_objArray(klass, 0, CHECK_NULL); // Return empty array 1384 return oopFactory::new_objArray(klass, 0, CHECK_NULL); // Return empty array
1380 } 1385 }
1381 1386
1382 klassOop klass = java_lang_Class::as_klassOop(mirror); 1387 klassOop klass = java_lang_Class::as_klassOop(mirror);
1383 if (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) { 1388 if (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) {
1384 klass = SystemDictionary::object_klass(); 1389 klass = SystemDictionary::Object_klass();
1385 } 1390 }
1386 instanceKlassHandle h_k(THREAD, klass); 1391 instanceKlassHandle h_k(THREAD, klass);
1387 1392
1388 // Ensure klass is linked (need not be initialized) 1393 // Ensure klass is linked (need not be initialized)
1389 h_k->link_class(CHECK_NULL); 1394 h_k->link_class(CHECK_NULL);
1409 } 1414 }
1410 } 1415 }
1411 } 1416 }
1412 1417
1413 // Allocate result 1418 // Allocate result
1414 klassOop klass = SystemDictionary::reflect_method_klass(); 1419 klassOop klass = SystemDictionary::reflect_Method_klass();
1415 objArrayOop r = oopFactory::new_objArray(klass, count, CHECK_NULL); 1420 objArrayOop r = oopFactory::new_objArray(klass, count, CHECK_NULL);
1416 objArrayHandle h_result (THREAD, r); 1421 objArrayHandle h_result (THREAD, r);
1417 1422
1418 // Fill in results backwards 1423 // Fill in results backwards
1419 { 1424 {
1460 count++; 1465 count++;
1461 } 1466 }
1462 } 1467 }
1463 } 1468 }
1464 // Allocate result 1469 // Allocate result
1465 klassOop klass = SystemDictionary::reflect_method_klass(); 1470 klassOop klass = SystemDictionary::reflect_Method_klass();
1466 objArrayOop r = oopFactory::new_objArray(klass, count, CHECK_NULL); 1471 objArrayOop r = oopFactory::new_objArray(klass, count, CHECK_NULL);
1467 objArrayHandle h_result (THREAD, r); 1472 objArrayHandle h_result (THREAD, r);
1468 1473
1469 // Fill in results backwards 1474 // Fill in results backwards
1470 { 1475 {
1521 objArrayOop Reflection::reflect_constructors(oop mirror, jint which, TRAPS) { 1526 objArrayOop Reflection::reflect_constructors(oop mirror, jint which, TRAPS) {
1522 // Exclude primitive, interface and array types 1527 // Exclude primitive, interface and array types
1523 bool prim = java_lang_Class::is_primitive(mirror); 1528 bool prim = java_lang_Class::is_primitive(mirror);
1524 Klass* k = prim ? NULL : Klass::cast(java_lang_Class::as_klassOop(mirror)); 1529 Klass* k = prim ? NULL : Klass::cast(java_lang_Class::as_klassOop(mirror));
1525 if (prim || k->is_interface() || k->oop_is_array()) { 1530 if (prim || k->is_interface() || k->oop_is_array()) {
1526 return oopFactory::new_objArray(SystemDictionary::reflect_constructor_klass(), 0, CHECK_NULL); // Return empty array 1531 return oopFactory::new_objArray(SystemDictionary::reflect_Constructor_klass(), 0, CHECK_NULL); // Return empty array
1527 } 1532 }
1528 1533
1529 // Must be instanceKlass at this point 1534 // Must be instanceKlass at this point
1530 instanceKlassHandle h_k(THREAD, java_lang_Class::as_klassOop(mirror)); 1535 instanceKlassHandle h_k(THREAD, java_lang_Class::as_klassOop(mirror));
1531 1536