Mercurial > hg > graal-jvmci-8
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 |