src/share/vm/prims/methodHandles.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 7052219 Cdiff src/share/vm/prims/methodHandles.cpp

src/share/vm/prims/methodHandles.cpp

Print this page

        

*** 203,215 **** if (_adapter_code == NULL) vm_exit_out_of_memory(adapter_code_size, "CodeCache: no room for MethodHandles adapters"); CodeBuffer code(_adapter_code); MethodHandlesAdapterGenerator g(&code); g.generate(); - - // Transfer code comments - _adapter_code->set_comments(code.comments()); } //------------------------------------------------------------------------------ // MethodHandlesAdapterGenerator::generate // --- 203,212 ----
*** 1978,2034 **** if (!is_java_primitive(src) || dest != T_OBJECT) { err = "adapter requires primitive src conversion subfield"; break; } break; case _adapter_swap_args: - case _adapter_rot_args: { ! if (!src || src != dest) { err = "adapter requires src/dest conversion subfields for swap"; break; } ! int swap_size = type2size[src]; int src_slot = argslot; int dest_slot = vminfo; - bool rotate_up = (src_slot > dest_slot); // upward rotation int src_arg = argnum; ! int dest_arg = argument_slot_to_argnum(dst_mtype(), dest_slot); ! verify_vmargslot(target, dest_arg, dest_slot, CHECK); ! if (!(dest_slot >= src_slot + swap_size) && ! !(src_slot >= dest_slot + swap_size)) { ! err = "source, destination slots must be distinct"; ! } else if (ek == _adapter_swap_args && !(src_slot > dest_slot)) { ! err = "source of swap must be deeper in stack"; ! } else if (ek == _adapter_swap_args) { err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), dest_arg), java_lang_invoke_MethodType::ptype(dst_mtype(), src_arg), dest_arg); ! } else if (ek == _adapter_rot_args) { ! if (rotate_up) { ! assert((src_slot > dest_slot) && (src_arg < dest_arg), ""); ! // rotate up: [dest_slot..src_slot-ss] --> [dest_slot+ss..src_slot] ! // that is: [src_arg+1..dest_arg] --> [src_arg..dest_arg-1] ! for (int i = src_arg+1; i <= dest_arg && err == NULL; i++) { err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), i), java_lang_invoke_MethodType::ptype(dst_mtype(), i-1), i); } ! } else { // rotate down ! assert((src_slot < dest_slot) && (src_arg > dest_arg), ""); ! // rotate down: [src_slot+ss..dest_slot] --> [src_slot..dest_slot-ss] ! // that is: [dest_arg..src_arg-1] --> [dst_arg+1..src_arg] ! for (int i = dest_arg; i <= src_arg-1 && err == NULL; i++) { err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), i), java_lang_invoke_MethodType::ptype(dst_mtype(), i+1), i); } } ! } ! if (err == NULL) err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), src_arg), java_lang_invoke_MethodType::ptype(dst_mtype(), dest_arg), src_arg); } break; case _adapter_spread_args: case _adapter_collect_args: case _adapter_fold_args: { --- 1975,2056 ---- if (!is_java_primitive(src) || dest != T_OBJECT) { err = "adapter requires primitive src conversion subfield"; break; } break; case _adapter_swap_args: { ! if (!src || !dest) { err = "adapter requires src/dest conversion subfields for swap"; break; } ! int src_size = type2size[src]; ! if (src_size != type2size[dest]) { ! err = "adapter requires equal sizes for src/dest"; break; ! } int src_slot = argslot; int dest_slot = vminfo; int src_arg = argnum; ! int dest_arg = argument_slot_to_argnum(src_mtype(), dest_slot); ! verify_vmargslot(mh, dest_arg, dest_slot, CHECK); ! if (!(dest_slot >= src_slot + src_size) && ! !(src_slot >= dest_slot + src_size)) { ! err = "source, destination slots must be distinct"; break; ! } else if (!(src_slot > dest_slot)) { ! err = "source of swap must be deeper in stack"; break; ! } err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), dest_arg), java_lang_invoke_MethodType::ptype(dst_mtype(), src_arg), dest_arg); ! if (err == NULL) ! err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), src_arg), ! java_lang_invoke_MethodType::ptype(dst_mtype(), dest_arg), ! src_arg); ! break; ! } ! case _adapter_rot_args: ! { ! if (!src || !dest) { ! err = "adapter requires src/dest conversion subfields for rotate"; break; ! } ! int src_slot = argslot; ! int limit_raw = vminfo; ! bool rot_down = (src_slot < limit_raw); ! int limit_bias = (rot_down ? MethodHandles::OP_ROT_ARGS_DOWN_LIMIT_BIAS : 0); ! int limit_slot = limit_raw - limit_bias; ! int src_arg = argnum; ! int limit_arg = argument_slot_to_argnum(src_mtype(), limit_slot); ! verify_vmargslot(mh, limit_arg, limit_slot, CHECK); ! if (src_slot == limit_slot) { ! err = "source, destination slots must be distinct"; break; ! } ! if (!rot_down) { // rotate slots up == shift arguments left ! // limit_slot is an inclusive lower limit ! assert((src_slot > limit_slot) && (src_arg < limit_arg), ""); ! // rotate up: [limit_slot..src_slot-ss] --> [limit_slot+ss..src_slot] ! // that is: [src_arg+1..limit_arg] --> [src_arg..limit_arg-1] ! for (int i = src_arg+1; i <= limit_arg && err == NULL; i++) { err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), i), java_lang_invoke_MethodType::ptype(dst_mtype(), i-1), i); } ! } else { // rotate slots down == shfit arguments right ! // limit_slot is an exclusive upper limit ! assert((src_slot < limit_slot - limit_bias) && (src_arg > limit_arg + limit_bias), ""); ! // rotate down: [src_slot+ss..limit_slot) --> [src_slot..limit_slot-ss) ! // that is: (limit_arg..src_arg-1] --> (dst_arg+1..src_arg] ! for (int i = limit_arg+1; i <= src_arg-1 && err == NULL; i++) { err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), i), java_lang_invoke_MethodType::ptype(dst_mtype(), i+1), i); } } ! if (err == NULL) { ! int dest_arg = (rot_down ? limit_arg+1 : limit_arg); err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), src_arg), java_lang_invoke_MethodType::ptype(dst_mtype(), dest_arg), src_arg); } + } break; case _adapter_spread_args: case _adapter_collect_args: case _adapter_fold_args: {
*** 2811,2820 **** --- 2833,2844 ---- case MethodHandles::GC_JVM_STACK_MOVE_UNIT: // return number of words per slot, signed according to stack direction return MethodHandles::stack_move_unit(); case MethodHandles::GC_CONV_OP_IMPLEMENTED_MASK: return MethodHandles::adapter_conversion_ops_supported_mask(); + case MethodHandles::GC_OP_ROT_ARGS_DOWN_LIMIT_BIAS: + return MethodHandles::OP_ROT_ARGS_DOWN_LIMIT_BIAS; } return 0; } JVM_END
*** 2822,2831 **** --- 2846,2857 ---- #define EACH_NAMED_CON(template) \ /* hold back this one until JDK stabilizes */ \ /* template(MethodHandles,GC_JVM_PUSH_LIMIT) */ \ /* hold back this one until JDK stabilizes */ \ /* template(MethodHandles,GC_JVM_STACK_MOVE_UNIT) */ \ + /* hold back this one until JDK stabilizes */ \ + /* template(MethodHandles,GC_OP_ROT_ARGS_DOWN_LIMIT_BIAS) */ \ template(MethodHandles,ETF_HANDLE_OR_METHOD_NAME) \ template(MethodHandles,ETF_DIRECT_HANDLE) \ template(MethodHandles,ETF_METHOD_NAME) \ template(MethodHandles,ETF_REFLECT_METHOD) \ template(java_lang_invoke_MemberName,MN_IS_METHOD) \
src/share/vm/prims/methodHandles.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File