< prev index next >
src/jdk.jdi/share/classes/com/sun/tools/jdi/ObjectReferenceImpl.java
Print this page
*** 74,83 ****
--- 74,87 ----
synchronized (vm.state()) {
cache = markerCache;
}
}
+ private boolean isInlineType() {
+ return referenceType().signature().startsWith("Q");
+ }
+
// Override in subclasses
protected Cache newCache() {
return new Cache();
}
*** 143,157 ****
return true;
}
}
}
public boolean equals(Object obj) {
if ((obj != null) && (obj instanceof ObjectReferenceImpl)) {
! ObjectReferenceImpl other = (ObjectReferenceImpl)obj;
return (ref() == other.ref()) &&
super.equals(obj);
} else {
return false;
}
}
--- 147,181 ----
return true;
}
}
}
+ private boolean isSubstitutable(ObjectReferenceImpl other) {
+ if (referenceType() != other.referenceType()) return false;
+ List<Field> fields = referenceType().fields();
+ for (Field f : fields) {
+ if (f.isStatic()) {
+ fields.remove(f);
+ }
+ }
+ Map<Field,Value> thisFields = getValues(fields);
+ Map<Field,Value> otherFields = other.getValues(fields);
+ for (Field f : fields) {
+ if (!thisFields.get(f).equals(otherFields.get(f))) return false;
+ }
+ return true;
+ }
+
public boolean equals(Object obj) {
if ((obj != null) && (obj instanceof ObjectReferenceImpl)) {
! ObjectReferenceImpl other = (ObjectReferenceImpl) obj;
! if (isInlineType()) {
! return isSubstitutable(other);
! } else {
return (ref() == other.ref()) &&
super.equals(obj);
+ }
} else {
return false;
}
}
*** 468,477 ****
--- 492,504 ----
throw exc.toJDIException();
}
}
public long uniqueID() {
+ if (isInlineType()) {
+ throw new UnsupportedOperationException("Inline types cannot have unique IDs");
+ }
return ref();
}
JDWP.ObjectReference.MonitorInfo jdwpMonitorInfo()
throws IncompatibleThreadStateException {
*** 592,601 ****
--- 619,632 ----
}
if ((destination.signature().charAt(0) == '[') &&
(type().signature().charAt(0) != '[')) {
throw new InvalidTypeException("Can't assign non-array value to an array");
}
+ if ((destination.signature().charAt(0) == 'Q') &&
+ ref() == 0) {
+ throw new InvalidTypeException("Can't assign null value to an inline type");
+ }
if ("void".equals(destination.typeName())) {
throw new InvalidTypeException("Can't assign object value to a void");
}
// Validate assignment
*** 609,624 ****
--- 640,663 ----
" to " + destTypeName);
}
}
public String toString() {
+ if (isInlineType()) {
+ return "instance of " + referenceType().name();
+ } else {
return "instance of " + referenceType().name() + "(id=" + uniqueID() + ")";
}
+ }
byte typeValueKey() {
+ if (isInlineType()) {
+ return JDWP.Tag.INLINE_OBJECT;
+ } else {
return JDWP.Tag.OBJECT;
}
+ }
private static boolean isNonVirtual(int options) {
return (options & INVOKE_NONVIRTUAL) != 0;
}
}
< prev index next >