< prev index next >

src/share/vm/runtime/reflection.cpp

Print this page

        

*** 706,736 **** // Checks that the 'outer' klass has declared 'inner' as being an inner klass. If not, // throw an incompatible class change exception // If inner_is_member, require the inner to be a member of the outer. // If !inner_is_member, require the inner to be anonymous (a non-member). // Caller is responsible for figuring out in advance which case must be true. ! void Reflection::check_for_inner_class(instanceKlassHandle outer, instanceKlassHandle inner, bool inner_is_member, TRAPS) { InnerClassesIterator iter(outer); constantPoolHandle cp (THREAD, outer->constants()); for (; !iter.done(); iter.next()) { int ioff = iter.inner_class_info_index(); int ooff = iter.outer_class_info_index(); if (inner_is_member && ioff != 0 && ooff != 0) { Klass* o = cp->klass_at(ooff, CHECK); ! if (o == outer()) { Klass* i = cp->klass_at(ioff, CHECK); ! if (i == inner()) { return; } } } if (!inner_is_member && ioff != 0 && ooff == 0 && cp->klass_name_at_matches(inner, ioff)) { Klass* i = cp->klass_at(ioff, CHECK); ! if (i == inner()) { return; } } } --- 706,736 ---- // Checks that the 'outer' klass has declared 'inner' as being an inner klass. If not, // throw an incompatible class change exception // If inner_is_member, require the inner to be a member of the outer. // If !inner_is_member, require the inner to be anonymous (a non-member). // Caller is responsible for figuring out in advance which case must be true. ! void Reflection::check_for_inner_class(const InstanceKlass* outer, const InstanceKlass* inner, bool inner_is_member, TRAPS) { InnerClassesIterator iter(outer); constantPoolHandle cp (THREAD, outer->constants()); for (; !iter.done(); iter.next()) { int ioff = iter.inner_class_info_index(); int ooff = iter.outer_class_info_index(); if (inner_is_member && ioff != 0 && ooff != 0) { Klass* o = cp->klass_at(ooff, CHECK); ! if (o == outer) { Klass* i = cp->klass_at(ioff, CHECK); ! if (i == inner) { return; } } } if (!inner_is_member && ioff != 0 && ooff == 0 && cp->klass_name_at_matches(inner, ioff)) { Klass* i = cp->klass_at(ioff, CHECK); ! if (i == inner) { return; } } }
*** 800,810 **** static objArrayHandle get_exception_types(methodHandle method, TRAPS) { return method->resolved_checked_exceptions(THREAD); } ! static Handle new_type(Symbol* signature, KlassHandle k, TRAPS) { // Basic types BasicType type = vmSymbols::signature_type(signature); if (type != T_OBJECT) { return Handle(THREAD, Universe::java_mirror(type)); } --- 800,810 ---- static objArrayHandle get_exception_types(methodHandle method, TRAPS) { return method->resolved_checked_exceptions(THREAD); } ! static Handle new_type(Symbol* signature, Klass* k, TRAPS) { // Basic types BasicType type = vmSymbols::signature_type(signature); if (type != T_OBJECT) { return Handle(THREAD, Universe::java_mirror(type)); }
*** 827,837 **** oop Reflection::new_method(const methodHandle& method, bool for_constant_pool_access, TRAPS) { // Allow sun.reflect.ConstantPool to refer to <clinit> methods as java.lang.reflect.Methods. assert(!method()->is_initializer() || (for_constant_pool_access && method()->is_static()), "should call new_constructor instead"); ! instanceKlassHandle holder (THREAD, method->method_holder()); int slot = method->method_idnum(); Symbol* signature = method->signature(); int parameter_count = ArgumentCount(signature).size(); oop return_type_oop = NULL; --- 827,837 ---- oop Reflection::new_method(const methodHandle& method, bool for_constant_pool_access, TRAPS) { // Allow sun.reflect.ConstantPool to refer to <clinit> methods as java.lang.reflect.Methods. assert(!method()->is_initializer() || (for_constant_pool_access && method()->is_static()), "should call new_constructor instead"); ! InstanceKlass* holder = method->method_holder(); int slot = method->method_idnum(); Symbol* signature = method->signature(); int parameter_count = ArgumentCount(signature).size(); oop return_type_oop = NULL;
*** 888,898 **** oop Reflection::new_constructor(const methodHandle& method, TRAPS) { assert(method()->is_initializer(), "should call new_method instead"); ! instanceKlassHandle holder (THREAD, method->method_holder()); int slot = method->method_idnum(); Symbol* signature = method->signature(); int parameter_count = ArgumentCount(signature).size(); objArrayHandle parameter_types = get_parameter_types(method, parameter_count, NULL, CHECK_NULL); --- 888,898 ---- oop Reflection::new_constructor(const methodHandle& method, TRAPS) { assert(method()->is_initializer(), "should call new_method instead"); ! InstanceKlass* holder = method->method_holder(); int slot = method->method_idnum(); Symbol* signature = method->signature(); int parameter_count = ArgumentCount(signature).size(); objArrayHandle parameter_types = get_parameter_types(method, parameter_count, NULL, CHECK_NULL);
*** 936,946 **** oop Reflection::new_field(fieldDescriptor* fd, TRAPS) { Symbol* field_name = fd->name(); oop name_oop = StringTable::intern(field_name, CHECK_NULL); Handle name = Handle(THREAD, name_oop); Symbol* signature = fd->signature(); ! instanceKlassHandle holder (THREAD, fd->field_holder()); Handle type = new_type(signature, holder, CHECK_NULL); Handle rh = java_lang_reflect_Field::create(CHECK_NULL); java_lang_reflect_Field::set_clazz(rh(), fd->field_holder()->java_mirror()); java_lang_reflect_Field::set_slot(rh(), fd->index()); --- 936,946 ---- oop Reflection::new_field(fieldDescriptor* fd, TRAPS) { Symbol* field_name = fd->name(); oop name_oop = StringTable::intern(field_name, CHECK_NULL); Handle name = Handle(THREAD, name_oop); Symbol* signature = fd->signature(); ! InstanceKlass* holder = fd->field_holder(); Handle type = new_type(signature, holder, CHECK_NULL); Handle rh = java_lang_reflect_Field::create(CHECK_NULL); java_lang_reflect_Field::set_clazz(rh(), fd->field_holder()->java_mirror()); java_lang_reflect_Field::set_slot(rh(), fd->index());
*** 983,995 **** java_lang_reflect_Parameter::set_index(rh(), index); return rh(); } ! static methodHandle resolve_interface_call(instanceKlassHandle klass, const methodHandle& method, ! KlassHandle recv_klass, Handle receiver, TRAPS) { assert(!method.is_null() , "method should not be null"); --- 983,995 ---- java_lang_reflect_Parameter::set_index(rh(), index); return rh(); } ! static methodHandle resolve_interface_call(InstanceKlass* klass, const methodHandle& method, ! Klass* recv_klass, Handle receiver, TRAPS) { assert(!method.is_null() , "method should not be null");
*** 1033,1043 **** THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "argument type mismatch"); } // Method call (shared by invoke_method and invoke_constructor) ! static oop invoke(instanceKlassHandle klass, methodHandle reflected_method, Handle receiver, bool override, objArrayHandle ptypes, BasicType rtype, --- 1033,1043 ---- THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "argument type mismatch"); } // Method call (shared by invoke_method and invoke_constructor) ! static oop invoke(InstanceKlass* klass, methodHandle reflected_method, Handle receiver, bool override, objArrayHandle ptypes, BasicType rtype,
*** 1046,1056 **** TRAPS) { ResourceMark rm(THREAD); methodHandle method; // actual method to invoke ! KlassHandle target_klass; // target klass, receiver's klass for non-static // Ensure klass is initialized klass->initialize(CHECK_NULL); bool is_static = reflected_method->is_static(); --- 1046,1056 ---- TRAPS) { ResourceMark rm(THREAD); methodHandle method; // actual method to invoke ! Klass* target_klass; // target klass, receiver's klass for non-static // Ensure klass is initialized klass->initialize(CHECK_NULL); bool is_static = reflected_method->is_static();
*** 1062,1076 **** // check for null receiver if (receiver.is_null()) { THROW_0(vmSymbols::java_lang_NullPointerException()); } // Check class of receiver against class declaring method ! if (!receiver->is_a(klass())) { THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "object is not an instance of declaring class"); } // target klass is receiver's klass ! target_klass = KlassHandle(THREAD, receiver->klass()); // no need to resolve if method is private or <init> if (reflected_method->is_private() || reflected_method->name() == vmSymbols::object_initializer_name()) { method = reflected_method; } else { // resolve based on the receiver --- 1062,1076 ---- // check for null receiver if (receiver.is_null()) { THROW_0(vmSymbols::java_lang_NullPointerException()); } // Check class of receiver against class declaring method ! if (!receiver->is_a(klass)) { THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "object is not an instance of declaring class"); } // target klass is receiver's klass ! target_klass = receiver->klass(); // no need to resolve if method is private or <init> if (reflected_method->is_private() || reflected_method->name() == vmSymbols::object_initializer_name()) { method = reflected_method; } else { // resolve based on the receiver
*** 1107,1117 **** if (method->is_abstract()) { // new default: 6531596 ResourceMark rm(THREAD); Handle h_origexception = Exceptions::new_exception(THREAD, vmSymbols::java_lang_AbstractMethodError(), ! Method::name_and_sig_as_C_string(target_klass(), method->name(), method->signature())); JavaCallArguments args(h_origexception); THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(), vmSymbols::throwable_void_signature(), --- 1107,1117 ---- if (method->is_abstract()) { // new default: 6531596 ResourceMark rm(THREAD); Handle h_origexception = Exceptions::new_exception(THREAD, vmSymbols::java_lang_AbstractMethodError(), ! Method::name_and_sig_as_C_string(target_klass, method->name(), method->signature())); JavaCallArguments args(h_origexception); THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(), vmSymbols::throwable_void_signature(),
*** 1125,1135 **** // I believe this is a ShouldNotGetHere case which requires // an internal vtable bug. If you ever get this please let Karen know. if (method.is_null()) { ResourceMark rm(THREAD); THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), ! Method::name_and_sig_as_C_string(klass(), reflected_method->name(), reflected_method->signature())); } assert(ptypes->is_objArray(), "just checking"); --- 1125,1135 ---- // I believe this is a ShouldNotGetHere case which requires // an internal vtable bug. If you ever get this please let Karen know. if (method.is_null()) { ResourceMark rm(THREAD); THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), ! Method::name_and_sig_as_C_string(klass, reflected_method->name(), reflected_method->signature())); } assert(ptypes->is_objArray(), "just checking");
*** 1227,1237 **** rtype = basic_type_mirror_to_basic_type(return_type_mirror, CHECK_NULL); } else { rtype = T_OBJECT; } ! instanceKlassHandle klass(THREAD, java_lang_Class::as_Klass(mirror)); Method* m = klass->method_with_idnum(slot); if (m == NULL) { THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke"); } methodHandle method(THREAD, m); --- 1227,1237 ---- rtype = basic_type_mirror_to_basic_type(return_type_mirror, CHECK_NULL); } else { rtype = T_OBJECT; } ! InstanceKlass* klass = InstanceKlass::cast(java_lang_Class::as_Klass(mirror)); Method* m = klass->method_with_idnum(slot); if (m == NULL) { THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke"); } methodHandle method(THREAD, m);
*** 1244,1254 **** oop mirror = java_lang_reflect_Constructor::clazz(constructor_mirror); int slot = java_lang_reflect_Constructor::slot(constructor_mirror); bool override = java_lang_reflect_Constructor::override(constructor_mirror) != 0; objArrayHandle ptypes(THREAD, objArrayOop(java_lang_reflect_Constructor::parameter_types(constructor_mirror))); ! instanceKlassHandle klass(THREAD, java_lang_Class::as_Klass(mirror)); Method* m = klass->method_with_idnum(slot); if (m == NULL) { THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke"); } methodHandle method(THREAD, m); --- 1244,1254 ---- oop mirror = java_lang_reflect_Constructor::clazz(constructor_mirror); int slot = java_lang_reflect_Constructor::slot(constructor_mirror); bool override = java_lang_reflect_Constructor::override(constructor_mirror) != 0; objArrayHandle ptypes(THREAD, objArrayOop(java_lang_reflect_Constructor::parameter_types(constructor_mirror))); ! InstanceKlass* klass = InstanceKlass::cast(java_lang_Class::as_Klass(mirror)); Method* m = klass->method_with_idnum(slot); if (m == NULL) { THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke"); } methodHandle method(THREAD, m);
< prev index next >