src/share/vm/prims/methodHandleWalk.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/prims/methodHandleWalk.cpp	Tue Jun 14 10:10:06 2011
--- new/src/share/vm/prims/methodHandleWalk.cpp	Tue Jun 14 10:10:06 2011

*** 234,246 **** --- 234,250 ---- case java_lang_invoke_AdapterMethodHandle::OP_RETYPE_ONLY: case java_lang_invoke_AdapterMethodHandle::OP_RETYPE_RAW: case java_lang_invoke_AdapterMethodHandle::OP_CHECK_CAST: case java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_PRIM: case java_lang_invoke_AdapterMethodHandle::OP_REF_TO_PRIM: case java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_REF: break; + case java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_REF: { + tty->print(" src_type = %s", type2name(chain.adapter_conversion_src_type())); + break; + } + case java_lang_invoke_AdapterMethodHandle::OP_SWAP_ARGS: case java_lang_invoke_AdapterMethodHandle::OP_ROT_ARGS: { int dest_arg_slot = chain.adapter_conversion_vminfo(); tty->print(" dest_arg_slot %d type %s", dest_arg_slot, type2name(chain.adapter_conversion_src_type())); break;
*** 501,529 **** --- 505,536 ---- change_argument(a1.basic_type(), arg_slot, a2); break; } case java_lang_invoke_AdapterMethodHandle::OP_ROT_ARGS: { ! int dest_arg_slot = chain().adapter_conversion_vminfo(); if (!has_argument(dest_arg_slot) || arg_slot == dest_arg_slot) { ! int limit_raw = chain().adapter_conversion_vminfo(); + bool rot_down = (arg_slot < limit_raw); + int limit_bias = (rot_down ? MethodHandles::OP_ROT_ARGS_DOWN_LIMIT_BIAS : 0); + int limit_slot = limit_raw - limit_bias; + if ((uint)limit_slot > (uint)_outgoing.length()) { lose("bad rotate index", CHECK_(empty)); } // Rotate the source argument (plus following N slots) into the // position occupied by the dest argument (plus following N slots). int rotate_count = type2size[chain().adapter_conversion_src_type()]; // (no other rotate counts are currently supported) ! if (arg_slot < dest_arg_slot) { ! if (rot_down) { for (int i = 0; i < rotate_count; i++) { ArgToken temp = _outgoing.at(arg_slot); _outgoing.remove_at(arg_slot); ! _outgoing.insert_before(dest_arg_slot + rotate_count - 1, temp); ! _outgoing.insert_before(limit_slot - 1, temp); } ! } else { // arg_slot > dest_arg_slot ! } else { // arg_slot > limit_slot => rotate_up for (int i = 0; i < rotate_count; i++) { ArgToken temp = _outgoing.at(arg_slot + rotate_count - 1); _outgoing.remove_at(arg_slot + rotate_count - 1); ! _outgoing.insert_before(dest_arg_slot, temp); ! _outgoing.insert_before(limit_slot, temp); } } assert(_outgoing_argc == argument_count_slow(), "empty slots under control"); break; }
*** 1414,1425 **** --- 1421,1433 ---- case T_LONG: emit_bc(Bytecodes::_lreturn); break; case T_FLOAT: emit_bc(Bytecodes::_freturn); break; case T_DOUBLE: emit_bc(Bytecodes::_dreturn); break; case T_VOID: emit_bc(Bytecodes::_return); break; case T_OBJECT: ! if (_rklass.not_null() && _rklass() != SystemDictionary::Object_klass() && !Klass::cast(_rklass())->is_interface()) { emit_bc(Bytecodes::_checkcast, cpool_klass_put(_rklass())); + } emit_bc(Bytecodes::_areturn); break; default: ShouldNotReachHere(); } ret = ArgToken(); // Dummy return value.

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