46 verify_klass(_masm, klass_reg, SystemDictionary::WK_KLASS_ENUM_NAME(java_lang_Class),
47 "MH argument is a Class");
48 __ ldr(klass_reg, Address(klass_reg, java_lang_Class::klass_offset_in_bytes()));
49 }
50
51 #ifdef ASSERT
52 static int check_nonzero(const char* xname, int x) {
53 assert(x != 0, "%s should be nonzero", xname);
54 return x;
55 }
56 #define NONZERO(x) check_nonzero(#x, x)
57 #else //ASSERT
58 #define NONZERO(x) (x)
59 #endif //PRODUCT
60
61 #ifdef ASSERT
62 void MethodHandles::verify_klass(MacroAssembler* _masm,
63 Register obj, SystemDictionary::WKID klass_id,
64 const char* error_message) {
65 InstanceKlass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
66 KlassHandle klass = SystemDictionary::well_known_klass(klass_id);
67 Register temp = rscratch2;
68 Register temp2 = rscratch1; // used by MacroAssembler::cmpptr
69 Label L_ok, L_bad;
70 BLOCK_COMMENT("verify_klass {");
71 __ verify_oop(obj);
72 __ cbz(obj, L_bad);
73 __ push(RegSet::of(temp, temp2), sp);
74 __ load_klass(temp, obj);
75 __ cmpptr(temp, ExternalAddress((address) klass_addr));
76 __ br(Assembler::EQ, L_ok);
77 intptr_t super_check_offset = klass->super_check_offset();
78 __ ldr(temp, Address(temp, super_check_offset));
79 __ cmpptr(temp, ExternalAddress((address) klass_addr));
80 __ br(Assembler::EQ, L_ok);
81 __ pop(RegSet::of(temp, temp2), sp);
82 __ bind(L_bad);
83 __ stop(error_message);
84 __ BIND(L_ok);
85 __ pop(RegSet::of(temp, temp2), sp);
86 BLOCK_COMMENT("} verify_klass");
|
46 verify_klass(_masm, klass_reg, SystemDictionary::WK_KLASS_ENUM_NAME(java_lang_Class),
47 "MH argument is a Class");
48 __ ldr(klass_reg, Address(klass_reg, java_lang_Class::klass_offset_in_bytes()));
49 }
50
51 #ifdef ASSERT
52 static int check_nonzero(const char* xname, int x) {
53 assert(x != 0, "%s should be nonzero", xname);
54 return x;
55 }
56 #define NONZERO(x) check_nonzero(#x, x)
57 #else //ASSERT
58 #define NONZERO(x) (x)
59 #endif //PRODUCT
60
61 #ifdef ASSERT
62 void MethodHandles::verify_klass(MacroAssembler* _masm,
63 Register obj, SystemDictionary::WKID klass_id,
64 const char* error_message) {
65 InstanceKlass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
66 Klass* klass = SystemDictionary::well_known_klass(klass_id);
67 Register temp = rscratch2;
68 Register temp2 = rscratch1; // used by MacroAssembler::cmpptr
69 Label L_ok, L_bad;
70 BLOCK_COMMENT("verify_klass {");
71 __ verify_oop(obj);
72 __ cbz(obj, L_bad);
73 __ push(RegSet::of(temp, temp2), sp);
74 __ load_klass(temp, obj);
75 __ cmpptr(temp, ExternalAddress((address) klass_addr));
76 __ br(Assembler::EQ, L_ok);
77 intptr_t super_check_offset = klass->super_check_offset();
78 __ ldr(temp, Address(temp, super_check_offset));
79 __ cmpptr(temp, ExternalAddress((address) klass_addr));
80 __ br(Assembler::EQ, L_ok);
81 __ pop(RegSet::of(temp, temp2), sp);
82 __ bind(L_bad);
83 __ stop(error_message);
84 __ BIND(L_ok);
85 __ pop(RegSet::of(temp, temp2), sp);
86 BLOCK_COMMENT("} verify_klass");
|