Index: working_vm/vm/vmcore/src/kernel_classes/javasrc/java/lang/Class.java =================================================================== --- working_vm/vm/vmcore/src/kernel_classes/javasrc/java/lang/Class.java (revision 631623) +++ working_vm/vm/vmcore/src/kernel_classes/javasrc/java/lang/Class.java (working copy) @@ -56,6 +56,8 @@ import org.apache.harmony.vm.VMGenericsAndAnnotations; import org.apache.harmony.vm.VMStack; +import java.io.ObjectStreamClass; + /** * @com.intel.drl.spec_ref * @@ -72,6 +74,8 @@ private transient ProtectionDomain domain; + private ObjectStreamClass osc; + /** It is required for synchronization in newInstance method. */ private boolean isDefaultConstructorInitialized; @@ -1145,6 +1149,20 @@ return VMClassRegistry.getSimpleName(this); } + public ObjectStreamClass getOSC() { + if ( osc != null ) { + return osc; + } + + synchronized(this) { + if (osc != null) return osc; + + osc = ObjectStreamClass.createClassDesc(this, true); + return osc; + } + } + + /** * Provides strong referencing between the classloader * and it's defined classes. Intended for class unloading implementation. Index: working_classlib/modules/luni-kernel/src/main/java/java/lang/Class.java =================================================================== --- working_classlib/modules/luni-kernel/src/main/java/java/lang/Class.java (revision 612717) +++ working_classlib/modules/luni-kernel/src/main/java/java/lang/Class.java (working copy) @@ -31,6 +31,8 @@ import java.net.URL; import java.security.ProtectionDomain; +import java.io.ObjectStreamClass; + /** * This class must be implemented by the VM vendor. The documented natives must * be implemented to support other provided class implementations in this @@ -860,4 +862,9 @@ public T cast(Object obj) { return null; } + + public ObjectStreamClass getOSC() { + return null; + } + } Index: working_classlib/modules/luni/src/main/java/java/io/ObjectInputStream.java =================================================================== --- working_classlib/modules/luni/src/main/java/java/io/ObjectInputStream.java (revision 612717) +++ working_classlib/modules/luni/src/main/java/java/io/ObjectInputStream.java (working copy) @@ -712,8 +712,7 @@ return readNewClassDesc(false); case TC_PROXYCLASSDESC: Class proxyClass = readNewProxyClassDesc(); - ObjectStreamClass streamClass = ObjectStreamClass - .lookup(proxyClass); + ObjectStreamClass streamClass = proxyClass.getOSC(); streamClass.setLoadFields(new ObjectStreamField[0]); registerObjectRead(streamClass, Integer.valueOf(nextHandle()), false); @@ -1355,7 +1354,7 @@ if (!ObjectStreamClass.isSerializable(cl)) { return; } - ObjectStreamClass classDesc = ObjectStreamClass.lookupStreamClass(cl); + ObjectStreamClass classDesc = cl.getOSC(); if (classDesc.hasMethodReadObjectNoData()){ final Method readMethod = classDesc.getMethodReadObjectNoData(); try { @@ -1986,7 +1985,7 @@ if (objectClass != null) { - ObjectStreamClass desc = ObjectStreamClass.lookupStreamClass(objectClass); + ObjectStreamClass desc = objectClass.getOSC(); if (desc.hasMethodReadResolve()){ Method methodReadResolve = desc.getMethodReadResolve(); try { @@ -2714,8 +2713,7 @@ throws InvalidClassException { Class localClass = loadedStreamClass.forClass(); - ObjectStreamClass localStreamClass = ObjectStreamClass - .lookupStreamClass(localClass); + ObjectStreamClass localStreamClass = localClass.getOSC(); if (loadedStreamClass.getSerialVersionUID() != localStreamClass .getSerialVersionUID()) { Index: working_classlib/modules/luni/src/main/java/java/io/ObjectOutputStream.java =================================================================== --- working_classlib/modules/luni/src/main/java/java/io/ObjectOutputStream.java (revision 612717) +++ working_classlib/modules/luni/src/main/java/java/io/ObjectOutputStream.java (working copy) @@ -1008,7 +1008,7 @@ */ private Integer writeClassDescForClass(Class objClass) throws IOException { - return writeClassDesc(ObjectStreamClass.lookup(objClass), false); + return writeClassDesc(objClass.getOSC(), false); } /** @@ -1500,8 +1500,7 @@ if (object.isEnum()) { writeEnumDesc(object, unshared); } else { - writeClassDesc(ObjectStreamClass.lookupStreamClass(object), - unshared); + writeClassDesc(object.getOSC(), unshared); } Integer previousHandle = objectsWritten.get(object); @@ -1646,7 +1645,7 @@ // place. // It allows writeExternal to call defaultWriteObject and have it work. currentObject = object; - currentClass = ObjectStreamClass.lookup(theClass); + currentClass = theClass.getOSC(); try { if (externalizable) { boolean noBlockData = protocolVersion == PROTOCOL_VERSION_1; @@ -1853,7 +1852,7 @@ if (ObjectStreamClass.isSerializable(object.getClass()) && computeClassBasedReplacement) { - ObjectStreamClass clDesc = ObjectStreamClass.lookupStreamClass(objClass); + ObjectStreamClass clDesc = objClass.getOSC(); if(clDesc.hasMethodWriteReplace()){ Method methodWriteReplace = clDesc.getMethodWriteReplace(); Object replObj = null; Index: working_classlib/modules/luni/src/main/java/java/io/ObjectStreamClass.java =================================================================== --- working_classlib/modules/luni/src/main/java/java/io/ObjectStreamClass.java (revision 612717) +++ working_classlib/modules/luni/src/main/java/java/io/ObjectStreamClass.java (working copy) @@ -204,7 +204,7 @@ * a boolean indicating if SUID should be computed or not. * @return the computer class descriptor */ - private static ObjectStreamClass createClassDesc(Class cl, + public static ObjectStreamClass createClassDesc(Class cl, boolean computeSUID) { ObjectStreamClass result = new ObjectStreamClass(); @@ -218,7 +218,7 @@ result.setClass(cl); Class superclass = cl.getSuperclass(); if (superclass != null) { - result.setSuperclass(lookup(superclass)); + result.setSuperclass(superclass.getOSC()); } Field[] declaredFields = null; @@ -897,7 +897,7 @@ return null; } - return lookupStreamClass(cl, true); + return cl.getOSC(); } /** @@ -930,6 +930,9 @@ boolean computeSUID) { // Synchronized because of the lookup table 'classesAndDescriptors' + throw new RuntimeException(); + +/* ObjectStreamClass cachedValue; synchronized (classesAndDescriptors) { cachedValue = classesAndDescriptors.get(cl); @@ -939,7 +942,7 @@ } } return cachedValue; - +*/ } /**