mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 22:34:27 +02:00
8232419: Improve Registry registration
Reviewed-by: smarks, chegar
This commit is contained in:
parent
34e36a8c01
commit
796f3ba8be
5 changed files with 137 additions and 20 deletions
|
@ -453,16 +453,50 @@ public class ObjectInputStream
|
|||
* @throws IOException Any of the usual Input/Output related exceptions.
|
||||
*/
|
||||
public final Object readObject()
|
||||
throws IOException, ClassNotFoundException {
|
||||
return readObject(Object.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a String and only a string.
|
||||
*
|
||||
* @return the String read
|
||||
* @throws EOFException If end of file is reached.
|
||||
* @throws IOException If other I/O error has occurred.
|
||||
*/
|
||||
private String readString() throws IOException {
|
||||
try {
|
||||
return (String) readObject(String.class);
|
||||
} catch (ClassNotFoundException cnf) {
|
||||
throw new IllegalStateException(cnf);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method to read an object from the ObjectInputStream of the expected type.
|
||||
* Called only from {@code readObject()} and {@code readString()}.
|
||||
* Only {@code Object.class} and {@code String.class} are supported.
|
||||
*
|
||||
* @param type the type expected; either Object.class or String.class
|
||||
* @return an object of the type
|
||||
* @throws IOException Any of the usual Input/Output related exceptions.
|
||||
* @throws ClassNotFoundException Class of a serialized object cannot be
|
||||
* found.
|
||||
*/
|
||||
private final Object readObject(Class<?> type)
|
||||
throws IOException, ClassNotFoundException
|
||||
{
|
||||
if (enableOverride) {
|
||||
return readObjectOverride();
|
||||
}
|
||||
|
||||
if (! (type == Object.class || type == String.class))
|
||||
throw new AssertionError("internal error");
|
||||
|
||||
// if nested read, passHandle contains handle of enclosing object
|
||||
int outerHandle = passHandle;
|
||||
try {
|
||||
Object obj = readObject0(false);
|
||||
Object obj = readObject0(type, false);
|
||||
handles.markDependency(outerHandle, passHandle);
|
||||
ClassNotFoundException ex = handles.lookupException(passHandle);
|
||||
if (ex != null) {
|
||||
|
@ -557,7 +591,7 @@ public class ObjectInputStream
|
|||
// if nested read, passHandle contains handle of enclosing object
|
||||
int outerHandle = passHandle;
|
||||
try {
|
||||
Object obj = readObject0(true);
|
||||
Object obj = readObject0(Object.class, true);
|
||||
handles.markDependency(outerHandle, passHandle);
|
||||
ClassNotFoundException ex = handles.lookupException(passHandle);
|
||||
if (ex != null) {
|
||||
|
@ -1577,8 +1611,10 @@ public class ObjectInputStream
|
|||
|
||||
/**
|
||||
* Underlying readObject implementation.
|
||||
* @param type a type expected to be deserialized; non-null
|
||||
* @param unshared true if the object can not be a reference to a shared object, otherwise false
|
||||
*/
|
||||
private Object readObject0(boolean unshared) throws IOException {
|
||||
private Object readObject0(Class<?> type, boolean unshared) throws IOException {
|
||||
boolean oldMode = bin.getBlockDataMode();
|
||||
if (oldMode) {
|
||||
int remain = bin.currentBlockRemaining();
|
||||
|
@ -1610,13 +1646,20 @@ public class ObjectInputStream
|
|||
return readNull();
|
||||
|
||||
case TC_REFERENCE:
|
||||
return readHandle(unshared);
|
||||
// check the type of the existing object
|
||||
return type.cast(readHandle(unshared));
|
||||
|
||||
case TC_CLASS:
|
||||
if (type == String.class) {
|
||||
throw new ClassCastException("Cannot cast a class to java.lang.String");
|
||||
}
|
||||
return readClass(unshared);
|
||||
|
||||
case TC_CLASSDESC:
|
||||
case TC_PROXYCLASSDESC:
|
||||
if (type == String.class) {
|
||||
throw new ClassCastException("Cannot cast a class to java.lang.String");
|
||||
}
|
||||
return readClassDesc(unshared);
|
||||
|
||||
case TC_STRING:
|
||||
|
@ -1624,15 +1667,27 @@ public class ObjectInputStream
|
|||
return checkResolve(readString(unshared));
|
||||
|
||||
case TC_ARRAY:
|
||||
if (type == String.class) {
|
||||
throw new ClassCastException("Cannot cast an array to java.lang.String");
|
||||
}
|
||||
return checkResolve(readArray(unshared));
|
||||
|
||||
case TC_ENUM:
|
||||
if (type == String.class) {
|
||||
throw new ClassCastException("Cannot cast an enum to java.lang.String");
|
||||
}
|
||||
return checkResolve(readEnum(unshared));
|
||||
|
||||
case TC_OBJECT:
|
||||
if (type == String.class) {
|
||||
throw new ClassCastException("Cannot cast an object to java.lang.String");
|
||||
}
|
||||
return checkResolve(readOrdinaryObject(unshared));
|
||||
|
||||
case TC_EXCEPTION:
|
||||
if (type == String.class) {
|
||||
throw new ClassCastException("Cannot cast an exception to java.lang.String");
|
||||
}
|
||||
IOException ex = readFatalException();
|
||||
throw new WriteAbortedException("writing aborted", ex);
|
||||
|
||||
|
@ -2004,7 +2059,7 @@ public class ObjectInputStream
|
|||
|
||||
if (ccl == null) {
|
||||
for (int i = 0; i < len; i++) {
|
||||
readObject0(false);
|
||||
readObject0(Object.class, false);
|
||||
}
|
||||
} else if (ccl.isPrimitive()) {
|
||||
if (ccl == Integer.TYPE) {
|
||||
|
@ -2029,7 +2084,7 @@ public class ObjectInputStream
|
|||
} else {
|
||||
Object[] oa = (Object[]) array;
|
||||
for (int i = 0; i < len; i++) {
|
||||
oa[i] = readObject0(false);
|
||||
oa[i] = readObject0(Object.class, false);
|
||||
handles.markDependency(arrayHandle, passHandle);
|
||||
}
|
||||
}
|
||||
|
@ -2393,7 +2448,7 @@ public class ObjectInputStream
|
|||
return;
|
||||
|
||||
default:
|
||||
readObject0(false);
|
||||
readObject0(Object.class, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -2438,7 +2493,7 @@ public class ObjectInputStream
|
|||
int numPrimFields = fields.length - objVals.length;
|
||||
for (int i = 0; i < objVals.length; i++) {
|
||||
ObjectStreamField f = fields[numPrimFields + i];
|
||||
objVals[i] = readObject0(f.isUnshared());
|
||||
objVals[i] = readObject0(Object.class, f.isUnshared());
|
||||
if (f.getField() != null) {
|
||||
handles.markDependency(objHandle, passHandle);
|
||||
}
|
||||
|
@ -2479,7 +2534,7 @@ public class ObjectInputStream
|
|||
throw new InternalError();
|
||||
}
|
||||
clear();
|
||||
return (IOException) readObject0(false);
|
||||
return (IOException) readObject0(Object.class, false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2601,7 +2656,7 @@ public class ObjectInputStream
|
|||
int numPrimFields = fields.length - objVals.length;
|
||||
for (int i = 0; i < objVals.length; i++) {
|
||||
objVals[i] =
|
||||
readObject0(fields[numPrimFields + i].isUnshared());
|
||||
readObject0(Object.class, fields[numPrimFields + i].isUnshared());
|
||||
objHandles[i] = passHandle;
|
||||
}
|
||||
passHandle = oldHandle;
|
||||
|
@ -4090,6 +4145,7 @@ public class ObjectInputStream
|
|||
|
||||
static {
|
||||
SharedSecrets.setJavaObjectInputStreamAccess(ObjectInputStream::checkArray);
|
||||
SharedSecrets.setJavaObjectInputStreamReadString(ObjectInputStream::readString);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue