< 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 #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;
< prev index next >