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