in src/main/java/com/jetbrains/jdi/ArrayReferenceImpl.java [376:422]
void validateAssignment(ValueContainer destination)
throws InvalidTypeException, ClassNotLoadedException {
try {
super.validateAssignment(destination);
} catch (ClassNotLoadedException e) {
/*
* An array can be used extensively without the
* enclosing loader being recorded by the VM as an
* initiating loader of the array type. In addition, the
* load of an array class is fairly harmless as long as
* the component class is already loaded. So we relax the
* rules a bit and allow the assignment as long as the
* ultimate component types are assignable.
*/
boolean valid = false;
JNITypeParser destParser = new JNITypeParser(
destination.signature());
JNITypeParser srcParser = new JNITypeParser(
arrayType().signature());
int destDims = destParser.dimensionCount();
if (destDims <= srcParser.dimensionCount()) {
/*
* Remove all dimensions from the destination. Remove
* the same number of dimensions from the source.
* Get types for both and check to see if they are
* compatible.
*/
String destComponentSignature =
destParser.componentSignature(destDims);
Type destComponentType =
destination.findType(destComponentSignature);
String srcComponentSignature =
srcParser.componentSignature(destDims);
Type srcComponentType =
arrayType().findType(srcComponentSignature);
valid = ArrayTypeImpl.isComponentAssignable(destComponentType,
srcComponentType);
}
if (!valid) {
throw new InvalidTypeException("Cannot assign " +
arrayType().name() +
" to " +
destination.typeName());
}
}
}