570 } 571 } 572 } 573 574 @Override 575 public JavaType lookupType(int cpi, int opcode) { 576 final LookupTypeCacheElement elem = this.lastLookupType; 577 if (elem != null && elem.lastCpi == cpi) { 578 return elem.javaType; 579 } else { 580 final Object type = compilerToVM().lookupKlassInPool(this, cpi); 581 JavaType result = getJavaType(type); 582 if (result instanceof ResolvedJavaType) { 583 this.lastLookupType = new LookupTypeCacheElement(cpi, result); 584 } 585 return result; 586 } 587 } 588 589 @Override 590 public JavaField lookupField(int cpi, int opcode) { 591 final int index = rawIndexToConstantPoolIndex(cpi, opcode); 592 final int nameAndTypeIndex = getNameAndTypeRefIndexAt(index); 593 final int nameIndex = getNameRefIndexAt(nameAndTypeIndex); 594 String name = lookupUtf8(nameIndex); 595 final int typeIndex = getSignatureRefIndexAt(nameAndTypeIndex); 596 String typeName = lookupUtf8(typeIndex); 597 JavaType type = runtime().lookupType(typeName, getHolder(), false); 598 599 final int holderIndex = getKlassRefIndexAt(index); 600 JavaType holder = lookupType(holderIndex, opcode); 601 602 if (holder instanceof HotSpotResolvedObjectTypeImpl) { 603 long[] info = new long[2]; 604 HotSpotResolvedObjectTypeImpl resolvedHolder; 605 try { 606 resolvedHolder = compilerToVM().resolveFieldInPool(this, index, (byte) opcode, info); 607 } catch (Throwable t) { 608 /* 609 * If there was an exception resolving the field we give up and return an unresolved 610 * field. 611 */ 612 return new HotSpotUnresolvedField(holder, name, type); 613 } 614 final int flags = (int) info[0]; 615 final long offset = info[1]; 616 HotSpotResolvedJavaField result = resolvedHolder.createField(name, type, offset, flags); 617 return result; 618 } else { 619 return new HotSpotUnresolvedField(holder, name, type); 620 } 621 } 622 623 @Override 624 @SuppressWarnings("fallthrough") 625 public void loadReferencedType(int cpi, int opcode) { 626 int index; | 570 } 571 } 572 } 573 574 @Override 575 public JavaType lookupType(int cpi, int opcode) { 576 final LookupTypeCacheElement elem = this.lastLookupType; 577 if (elem != null && elem.lastCpi == cpi) { 578 return elem.javaType; 579 } else { 580 final Object type = compilerToVM().lookupKlassInPool(this, cpi); 581 JavaType result = getJavaType(type); 582 if (result instanceof ResolvedJavaType) { 583 this.lastLookupType = new LookupTypeCacheElement(cpi, result); 584 } 585 return result; 586 } 587 } 588 589 @Override 590 public JavaField lookupField(int cpi, ResolvedJavaMethod method, int opcode) { 591 final int index = rawIndexToConstantPoolIndex(cpi, opcode); 592 final int nameAndTypeIndex = getNameAndTypeRefIndexAt(index); 593 final int nameIndex = getNameRefIndexAt(nameAndTypeIndex); 594 String name = lookupUtf8(nameIndex); 595 final int typeIndex = getSignatureRefIndexAt(nameAndTypeIndex); 596 String typeName = lookupUtf8(typeIndex); 597 JavaType type = runtime().lookupType(typeName, getHolder(), false); 598 599 final int holderIndex = getKlassRefIndexAt(index); 600 JavaType holder = lookupType(holderIndex, opcode); 601 602 if (holder instanceof HotSpotResolvedObjectTypeImpl) { 603 long[] info = new long[2]; 604 HotSpotResolvedObjectTypeImpl resolvedHolder; 605 try { 606 resolvedHolder = compilerToVM().resolveFieldInPool(this, index, (HotSpotResolvedJavaMethodImpl) method, (byte) opcode, info); 607 } catch (Throwable t) { 608 /* 609 * If there was an exception resolving the field we give up and return an unresolved 610 * field. 611 */ 612 return new HotSpotUnresolvedField(holder, name, type); 613 } 614 final int flags = (int) info[0]; 615 final long offset = info[1]; 616 HotSpotResolvedJavaField result = resolvedHolder.createField(name, type, offset, flags); 617 return result; 618 } else { 619 return new HotSpotUnresolvedField(holder, name, type); 620 } 621 } 622 623 @Override 624 @SuppressWarnings("fallthrough") 625 public void loadReferencedType(int cpi, int opcode) { 626 int index; |