< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ObjectStamp.java
Print this page
@@ -29,10 +29,11 @@
import jdk.vm.ci.meta.Constant;
import jdk.vm.ci.meta.JavaConstant;
import jdk.vm.ci.meta.MemoryAccessProvider;
import jdk.vm.ci.meta.ResolvedJavaType;
+import jdk.vm.ci.meta.UnresolvedJavaType;
public class ObjectStamp extends AbstractObjectStamp {
public ObjectStamp(ResolvedJavaType type, boolean exactType, boolean nonNull, boolean alwaysNull) {
super(type, exactType, nonNull, alwaysNull);
@@ -90,6 +91,50 @@
* null.
*/
return null;
}
}
+
+ /**
+ * Convert an ObjectStamp into a representation that can be resolved symbolically into the
+ * original stamp.
+ */
+ @Override
+ public SymbolicJVMCIReference<ObjectStamp> makeSymbolic() {
+ if (type() == null) {
+ return null;
+ }
+ return new SymbolicObjectStamp(this);
+ }
+
+ static class SymbolicObjectStamp implements SymbolicJVMCIReference<ObjectStamp> {
+ UnresolvedJavaType type;
+ private boolean exactType;
+ private boolean nonNull;
+ private boolean alwaysNull;
+
+ SymbolicObjectStamp(ObjectStamp stamp) {
+ if (stamp.type() != null) {
+ type = UnresolvedJavaType.create(stamp.type().getName());
+ }
+ exactType = stamp.isExactType();
+ nonNull = stamp.nonNull();
+ alwaysNull = stamp.alwaysNull();
+ }
+
+ @Override
+ public ObjectStamp resolve(ResolvedJavaType accessingClass) {
+ return new ObjectStamp(type != null ? type.resolve(accessingClass) : null, exactType, nonNull, alwaysNull);
+ }
+
+ @Override
+ public String toString() {
+ return "SymbolicObjectStamp{" +
+ "declaringType=" + type +
+ ", exactType=" + exactType +
+ ", nonNull=" + nonNull +
+ ", alwaysNull=" + alwaysNull +
+ '}';
+ }
+ }
+
}
< prev index next >