170 __ load_heap_oop(method_temp, Address(recv, NONZERO(java_lang_invoke_MethodHandle::form_offset_in_bytes())));
171 oopDesc::bs()->interpreter_read_barrier(_masm, method_temp);
172 __ verify_oop(method_temp);
173 __ load_heap_oop(method_temp, Address(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes())));
174 oopDesc::bs()->interpreter_read_barrier(_masm, method_temp);
175 __ verify_oop(method_temp);
176 __ load_heap_oop(method_temp, Address(method_temp, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes())));
177 oopDesc::bs()->interpreter_read_barrier(_masm, method_temp);
178 __ verify_oop(method_temp);
179 __ movptr(method_temp, Address(method_temp, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes())));
180
181 if (VerifyMethodHandles && !for_compiler_entry) {
182 // make sure recv is already on stack
183 __ movptr(temp2, Address(method_temp, Method::const_offset()));
184 __ load_sized_value(temp2,
185 Address(temp2, ConstMethod::size_of_parameters_offset()),
186 sizeof(u2), /*is_signed*/ false);
187 // assert(sizeof(u2) == sizeof(Method::_size_of_parameters), "");
188 __ movptr(temp2, __ argument_address(temp2, -1));
189 Label L;
190 __ cmpptr(recv, temp2);
191 oopDesc::bs()->asm_acmp_barrier(_masm, recv, temp2);
192 __ jcc(Assembler::equal, L);
193 __ movptr(rax, temp2);
194 __ STOP("receiver not on stack");
195 __ BIND(L);
196 }
197
198 jump_from_method_handle(_masm, method_temp, temp2, for_compiler_entry);
199 BLOCK_COMMENT("} jump_to_lambda_form");
200 }
201
202
203 // Code generation
204 address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* _masm,
205 vmIntrinsics::ID iid) {
206 const bool not_for_compiler_entry = false; // this is the interpreter entry
207 assert(is_signature_polymorphic(iid), "expected invoke iid");
208 if (iid == vmIntrinsics::_invokeGeneric ||
209 iid == vmIntrinsics::_compiledLambdaForm) {
210 // Perhaps surprisingly, the symbolic references visible to Java are not directly used.
211 // They are linked to Java-generated adapters via MethodHandleNatives.linkMethod.
|
170 __ load_heap_oop(method_temp, Address(recv, NONZERO(java_lang_invoke_MethodHandle::form_offset_in_bytes())));
171 oopDesc::bs()->interpreter_read_barrier(_masm, method_temp);
172 __ verify_oop(method_temp);
173 __ load_heap_oop(method_temp, Address(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes())));
174 oopDesc::bs()->interpreter_read_barrier(_masm, method_temp);
175 __ verify_oop(method_temp);
176 __ load_heap_oop(method_temp, Address(method_temp, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes())));
177 oopDesc::bs()->interpreter_read_barrier(_masm, method_temp);
178 __ verify_oop(method_temp);
179 __ movptr(method_temp, Address(method_temp, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes())));
180
181 if (VerifyMethodHandles && !for_compiler_entry) {
182 // make sure recv is already on stack
183 __ movptr(temp2, Address(method_temp, Method::const_offset()));
184 __ load_sized_value(temp2,
185 Address(temp2, ConstMethod::size_of_parameters_offset()),
186 sizeof(u2), /*is_signed*/ false);
187 // assert(sizeof(u2) == sizeof(Method::_size_of_parameters), "");
188 __ movptr(temp2, __ argument_address(temp2, -1));
189 Label L;
190 __ cmpoopptr(recv, temp2);
191 __ jcc(Assembler::equal, L);
192 __ movptr(rax, temp2);
193 __ STOP("receiver not on stack");
194 __ BIND(L);
195 }
196
197 jump_from_method_handle(_masm, method_temp, temp2, for_compiler_entry);
198 BLOCK_COMMENT("} jump_to_lambda_form");
199 }
200
201
202 // Code generation
203 address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* _masm,
204 vmIntrinsics::ID iid) {
205 const bool not_for_compiler_entry = false; // this is the interpreter entry
206 assert(is_signature_polymorphic(iid), "expected invoke iid");
207 if (iid == vmIntrinsics::_invokeGeneric ||
208 iid == vmIntrinsics::_compiledLambdaForm) {
209 // Perhaps surprisingly, the symbolic references visible to Java are not directly used.
210 // They are linked to Java-generated adapters via MethodHandleNatives.linkMethod.
|