< prev index next >

test/compiler/jvmci/compilerToVM/GetStackTraceElementTest.java

Print this page
rev 9261 : 8138815: improve tests CompilerToVM::getStackTraceElement

@@ -39,10 +39,12 @@
 import java.lang.reflect.Executable;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.HashMap;
 import java.util.Map;
+
+import compiler.jvmci.common.testcases.TestCase;
 import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
 import jdk.vm.ci.hotspot.CompilerToVMHelper;
 import jdk.test.lib.Asserts;
 
 public class GetStackTraceElementTest {

@@ -54,28 +56,55 @@
 
     private static void runSanityTest(Executable aMethod, int[] bcis) {
         HotSpotResolvedJavaMethod method = CTVMUtilities
                 .getResolvedMethod(aMethod);
         String className = aMethod.getDeclaringClass().getName();
-        int lastDot = className.lastIndexOf('.');
-        int firstDol = className.contains("$")
-                ? className.indexOf('$')
-                : className.length();
-        String fileName = className.substring(lastDot + 1, firstDol) + ".java";
+        String methodName = aMethod.getName().equals(className)
+                ? "<init>"
+                : aMethod.getName();
+        String fileName = getFileName(className);
+        Map<Integer, Integer> bciWithLineNumber = CTVMUtilities
+                .getBciToLineNumber(aMethod);
+        boolean isNative = Modifier.isNative(aMethod.getModifiers());
+        int lineNumber = -1;
         for (int bci : bcis) {
             StackTraceElement ste = CompilerToVMHelper
                     .getStackTraceElement(method, bci);
-            Asserts.assertNotNull(ste);
-            Asserts.assertEQ(ste.getClassName(), className);
-            Asserts.assertEQ(ste.getFileName(), fileName);
-            Asserts.assertEQ(ste.getMethodName(), aMethod.getName());
-            Asserts.assertEQ(ste.isNativeMethod(), Modifier
-                    .isNative(aMethod.getModifiers()));
+            Asserts.assertNotNull(ste, aMethod + " : got null StackTraceElement"
+                    + " at bci " + bci);
+            Asserts.assertEQ(className, ste.getClassName(), aMethod
+                    + " : unexpected class name");
+            Asserts.assertEQ(fileName, ste.getFileName(), aMethod
+                    + " : unexpected filename");
+            Asserts.assertEQ(methodName, ste.getMethodName(), aMethod
+                    + " : unexpected method name");
+            Asserts.assertEQ(isNative, ste.isNativeMethod(), aMethod
+                    + " : unexpected 'isNative' value");
+            if (bciWithLineNumber.size() > 0) {
+                if (bciWithLineNumber.containsKey(bci)) {
+                    lineNumber = bciWithLineNumber.get(bci);
+                }
+                Asserts.assertEQ(lineNumber, ste.getLineNumber(), aMethod
+                        + " : unexpected line number");
+            } else {
+                // native and abstract function
+                Asserts.assertLT(0, ste.getLineNumber(),
+                        aMethod + " : unexpected line number for abstract "
+                                + "or native method");
+            }
         }
 
     }
 
+    private static String getFileName(String className) {
+        int lastDot = className.lastIndexOf('.');
+        int firstDol = className.contains("$")
+                ? className.indexOf('$')
+                : className.length();
+        return className.substring(lastDot + 1, firstDol) + ".java";
+    }
+
     private static Map<Executable, int[]> createTestCases() {
         Map<Executable, int[]> testCases = new HashMap<>();
 
         try {
             Class<?> aClass = DummyClass.class;

@@ -84,10 +113,17 @@
             testCases.put(aMethod, bci);
 
             aMethod = aClass.getDeclaredMethod("dummyEmptyFunction");
             bci = new int[] {0};
             testCases.put(aMethod, bci);
+
+            aMethod = aClass.getDeclaredMethod("nativeFunction");
+            bci = new int[] {0};
+            testCases.put(aMethod, bci);
+
+            TestCase.getAllExecutables()
+                    .forEach(c -> testCases.put(c, new int[] {0}));
         } catch (NoSuchMethodException e) {
             throw new Error("TEST BUG : test method not found", e);
         }
         return testCases;
     }

@@ -100,7 +136,9 @@
 
             return y / (int)x;
         }
 
         public void dummyEmptyFunction() {}
+
+        public native void nativeFunction();
     }
 }
< prev index next >