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 void MethodHandles::verify_method(MacroAssembler* _masm, Register method, Register temp, vmIntrinsics::ID iid) {
126 BLOCK_COMMENT("verify_method {");
127 __ verify_method_ptr(method);
128 if (VerifyMethodHandles) {
129 Label L_ok;
130 assert_different_registers(method, temp);
131
132 const Register method_holder = temp;
133 __ load_method_holder(method_holder, method);
134 __ push(method_holder); // keep holder around for diagnostic purposes
135
136 switch (iid) {
137 case vmIntrinsicID::_invokeBasic:
138 // Require compiled LambdaForm class to be fully initialized.
|
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 void MethodHandles::verify_method(MacroAssembler* _masm, Register method, Register temp, vmIntrinsics::ID iid) {
128 BLOCK_COMMENT("verify_method {");
129 __ verify_method_ptr(method);
130 if (VerifyMethodHandles) {
131 Label L_ok;
132 assert_different_registers(method, temp);
133
134 const Register method_holder = temp;
135 __ load_method_holder(method_holder, method);
136 __ push(method_holder); // keep holder around for diagnostic purposes
137
138 switch (iid) {
139 case vmIntrinsicID::_invokeBasic:
140 // Require compiled LambdaForm class to be fully initialized.
|