@@ -430,12 +430,12 @@ public TypeState forContextInsensitiveTypeState(PointsToAnalysis bb, TypeState s
430
430
431
431
@ Override
432
432
public SingleTypeState singleTypeState (PointsToAnalysis bb , boolean canBeNull , AnalysisType type , AnalysisObject ... objects ) {
433
- return new ContextSensitiveSingleTypeState (bb , canBeNull , type , objects );
433
+ return PointsToStats . registerTypeState (bb , new ContextSensitiveSingleTypeState ( canBeNull , type , objects ) );
434
434
}
435
435
436
436
@ Override
437
437
public MultiTypeState multiTypeState (PointsToAnalysis bb , boolean canBeNull , BitSet typesBitSet , int typesCount , AnalysisObject ... objects ) {
438
- return new ContextSensitiveMultiTypeState (bb , canBeNull , typesBitSet , typesCount , objects );
438
+ return PointsToStats . registerTypeState (bb , new ContextSensitiveMultiTypeState ( canBeNull , typesBitSet , typesCount , objects ) );
439
439
}
440
440
441
441
@ Override
@@ -466,7 +466,7 @@ public TypeState doUnion(PointsToAnalysis bb, SingleTypeState state1, SingleType
466
466
assert !Arrays .equals (resultObjects , s1 .objects ) && !Arrays .equals (resultObjects , s2 .objects ) : resultObjects ;
467
467
468
468
/* Create the resulting exact type state. */
469
- SingleTypeState result = new ContextSensitiveSingleTypeState (bb , resultCanBeNull , s1 .exactType (), resultObjects );
469
+ SingleTypeState result = singleTypeState (bb , resultCanBeNull , s1 .exactType (), resultObjects );
470
470
assert !s1 .equals (result ) && !s2 .equals (result ) : result ;
471
471
PointsToStats .registerUnionOperation (bb , s1 , s2 , result );
472
472
return result ;
@@ -482,7 +482,7 @@ public TypeState doUnion(PointsToAnalysis bb, SingleTypeState state1, SingleType
482
482
/* We know the types, construct the types bit set without walking the objects. */
483
483
BitSet typesBitSet = TypeStateUtils .newBitSet (s1 .exactType ().getId (), s2 .exactType ().getId ());
484
484
assert typesBitSet .cardinality () == 2 : typesBitSet ;
485
- TypeState result = new ContextSensitiveMultiTypeState (bb , resultCanBeNull , typesBitSet , 2 , resultObjects );
485
+ TypeState result = multiTypeState (bb , resultCanBeNull , typesBitSet , 2 , resultObjects );
486
486
PointsToStats .registerUnionOperation (bb , s1 , s2 , result );
487
487
return result ;
488
488
}
@@ -542,7 +542,7 @@ public TypeState doUnion(PointsToAnalysis bb, MultiTypeState state1, SingleTypeS
542
542
System .arraycopy (so1 , typeRange .right (), resultObjects , typeRange .left () + unionObjects .length , so1 .length - typeRange .right ());
543
543
544
544
/* The types bit set of the result and s1 are the same. */
545
- MultiTypeState result = new ContextSensitiveMultiTypeState (bb , resultCanBeNull , s1 .bitSet (), s1 .typesCount (), resultObjects );
545
+ MultiTypeState result = multiTypeState (bb , resultCanBeNull , s1 .bitSet (), s1 .typesCount (), resultObjects );
546
546
assert !result .equals (s1 ) : result ;
547
547
/*
548
548
* No need to check the result size against the all-instantiated since the type count
@@ -576,7 +576,7 @@ public TypeState doUnion(PointsToAnalysis bb, MultiTypeState state1, SingleTypeS
576
576
BitSet typesBitSet = TypeStateUtils .set (s1 .bitSet (), s2 .exactType ().getId ());
577
577
int typesCount = s1 .typesCount () + 1 ;
578
578
assert typesCount == typesBitSet .cardinality () : typesCount ;
579
- MultiTypeState result = new ContextSensitiveMultiTypeState (bb , resultCanBeNull , typesBitSet , typesCount , resultObjects );
579
+ MultiTypeState result = multiTypeState (bb , resultCanBeNull , typesBitSet , typesCount , resultObjects );
580
580
PointsToStats .registerUnionOperation (bb , s1 , s2 , result );
581
581
return result ;
582
582
}
@@ -621,7 +621,7 @@ private TypeState doUnion0(PointsToAnalysis bb, ContextSensitiveMultiTypeState s
621
621
BitSet resultTypesBitSet = TypeStateUtils .or (s1 .bitSet (), s2 .bitSet ());
622
622
int typesCount = s1 .typesCount () + s2 .typesCount ();
623
623
assert typesCount == resultTypesBitSet .cardinality () : typesCount ;
624
- MultiTypeState result = new ContextSensitiveMultiTypeState (bb , resultCanBeNull , resultTypesBitSet , typesCount , resultObjects );
624
+ MultiTypeState result = multiTypeState (bb , resultCanBeNull , resultTypesBitSet , typesCount , resultObjects );
625
625
PointsToStats .registerUnionOperation (bb , s1 , s2 , result );
626
626
return result ;
627
627
@@ -635,7 +635,7 @@ private TypeState doUnion0(PointsToAnalysis bb, ContextSensitiveMultiTypeState s
635
635
BitSet resultTypesBitSet = TypeStateUtils .or (s1 .bitSet (), s2 .bitSet ());
636
636
int typesCount = s1 .typesCount () + s2 .typesCount ();
637
637
assert typesCount == resultTypesBitSet .cardinality () : typesCount ;
638
- MultiTypeState result = new ContextSensitiveMultiTypeState (bb , resultCanBeNull , resultTypesBitSet , typesCount , resultObjects );
638
+ MultiTypeState result = multiTypeState (bb , resultCanBeNull , resultTypesBitSet , typesCount , resultObjects );
639
639
PointsToStats .registerUnionOperation (bb , s1 , s2 , result );
640
640
return result ;
641
641
}
@@ -824,7 +824,7 @@ private TypeState doUnion2(PointsToAnalysis bb, ContextSensitiveMultiTypeState s
824
824
825
825
/* Logical OR the type bit sets. */
826
826
BitSet resultTypesBitSet = TypeStateUtils .or (s1 .bitSet (), s2 .bitSet ());
827
- MultiTypeState result = new ContextSensitiveMultiTypeState (bb , resultCanBeNull , resultTypesBitSet , resultTypesBitSet .cardinality (),
827
+ MultiTypeState result = multiTypeState (bb , resultCanBeNull , resultTypesBitSet , resultTypesBitSet .cardinality (),
828
828
resultObjects .copyToArray (new AnalysisObject [resultObjects .size ()]));
829
829
assert !result .equals (s1 ) : "speculation code should prevent this case" ;
830
830
@@ -874,7 +874,7 @@ public TypeState doIntersection(PointsToAnalysis bb, MultiTypeState s1, SingleTy
874
874
AnalysisObject [] resultObjects = ((ContextSensitiveMultiTypeState ) s1 ).objectsArray (s2 .exactType ());
875
875
/* All objects must have the same type. */
876
876
assert TypeStateUtils .holdsSingleTypeState (resultObjects );
877
- return new ContextSensitiveSingleTypeState (bb , resultCanBeNull , s2 .exactType (), resultObjects );
877
+ return singleTypeState (bb , resultCanBeNull , s2 .exactType (), resultObjects );
878
878
} else {
879
879
return TypeState .forEmpty ().forCanBeNull (bb , resultCanBeNull );
880
880
}
@@ -900,7 +900,7 @@ public TypeState doIntersection(PointsToAnalysis bb, MultiTypeState state1, Mult
900
900
return doIntersection0 (bb , s1 , s2 , resultCanBeNull );
901
901
}
902
902
903
- private static TypeState doIntersection0 (PointsToAnalysis bb , ContextSensitiveMultiTypeState s1 , ContextSensitiveMultiTypeState s2 , boolean resultCanBeNull ) {
903
+ private TypeState doIntersection0 (PointsToAnalysis bb , ContextSensitiveMultiTypeState s1 , ContextSensitiveMultiTypeState s2 , boolean resultCanBeNull ) {
904
904
/* Speculate that s1 and s2 have either the same types, or no types in common. */
905
905
906
906
if (s1 .bitSet ().equals (s2 .bitSet ())) {
@@ -916,7 +916,7 @@ private static TypeState doIntersection0(PointsToAnalysis bb, ContextSensitiveMu
916
916
return doIntersection1 (bb , s1 , s2 , resultCanBeNull );
917
917
}
918
918
919
- private static TypeState doIntersection1 (PointsToAnalysis bb , ContextSensitiveMultiTypeState s1 , ContextSensitiveMultiTypeState s2 , boolean resultCanBeNull ) {
919
+ private TypeState doIntersection1 (PointsToAnalysis bb , ContextSensitiveMultiTypeState s1 , ContextSensitiveMultiTypeState s2 , boolean resultCanBeNull ) {
920
920
/*
921
921
* Speculate that s2 contains all types of s1, i.e., the filter is broader than s1, thus the
922
922
* result is s1.
@@ -964,7 +964,7 @@ private static TypeState doIntersection1(PointsToAnalysis bb, ContextSensitiveMu
964
964
965
965
private static ThreadLocal <ListUtils .UnsafeArrayListClosable <AnalysisObject >> intersectionArrayListTL = new ThreadLocal <>();
966
966
967
- private static TypeState doIntersection2 (PointsToAnalysis bb , ContextSensitiveMultiTypeState s1 , ContextSensitiveMultiTypeState s2 , boolean resultCanBeNull , int idx1Param , int idx2Param ) {
967
+ private TypeState doIntersection2 (PointsToAnalysis bb , ContextSensitiveMultiTypeState s1 , ContextSensitiveMultiTypeState s2 , boolean resultCanBeNull , int idx1Param , int idx2Param ) {
968
968
969
969
try (ListUtils .UnsafeArrayListClosable <AnalysisObject > tlArrayClosable = ListUtils .getTLArrayList (intersectionArrayListTL , 256 )) {
970
970
ListUtils .UnsafeArrayList <AnalysisObject > resultObjects = tlArrayClosable .list ();
@@ -1007,11 +1007,11 @@ private static TypeState doIntersection2(PointsToAnalysis bb, ContextSensitiveMu
1007
1007
1008
1008
if (TypeStateUtils .holdsSingleTypeState (objects , objects .length )) {
1009
1009
/* Multiple objects of the same type. */
1010
- return new ContextSensitiveSingleTypeState (bb , resultCanBeNull , objects [0 ].type (), objects );
1010
+ return singleTypeState (bb , resultCanBeNull , objects [0 ].type (), objects );
1011
1011
} else {
1012
1012
/* Logical AND the type bit sets. */
1013
1013
BitSet resultTypesBitSet = TypeStateUtils .and (s1 .bitSet (), s2 .bitSet ());
1014
- MultiTypeState result = new ContextSensitiveMultiTypeState (bb , resultCanBeNull , resultTypesBitSet , resultTypesBitSet .cardinality (), objects );
1014
+ MultiTypeState result = multiTypeState (bb , resultCanBeNull , resultTypesBitSet , resultTypesBitSet .cardinality (), objects );
1015
1015
1016
1016
/*
1017
1017
* The result can be equal to s1 if and only if s1 and s2 have the same type
@@ -1077,15 +1077,15 @@ public TypeState doSubtraction(PointsToAnalysis bb, MultiTypeState state1, Singl
1077
1077
System .arraycopy (s1 .objects , typeRange .right (), resultObjects , typeRange .left (), s1 .objects .length - typeRange .right ());
1078
1078
1079
1079
if (resultObjects .length == 1 ) {
1080
- return new ContextSensitiveSingleTypeState (bb , resultCanBeNull , resultObjects [0 ].type (), resultObjects [0 ]);
1080
+ return singleTypeState (bb , resultCanBeNull , resultObjects [0 ].type (), resultObjects [0 ]);
1081
1081
} else if (TypeStateUtils .holdsSingleTypeState (resultObjects )) {
1082
1082
/* Multiple objects of the same type. */
1083
- return new ContextSensitiveSingleTypeState (bb , resultCanBeNull , resultObjects [0 ].type (), resultObjects );
1083
+ return singleTypeState (bb , resultCanBeNull , resultObjects [0 ].type (), resultObjects );
1084
1084
} else {
1085
1085
BitSet resultTypesBitSet = TypeStateUtils .clear (s1 .bitSet (), s2 .exactType ().getId ());
1086
1086
int typesCount = s1 .typesCount () - 1 ;
1087
1087
assert typesCount == resultTypesBitSet .cardinality () : typesCount ;
1088
- return new ContextSensitiveMultiTypeState (bb , resultCanBeNull , resultTypesBitSet , typesCount , resultObjects );
1088
+ return multiTypeState (bb , resultCanBeNull , resultTypesBitSet , typesCount , resultObjects );
1089
1089
}
1090
1090
1091
1091
} else {
@@ -1110,7 +1110,7 @@ public TypeState doSubtraction(PointsToAnalysis bb, MultiTypeState state1, Multi
1110
1110
return doSubtraction0 (bb , s1 , s2 , resultCanBeNull );
1111
1111
}
1112
1112
1113
- private static TypeState doSubtraction0 (PointsToAnalysis bb , ContextSensitiveMultiTypeState s1 , ContextSensitiveMultiTypeState s2 , boolean resultCanBeNull ) {
1113
+ private TypeState doSubtraction0 (PointsToAnalysis bb , ContextSensitiveMultiTypeState s1 , ContextSensitiveMultiTypeState s2 , boolean resultCanBeNull ) {
1114
1114
/* Speculate that s1 and s2 have either the same types, or no types in common. */
1115
1115
1116
1116
if (s1 .bitSet ().equals (s2 .bitSet ())) {
@@ -1126,7 +1126,7 @@ private static TypeState doSubtraction0(PointsToAnalysis bb, ContextSensitiveMul
1126
1126
return doSubtraction1 (bb , s1 , s2 , resultCanBeNull );
1127
1127
}
1128
1128
1129
- private static TypeState doSubtraction1 (PointsToAnalysis bb , ContextSensitiveMultiTypeState s1 , ContextSensitiveMultiTypeState s2 , boolean resultCanBeNull ) {
1129
+ private TypeState doSubtraction1 (PointsToAnalysis bb , ContextSensitiveMultiTypeState s1 , ContextSensitiveMultiTypeState s2 , boolean resultCanBeNull ) {
1130
1130
/*
1131
1131
* Speculate that s1 and s2 have no overlap, i.e., they don't have any objects in common. In
1132
1132
* that case, the result is just s1.
@@ -1162,7 +1162,7 @@ private static TypeState doSubtraction1(PointsToAnalysis bb, ContextSensitiveMul
1162
1162
return doSubtraction2 (bb , s1 , s2 , resultCanBeNull , idx1 , idx2 );
1163
1163
}
1164
1164
1165
- private static TypeState doSubtraction2 (PointsToAnalysis bb , ContextSensitiveMultiTypeState s1 , ContextSensitiveMultiTypeState s2 , boolean resultCanBeNull , int idx1Param , int idx2Param ) {
1165
+ private TypeState doSubtraction2 (PointsToAnalysis bb , ContextSensitiveMultiTypeState s1 , ContextSensitiveMultiTypeState s2 , boolean resultCanBeNull , int idx1Param , int idx2Param ) {
1166
1166
try (ListUtils .UnsafeArrayListClosable <AnalysisObject > tlArrayClosable = ListUtils .getTLArrayList (intersectionArrayListTL , 256 )) {
1167
1167
ListUtils .UnsafeArrayList <AnalysisObject > resultObjects = tlArrayClosable .list ();
1168
1168
@@ -1207,14 +1207,14 @@ private static TypeState doSubtraction2(PointsToAnalysis bb, ContextSensitiveMul
1207
1207
1208
1208
if (TypeStateUtils .holdsSingleTypeState (objects , totalLength )) {
1209
1209
/* Multiple objects of the same type. */
1210
- return new ContextSensitiveSingleTypeState (bb , resultCanBeNull , objects [0 ].type (), objects );
1210
+ return singleTypeState (bb , resultCanBeNull , objects [0 ].type (), objects );
1211
1211
} else {
1212
1212
BitSet resultTypesBitSet = TypeStateUtils .andNot (s1 .bitSet (), s2 .bitSet ());
1213
1213
/*
1214
1214
* Don't need to check if the result is close-to-all-instantiated since result
1215
1215
* <= s1.
1216
1216
*/
1217
- return new ContextSensitiveMultiTypeState (bb , resultCanBeNull , resultTypesBitSet , resultTypesBitSet .cardinality (), objects );
1217
+ return multiTypeState (bb , resultCanBeNull , resultTypesBitSet , resultTypesBitSet .cardinality (), objects );
1218
1218
}
1219
1219
}
1220
1220
}
0 commit comments