home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / java / io / ObjectInputStream.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  18.8 KB  |  1,296 lines

  1. package java.io;
  2.  
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Proxy;
  6. import java.util.ArrayList;
  7.  
  8. public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants {
  9.    // $FF: renamed from: in java.io.InputStream
  10.    private InputStream field_0;
  11.    private int count;
  12.    private boolean blockDataMode;
  13.    private byte[] buf;
  14.    private int bufpos;
  15.    private int bufsize;
  16.    private DataInputStream dis;
  17.    private IOException abortIOException = null;
  18.    private ClassNotFoundException abortClassNotFoundException = null;
  19.    private Object currentObject;
  20.    private ObjectStreamClass currentClassDesc;
  21.    private Class currentClass;
  22.    private Object currentGetFields;
  23.    private byte[] data = new byte[1024];
  24.    private char[] cdata = new char[50];
  25.    private static final int CDATA_MAX_LEN = 1000;
  26.    private StringBuffer sbuf = new StringBuffer();
  27.    ObjectStreamClass[] classdesc;
  28.    Class[] classes;
  29.    int spClass;
  30.    private ArrayList wireHandle2Object;
  31.    private int nextWireOffset;
  32.    private ArrayList callbacks;
  33.    private int recursionDepth;
  34.    private byte currCode;
  35.    boolean enableResolve;
  36.    private boolean enableSubclassImplementation;
  37.    private Object[] readObjectArglist = new Object[]{this};
  38.    // $FF: synthetic field
  39.    static Class class$java$io$Serializable;
  40.  
  41.    public ObjectInputStream(InputStream var1) throws IOException, StreamCorruptedException {
  42.       this.enableSubclassImplementation = false;
  43.       this.field_0 = var1;
  44.       this.buf = new byte[8];
  45.       this.dis = new DataInputStream(this);
  46.       this.readStreamHeader();
  47.       this.resetStream();
  48.    }
  49.  
  50.    protected ObjectInputStream() throws IOException, SecurityException {
  51.       SecurityManager var1 = System.getSecurityManager();
  52.       if (var1 != null) {
  53.          var1.checkPermission(ObjectStreamConstants.SUBCLASS_IMPLEMENTATION_PERMISSION);
  54.       }
  55.  
  56.       this.enableSubclassImplementation = true;
  57.    }
  58.  
  59.    public final Object readObject() throws OptionalDataException, ClassNotFoundException, IOException {
  60.       return this.enableSubclassImplementation ? this.readObjectOverride() : this.readObject(true);
  61.    }
  62.  
  63.    protected Object readObjectOverride() throws OptionalDataException, ClassNotFoundException, IOException {
  64.       return null;
  65.    }
  66.  
  67.    private final Object readObject(boolean var1) throws OptionalDataException, ClassNotFoundException, IOException {
  68.       if (this.blockDataMode) {
  69.          if (this.count == 0) {
  70.             this.refill();
  71.          }
  72.  
  73.          if (this.count > 0) {
  74.             throw new OptionalDataException(this.count);
  75.          }
  76.       }
  77.  
  78.       this.peekCode();
  79.       Object var2 = this.currentObject;
  80.       ObjectStreamClass var3 = this.currentClassDesc;
  81.       boolean var4 = this.setBlockData(false);
  82.       ++this.recursionDepth;
  83.       Object var5 = null;
  84.       byte var6 = this.readCode();
  85.  
  86.       try {
  87.          int var7 = -1;
  88.          switch (var6) {
  89.             case 112:
  90.                var5 = null;
  91.                break;
  92.             case 113:
  93.                var7 = this.readInt() - 8257536;
  94.  
  95.                try {
  96.                   var5 = this.wireHandle2Object.get(var7);
  97.                   break;
  98.                } catch (ArrayIndexOutOfBoundsException var20) {
  99.                   throw new StreamCorruptedException("Reference to object never serialized.");
  100.                }
  101.             case 114:
  102.                var5 = this.inputClassDescriptor();
  103.                break;
  104.             case 115:
  105.                var7 = this.inputObject(var1);
  106.                var5 = this.currentObject;
  107.                if (this.currentObject != null && this.currentClassDesc != null && this.currentClassDesc.isResolvable()) {
  108.                   var5 = ObjectStreamClass.invokeMethod(this.currentClassDesc.readResolveMethod, var5, (Object[])null);
  109.                }
  110.  
  111.                if (this.enableResolve) {
  112.                   var5 = this.resolveObject(var5);
  113.                }
  114.  
  115.                if (var5 != this.currentObject) {
  116.                   this.wireHandle2Object.set(var7, var5);
  117.                }
  118.                break;
  119.             case 116:
  120.             case 124:
  121.                long var30 = var6 == 116 ? (long)this.readUnsignedShort() : this.readLong();
  122.                var5 = this.readUTFBody(var30);
  123.                Object var33 = var5;
  124.                var7 = this.assignWireOffset(var5);
  125.                if (this.enableResolve) {
  126.                   var5 = this.resolveObject(var5);
  127.                }
  128.  
  129.                if (var5 != var33) {
  130.                   this.wireHandle2Object.set(var7, var5);
  131.                }
  132.                break;
  133.             case 117:
  134.                var7 = this.inputArray(var1);
  135.                var5 = this.currentObject;
  136.                if (this.enableResolve) {
  137.                   var5 = this.resolveObject(var5);
  138.                }
  139.  
  140.                if (var5 != this.currentObject) {
  141.                   this.wireHandle2Object.set(var7, var5);
  142.                }
  143.                break;
  144.             case 118:
  145.                ObjectStreamClass var8 = (ObjectStreamClass)this.readObject(var1);
  146.                if (var8 == null) {
  147.                   throw new StreamCorruptedException("Class not in stream");
  148.                }
  149.  
  150.                var5 = var8.forClass();
  151.                if (var5 == null && var1) {
  152.                   throw var8.pendingException;
  153.                }
  154.  
  155.                this.assignWireOffset(var5);
  156.                break;
  157.             case 119:
  158.             case 122:
  159.                if (var6 == 122) {
  160.                   int var32 = this.field_0.read();
  161.                   int var10 = this.field_0.read();
  162.                   int var11 = this.field_0.read();
  163.                   int var12 = this.field_0.read();
  164.                   if ((var32 | var10 | var11 | var12) < 0) {
  165.                      throw new StreamCorruptedException("EOF expecting count");
  166.                   }
  167.  
  168.                   this.count = var32 << 24 | var10 << 16 | var11 << 8 | var12;
  169.                   if (this.count < 0) {
  170.                      throw new StreamCorruptedException("Negative block data size");
  171.                   }
  172.                } else {
  173.                   this.count = this.field_0.read();
  174.                   if (this.count < 0) {
  175.                      throw new StreamCorruptedException("EOF expecting count");
  176.                   }
  177.                }
  178.  
  179.                if (!var4) {
  180.                   throw new StreamCorruptedException("Unexpected blockdata");
  181.                }
  182.  
  183.                throw new OptionalDataException(this.count);
  184.             case 120:
  185.                if (!var4) {
  186.                   throw new StreamCorruptedException("Unexpected end of block data");
  187.                }
  188.  
  189.                this.pushbackCode((byte)120);
  190.                this.count = -1;
  191.                throw new OptionalDataException(true);
  192.             case 121:
  193.             default:
  194.                throw new StreamCorruptedException("Unknown code in readObject " + var6);
  195.             case 123:
  196.                this.resetStream();
  197.                IOException var9 = (IOException)this.readObject();
  198.                this.resetStream();
  199.                throw new WriteAbortedException("Writing aborted by exception", var9);
  200.             case 125:
  201.                var5 = this.inputProxyClassDescriptor();
  202.          }
  203.       } catch (OptionalDataException var21) {
  204.          throw var21;
  205.       } catch (IOException var22) {
  206.          if (this.abortIOException == null && this.abortClassNotFoundException == null) {
  207.             this.abortIOException = var22;
  208.          }
  209.       } catch (ClassNotFoundException var23) {
  210.          if (this.abortIOException == null && this.abortClassNotFoundException == null) {
  211.             this.abortClassNotFoundException = var23;
  212.          }
  213.       } finally {
  214.          --this.recursionDepth;
  215.          this.currentObject = var2;
  216.          this.currentClassDesc = var3;
  217.          this.currentClass = this.currentClassDesc != null ? this.currentClassDesc.forClass() : null;
  218.          this.setBlockData(var4);
  219.       }
  220.  
  221.       IOException var29 = this.abortIOException;
  222.       if (this.recursionDepth == 0) {
  223.          this.abortIOException = null;
  224.       }
  225.  
  226.       if (var29 != null) {
  227.          throw var29;
  228.       } else {
  229.          ClassNotFoundException var31 = this.abortClassNotFoundException;
  230.          if (this.recursionDepth == 0) {
  231.             this.abortClassNotFoundException = null;
  232.          }
  233.  
  234.          if (var31 != null) {
  235.             throw var31;
  236.          } else {
  237.             if (this.recursionDepth == 0) {
  238.                this.doValidations();
  239.             }
  240.  
  241.             return var5;
  242.          }
  243.       }
  244.    }
  245.  
  246.    public void defaultReadObject() throws IOException, ClassNotFoundException, NotActiveException {
  247.       if (this.currentObject != null && this.currentClassDesc != null) {
  248.          ObjectStreamField[] var1 = this.currentClassDesc.getFieldsNoCopy();
  249.          if (var1.length > 0) {
  250.             boolean var2 = this.setBlockData(false);
  251.             this.inputClassFields(this.currentObject, this.currentClass, var1);
  252.             this.setBlockData(var2);
  253.          }
  254.  
  255.       } else {
  256.          throw new NotActiveException("defaultReadObject");
  257.       }
  258.    }
  259.  
  260.    public GetField readFields() throws IOException, ClassNotFoundException, NotActiveException {
  261.       if (this.currentObject != null && this.currentClassDesc != null) {
  262.          GetFieldImpl var1 = new GetFieldImpl(this.currentClassDesc);
  263.          this.currentGetFields = var1;
  264.          boolean var2 = this.setBlockData(false);
  265.          var1.read(this);
  266.          this.setBlockData(var2);
  267.          return var1;
  268.       } else {
  269.          throw new NotActiveException("defaultReadObject");
  270.       }
  271.    }
  272.  
  273.    public synchronized void registerValidation(ObjectInputValidation var1, int var2) throws NotActiveException, InvalidObjectException {
  274.       if (this.recursionDepth == 0) {
  275.          throw new NotActiveException("readObject not Active");
  276.       } else if (var1 == null) {
  277.          throw new InvalidObjectException("Null is not a valid callback object");
  278.       } else {
  279.          ValidationCallback var3 = new ValidationCallback(var1, var2);
  280.          if (this.callbacks == null) {
  281.             this.callbacks = new ArrayList();
  282.          }
  283.  
  284.          if (!this.callbacks.isEmpty() && ((ValidationCallback)this.callbacks.get(this.callbacks.size() - 1)).priority < var2) {
  285.             int var4 = this.callbacks.size();
  286.  
  287.             for(int var5 = 0; var5 < var4; ++var5) {
  288.                ValidationCallback var6 = (ValidationCallback)this.callbacks.get(var5);
  289.                if (var6.priority <= var2) {
  290.                   this.callbacks.add(var5, var3);
  291.                   break;
  292.                }
  293.             }
  294.  
  295.          } else {
  296.             this.callbacks.add(var3);
  297.          }
  298.       }
  299.    }
  300.  
  301.    private void doValidations() throws InvalidObjectException {
  302.       if (this.callbacks != null) {
  303.          int var1 = this.callbacks.size();
  304.  
  305.          for(int var2 = 0; var2 < var1; ++var2) {
  306.             ValidationCallback var3 = (ValidationCallback)this.callbacks.get(var2);
  307.             var3.callback.validateObject();
  308.          }
  309.  
  310.          this.callbacks.clear();
  311.       }
  312.    }
  313.  
  314.    protected Class resolveClass(ObjectStreamClass var1) throws IOException, ClassNotFoundException {
  315.       ClassLoader var2 = latestUserDefinedLoader();
  316.       return Class.forName(var1.getName(), false, var2);
  317.    }
  318.  
  319.    protected Class resolveProxyClass(String[] var1) throws IOException, ClassNotFoundException {
  320.       ClassLoader var2 = latestUserDefinedLoader();
  321.       Class[] var3 = new Class[var1.length];
  322.  
  323.       for(int var4 = 0; var4 < var1.length; ++var4) {
  324.          var3[var4] = Class.forName(var1[var4], false, var2);
  325.       }
  326.  
  327.       try {
  328.          return Proxy.getProxyClass(var2, var3);
  329.       } catch (IllegalArgumentException var6) {
  330.          throw new ClassNotFoundException((String)null, var6);
  331.       }
  332.    }
  333.  
  334.    private static native ClassLoader latestUserDefinedLoader() throws ClassNotFoundException;
  335.  
  336.    private Class loadClass0(Class var1, String var2) throws ClassNotFoundException {
  337.       ClassLoader var3;
  338.       if (var1 != null) {
  339.          var3 = var1.getClassLoader();
  340.       } else {
  341.          var3 = latestUserDefinedLoader();
  342.       }
  343.  
  344.       return Class.forName(var2, false, var3);
  345.    }
  346.  
  347.    protected Object resolveObject(Object var1) throws IOException {
  348.       return var1;
  349.    }
  350.  
  351.    protected boolean enableResolveObject(boolean var1) throws SecurityException {
  352.       boolean var2 = this.enableResolve;
  353.       if (var1) {
  354.          SecurityManager var3 = System.getSecurityManager();
  355.          if (var3 != null) {
  356.             var3.checkPermission(ObjectStreamConstants.SUBSTITUTION_PERMISSION);
  357.          }
  358.  
  359.          this.enableResolve = true;
  360.       } else {
  361.          this.enableResolve = false;
  362.       }
  363.  
  364.       return var2;
  365.    }
  366.  
  367.    protected void readStreamHeader() throws IOException, StreamCorruptedException {
  368.       short var1 = 0;
  369.       short var2 = 0;
  370.  
  371.       try {
  372.          var1 = this.readShort();
  373.          var2 = this.readShort();
  374.       } catch (EOFException var4) {
  375.          throw new StreamCorruptedException("Caught EOFException while reading the stream header");
  376.       }
  377.  
  378.       if (var1 != -21267) {
  379.          throw new StreamCorruptedException("InputStream does not contain a serialized object");
  380.       } else if (var2 != 5) {
  381.          throw new StreamCorruptedException("Version Mismatch, Expected 5 and got " + var2);
  382.       }
  383.    }
  384.  
  385.    protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
  386.       String var1 = this.readUTF();
  387.       long var2 = this.readLong();
  388.       ObjectStreamClass var4 = new ObjectStreamClass(var1, var2);
  389.       var4.read(this);
  390.       return var4;
  391.    }
  392.  
  393.    private ObjectStreamClass inputClassDescriptor() throws IOException, InvalidClassException, ClassNotFoundException {
  394.       ObjectStreamClass var2 = new ObjectStreamClass((String)null, 0L);
  395.       this.assignWireOffset(var2);
  396.       ObjectStreamClass var4 = this.readClassDescriptor();
  397.       var2.lightCopy(var4);
  398.       boolean var5 = this.setBlockData(true);
  399.  
  400.       Class var1;
  401.       try {
  402.          var1 = this.resolveClass(var2);
  403.       } catch (ClassNotFoundException var7) {
  404.          var1 = null;
  405.          var2.pendingException = var7;
  406.       }
  407.  
  408.       this.skipToEndOfBlockData();
  409.       this.setBlockData(var5);
  410.       var2.setClass(var1);
  411.       ObjectStreamClass var6 = (ObjectStreamClass)this.readObject();
  412.       var2.setSuperclass(var6);
  413.       return var2;
  414.    }
  415.  
  416.    private ObjectStreamClass inputProxyClassDescriptor() throws IOException, InvalidClassException, ClassNotFoundException {
  417.       ObjectStreamClass var1 = new ObjectStreamClass("", 0L);
  418.       this.assignWireOffset(var1);
  419.       int var3 = this.readInt();
  420.       String[] var4 = new String[var3];
  421.  
  422.       for(int var5 = 0; var5 < var3; ++var5) {
  423.          var4[var5] = this.readUTF();
  424.       }
  425.  
  426.       boolean var7 = this.setBlockData(true);
  427.  
  428.       Class var6;
  429.       try {
  430.          var6 = this.resolveProxyClass(var4);
  431.       } catch (ClassNotFoundException var9) {
  432.          var6 = null;
  433.          var1.pendingException = var9;
  434.       }
  435.  
  436.       this.skipToEndOfBlockData();
  437.       this.setBlockData(var7);
  438.       var1.initProxyClassDesc(var6);
  439.       var1.setClass(var6);
  440.       ObjectStreamClass var8 = (ObjectStreamClass)this.readObject();
  441.       var1.setSuperclass(var8);
  442.       return var1;
  443.    }
  444.  
  445.    private int inputArray(boolean var1) throws IOException, ClassNotFoundException {
  446.       ObjectStreamClass var2 = (ObjectStreamClass)this.readObject();
  447.       Class var3 = var2.forClass();
  448.       if (var3 == null && var1) {
  449.          throw var2.pendingException;
  450.       } else {
  451.          int var4 = this.readInt();
  452.          this.currentObject = var3 == null ? null : allocateNewArray(var3, var4);
  453.          int var5 = this.assignWireOffset(this.currentObject);
  454.          if (var3 != null && var3.getComponentType().isPrimitive()) {
  455.             Class var20 = var3.getComponentType();
  456.             int var21 = this.data.length;
  457.             int var22 = this.data.length;
  458.             if (var20 == Boolean.TYPE) {
  459.                boolean[] var10 = (boolean[])this.currentObject;
  460.  
  461.                for(int var13 = 0; var13 < var4; ++var13) {
  462.                   if (var21 >= var22) {
  463.                      int var11 = Math.min(var4 - var13, var22);
  464.                      this.readFully(this.data, 0, var11);
  465.                      var21 = 0;
  466.                   }
  467.  
  468.                   var10[var13] = this.data[var21] != 0;
  469.                   ++var21;
  470.                }
  471.             } else if (var20 == Byte.TYPE) {
  472.                byte[] var23 = (byte[])this.currentObject;
  473.  
  474.                int var12;
  475.                for(int var30 = 0; var30 < var4; var30 += var12) {
  476.                   var12 = Math.min(var4 - var30, var22);
  477.                   this.readFully(this.data, 0, var12);
  478.                   System.arraycopy(this.data, 0, var23, var30, var12);
  479.                }
  480.             } else if (var20 == Short.TYPE) {
  481.                short[] var24 = (short[])this.currentObject;
  482.  
  483.                for(int var14 = 0; var14 < var4; ++var14) {
  484.                   if (var21 > var22 - 2) {
  485.                      int var31 = Math.min((var4 - var14) * 2, var22);
  486.                      this.readFully(this.data, 0, var31);
  487.                      var21 = 0;
  488.                   }
  489.  
  490.                   var24[var14] = (short)(((this.data[var21] & 255) << 8) + ((this.data[var21 + 1] & 255) << 0));
  491.                   var21 += 2;
  492.                }
  493.             } else if (var20 == Integer.TYPE) {
  494.                int[] var25 = (int[])this.currentObject;
  495.  
  496.                for(int var15 = 0; var15 < var4; ++var15) {
  497.                   if (var21 > var22 - 4) {
  498.                      int var32 = Math.min(var4 - var15 << 2, var22);
  499.                      this.readFully(this.data, 0, var32);
  500.                      var21 = 0;
  501.                   }
  502.  
  503.                   var25[var15] = ((this.data[var21] & 255) << 24) + ((this.data[var21 + 1] & 255) << 16) + ((this.data[var21 + 2] & 255) << 8) + ((this.data[var21 + 3] & 255) << 0);
  504.                   var21 += 4;
  505.                }
  506.             } else if (var20 == Long.TYPE) {
  507.                long[] var26 = (long[])this.currentObject;
  508.  
  509.                for(int var16 = 0; var16 < var4; ++var16) {
  510.                   if (var21 > var22 - 8) {
  511.                      int var33 = Math.min(var4 - var16 << 3, var22);
  512.                      this.readFully(this.data, 0, var33);
  513.                      var21 = 0;
  514.                   }
  515.  
  516.                   int var34 = ((this.data[var21] & 255) << 24) + ((this.data[var21 + 1] & 255) << 16) + ((this.data[var21 + 2] & 255) << 8) + ((this.data[var21 + 3] & 255) << 0);
  517.                   int var38 = ((this.data[var21 + 4] & 255) << 24) + ((this.data[var21 + 5] & 255) << 16) + ((this.data[var21 + 6] & 255) << 8) + ((this.data[var21 + 7] & 255) << 0);
  518.                   var26[var16] = ((long)var34 << 32) + ((long)var38 & 4294967295L);
  519.                   var21 += 8;
  520.                }
  521.             } else if (var20 == Float.TYPE) {
  522.                float[] var27 = (float[])this.currentObject;
  523.  
  524.                int var35;
  525.                for(int var17 = 0; var17 < var4; var17 += var35) {
  526.                   var35 = Math.min(var4 - var17, var22 >> 2);
  527.                   this.readFully(this.data, 0, var35 << 2);
  528.                   bytesToFloats(this.data, 0, var27, var17, var35);
  529.                }
  530.             } else if (var20 == Double.TYPE) {
  531.                double[] var28 = (double[])this.currentObject;
  532.  
  533.                int var36;
  534.                for(int var18 = 0; var18 < var4; var18 += var36) {
  535.                   var36 = Math.min(var4 - var18, var22 >> 3);
  536.                   this.readFully(this.data, 0, var36 << 3);
  537.                   bytesToDoubles(this.data, 0, var28, var18, var36);
  538.                }
  539.             } else {
  540.                if (var20 != Character.TYPE) {
  541.                   throw new InvalidClassException(var3.getName());
  542.                }
  543.  
  544.                char[] var29 = (char[])this.currentObject;
  545.  
  546.                for(int var19 = 0; var19 < var4; ++var19) {
  547.                   if (var21 > var22 - 2) {
  548.                      int var37 = Math.min((var4 - var19) * 2, var22);
  549.                      this.readFully(this.data, 0, var37);
  550.                      var21 = 0;
  551.                   }
  552.  
  553.                   var29[var19] = (char)(((this.data[var21] & 255) << 8) + ((this.data[var21 + 1] & 255) << 0));
  554.                   var21 += 2;
  555.                }
  556.             }
  557.          } else {
  558.             Object[] var7 = this.currentObject;
  559.             boolean var8 = var3 != null;
  560.  
  561.             for(int var6 = 0; var6 < var4; ++var6) {
  562.                Object var9 = this.readObject(var8);
  563.                if (var7 != null) {
  564.                   var7[var6] = var9;
  565.                }
  566.             }
  567.          }
  568.  
  569.          return var5;
  570.       }
  571.    }
  572.  
  573.    private static native void bytesToFloats(byte[] var0, int var1, float[] var2, int var3, int var4);
  574.  
  575.    private static native void bytesToDoubles(byte[] var0, int var1, double[] var2, int var3, int var4);
  576.  
  577.    private int inputObject(boolean var1) throws IOException, ClassNotFoundException {
  578.       int var2 = -1;
  579.       this.currentClassDesc = (ObjectStreamClass)this.readObject();
  580.       this.currentClass = this.currentClassDesc.forClass();
  581.       if (this.currentClass == null && var1) {
  582.          throw this.currentClassDesc.pendingException;
  583.       } else {
  584.          if (var1) {
  585.             this.currentClassDesc.verifyInstanceDeserialization();
  586.          }
  587.  
  588.          if (this.currentClassDesc.isExternalizable()) {
  589.             try {
  590.                this.currentObject = this.currentClass == null ? null : allocateNewObject(this.currentClass, this.currentClass);
  591.                var2 = this.assignWireOffset(this.currentObject);
  592.                boolean var3 = this.blockDataMode;
  593.  
  594.                try {
  595.                   if (this.currentClassDesc.hasExternalizableBlockDataMode()) {
  596.                      var3 = this.setBlockData(true);
  597.                   }
  598.  
  599.                   if (this.currentObject != null) {
  600.                      Externalizable var4 = (Externalizable)this.currentObject;
  601.                      var4.readExternal(this);
  602.                   }
  603.                } finally {
  604.                   if (this.currentClassDesc.hasExternalizableBlockDataMode()) {
  605.                      this.skipToEndOfBlockData();
  606.                      this.setBlockData(var3);
  607.                   }
  608.  
  609.                }
  610.             } catch (NoSuchMethodError var32) {
  611.                throw new InvalidClassException(this.currentClass.getName() + "Missing no-arg constructor for class");
  612.             } catch (IllegalAccessException var33) {
  613.                throw new InvalidClassException(this.currentClass.getName(), "IllegalAccessException");
  614.             } catch (InstantiationException var34) {
  615.                throw new InvalidClassException(this.currentClass.getName(), "InstantiationException");
  616.             }
  617.          } else {
  618.             if (this.currentClassDesc.ancestors == null) {
  619.                ObjectStreamClass var37 = this.currentClassDesc;
  620.                Class var40 = this.currentClass;
  621.                int var6 = this.spClass;
  622.                var37 = this.currentClassDesc;
  623.  
  624.                for(var40 = this.currentClass; var37 != null; var37 = var37.superclass) {
  625.                   Class var7 = var37.forClass();
  626.  
  627.                   Class var8;
  628.                   for(var8 = var40; var8 != null && var7 != var8; var8 = var8.getSuperclass()) {
  629.                   }
  630.  
  631.                   if (this.spClass >= this.classes.length) {
  632.                      this.growClassStacks();
  633.                   }
  634.  
  635.                   if (var8 == null) {
  636.                      this.classdesc[this.spClass] = var37;
  637.                      this.classes[this.spClass] = null;
  638.                   } else {
  639.                      this.classdesc[this.spClass] = var37;
  640.                      this.classes[this.spClass] = var8;
  641.                      var40 = var8.getSuperclass();
  642.                   }
  643.  
  644.                   ++this.spClass;
  645.                }
  646.  
  647.                if (var40 != null) {
  648.                   while((class$java$io$Serializable == null ? (class$java$io$Serializable = class$("java.io.Serializable")) : class$java$io$Serializable).isAssignableFrom(var40)) {
  649.                      var40 = var40.getSuperclass();
  650.                   }
  651.                }
  652.  
  653.                int var5 = this.spClass - var6;
  654.                this.currentClassDesc.ancestors = new Class[var5 + 1];
  655.  
  656.                for(int var45 = 0; var45 < var5; ++var45) {
  657.                   this.currentClassDesc.ancestors[var45] = this.classes[var6 + var45];
  658.                }
  659.  
  660.                this.currentClassDesc.ancestors[var5] = var40;
  661.                this.spClass = var6;
  662.             }
  663.  
  664.             int var43 = this.currentClassDesc.ancestors.length - 1;
  665.             Class var42 = this.currentClassDesc.ancestors[var43];
  666.  
  667.             try {
  668.                this.currentObject = this.currentClass == null ? null : allocateNewObject(this.currentClass, var42);
  669.             } catch (NoSuchMethodError var28) {
  670.                throw new InvalidClassException(var42.getName() + "Missing no-arg constructor for class");
  671.             } catch (IllegalAccessException var29) {
  672.                throw new InvalidClassException(var42.getName(), "IllegalAccessException");
  673.             } catch (InstantiationException var30) {
  674.                throw new InvalidClassException(var42.getName(), "InstantiationException");
  675.             }
  676.  
  677.             var2 = this.assignWireOffset(this.currentObject);
  678.             int var44 = this.spClass;
  679.  
  680.             for(ObjectStreamClass var39 = this.currentClassDesc; var39 != null; var39 = var39.superclass) {
  681.                if (this.spClass >= this.classes.length) {
  682.                   this.growClassStacks();
  683.                }
  684.  
  685.                this.classdesc[this.spClass] = var39;
  686.                this.classes[this.spClass] = this.currentClassDesc.ancestors[this.spClass - var44];
  687.                ++this.spClass;
  688.             }
  689.  
  690.             try {
  691.                --this.spClass;
  692.  
  693.                while(this.spClass >= var44) {
  694.                   this.currentClassDesc = this.classdesc[this.spClass];
  695.                   this.currentClass = this.classes[this.spClass];
  696.                   if (this.classes[this.spClass] != null) {
  697.                      this.setBlockData(true);
  698.                      ObjectStreamClass var46 = this.currentClassDesc.localClassDescriptor();
  699.                      if (!this.invokeObjectReader(this.currentObject)) {
  700.                         this.defaultReadObject();
  701.                      }
  702.                   } else {
  703.                      ObjectStreamField[] var47 = this.currentClassDesc.getFieldsNoCopy();
  704.                      if (var47.length > 0) {
  705.                         boolean var48 = this.setBlockData(false);
  706.                         this.inputClassFields((Object)null, this.currentClass, var47);
  707.                         this.setBlockData(var48);
  708.                      }
  709.                   }
  710.  
  711.                   if (this.currentClassDesc.hasWriteObject()) {
  712.                      this.skipToEndOfBlockData();
  713.                   }
  714.  
  715.                   this.setBlockData(false);
  716.                   --this.spClass;
  717.                }
  718.             } finally {
  719.                this.spClass = var44;
  720.             }
  721.          }
  722.  
  723.          return var2;
  724.       }
  725.    }
  726.  
  727.    private void growClassStacks() {
  728.       int var1 = this.classes.length * 2;
  729.       Class[] var2 = new Class[var1];
  730.       ObjectStreamClass[] var3 = new ObjectStreamClass[var1];
  731.       System.arraycopy(this.classes, 0, var2, 0, this.classes.length);
  732.       System.arraycopy(this.classdesc, 0, var3, 0, this.classes.length);
  733.       this.classes = var2;
  734.       this.classdesc = var3;
  735.    }
  736.  
  737.    private void skipToEndOfBlockData() throws IOException, ClassNotFoundException {
  738.       if (this.blockDataMode) {
  739.          while(true) {
  740.             while(this.count > 0) {
  741.                ((InputStream)this).skip((long)this.count);
  742.             }
  743.  
  744.             switch (this.peekCode()) {
  745.                case -1:
  746.                   return;
  747.                case 119:
  748.                case 122:
  749.                   this.refill();
  750.                   break;
  751.                case 120:
  752.                   this.readCode();
  753.                   return;
  754.                default:
  755.                   this.readObject(false);
  756.             }
  757.          }
  758.       }
  759.    }
  760.  
  761.    private void resetStream() throws IOException {
  762.       if (this.wireHandle2Object == null) {
  763.          this.wireHandle2Object = new ArrayList();
  764.       } else {
  765.          this.wireHandle2Object.clear();
  766.       }
  767.  
  768.       this.nextWireOffset = 0;
  769.       if (this.classes == null) {
  770.          this.classes = new Class[20];
  771.       } else {
  772.          for(int var1 = 0; var1 < this.classes.length; ++var1) {
  773.             this.classes[var1] = null;
  774.          }
  775.       }
  776.  
  777.       if (this.classdesc == null) {
  778.          this.classdesc = new ObjectStreamClass[20];
  779.       } else {
  780.          for(int var2 = 0; var2 < this.classdesc.length; ++var2) {
  781.             this.classdesc[var2] = null;
  782.          }
  783.       }
  784.  
  785.       this.spClass = 0;
  786.       this.setBlockData(true);
  787.       if (this.callbacks != null) {
  788.          this.callbacks.clear();
  789.       }
  790.  
  791.    }
  792.  
  793.    private int assignWireOffset(Object var1) throws IOException {
  794.       this.wireHandle2Object.add(var1);
  795.       if (++this.nextWireOffset != this.wireHandle2Object.size()) {
  796.          throw new StreamCorruptedException("Elements not assigned in order");
  797.       } else {
  798.          return this.nextWireOffset - 1;
  799.       }
  800.    }
  801.  
  802.    private byte peekCode() throws IOException, StreamCorruptedException {
  803.       while(this.currCode == 0) {
  804.          int var1 = this.field_0.read();
  805.          if (var1 < 0) {
  806.             throw new EOFException("Expecting code");
  807.          }
  808.  
  809.          this.currCode = (byte)var1;
  810.          if (this.currCode >= 112 && this.currCode <= 125) {
  811.             if (this.currCode != 121) {
  812.                continue;
  813.             }
  814.  
  815.             if (this.recursionDepth == 0 && this.currentObject == null && this.currentClassDesc == null) {
  816.                this.resetStream();
  817.                this.currCode = 0;
  818.                continue;
  819.             }
  820.  
  821.             throw new StreamCorruptedException("Illegal stream state for reset");
  822.          }
  823.  
  824.          throw new StreamCorruptedException("Type code out of range, is " + this.currCode);
  825.       }
  826.  
  827.       return this.currCode;
  828.    }
  829.  
  830.    private byte readCode() throws IOException, StreamCorruptedException {
  831.       byte var1 = this.peekCode();
  832.       this.currCode = 0;
  833.       return var1;
  834.    }
  835.  
  836.    private void pushbackCode(byte var1) {
  837.       this.currCode = var1;
  838.    }
  839.  
  840.    private boolean setBlockData(boolean var1) throws IOException {
  841.       if (this.blockDataMode == var1) {
  842.          return var1;
  843.       } else if (this.blockDataMode && this.count > 0) {
  844.          throw new StreamCorruptedException("Unread data");
  845.       } else {
  846.          this.count = var1 ? 0 : -1;
  847.          this.bufpos = 0;
  848.          this.bufsize = 0;
  849.          this.blockDataMode = var1;
  850.          return !var1;
  851.       }
  852.    }
  853.  
  854.    public int read() throws IOException {
  855.       if (!this.blockDataMode) {
  856.          return this.field_0.read();
  857.       } else {
  858.          while(this.count == 0) {
  859.             this.refill();
  860.          }
  861.  
  862.          if (this.count < 0) {
  863.             return -1;
  864.          } else {
  865.             try {
  866.                int var1 = this.bufferData(1);
  867.                return this.buf[var1] & 255;
  868.             } catch (EOFException var2) {
  869.                return -1;
  870.             }
  871.          }
  872.       }
  873.    }
  874.  
  875.    private void refill() throws IOException {
  876.       this.count = -1;
  877.  
  878.       byte var1;
  879.       try {
  880.          var1 = this.peekCode();
  881.       } catch (EOFException var7) {
  882.          return;
  883.       }
  884.  
  885.       if (var1 == 119) {
  886.          var1 = this.readCode();
  887.          int var2 = this.field_0.read();
  888.          if (var2 < 0) {
  889.             throw new StreamCorruptedException("EOF expecting count");
  890.          }
  891.  
  892.          this.count = var2 & 255;
  893.       } else if (var1 == 122) {
  894.          var1 = this.readCode();
  895.          int var10 = this.field_0.read();
  896.          int var3 = this.field_0.read();
  897.          int var4 = this.field_0.read();
  898.          int var5 = this.field_0.read();
  899.          if ((var10 | var3 | var4 | var5) < 0) {
  900.             throw new StreamCorruptedException("EOF expecting count");
  901.          }
  902.  
  903.          int var6 = var10 << 24 | var3 << 16 | var4 << 8 | var5;
  904.          if (var6 < 0) {
  905.             throw new StreamCorruptedException("Negative block data size");
  906.          }
  907.  
  908.          this.count = var6;
  909.       }
  910.  
  911.    }
  912.  
  913.    int bufferData(int var1) throws IOException {
  914.       this.ensureBufferCapacity(var1);
  915.       if (this.blockDataMode) {
  916.          if (var1 > this.count) {
  917.             throw new InternalError("attempt to read past block end");
  918.          } else {
  919.             int var2 = this.bufsize - this.bufpos;
  920.             if (var1 > var2) {
  921.                if (this.bufpos > 0) {
  922.                   System.arraycopy(this.buf, this.bufpos, this.buf, 0, var2);
  923.                   this.bufpos = 0;
  924.                   this.bufsize = var2;
  925.                }
  926.  
  927.                this.ensureBufferCapacity(this.count);
  928.                this.readFullyInternal(this.buf, this.bufsize, this.count - this.bufsize);
  929.                this.bufsize = this.count;
  930.             }
  931.  
  932.             int var3 = this.bufpos;
  933.             this.bufpos += var1;
  934.             this.count -= var1;
  935.             return var3;
  936.          }
  937.       } else {
  938.          this.readFullyInternal(this.buf, 0, var1);
  939.          return 0;
  940.       }
  941.    }
  942.  
  943.    private void ensureBufferCapacity(int var1) {
  944.       if (this.buf.length < var1) {
  945.          byte[] var2 = new byte[var1];
  946.          if (this.bufsize > 0) {
  947.             System.arraycopy(this.buf, 0, var2, 0, this.bufsize);
  948.          }
  949.  
  950.          this.buf = var2;
  951.       }
  952.  
  953.    }
  954.  
  955.    private void readFullyInternal(byte[] var1, int var2, int var3) throws IOException {
  956.       int var5;
  957.       for(int var4 = 0; var4 < var3; var4 += var5) {
  958.          var5 = this.field_0.read(var1, var2 + var4, var3 - var4);
  959.          if (var5 < 0) {
  960.             throw new EOFException();
  961.          }
  962.       }
  963.  
  964.    }
  965.  
  966.    public int read(byte[] var1, int var2, int var3) throws IOException {
  967.       if (var1 == null) {
  968.          throw new NullPointerException();
  969.       } else if (var2 >= 0 && var3 >= 0 && var2 + var3 <= var1.length && var2 + var3 >= 0) {
  970.          if (var3 == 0) {
  971.             return 0;
  972.          } else if (!this.blockDataMode) {
  973.             return this.field_0.read(var1, var2, var3);
  974.          } else {
  975.             while(this.count == 0) {
  976.                this.refill();
  977.             }
  978.  
  979.             if (this.count < 0) {
  980.                return -1;
  981.             } else {
  982.                var3 = Math.min(var3, this.count);
  983.                int var4 = 0;
  984.                int var5 = this.bufsize - this.bufpos;
  985.                if (var5 > 0) {
  986.                   var4 = Math.min(var3, var5);
  987.                   System.arraycopy(this.buf, this.bufpos, var1, var2, var4);
  988.                   this.bufpos += var4;
  989.                }
  990.  
  991.                if (var3 > var4) {
  992.                   var4 += this.field_0.read(var1, var2 + var4, var3 - var4);
  993.                }
  994.  
  995.                this.count -= var4;
  996.                return var4;
  997.             }
  998.          }
  999.       } else {
  1000.          throw new IndexOutOfBoundsException();
  1001.       }
  1002.    }
  1003.  
  1004.    public int available() throws IOException {
  1005.       if (this.blockDataMode) {
  1006.          if (this.count == 0 && this.field_0.available() > 0) {
  1007.             this.refill();
  1008.          }
  1009.  
  1010.          return this.count >= 0 ? this.count : 0;
  1011.       } else {
  1012.          return 0;
  1013.       }
  1014.    }
  1015.  
  1016.    public void close() throws IOException {
  1017.       this.field_0.close();
  1018.    }
  1019.  
  1020.    public boolean readBoolean() throws IOException {
  1021.       int var1 = this.read();
  1022.       if (var1 < 0) {
  1023.          throw new EOFException();
  1024.       } else {
  1025.          return var1 != 0;
  1026.       }
  1027.    }
  1028.  
  1029.    public byte readByte() throws IOException {
  1030.       int var1 = this.read();
  1031.       if (var1 < 0) {
  1032.          throw new EOFException();
  1033.       } else {
  1034.          return (byte)var1;
  1035.       }
  1036.    }
  1037.  
  1038.    public int readUnsignedByte() throws IOException {
  1039.       int var1 = this.read();
  1040.       if (var1 < 0) {
  1041.          throw new EOFException();
  1042.       } else {
  1043.          return var1;
  1044.       }
  1045.    }
  1046.  
  1047.    public short readShort() throws IOException {
  1048.       if (this.blockDataMode && this.count < 2) {
  1049.          return this.dis.readShort();
  1050.       } else {
  1051.          int var1 = this.bufferData(2);
  1052.          return (short)(((this.buf[var1 + 0] & 255) << 8) + ((this.buf[var1 + 1] & 255) << 0));
  1053.       }
  1054.    }
  1055.  
  1056.    public int readUnsignedShort() throws IOException {
  1057.       if (this.blockDataMode && this.count < 2) {
  1058.          return this.dis.readUnsignedShort();
  1059.       } else {
  1060.          int var1 = this.bufferData(2);
  1061.          return ((this.buf[var1 + 0] & 255) << 8) + ((this.buf[var1 + 1] & 255) << 0);
  1062.       }
  1063.    }
  1064.  
  1065.    public char readChar() throws IOException {
  1066.       if (this.blockDataMode && this.count < 2) {
  1067.          return this.dis.readChar();
  1068.       } else {
  1069.          int var1 = this.bufferData(2);
  1070.          return (char)(((this.buf[var1 + 0] & 255) << 8) + ((this.buf[var1 + 1] & 255) << 0));
  1071.       }
  1072.    }
  1073.  
  1074.    public int readInt() throws IOException {
  1075.       if (this.blockDataMode && this.count < 4) {
  1076.          return this.dis.readInt();
  1077.       } else {
  1078.          int var1 = this.bufferData(4);
  1079.          return ((this.buf[var1 + 0] & 255) << 24) + ((this.buf[var1 + 1] & 255) << 16) + ((this.buf[var1 + 2] & 255) << 8) + ((this.buf[var1 + 3] & 255) << 0);
  1080.       }
  1081.    }
  1082.  
  1083.    public long readLong() throws IOException {
  1084.       if (this.blockDataMode && this.count < 8) {
  1085.          return this.dis.readLong();
  1086.       } else {
  1087.          int var1 = this.bufferData(8);
  1088.          return (((long)this.buf[var1 + 0] & 255L) << 56) + (((long)this.buf[var1 + 1] & 255L) << 48) + (((long)this.buf[var1 + 2] & 255L) << 40) + (((long)this.buf[var1 + 3] & 255L) << 32) + (((long)this.buf[var1 + 4] & 255L) << 24) + (((long)this.buf[var1 + 5] & 255L) << 16) + (((long)this.buf[var1 + 6] & 255L) << 8) + (((long)this.buf[var1 + 7] & 255L) << 0);
  1089.       }
  1090.    }
  1091.  
  1092.    public float readFloat() throws IOException {
  1093.       if (this.blockDataMode && this.count < 4) {
  1094.          return this.dis.readFloat();
  1095.       } else {
  1096.          int var1 = this.bufferData(4);
  1097.          return Float.intBitsToFloat(((this.buf[var1 + 0] & 255) << 24) + ((this.buf[var1 + 1] & 255) << 16) + ((this.buf[var1 + 2] & 255) << 8) + ((this.buf[var1 + 3] & 255) << 0));
  1098.       }
  1099.    }
  1100.  
  1101.    public double readDouble() throws IOException {
  1102.       if (this.blockDataMode && this.count < 8) {
  1103.          return this.dis.readDouble();
  1104.       } else {
  1105.          int var1 = this.bufferData(8);
  1106.          return Double.longBitsToDouble((((long)this.buf[var1 + 0] & 255L) << 56) + (((long)this.buf[var1 + 1] & 255L) << 48) + (((long)this.buf[var1 + 2] & 255L) << 40) + (((long)this.buf[var1 + 3] & 255L) << 32) + (((long)this.buf[var1 + 4] & 255L) << 24) + (((long)this.buf[var1 + 5] & 255L) << 16) + (((long)this.buf[var1 + 6] & 255L) << 8) + (((long)this.buf[var1 + 7] & 255L) << 0));
  1107.       }
  1108.    }
  1109.  
  1110.    public void readFully(byte[] var1) throws IOException {
  1111.       this.dis.readFully(var1);
  1112.    }
  1113.  
  1114.    public void readFully(byte[] var1, int var2, int var3) throws IOException {
  1115.       if (var3 < 0) {
  1116.          throw new IndexOutOfBoundsException();
  1117.       } else {
  1118.          this.dis.readFully(var1, var2, var3);
  1119.       }
  1120.    }
  1121.  
  1122.    public int skipBytes(int var1) throws IOException {
  1123.       return this.dis.skipBytes(var1);
  1124.    }
  1125.  
  1126.    public String readLine() throws IOException {
  1127.       return this.dis.readLine();
  1128.    }
  1129.  
  1130.    public String readUTF() throws IOException {
  1131.       return this.readUTFBody((long)this.readUnsignedShort());
  1132.    }
  1133.  
  1134.    private String readUTFBody(long var1) throws IOException {
  1135.       long var4 = var1;
  1136.       int var6 = 0;
  1137.       int var7 = 0;
  1138.       int var8 = 0;
  1139.       int var9 = this.cdata.length;
  1140.       if (var1 > (long)var9 && var9 < 1000) {
  1141.          this.cdata = new char[(int)Math.min(var1, 1000L)];
  1142.          var9 = this.cdata.length;
  1143.       }
  1144.  
  1145.       while(var4 > 0L) {
  1146.          int var13 = var7 - var6;
  1147.          if (var13 > 0) {
  1148.             System.arraycopy(this.data, var6, this.data, 0, var13);
  1149.          }
  1150.  
  1151.          int var14 = (int)Math.min(var4, (long)(this.data.length - var13));
  1152.          this.dis.readFully(this.data, var13, var14);
  1153.          var7 = var13 + var14;
  1154.          var4 -= (long)var14;
  1155.          var6 = 0;
  1156.  
  1157.          try {
  1158.             int var15 = var4 > 0L ? var7 - 2 : var7;
  1159.  
  1160.             while(var6 < var15) {
  1161.                if (var8 >= var9) {
  1162.                   this.sbuf.append(this.cdata);
  1163.                   var8 = 0;
  1164.                }
  1165.  
  1166.                int var10 = this.data[var6++] & 255;
  1167.                switch (var10 >> 4) {
  1168.                   case 0:
  1169.                   case 1:
  1170.                   case 2:
  1171.                   case 3:
  1172.                   case 4:
  1173.                   case 5:
  1174.                   case 6:
  1175.                   case 7:
  1176.                      this.cdata[var8++] = (char)var10;
  1177.                      break;
  1178.                   case 8:
  1179.                   case 9:
  1180.                   case 10:
  1181.                   case 11:
  1182.                   default:
  1183.                      throw new UTFDataFormatException();
  1184.                   case 12:
  1185.                   case 13:
  1186.                      byte var19 = this.data[var6++];
  1187.                      if ((var19 & 192) != 128) {
  1188.                         throw new UTFDataFormatException();
  1189.                      }
  1190.  
  1191.                      this.cdata[var8++] = (char)((var10 & 31) << 6 | var19 & 63);
  1192.                      break;
  1193.                   case 14:
  1194.                      byte var11 = this.data[var6++];
  1195.                      byte var12 = this.data[var6++];
  1196.                      if ((var11 & 192) != 128 || (var12 & 192) != 128) {
  1197.                         throw new UTFDataFormatException();
  1198.                      }
  1199.  
  1200.                      this.cdata[var8++] = (char)((var10 & 15) << 12 | (var11 & 63) << 6 | (var12 & 63) << 0);
  1201.                }
  1202.             }
  1203.          } catch (IndexOutOfBoundsException var16) {
  1204.             throw new UTFDataFormatException();
  1205.          }
  1206.       }
  1207.  
  1208.       if (var8 > 0) {
  1209.          this.sbuf.append(this.cdata, 0, var8);
  1210.       }
  1211.  
  1212.       String var18 = this.sbuf.toString();
  1213.       this.sbuf.setLength(0);
  1214.       return var18;
  1215.    }
  1216.  
  1217.    private boolean invokeObjectReader(Object var1) throws InvalidClassException, StreamCorruptedException, ClassNotFoundException, IOException {
  1218.       if (this.currentClassDesc.readObjectMethod == null) {
  1219.          return false;
  1220.       } else {
  1221.          try {
  1222.             this.currentClassDesc.readObjectMethod.invoke(var1, this.readObjectArglist);
  1223.             return true;
  1224.          } catch (InvocationTargetException var4) {
  1225.             Throwable var3 = var4.getTargetException();
  1226.             if (var3 instanceof ClassNotFoundException) {
  1227.                throw (ClassNotFoundException)var3;
  1228.             } else if (var3 instanceof IOException) {
  1229.                throw (IOException)var3;
  1230.             } else if (var3 instanceof RuntimeException) {
  1231.                throw (RuntimeException)var3;
  1232.             } else if (var3 instanceof Error) {
  1233.                throw (Error)var3;
  1234.             } else {
  1235.                throw new Error("interal error");
  1236.             }
  1237.          } catch (IllegalAccessException var5) {
  1238.             return false;
  1239.          }
  1240.       }
  1241.    }
  1242.  
  1243.    private void inputClassFields(Object var1, Class var2, ObjectStreamField[] var3) throws InvalidClassException, StreamCorruptedException, ClassNotFoundException, IOException {
  1244.       if (this.currentClassDesc.numPrimBytes > 0) {
  1245.          if (this.data.length < this.currentClassDesc.numPrimBytes) {
  1246.             this.data = new byte[this.currentClassDesc.numPrimBytes];
  1247.          }
  1248.  
  1249.          this.readFully(this.data, 0, this.currentClassDesc.numPrimBytes);
  1250.          if (var1 != null) {
  1251.             setPrimitiveFieldValues(var1, this.currentClassDesc.primFieldIDs, this.currentClassDesc.primFieldTypecodes, this.data);
  1252.          }
  1253.       }
  1254.  
  1255.       int var4 = var3.length - this.currentClassDesc.numObjFields;
  1256.  
  1257.       for(int var5 = 0; var5 < this.currentClassDesc.numObjFields; ++var5) {
  1258.          Field var6 = var3[var4 + var5].getField();
  1259.          boolean var7 = var6 != null;
  1260.          Object var8 = this.readObject(var7);
  1261.          if (var1 != null && var6 != null) {
  1262.             try {
  1263.                setObjectFieldValue(var1, this.currentClassDesc.objFieldIDs[var5], this.currentClassDesc.objFieldTypes[var5], var8);
  1264.             } catch (ClassCastException var11) {
  1265.                throw new ClassCastException("Assigning instance of class " + var8.getClass().getName() + " to field " + var2.getName() + '#' + var6.getName());
  1266.             } catch (Exception var12) {
  1267.                throw new InvalidClassException(var2.getName(), "Invalid field " + var6.getName());
  1268.             }
  1269.          }
  1270.       }
  1271.  
  1272.    }
  1273.  
  1274.    private static native void setPrimitiveFieldValues(Object var0, long[] var1, char[] var2, byte[] var3);
  1275.  
  1276.    private static native void setObjectFieldValue(Object var0, long var1, Class var3, Object var4);
  1277.  
  1278.    private static native Object allocateNewObject(Class var0, Class var1) throws InstantiationException, IllegalAccessException;
  1279.  
  1280.    private static native Object allocateNewArray(Class var0, int var1);
  1281.  
  1282.    // $FF: synthetic method
  1283.    static Class class$(String var0) {
  1284.       try {
  1285.          return Class.forName(var0);
  1286.       } catch (ClassNotFoundException var2) {
  1287.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  1288.       }
  1289.    }
  1290.  
  1291.    // $FF: synthetic method
  1292.    static Object access$000(ObjectInputStream var0, boolean var1) throws OptionalDataException, ClassNotFoundException, IOException {
  1293.       return var0.readObject(var1);
  1294.    }
  1295. }
  1296.