< prev index next >

src/cpu/aarch64/vm/methodHandles_aarch64.cpp

Print this page




  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");


< prev index next >