35 import org.graalvm.compiler.graph.Graph; |
35 import org.graalvm.compiler.graph.Graph; |
36 import org.graalvm.compiler.nodes.ConstantNode; |
36 import org.graalvm.compiler.nodes.ConstantNode; |
37 import org.graalvm.compiler.nodes.StructuredGraph; |
37 import org.graalvm.compiler.nodes.StructuredGraph; |
38 import org.graalvm.compiler.nodes.util.JavaConstantFormatter; |
38 import org.graalvm.compiler.nodes.util.JavaConstantFormatter; |
39 import org.graalvm.compiler.phases.schedule.SchedulePhase; |
39 import org.graalvm.compiler.phases.schedule.SchedulePhase; |
40 import org.graalvm.compiler.serviceprovider.JDK9Method; |
40 import org.graalvm.compiler.serviceprovider.GraalServices; |
41 |
41 |
42 import jdk.vm.ci.meta.JavaConstant; |
42 import jdk.vm.ci.meta.JavaConstant; |
43 import jdk.vm.ci.meta.JavaKind; |
43 import jdk.vm.ci.meta.JavaKind; |
44 import jdk.vm.ci.meta.JavaType; |
44 import jdk.vm.ci.meta.JavaType; |
45 import jdk.vm.ci.meta.MetaUtil; |
45 import jdk.vm.ci.meta.MetaUtil; |
46 import jdk.vm.ci.meta.ResolvedJavaMethod; |
46 import jdk.vm.ci.meta.ResolvedJavaMethod; |
47 import jdk.vm.ci.runtime.JVMCI; |
|
48 import jdk.vm.ci.services.Services; |
|
49 |
47 |
50 interface GraphPrinter extends Closeable, JavaConstantFormatter { |
48 interface GraphPrinter extends Closeable, JavaConstantFormatter { |
51 |
49 |
52 /** |
50 /** |
53 * Starts a new group of graphs with the given name, short name and method byte code index (BCI) |
51 * Starts a new group of graphs with the given name, short name and method byte code index (BCI) |
68 */ |
66 */ |
69 void endGroup() throws IOException; |
67 void endGroup() throws IOException; |
70 |
68 |
71 @Override |
69 @Override |
72 void close(); |
70 void close(); |
73 |
|
74 /** |
|
75 * A JVMCI package dynamically exported to trusted modules. |
|
76 */ |
|
77 String JVMCI_RUNTIME_PACKAGE = JVMCI.class.getPackage().getName(); |
|
78 |
|
79 /** |
|
80 * {@code jdk.vm.ci} module. |
|
81 */ |
|
82 Object JVMCI_MODULE = JDK9Method.JAVA_SPECIFICATION_VERSION < 9 ? null : JDK9Method.getModule(Services.class); |
|
83 |
71 |
84 /** |
72 /** |
85 * Classes whose {@link #toString()} method does not run any untrusted code. |
73 * Classes whose {@link #toString()} method does not run any untrusted code. |
86 */ |
74 */ |
87 List<Class<?>> TRUSTED_CLASSES = Arrays.asList( |
75 List<Class<?>> TRUSTED_CLASSES = Arrays.asList( |
103 */ |
91 */ |
104 static boolean isToStringTrusted(Class<?> c) { |
92 static boolean isToStringTrusted(Class<?> c) { |
105 if (TRUSTED_CLASSES.contains(c)) { |
93 if (TRUSTED_CLASSES.contains(c)) { |
106 return true; |
94 return true; |
107 } |
95 } |
108 if (JDK9Method.JAVA_SPECIFICATION_VERSION < 9) { |
96 if (GraalServices.isToStringTrusted(c)) { |
109 if (c.getClassLoader() == Services.class.getClassLoader()) { |
97 return true; |
110 // Loaded by the JVMCI class loader |
|
111 return true; |
|
112 } |
|
113 } else { |
|
114 Object module = JDK9Method.getModule(c); |
|
115 if (JVMCI_MODULE == module || JDK9Method.isOpenTo(JVMCI_MODULE, JVMCI_RUNTIME_PACKAGE, module)) { |
|
116 // Can access non-statically-exported package in JVMCI |
|
117 return true; |
|
118 } |
|
119 } |
98 } |
120 if (c.getClassLoader() == GraphPrinter.class.getClassLoader()) { |
99 if (c.getClassLoader() == GraphPrinter.class.getClassLoader()) { |
121 return true; |
100 return true; |
122 } |
101 } |
123 return false; |
102 return false; |