56 }
57
58
59 #ifdef ASSERT
60 static int check_nonzero(const char* xname, int x) {
61 assert(x != 0, "%s should be nonzero", xname);
62 return x;
63 }
64 #define NONZERO(x) check_nonzero(#x, x)
65 #else
66 #define NONZERO(x) (x)
67 #endif
68
69 #ifdef ASSERT
70 void MethodHandles::verify_klass(MacroAssembler* _masm,
71 Register obj_reg, SystemDictionary::WKID klass_id,
72 Register temp_reg, Register temp2_reg,
73 const char* error_message) {
74
75 InstanceKlass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
76 KLass* klass = SystemDictionary::well_known_klass(klass_id);
77
78 assert(temp_reg != Z_R0 && // Is used as base register!
79 temp_reg != noreg && temp2_reg != noreg, "need valid registers!");
80
81 NearLabel L_ok, L_bad;
82
83 BLOCK_COMMENT("verify_klass {");
84
85 __ verify_oop(obj_reg);
86 __ compareU64_and_branch(obj_reg, (intptr_t)0L, Assembler::bcondEqual, L_bad);
87 __ load_klass(temp_reg, obj_reg);
88 // klass_addr is a klass in allstatic SystemDictionaryHandles. Can't get GCed.
89 __ load_const_optimized(temp2_reg, (address)klass_addr);
90 __ z_lg(temp2_reg, Address(temp2_reg));
91 __ compareU64_and_branch(temp_reg, temp2_reg, Assembler::bcondEqual, L_ok);
92
93 intptr_t super_check_offset = klass->super_check_offset();
94 __ z_lg(temp_reg, Address(temp_reg, super_check_offset));
95 __ compareU64_and_branch(temp_reg, temp2_reg, Assembler::bcondEqual, L_ok);
96 __ BIND(L_bad);
|
56 }
57
58
59 #ifdef ASSERT
60 static int check_nonzero(const char* xname, int x) {
61 assert(x != 0, "%s should be nonzero", xname);
62 return x;
63 }
64 #define NONZERO(x) check_nonzero(#x, x)
65 #else
66 #define NONZERO(x) (x)
67 #endif
68
69 #ifdef ASSERT
70 void MethodHandles::verify_klass(MacroAssembler* _masm,
71 Register obj_reg, SystemDictionary::WKID klass_id,
72 Register temp_reg, Register temp2_reg,
73 const char* error_message) {
74
75 InstanceKlass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
76 Klass* klass = SystemDictionary::well_known_klass(klass_id);
77
78 assert(temp_reg != Z_R0 && // Is used as base register!
79 temp_reg != noreg && temp2_reg != noreg, "need valid registers!");
80
81 NearLabel L_ok, L_bad;
82
83 BLOCK_COMMENT("verify_klass {");
84
85 __ verify_oop(obj_reg);
86 __ compareU64_and_branch(obj_reg, (intptr_t)0L, Assembler::bcondEqual, L_bad);
87 __ load_klass(temp_reg, obj_reg);
88 // klass_addr is a klass in allstatic SystemDictionaryHandles. Can't get GCed.
89 __ load_const_optimized(temp2_reg, (address)klass_addr);
90 __ z_lg(temp2_reg, Address(temp2_reg));
91 __ compareU64_and_branch(temp_reg, temp2_reg, Assembler::bcondEqual, L_ok);
92
93 intptr_t super_check_offset = klass->super_check_offset();
94 __ z_lg(temp_reg, Address(temp_reg, super_check_offset));
95 __ compareU64_and_branch(temp_reg, temp2_reg, Assembler::bcondEqual, L_ok);
96 __ BIND(L_bad);
|