comparison src/share/vm/runtime/reflection.cpp @ 51:1ffa5cdd0b7e

6667089: 3/3 multiple redefinitions of a class break reflection Summary: Use instanceKlass::method_with_idnum() instead of slot() to work with RedefineClasses(). Reviewed-by: sspitsyn
author dcubed
date Wed, 12 Mar 2008 18:39:05 -0700
parents a61af66fc99e
children e7a91a357527
comparison
equal deleted inserted replaced
50:485d403e94e1 51:1ffa5cdd0b7e
1546 } else { 1546 } else {
1547 rtype = T_OBJECT; 1547 rtype = T_OBJECT;
1548 } 1548 }
1549 1549
1550 instanceKlassHandle klass(THREAD, java_lang_Class::as_klassOop(mirror)); 1550 instanceKlassHandle klass(THREAD, java_lang_Class::as_klassOop(mirror));
1551 if (!klass->methods()->is_within_bounds(slot)) { 1551 methodOop m = klass->method_with_idnum(slot);
1552 if (m == NULL) {
1552 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke"); 1553 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke");
1553 } 1554 }
1554 methodHandle method(THREAD, methodOop(klass->methods()->obj_at(slot))); 1555 methodHandle method(THREAD, m);
1555 1556
1556 return invoke(klass, method, receiver, override, ptypes, rtype, args, true, THREAD); 1557 return invoke(klass, method, receiver, override, ptypes, rtype, args, true, THREAD);
1557 } 1558 }
1558 1559
1559 1560
1562 int slot = java_lang_reflect_Constructor::slot(constructor_mirror); 1563 int slot = java_lang_reflect_Constructor::slot(constructor_mirror);
1563 bool override = java_lang_reflect_Constructor::override(constructor_mirror) != 0; 1564 bool override = java_lang_reflect_Constructor::override(constructor_mirror) != 0;
1564 objArrayHandle ptypes(THREAD, objArrayOop(java_lang_reflect_Constructor::parameter_types(constructor_mirror))); 1565 objArrayHandle ptypes(THREAD, objArrayOop(java_lang_reflect_Constructor::parameter_types(constructor_mirror)));
1565 1566
1566 instanceKlassHandle klass(THREAD, java_lang_Class::as_klassOop(mirror)); 1567 instanceKlassHandle klass(THREAD, java_lang_Class::as_klassOop(mirror));
1567 if (!klass->methods()->is_within_bounds(slot)) { 1568 methodOop m = klass->method_with_idnum(slot);
1569 if (m == NULL) {
1568 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke"); 1570 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke");
1569 } 1571 }
1570 methodHandle method(THREAD, methodOop(klass->methods()->obj_at(slot))); 1572 methodHandle method(THREAD, m);
1571 assert(method->name() == vmSymbols::object_initializer_name(), "invalid constructor"); 1573 assert(method->name() == vmSymbols::object_initializer_name(), "invalid constructor");
1572 1574
1573 // Make sure klass gets initialize 1575 // Make sure klass gets initialize
1574 klass->initialize(CHECK_NULL); 1576 klass->initialize(CHECK_NULL);
1575 1577