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 |