< prev index next >

src/hotspot/share/ci/ciInstanceKlass.cpp

Print this page




 404       ciField* field = _nonstatic_fields->at(i);
 405       int  field_off = field->offset_in_bytes();
 406       if (field_off == field_offset)
 407         return field;
 408       if (field_off > field_offset)
 409         break;
 410       // could do binary search or check bins, but probably not worth it
 411     }
 412     return NULL;
 413   }
 414   VM_ENTRY_MARK;
 415   InstanceKlass* k = get_instanceKlass();
 416   fieldDescriptor fd;
 417   if (!k->find_field_from_offset(field_offset, is_static, &fd)) {
 418     return NULL;
 419   }
 420   ciField* field = new (CURRENT_THREAD_ENV->arena()) ciField(&fd);
 421   return field;
 422 }
 423 























 424 // ------------------------------------------------------------------
 425 // ciInstanceKlass::get_field_by_name
 426 ciField* ciInstanceKlass::get_field_by_name(ciSymbol* name, ciSymbol* signature, bool is_static) {
 427   VM_ENTRY_MARK;
 428   InstanceKlass* k = get_instanceKlass();
 429   fieldDescriptor fd;
 430   Klass* def = k->find_field(name->get_symbol(), signature->get_symbol(), is_static, &fd);
 431   if (def == NULL) {
 432     return NULL;
 433   }
 434   ciField* field = new (CURRENT_THREAD_ENV->arena()) ciField(&fd);
 435   return field;
 436 }
 437 
 438 
 439 static int sort_field_by_offset(ciField** a, ciField** b) {
 440   return (*a)->offset_in_bytes() - (*b)->offset_in_bytes();
 441   // (no worries about 32-bit overflow...)
 442 }
 443 




 404       ciField* field = _nonstatic_fields->at(i);
 405       int  field_off = field->offset_in_bytes();
 406       if (field_off == field_offset)
 407         return field;
 408       if (field_off > field_offset)
 409         break;
 410       // could do binary search or check bins, but probably not worth it
 411     }
 412     return NULL;
 413   }
 414   VM_ENTRY_MARK;
 415   InstanceKlass* k = get_instanceKlass();
 416   fieldDescriptor fd;
 417   if (!k->find_field_from_offset(field_offset, is_static, &fd)) {
 418     return NULL;
 419   }
 420   ciField* field = new (CURRENT_THREAD_ENV->arena()) ciField(&fd);
 421   return field;
 422 }
 423 
 424 ciField* ciInstanceKlass::get_non_flattened_field_by_offset(int field_offset) {
 425   if (super() != NULL && super()->has_nonstatic_fields()) {
 426     ciField* f = super()->get_non_flattened_field_by_offset(field_offset);
 427     if (f != NULL) {
 428       return f;
 429     }
 430   }
 431 
 432   VM_ENTRY_MARK;
 433   InstanceKlass* k = get_instanceKlass();
 434   Arena* arena = CURRENT_ENV->arena();
 435   for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
 436     if (fs.access_flags().is_static())  continue;
 437     fieldDescriptor& fd = fs.field_descriptor();
 438     if (fd.offset() == field_offset) {
 439       ciField* f = new (arena) ciField(&fd);
 440       return f;
 441     }
 442   }
 443 
 444   return NULL;
 445 }
 446 
 447 // ------------------------------------------------------------------
 448 // ciInstanceKlass::get_field_by_name
 449 ciField* ciInstanceKlass::get_field_by_name(ciSymbol* name, ciSymbol* signature, bool is_static) {
 450   VM_ENTRY_MARK;
 451   InstanceKlass* k = get_instanceKlass();
 452   fieldDescriptor fd;
 453   Klass* def = k->find_field(name->get_symbol(), signature->get_symbol(), is_static, &fd);
 454   if (def == NULL) {
 455     return NULL;
 456   }
 457   ciField* field = new (CURRENT_THREAD_ENV->arena()) ciField(&fd);
 458   return field;
 459 }
 460 
 461 
 462 static int sort_field_by_offset(ciField** a, ciField** b) {
 463   return (*a)->offset_in_bytes() - (*b)->offset_in_bytes();
 464   // (no worries about 32-bit overflow...)
 465 }
 466 


< prev index next >