93 __ cmpptr(temp, ExternalAddress((address) klass_addr), rscratch1);
94 __ jcc(Assembler::equal, L_ok);
95 POP;
96 __ bind(L_bad);
97 __ STOP(error_message);
98 __ BIND(L_ok);
99 POP;
100 BLOCK_COMMENT("} verify_klass");
101 #undef POP
102 #undef PUSH
103 }
104
105 void MethodHandles::verify_ref_kind(MacroAssembler* _masm, int ref_kind, Register member_reg, Register temp) {
106 Label L;
107 BLOCK_COMMENT("verify_ref_kind {");
108 __ movl(temp, Address(member_reg, NONZERO(java_lang_invoke_MemberName::flags_offset())));
109 __ shrl(temp, java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT);
110 __ andl(temp, java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK);
111 __ cmpl(temp, ref_kind);
112 __ jcc(Assembler::equal, L);
113 { char* buf = NEW_C_HEAP_ARRAY(char, 100, mtInternal);
114 jio_snprintf(buf, 100, "verify_ref_kind expected %x", ref_kind);
115 if (ref_kind == JVM_REF_invokeVirtual ||
116 ref_kind == JVM_REF_invokeSpecial)
117 // could do this for all ref_kinds, but would explode assembly code size
118 trace_method_handle(_masm, buf);
119 __ STOP(buf);
120 }
121 BLOCK_COMMENT("} verify_ref_kind");
122 __ bind(L);
123 }
124
125 #endif //ASSERT
126
127 void MethodHandles::jump_from_method_handle(MacroAssembler* _masm, Register method, Register temp,
128 bool for_compiler_entry) {
129 assert(method == rbx, "interpreter calling convention");
130
131 Label L_no_such_method;
132 __ testptr(rbx, rbx);
133 __ jcc(Assembler::zero, L_no_such_method);
134
135 __ verify_method_ptr(method);
136
137 if (!for_compiler_entry && JvmtiExport::can_post_interpreter_events()) {
138 Label run_compiled_code;
|
93 __ cmpptr(temp, ExternalAddress((address) klass_addr), rscratch1);
94 __ jcc(Assembler::equal, L_ok);
95 POP;
96 __ bind(L_bad);
97 __ STOP(error_message);
98 __ BIND(L_ok);
99 POP;
100 BLOCK_COMMENT("} verify_klass");
101 #undef POP
102 #undef PUSH
103 }
104
105 void MethodHandles::verify_ref_kind(MacroAssembler* _masm, int ref_kind, Register member_reg, Register temp) {
106 Label L;
107 BLOCK_COMMENT("verify_ref_kind {");
108 __ movl(temp, Address(member_reg, NONZERO(java_lang_invoke_MemberName::flags_offset())));
109 __ shrl(temp, java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT);
110 __ andl(temp, java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK);
111 __ cmpl(temp, ref_kind);
112 __ jcc(Assembler::equal, L);
113 { //char* buf = NEW_C_HEAP_ARRAY(char, 100, mtInternal);
114 //jio_snprintf(buf, 100, "verify_ref_kind expected %x", ref_kind);
115 const char* buf = "verify_ref_kind"; // avoid allocating new strings
116 if (ref_kind == JVM_REF_invokeVirtual ||
117 ref_kind == JVM_REF_invokeSpecial) {
118 // could do this for all ref_kinds, but would explode assembly code size
119 trace_method_handle(_masm, buf);
120 }
121 __ STOP(buf);
122 }
123 BLOCK_COMMENT("} verify_ref_kind");
124 __ bind(L);
125 }
126
127 #endif //ASSERT
128
129 void MethodHandles::jump_from_method_handle(MacroAssembler* _masm, Register method, Register temp,
130 bool for_compiler_entry) {
131 assert(method == rbx, "interpreter calling convention");
132
133 Label L_no_such_method;
134 __ testptr(rbx, rbx);
135 __ jcc(Assembler::zero, L_no_such_method);
136
137 __ verify_method_ptr(method);
138
139 if (!for_compiler_entry && JvmtiExport::can_post_interpreter_events()) {
140 Label run_compiled_code;
|