< prev index next >

src/hotspot/cpu/x86/methodHandles_x86.cpp

Print this page

 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.
< prev index next >