comparison src/share/vm/prims/methodHandles.hpp @ 10133:6337ca4dcad8

8008511: JSR 292: MemberName vmtarget refs to methods must be updated at class redefinition Summary: Lazily create and maintain the MemberNameTable to be able to update MemberName's Reviewed-by: coleenp, jrose, dholmes Contributed-by: serguei.spitsyn@oracle.com
author sspitsyn
date Sat, 20 Apr 2013 04:07:08 -0700
parents 65d07d9ee446
children b7fa10a3a69a
comparison
equal deleted inserted replaced
10132:5b6512efcdc4 10133:6337ca4dcad8
52 public: 52 public:
53 // working with member names 53 // working with member names
54 static Handle resolve_MemberName(Handle mname, TRAPS); // compute vmtarget/vmindex from name/type 54 static Handle resolve_MemberName(Handle mname, TRAPS); // compute vmtarget/vmindex from name/type
55 static void expand_MemberName(Handle mname, int suppress, TRAPS); // expand defc/name/type if missing 55 static void expand_MemberName(Handle mname, int suppress, TRAPS); // expand defc/name/type if missing
56 static Handle new_MemberName(TRAPS); // must be followed by init_MemberName 56 static Handle new_MemberName(TRAPS); // must be followed by init_MemberName
57 static oop init_MemberName(oop mname_oop, oop target_oop); // compute vmtarget/vmindex from target 57 static oop init_MemberName(Handle mname_h, Handle target_h); // compute vmtarget/vmindex from target
58 static oop init_method_MemberName(oop mname_oop, Method* m, bool do_dispatch, 58 static oop init_method_MemberName(Handle mname_h, Method* m, bool do_dispatch,
59 Klass* receiver_limit); 59 KlassHandle receiver_limit_h);
60 static oop init_field_MemberName(oop mname_oop, Klass* field_holder, 60 static oop init_field_MemberName(Handle mname_h, KlassHandle field_holder_h,
61 AccessFlags mods, oop type, oop name, 61 AccessFlags mods, oop type, oop name,
62 intptr_t offset, bool is_setter = false); 62 intptr_t offset, bool is_setter = false);
63 static Handle init_method_MemberName(oop mname_oop, CallInfo& info, TRAPS); 63 static Handle init_method_MemberName(Handle mname_h, CallInfo& info, TRAPS);
64 static Handle init_field_MemberName(oop mname_oop, FieldAccessInfo& info, TRAPS); 64 static Handle init_field_MemberName(Handle mname_h, FieldAccessInfo& info, TRAPS);
65 static int method_ref_kind(Method* m, bool do_dispatch_if_possible = true); 65 static int method_ref_kind(Method* m, bool do_dispatch_if_possible = true);
66 static int find_MemberNames(Klass* k, Symbol* name, Symbol* sig, 66 static int find_MemberNames(KlassHandle k, Symbol* name, Symbol* sig,
67 int mflags, Klass* caller, 67 int mflags, KlassHandle caller,
68 int skip, objArrayOop results); 68 int skip, objArrayHandle results);
69 // bit values for suppress argument to expand_MemberName: 69 // bit values for suppress argument to expand_MemberName:
70 enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 }; 70 enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 };
71 71
72 // Generate MethodHandles adapters. 72 // Generate MethodHandles adapters.
73 static void generate_adapters(); 73 static void generate_adapters();
74 74
75 // Called from MethodHandlesAdapterGenerator. 75 // Called from MethodHandlesAdapterGenerator.
76 static address generate_method_handle_interpreter_entry(MacroAssembler* _masm, vmIntrinsics::ID iid); 76 static address generate_method_handle_interpreter_entry(MacroAssembler* _masm, vmIntrinsics::ID iid);
77 static void generate_method_handle_dispatch(MacroAssembler* _masm, 77 static void generate_method_handle_dispatch(MacroAssembler* _masm,
78 vmIntrinsics::ID iid, 78 vmIntrinsics::ID iid,
228 MethodHandlesAdapterGenerator(CodeBuffer* code) : StubCodeGenerator(code, PrintMethodHandleStubs) {} 228 MethodHandlesAdapterGenerator(CodeBuffer* code) : StubCodeGenerator(code, PrintMethodHandleStubs) {}
229 229
230 void generate(); 230 void generate();
231 }; 231 };
232 232
233 //------------------------------------------------------------------------------
234 // MemberNameTable
235 //
236 class MemberNameTable : public GrowableArray<jweak> {
237 public:
238 MemberNameTable();
239 ~MemberNameTable();
240 void add_member_name(jweak mem_name_ref);
241 private:
242 int find_member_name(oop mem_name);
243
244 #if INCLUDE_JVMTI
245 public:
246 // RedefineClasses() API support:
247 // If a MemberName refers to old_method then update it
248 // to refer to new_method.
249 void adjust_method_entries(Method** old_methods, Method** new_methods,
250 int methods_length, bool *trace_name_printed);
251 private:
252 oop find_member_name_by_method(Method* old_method);
253 #endif // INCLUDE_JVMTI
254 };
255
233 #endif // SHARE_VM_PRIMS_METHODHANDLES_HPP 256 #endif // SHARE_VM_PRIMS_METHODHANDLES_HPP