Mercurial > hg > graal-jvmci-8
changeset 19377:2ff3a30501da
Prototype caching in HotSpotConstantPool.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Sat, 14 Feb 2015 21:34:37 +0100 |
parents | 525d1e6067b7 |
children | 1a9d5e9ab0f4 |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantPool.java |
diffstat | 1 files changed, 33 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantPool.java Sat Feb 14 21:32:35 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantPool.java Sat Feb 14 21:34:37 2015 +0100 @@ -119,9 +119,13 @@ * Reference to the C++ ConstantPool object. */ private final long metaspaceConstantPool; + private final Object[] cache; + private ResolvedJavaType lastType; + private int lastTypeCpi = Integer.MIN_VALUE; public HotSpotConstantPool(long metaspaceConstantPool) { this.metaspaceConstantPool = metaspaceConstantPool; + cache = new Object[length()]; } /** @@ -453,10 +457,20 @@ @Override public JavaMethod lookupMethod(int cpi, int opcode) { + if (opcode != Bytecodes.INVOKEDYNAMIC) { + Object result = cache[cpi]; + if (result != null) { + return (ResolvedJavaMethod) result; + } + } final int index = toConstantPoolIndex(cpi, opcode); final long metaspaceMethod = runtime().getCompilerToVM().lookupMethodInPool(metaspaceConstantPool, index, (byte) opcode); if (metaspaceMethod != 0L) { - return HotSpotResolvedJavaMethodImpl.fromMetaspace(metaspaceMethod); + HotSpotResolvedJavaMethod result = HotSpotResolvedJavaMethodImpl.fromMetaspace(metaspaceMethod); + if (opcode != Bytecodes.INVOKEDYNAMIC) { + cache[cpi] = result; + } + return result; } else { // Get the method's name and signature. String name = getNameRefAt(index); @@ -475,12 +489,24 @@ @Override public JavaType lookupType(int cpi, int opcode) { + if (cpi == this.lastTypeCpi) { + return this.lastType; + } final long metaspacePointer = runtime().getCompilerToVM().lookupKlassInPool(metaspaceConstantPool, cpi); - return getJavaType(metaspacePointer); + JavaType result = getJavaType(metaspacePointer); + if (result instanceof ResolvedJavaType) { + this.lastType = (ResolvedJavaType) result; + this.lastTypeCpi = cpi; + } + return result; } @Override public JavaField lookupField(int cpi, int opcode) { + Object resolvedJavaField = cache[cpi]; + if (resolvedJavaField != null) { + return (ResolvedJavaField) resolvedJavaField; + } final int index = toConstantPoolIndex(cpi, opcode); final int nameAndTypeIndex = getNameAndTypeRefIndexAt(index); final int nameIndex = getNameRefIndexAt(nameAndTypeIndex); @@ -507,7 +533,11 @@ HotSpotResolvedObjectTypeImpl resolvedHolder = HotSpotResolvedObjectTypeImpl.fromMetaspaceKlass(metaspaceKlass); final int flags = (int) info[0]; final long offset = info[1]; - return resolvedHolder.createField(name, type, offset, flags); + HotSpotResolvedJavaField result = resolvedHolder.createField(name, type, offset, flags); + if (type instanceof ResolvedJavaType) { + cache[cpi] = result; + } + return result; } else { return new HotSpotUnresolvedField(holder, name, type); }