277 // The result is *not* reported as a multiple of stack_move_unit();
278 // It is a signed net number of pushes (a difference in vmslots).
279 // To compare with a stack_move value, first multiply by stack_move_unit().
280 static int decode_MethodHandle_stack_pushes(oop mh);
281
282 public:
283 // working with member names
284 static void resolve_MemberName(Handle mname, TRAPS); // compute vmtarget/vmindex from name/type
285 static void expand_MemberName(Handle mname, int suppress, TRAPS); // expand defc/name/type if missing
286 static Handle new_MemberName(TRAPS); // must be followed by init_MemberName
287 static void init_MemberName(oop mname_oop, oop target); // compute vmtarget/vmindex from target
288 static void init_MemberName(oop mname_oop, methodOop m, bool do_dispatch = true);
289 static void init_MemberName(oop mname_oop, klassOop field_holder, AccessFlags mods, int offset);
290 static int find_MemberNames(klassOop k, symbolOop name, symbolOop sig,
291 int mflags, klassOop caller,
292 int skip, objArrayOop results);
293 // bit values for suppress argument to expand_MemberName:
294 enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 };
295
296 // Generate MethodHandles adapters.
297 static void generate_adapters(TRAPS);
298
299 // Called from InterpreterGenerator and MethodHandlesAdapterGenerator.
300 static address generate_method_handle_interpreter_entry(MacroAssembler* _masm);
301 static void generate_method_handle_stub(MacroAssembler* _masm, EntryKind ek, TRAPS);
302
303 // argument list parsing
304 static int argument_slot(oop method_type, int arg);
305 static int argument_slot_count(oop method_type) { return argument_slot(method_type, -1); }
306 static int argument_slot_to_argnum(oop method_type, int argslot);
307
308 // Runtime support
309 enum { // bit-encoded flags from decode_method or decode_vmref
310 _dmf_has_receiver = 0x01, // target method has leading reference argument
311 _dmf_does_dispatch = 0x02, // method handle performs virtual or interface dispatch
312 _dmf_from_interface = 0x04, // peforms interface dispatch
313 _DMF_DIRECT_MASK = (_dmf_from_interface*2 - _dmf_has_receiver),
314 _dmf_binds_method = 0x08,
315 _dmf_binds_argument = 0x10,
316 _DMF_BOUND_MASK = (_dmf_binds_argument*2 - _dmf_binds_method),
317 _dmf_adapter_lsb = 0x20,
318 _DMF_ADAPTER_MASK = (_dmf_adapter_lsb << CONV_OP_LIMIT) - _dmf_adapter_lsb
319 };
320 static methodOop decode_method(oop x, klassOop& receiver_limit_result, int& decode_flags_result);
321 enum {
513 static int type_checking_entry_offset_in_bytes() {
514 return (int)( offset_of(Data, _from_interpreted_entry) - sizeof(Data) );
515 }
516
517 static address start_compiled_entry(MacroAssembler* _masm,
518 address interpreted_entry = NULL);
519 static MethodHandleEntry* finish_compiled_entry(MacroAssembler* masm, address start_addr);
520 };
521
522 address MethodHandles::from_compiled_entry(EntryKind ek) { return entry(ek)->from_compiled_entry(); }
523 address MethodHandles::from_interpreted_entry(EntryKind ek) { return entry(ek)->from_interpreted_entry(); }
524
525
526 //------------------------------------------------------------------------------
527 // MethodHandlesAdapterGenerator
528 //
529 class MethodHandlesAdapterGenerator : public StubCodeGenerator {
530 public:
531 MethodHandlesAdapterGenerator(CodeBuffer* code) : StubCodeGenerator(code) {}
532
533 void generate(TRAPS);
534 };
535
536 #endif // SHARE_VM_PRIMS_METHODHANDLES_HPP
|
277 // The result is *not* reported as a multiple of stack_move_unit();
278 // It is a signed net number of pushes (a difference in vmslots).
279 // To compare with a stack_move value, first multiply by stack_move_unit().
280 static int decode_MethodHandle_stack_pushes(oop mh);
281
282 public:
283 // working with member names
284 static void resolve_MemberName(Handle mname, TRAPS); // compute vmtarget/vmindex from name/type
285 static void expand_MemberName(Handle mname, int suppress, TRAPS); // expand defc/name/type if missing
286 static Handle new_MemberName(TRAPS); // must be followed by init_MemberName
287 static void init_MemberName(oop mname_oop, oop target); // compute vmtarget/vmindex from target
288 static void init_MemberName(oop mname_oop, methodOop m, bool do_dispatch = true);
289 static void init_MemberName(oop mname_oop, klassOop field_holder, AccessFlags mods, int offset);
290 static int find_MemberNames(klassOop k, symbolOop name, symbolOop sig,
291 int mflags, klassOop caller,
292 int skip, objArrayOop results);
293 // bit values for suppress argument to expand_MemberName:
294 enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 };
295
296 // Generate MethodHandles adapters.
297 static void generate_adapters();
298
299 // Called from InterpreterGenerator and MethodHandlesAdapterGenerator.
300 static address generate_method_handle_interpreter_entry(MacroAssembler* _masm);
301 static void generate_method_handle_stub(MacroAssembler* _masm, EntryKind ek);
302
303 // argument list parsing
304 static int argument_slot(oop method_type, int arg);
305 static int argument_slot_count(oop method_type) { return argument_slot(method_type, -1); }
306 static int argument_slot_to_argnum(oop method_type, int argslot);
307
308 // Runtime support
309 enum { // bit-encoded flags from decode_method or decode_vmref
310 _dmf_has_receiver = 0x01, // target method has leading reference argument
311 _dmf_does_dispatch = 0x02, // method handle performs virtual or interface dispatch
312 _dmf_from_interface = 0x04, // peforms interface dispatch
313 _DMF_DIRECT_MASK = (_dmf_from_interface*2 - _dmf_has_receiver),
314 _dmf_binds_method = 0x08,
315 _dmf_binds_argument = 0x10,
316 _DMF_BOUND_MASK = (_dmf_binds_argument*2 - _dmf_binds_method),
317 _dmf_adapter_lsb = 0x20,
318 _DMF_ADAPTER_MASK = (_dmf_adapter_lsb << CONV_OP_LIMIT) - _dmf_adapter_lsb
319 };
320 static methodOop decode_method(oop x, klassOop& receiver_limit_result, int& decode_flags_result);
321 enum {
513 static int type_checking_entry_offset_in_bytes() {
514 return (int)( offset_of(Data, _from_interpreted_entry) - sizeof(Data) );
515 }
516
517 static address start_compiled_entry(MacroAssembler* _masm,
518 address interpreted_entry = NULL);
519 static MethodHandleEntry* finish_compiled_entry(MacroAssembler* masm, address start_addr);
520 };
521
522 address MethodHandles::from_compiled_entry(EntryKind ek) { return entry(ek)->from_compiled_entry(); }
523 address MethodHandles::from_interpreted_entry(EntryKind ek) { return entry(ek)->from_interpreted_entry(); }
524
525
526 //------------------------------------------------------------------------------
527 // MethodHandlesAdapterGenerator
528 //
529 class MethodHandlesAdapterGenerator : public StubCodeGenerator {
530 public:
531 MethodHandlesAdapterGenerator(CodeBuffer* code) : StubCodeGenerator(code) {}
532
533 void generate();
534 };
535
536 #endif // SHARE_VM_PRIMS_METHODHANDLES_HPP
|