diff jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java @ 23992:1b8892b4ce9c

lazily cache the name of a HotSpotResolvedJavaMethodImpl
author Doug Simon <doug.simon@oracle.com>
date Tue, 31 Jan 2017 16:44:20 +0100
parents 6d2c72b822b0
children 11f0412408cd
line wrap: on
line diff
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java	Mon Jan 30 09:59:50 2017 +0100
+++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java	Tue Jan 31 16:44:20 2017 +0100
@@ -74,6 +74,7 @@
     private HotSpotMethodData methodData;
     private byte[] code;
     private Executable toJavaCache;
+    private String nameCache;
 
     /**
      * Gets the holder of a HotSpot metaspace method native object.
@@ -106,8 +107,6 @@
     }
 
     HotSpotResolvedJavaMethodImpl(HotSpotResolvedObjectTypeImpl holder, long metaspaceMethod) {
-        // It would be too much work to get the method name here so we fill it in later.
-        super(null);
         this.metaspaceMethod = metaspaceMethod;
         this.holder = holder;
 
@@ -126,9 +125,6 @@
             this.constantPool = compilerToVM().getConstantPool(this);
         }
 
-        final int nameIndex = UNSAFE.getChar(constMethod + config.constMethodNameIndexOffset);
-        this.name = constantPool.lookupUtf8(nameIndex);
-
         final int signatureIndex = UNSAFE.getChar(constMethod + config.constMethodSignatureIndexOffset);
         this.signature = (HotSpotSignature) constantPool.lookupSignature(signatureIndex);
     }
@@ -146,6 +142,13 @@
         return UNSAFE.getAddress(metaspaceMethod + config().methodConstMethodOffset);
     }
 
+    public String getName() {
+        if (nameCache == null) {
+            nameCache = compilerToVM().getMethodName(this);
+        }
+        return nameCache;
+    }
+
     @Override
     public boolean equals(Object obj) {
         if (this == obj) {
@@ -328,12 +331,12 @@
 
     @Override
     public boolean isClassInitializer() {
-        return "<clinit>".equals(name) && isStatic();
+        return isStatic() && "<clinit>".equals(getName());
     }
 
     @Override
     public boolean isConstructor() {
-        return "<init>".equals(name) && !isStatic();
+        return !isStatic() && "<init>".equals(getName());
     }
 
     @Override
@@ -564,7 +567,7 @@
             } else {
                 // Do not use Method.getDeclaredMethod() as it can return a bridge method
                 // when this.isBridge() is false and vice versa.
-                result = searchMethods(holder.mirror().getDeclaredMethods(), name, returnType, parameterTypes);
+                result = searchMethods(holder.mirror().getDeclaredMethods(), getName(), returnType, parameterTypes);
             }
             toJavaCache = result;
             return result;