@@ -653,10 +653,12 @@ public void defaultReadObject()
653
653
Object curObj = ctx .getObj ();
654
654
ObjectStreamClass curDesc = ctx .getDesc ();
655
655
bin .setBlockDataMode (false );
656
- FieldValues vals = defaultReadFields (curObj , curDesc );
656
+
657
+ // Read fields of the current descriptor into a new FieldValues
658
+ FieldValues values = new FieldValues (curDesc , true );
657
659
if (curObj != null ) {
658
- defaultCheckFieldValues (curObj , curDesc , vals );
659
- defaultSetFieldValues (curObj , curDesc , vals );
660
+ values . defaultCheckFieldValues (curObj );
661
+ values . defaultSetFieldValues (curObj );
660
662
}
661
663
bin .setBlockDataMode (true );
662
664
if (!curDesc .hasWriteObjectData ()) {
@@ -696,8 +698,8 @@ public ObjectInputStream.GetField readFields()
696
698
ctx .checkAndSetUsed ();
697
699
ObjectStreamClass curDesc = ctx .getDesc ();
698
700
bin .setBlockDataMode (false );
699
- GetFieldImpl getField = new GetFieldImpl ( curDesc );
700
- getField . readFields ( );
701
+ // Read fields of the current descriptor into a new FieldValues
702
+ FieldValues values = new FieldValues ( curDesc , false );
701
703
bin .setBlockDataMode (true );
702
704
if (!curDesc .hasWriteObjectData ()) {
703
705
/*
@@ -707,8 +709,7 @@ public ObjectInputStream.GetField readFields()
707
709
*/
708
710
defaultDataEnd = true ;
709
711
}
710
-
711
- return getField ;
712
+ return values ;
712
713
}
713
714
714
715
/**
@@ -2322,14 +2323,13 @@ private Object readRecord(ObjectStreamClass desc) throws IOException {
2322
2323
if (slots .length != 1 ) {
2323
2324
// skip any superclass stream field values
2324
2325
for (int i = 0 ; i < slots .length -1 ; i ++) {
2325
- ObjectStreamClass slotDesc = slots [i ].desc ;
2326
2326
if (slots [i ].hasData ) {
2327
- defaultReadFields ( null , slotDesc );
2327
+ new FieldValues ( slots [ i ]. desc , true );
2328
2328
}
2329
2329
}
2330
2330
}
2331
2331
2332
- FieldValues fieldValues = defaultReadFields ( null , desc );
2332
+ FieldValues fieldValues = new FieldValues ( desc , true );
2333
2333
2334
2334
// get canonical record constructor adapted to take two arguments:
2335
2335
// - byte[] primValues
@@ -2388,7 +2388,8 @@ private void readSerialData(Object obj, ObjectStreamClass desc)
2388
2388
2389
2389
if (slots [i ].hasData ) {
2390
2390
if (obj == null || handles .lookupException (passHandle ) != null ) {
2391
- defaultReadFields (null , slotDesc ); // skip field values
2391
+ // Read fields of the current descriptor into a new FieldValues and discard
2392
+ new FieldValues (slotDesc , true );
2392
2393
} else if (slotDesc .hasReadObjectMethod ()) {
2393
2394
ThreadDeath t = null ;
2394
2395
boolean reset = false ;
@@ -2432,12 +2433,13 @@ private void readSerialData(Object obj, ObjectStreamClass desc)
2432
2433
*/
2433
2434
defaultDataEnd = false ;
2434
2435
} else {
2435
- FieldValues vals = defaultReadFields (obj , slotDesc );
2436
+ // Read fields of the current descriptor into a new FieldValues
2437
+ FieldValues values = new FieldValues (slotDesc , true );
2436
2438
if (slotValues != null ) {
2437
- slotValues [i ] = vals ;
2439
+ slotValues [i ] = values ;
2438
2440
} else if (obj != null ) {
2439
- defaultCheckFieldValues (obj , slotDesc , vals );
2440
- defaultSetFieldValues (obj , slotDesc , vals );
2441
+ values . defaultCheckFieldValues (obj );
2442
+ values . defaultSetFieldValues (obj );
2441
2443
}
2442
2444
}
2443
2445
@@ -2461,11 +2463,11 @@ private void readSerialData(Object obj, ObjectStreamClass desc)
2461
2463
// before assigning.
2462
2464
for (int i = 0 ; i < slots .length ; i ++) {
2463
2465
if (slotValues [i ] != null )
2464
- defaultCheckFieldValues ( obj , slots [ i ]. desc , slotValues [i ]);
2466
+ slotValues [i ]. defaultCheckFieldValues ( obj );
2465
2467
}
2466
2468
for (int i = 0 ; i < slots .length ; i ++) {
2467
2469
if (slotValues [i ] != null )
2468
- defaultSetFieldValues ( obj , slots [ i ]. desc , slotValues [i ]);
2470
+ slotValues [i ]. defaultSetFieldValues ( obj );
2469
2471
}
2470
2472
}
2471
2473
}
@@ -2499,76 +2501,6 @@ private void skipCustomData() throws IOException {
2499
2501
}
2500
2502
}
2501
2503
2502
- /*package-private*/ class FieldValues {
2503
- final byte [] primValues ;
2504
- final Object [] objValues ;
2505
-
2506
- FieldValues (byte [] primValues , Object [] objValues ) {
2507
- this .primValues = primValues ;
2508
- this .objValues = objValues ;
2509
- }
2510
- }
2511
-
2512
- /**
2513
- * Reads in values of serializable fields declared by given class
2514
- * descriptor. Expects that passHandle is set to obj's handle before this
2515
- * method is called.
2516
- */
2517
- private FieldValues defaultReadFields (Object obj , ObjectStreamClass desc )
2518
- throws IOException
2519
- {
2520
- Class <?> cl = desc .forClass ();
2521
- if (cl != null && obj != null && !cl .isInstance (obj )) {
2522
- throw new ClassCastException ();
2523
- }
2524
-
2525
- byte [] primVals = null ;
2526
- int primDataSize = desc .getPrimDataSize ();
2527
- if (primDataSize > 0 ) {
2528
- primVals = new byte [primDataSize ];
2529
- bin .readFully (primVals , 0 , primDataSize , false );
2530
- }
2531
-
2532
- Object [] objVals = null ;
2533
- int numObjFields = desc .getNumObjFields ();
2534
- if (numObjFields > 0 ) {
2535
- int objHandle = passHandle ;
2536
- ObjectStreamField [] fields = desc .getFields (false );
2537
- objVals = new Object [numObjFields ];
2538
- int numPrimFields = fields .length - objVals .length ;
2539
- for (int i = 0 ; i < objVals .length ; i ++) {
2540
- ObjectStreamField f = fields [numPrimFields + i ];
2541
- objVals [i ] = readObject0 (Object .class , f .isUnshared ());
2542
- if (f .getField () != null ) {
2543
- handles .markDependency (objHandle , passHandle );
2544
- }
2545
- }
2546
- passHandle = objHandle ;
2547
- }
2548
-
2549
- return new FieldValues (primVals , objVals );
2550
- }
2551
-
2552
- /** Throws ClassCastException if any value is not assignable. */
2553
- private void defaultCheckFieldValues (Object obj , ObjectStreamClass desc ,
2554
- FieldValues values ) {
2555
- Object [] objectValues = values .objValues ;
2556
- if (objectValues != null )
2557
- desc .checkObjFieldValueTypes (obj , objectValues );
2558
- }
2559
-
2560
- /** Sets field values in obj. */
2561
- private void defaultSetFieldValues (Object obj , ObjectStreamClass desc ,
2562
- FieldValues values ) {
2563
- byte [] primValues = values .primValues ;
2564
- Object [] objectValues = values .objValues ;
2565
-
2566
- if (primValues != null )
2567
- desc .setPrimFieldValues (obj , primValues );
2568
- if (objectValues != null )
2569
- desc .setObjFieldValues (obj , objectValues );
2570
- }
2571
-
2572
2504
/**
2573
2505
* Reads in and returns IOException that caused serialization to abort.
2574
2506
* All stream state is discarded prior to reading in fatal exception. Sets
@@ -2608,103 +2540,123 @@ private static ClassLoader latestUserDefinedLoader() {
2608
2540
/**
2609
2541
* Default GetField implementation.
2610
2542
*/
2611
- private class GetFieldImpl extends GetField {
2543
+ private final class FieldValues extends GetField {
2612
2544
2613
2545
/** class descriptor describing serializable fields */
2614
2546
private final ObjectStreamClass desc ;
2615
2547
/** primitive field values */
2616
- private final byte [] primVals ;
2548
+ final byte [] primValues ;
2617
2549
/** object field values */
2618
- private final Object [] objVals ;
2550
+ final Object [] objValues ;
2619
2551
/** object field value handles */
2620
2552
private final int [] objHandles ;
2621
2553
2622
2554
/**
2623
- * Creates GetFieldImpl object for reading fields defined in given
2555
+ * Creates FieldValues object for reading fields defined in given
2624
2556
* class descriptor.
2557
+ * @param desc the ObjectStreamClass to read
2558
+ * @param recordDependencies if true, record the dependencies
2559
+ * from current PassHandle and the object's read.
2625
2560
*/
2626
- GetFieldImpl (ObjectStreamClass desc ) {
2561
+ FieldValues (ObjectStreamClass desc , boolean recordDependencies ) throws IOException {
2627
2562
this .desc = desc ;
2628
- primVals = new byte [desc .getPrimDataSize ()];
2629
- objVals = new Object [desc .getNumObjFields ()];
2630
- objHandles = new int [objVals .length ];
2563
+
2564
+ int primDataSize = desc .getPrimDataSize ();
2565
+ primValues = (primDataSize > 0 ) ? new byte [primDataSize ] : null ;
2566
+ if (primDataSize > 0 ) {
2567
+ bin .readFully (primValues , 0 , primDataSize , false );
2568
+ }
2569
+
2570
+ int numObjFields = desc .getNumObjFields ();
2571
+ objValues = (numObjFields > 0 ) ? new Object [numObjFields ] : null ;
2572
+ objHandles = (numObjFields > 0 ) ? new int [numObjFields ] : null ;
2573
+ if (numObjFields > 0 ) {
2574
+ int objHandle = passHandle ;
2575
+ ObjectStreamField [] fields = desc .getFields (false );
2576
+ int numPrimFields = fields .length - objValues .length ;
2577
+ for (int i = 0 ; i < objValues .length ; i ++) {
2578
+ ObjectStreamField f = fields [numPrimFields + i ];
2579
+ objValues [i ] = readObject0 (Object .class , f .isUnshared ());
2580
+ objHandles [i ] = passHandle ;
2581
+ if (recordDependencies && f .getField () != null ) {
2582
+ handles .markDependency (objHandle , passHandle );
2583
+ }
2584
+ }
2585
+ passHandle = objHandle ;
2586
+ }
2631
2587
}
2632
2588
2633
2589
public ObjectStreamClass getObjectStreamClass () {
2634
2590
return desc ;
2635
2591
}
2636
2592
2637
- public boolean defaulted (String name ) throws IOException {
2593
+ public boolean defaulted (String name ) {
2638
2594
return (getFieldOffset (name , null ) < 0 );
2639
2595
}
2640
2596
2641
- public boolean get (String name , boolean val ) throws IOException {
2597
+ public boolean get (String name , boolean val ) {
2642
2598
int off = getFieldOffset (name , Boolean .TYPE );
2643
- return (off >= 0 ) ? Bits .getBoolean (primVals , off ) : val ;
2599
+ return (off >= 0 ) ? Bits .getBoolean (primValues , off ) : val ;
2644
2600
}
2645
2601
2646
- public byte get (String name , byte val ) throws IOException {
2602
+ public byte get (String name , byte val ) {
2647
2603
int off = getFieldOffset (name , Byte .TYPE );
2648
- return (off >= 0 ) ? primVals [off ] : val ;
2604
+ return (off >= 0 ) ? primValues [off ] : val ;
2649
2605
}
2650
2606
2651
- public char get (String name , char val ) throws IOException {
2607
+ public char get (String name , char val ) {
2652
2608
int off = getFieldOffset (name , Character .TYPE );
2653
- return (off >= 0 ) ? Bits .getChar (primVals , off ) : val ;
2609
+ return (off >= 0 ) ? Bits .getChar (primValues , off ) : val ;
2654
2610
}
2655
2611
2656
- public short get (String name , short val ) throws IOException {
2612
+ public short get (String name , short val ) {
2657
2613
int off = getFieldOffset (name , Short .TYPE );
2658
- return (off >= 0 ) ? Bits .getShort (primVals , off ) : val ;
2614
+ return (off >= 0 ) ? Bits .getShort (primValues , off ) : val ;
2659
2615
}
2660
2616
2661
- public int get (String name , int val ) throws IOException {
2617
+ public int get (String name , int val ) {
2662
2618
int off = getFieldOffset (name , Integer .TYPE );
2663
- return (off >= 0 ) ? Bits .getInt (primVals , off ) : val ;
2619
+ return (off >= 0 ) ? Bits .getInt (primValues , off ) : val ;
2664
2620
}
2665
2621
2666
- public float get (String name , float val ) throws IOException {
2622
+ public float get (String name , float val ) {
2667
2623
int off = getFieldOffset (name , Float .TYPE );
2668
- return (off >= 0 ) ? Bits .getFloat (primVals , off ) : val ;
2624
+ return (off >= 0 ) ? Bits .getFloat (primValues , off ) : val ;
2669
2625
}
2670
2626
2671
- public long get (String name , long val ) throws IOException {
2627
+ public long get (String name , long val ) {
2672
2628
int off = getFieldOffset (name , Long .TYPE );
2673
- return (off >= 0 ) ? Bits .getLong (primVals , off ) : val ;
2629
+ return (off >= 0 ) ? Bits .getLong (primValues , off ) : val ;
2674
2630
}
2675
2631
2676
- public double get (String name , double val ) throws IOException {
2632
+ public double get (String name , double val ) {
2677
2633
int off = getFieldOffset (name , Double .TYPE );
2678
- return (off >= 0 ) ? Bits .getDouble (primVals , off ) : val ;
2634
+ return (off >= 0 ) ? Bits .getDouble (primValues , off ) : val ;
2679
2635
}
2680
2636
2681
- public Object get (String name , Object val ) throws IOException {
2637
+ public Object get (String name , Object val ) {
2682
2638
int off = getFieldOffset (name , Object .class );
2683
2639
if (off >= 0 ) {
2684
2640
int objHandle = objHandles [off ];
2685
2641
handles .markDependency (passHandle , objHandle );
2686
2642
return (handles .lookupException (objHandle ) == null ) ?
2687
- objVals [off ] : null ;
2643
+ objValues [off ] : null ;
2688
2644
} else {
2689
2645
return val ;
2690
2646
}
2691
2647
}
2692
2648
2693
- /**
2694
- * Reads primitive and object field values from stream.
2695
- */
2696
- void readFields () throws IOException {
2697
- bin .readFully (primVals , 0 , primVals .length , false );
2698
-
2699
- int oldHandle = passHandle ;
2700
- ObjectStreamField [] fields = desc .getFields (false );
2701
- int numPrimFields = fields .length - objVals .length ;
2702
- for (int i = 0 ; i < objVals .length ; i ++) {
2703
- objVals [i ] =
2704
- readObject0 (Object .class , fields [numPrimFields + i ].isUnshared ());
2705
- objHandles [i ] = passHandle ;
2706
- }
2707
- passHandle = oldHandle ;
2649
+ /** Throws ClassCastException if any value is not assignable. */
2650
+ void defaultCheckFieldValues (Object obj ) {
2651
+ if (objValues != null )
2652
+ desc .checkObjFieldValueTypes (obj , objValues );
2653
+ }
2654
+
2655
+ private void defaultSetFieldValues (Object obj ) {
2656
+ if (primValues != null )
2657
+ desc .setPrimFieldValues (obj , primValues );
2658
+ if (objValues != null )
2659
+ desc .setObjFieldValues (obj , objValues );
2708
2660
}
2709
2661
2710
2662
/**
0 commit comments