1.1 --- a/src/share/vm/interpreter/linkResolver.hpp Mon Jul 23 13:04:59 2012 -0700 1.2 +++ b/src/share/vm/interpreter/linkResolver.hpp Tue Jul 24 10:51:00 2012 -0700 1.3 @@ -75,11 +75,12 @@ 1.4 methodHandle _resolved_method; // static target method 1.5 methodHandle _selected_method; // dynamic (actual) target method 1.6 int _vtable_index; // vtable index of selected method 1.7 + Handle _resolved_appendix; // extra argument in constant pool (if CPCE::has_appendix) 1.8 1.9 void set_static( KlassHandle resolved_klass, methodHandle resolved_method , TRAPS); 1.10 void set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method , TRAPS); 1.11 void set_virtual( KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS); 1.12 - void set_dynamic( methodHandle resolved_method, TRAPS); 1.13 + void set_handle( methodHandle resolved_method, Handle resolved_appendix, TRAPS); 1.14 void set_common( KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS); 1.15 1.16 friend class LinkResolver; 1.17 @@ -89,6 +90,7 @@ 1.18 KlassHandle selected_klass() const { return _selected_klass; } 1.19 methodHandle resolved_method() const { return _resolved_method; } 1.20 methodHandle selected_method() const { return _selected_method; } 1.21 + Handle resolved_appendix() const { return _resolved_appendix; } 1.22 1.23 BasicType result_type() const { return selected_method()->result_type(); } 1.24 bool has_vtable_index() const { return _vtable_index >= 0; } 1.25 @@ -110,8 +112,8 @@ 1.26 static void lookup_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); 1.27 static void lookup_instance_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); 1.28 static void lookup_method_in_interfaces (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); 1.29 - static void lookup_implicit_method (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, 1.30 - KlassHandle current_klass, TRAPS); 1.31 + static void lookup_polymorphic_method (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, 1.32 + KlassHandle current_klass, Handle* appendix_result_or_null, TRAPS); 1.33 1.34 static int vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); 1.35 1.36 @@ -139,10 +141,9 @@ 1.37 // constant pool resolving 1.38 static void check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS); 1.39 1.40 - // static resolving for all calls except interface calls 1.41 - static void resolve_method (methodHandle& method_result, KlassHandle& klass_result, constantPoolHandle pool, int index, TRAPS); 1.42 - static void resolve_dynamic_method (methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS); 1.43 - static void resolve_interface_method(methodHandle& method_result, KlassHandle& klass_result, constantPoolHandle pool, int index, TRAPS); 1.44 + // static resolving calls (will not run any Java code); used only from Bytecode_invoke::static_target 1.45 + static void resolve_method_statically(methodHandle& method_result, KlassHandle& klass_result, 1.46 + Bytecodes::Code code, constantPoolHandle pool, int index, TRAPS); 1.47 1.48 // runtime/static resolving for fields 1.49 static void resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, TRAPS); 1.50 @@ -156,6 +157,8 @@ 1.51 static void resolve_special_call (CallInfo& result, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS); 1.52 static void resolve_virtual_call (CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool check_null_and_abstract, TRAPS); 1.53 static void resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool check_null_and_abstract, TRAPS); 1.54 + static void resolve_handle_call (CallInfo& result, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, TRAPS); 1.55 + static void resolve_dynamic_call (CallInfo& result, Handle bootstrap_specifier, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, TRAPS); 1.56 1.57 // same as above for compile-time resolution; but returns null handle instead of throwing an exception on error 1.58 // also, does not initialize klass (i.e., no side effects) 1.59 @@ -177,6 +180,7 @@ 1.60 static void resolve_invokevirtual (CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS); 1.61 static void resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS); 1.62 static void resolve_invokedynamic (CallInfo& result, constantPoolHandle pool, int index, TRAPS); 1.63 + static void resolve_invokehandle (CallInfo& result, constantPoolHandle pool, int index, TRAPS); 1.64 1.65 static void resolve_invoke (CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS); 1.66 };