Skip to content

Commit 2785197

Browse files
author
Flavio Brasil
committed
introduce option to consider scala companion objects stable
1 parent 9e2a5c5 commit 2785197

File tree

1 file changed

+37
-1
lines changed

1 file changed

+37
-1
lines changed

compiler/src/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/JavaConstantFieldProvider.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
*/
2525
package org.graalvm.compiler.core.common.spi;
2626

27+
import java.lang.annotation.Annotation;
28+
2729
import org.graalvm.compiler.debug.GraalError;
2830
import org.graalvm.compiler.options.Option;
2931
import org.graalvm.compiler.options.OptionKey;
@@ -42,6 +44,9 @@ public abstract class JavaConstantFieldProvider implements ConstantFieldProvider
4244
static class Options {
4345
@Option(help = "Determines whether to treat final fields with default values as constant.")//
4446
public static final OptionKey<Boolean> TrustFinalDefaultFields = new OptionKey<>(true);
47+
48+
@Option(help = "Determines whether to treat scala companion objects as stable values.")//
49+
public static final OptionKey<Boolean> ConsiderScalaCompanionObjectsStable = new OptionKey<>(false);
4550
}
4651

4752
protected JavaConstantFieldProvider(MetaAccessProvider metaAccess) {
@@ -98,7 +103,6 @@ protected boolean isFinalFieldValueConstant(ResolvedJavaField field, JavaConstan
98103
return !value.isDefaultForKind() || Options.TrustFinalDefaultFields.getValue(tool.getOptions());
99104
}
100105

101-
@SuppressWarnings("unused")
102106
protected boolean isStableField(ResolvedJavaField field, ConstantFieldTool<?> tool) {
103107
if (isSyntheticEnumSwitchMap(field)) {
104108
return true;
@@ -109,9 +113,41 @@ protected boolean isStableField(ResolvedJavaField field, ConstantFieldTool<?> to
109113
if (field.equals(stringHashField)) {
110114
return true;
111115
}
116+
if (Options.ConsiderScalaCompanionObjectsStable.getValue(tool.getOptions()) &&
117+
isScalaCompanionObjectField(field)) {
118+
return true;
119+
}
120+
return false;
121+
}
122+
123+
private static boolean isScalaCompanionObjectField(ResolvedJavaField field) {
124+
ResolvedJavaType declaringClass = field.getDeclaringClass();
125+
String declaringClassName = declaringClass.toClassName();
126+
if (declaringClass.isInitialized() && field.getName().equals("MODULE$") && declaringClassName.endsWith("$")) {
127+
try {
128+
String companionInstanceClassName = declaringClassName.substring(0, declaringClassName.length() - 1);
129+
Class<?> companionInstanceClass = ClassLoader.getSystemClassLoader().loadClass(companionInstanceClassName);
130+
return isScalaClass(companionInstanceClass);
131+
} catch (ClassNotFoundException e) {
132+
return false;
133+
}
134+
}
112135
return false;
113136
}
114137

138+
private static boolean isScalaClass(Class<?> cls) {
139+
for (Annotation annotation : cls.getAnnotations()) {
140+
if (annotation.annotationType().getName().equals("scala.reflect.ScalaSignature")) {
141+
return true;
142+
}
143+
}
144+
if (cls.getEnclosingClass() != null) {
145+
return isScalaClass(cls.getEnclosingClass());
146+
} else {
147+
return false;
148+
}
149+
}
150+
115151
protected boolean isDefaultStableField(ResolvedJavaField field, ConstantFieldTool<?> tool) {
116152
assert isStableField(field, tool);
117153
if (isSyntheticEnumSwitchMap(field)) {

0 commit comments

Comments
 (0)