22 */ |
22 */ |
23 |
23 |
24 |
24 |
25 package org.graalvm.compiler.core.test; |
25 package org.graalvm.compiler.core.test; |
26 |
26 |
|
27 import java.lang.invoke.MethodHandles; |
|
28 import java.lang.reflect.Method; |
|
29 import java.security.ProtectionDomain; |
|
30 |
27 import org.objectweb.asm.Opcodes; |
31 import org.objectweb.asm.Opcodes; |
|
32 |
|
33 import sun.misc.Unsafe; |
28 |
34 |
29 public abstract class CustomizedBytecodePatternTest extends GraalCompilerTest implements Opcodes { |
35 public abstract class CustomizedBytecodePatternTest extends GraalCompilerTest implements Opcodes { |
30 |
36 |
31 protected Class<?> getClass(String className) throws ClassNotFoundException { |
37 protected Class<?> getClass(String className) throws ClassNotFoundException { |
32 return new CachedLoader(CustomizedBytecodePatternTest.class.getClassLoader(), className).findClass(className); |
38 return new CachedLoader(CustomizedBytecodePatternTest.class.getClassLoader(), className).findClass(className); |
|
39 } |
|
40 |
|
41 /** |
|
42 * @param className |
|
43 * @param lookUp lookup object with boot class load capability (required for jdk 9 and above) |
|
44 * @return loaded class |
|
45 * @throws ClassNotFoundException |
|
46 */ |
|
47 protected Class<?> getClassBL(String className, MethodHandles.Lookup lookUp) throws ClassNotFoundException { |
|
48 byte[] gen = generateClass(className.replace('.', '/')); |
|
49 Method defineClass = null; |
|
50 Class<?> loadedClass = null; |
|
51 try { |
|
52 if (Java8OrEarlier) { |
|
53 defineClass = Unsafe.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class, ClassLoader.class, ProtectionDomain.class); |
|
54 loadedClass = (Class<?>) defineClass.invoke(UNSAFE, className, gen, 0, gen.length, null, null); |
|
55 } else { |
|
56 defineClass = MethodHandles.lookup().getClass().getDeclaredMethod("defineClass", byte[].class); |
|
57 loadedClass = (Class<?>) defineClass.invoke(lookUp, gen); |
|
58 } |
|
59 } catch (Exception e) { |
|
60 throw new ClassNotFoundException(); |
|
61 } |
|
62 return loadedClass; |
33 } |
63 } |
34 |
64 |
35 private class CachedLoader extends ClassLoader { |
65 private class CachedLoader extends ClassLoader { |
36 |
66 |
37 final String className; |
67 final String className; |