@@ -31,6 +31,7 @@ import org.opalj.br.fpcf.properties.cg.Callers
3131import org .opalj .br .fpcf .properties .cg .ForNameClasses
3232import org .opalj .br .fpcf .properties .cg .LoadedClasses
3333import org .opalj .br .fpcf .properties .string .StringConstancyProperty
34+ import org .opalj .br .fpcf .properties .string .StringTreeNode
3435import org .opalj .collection .immutable .IntTrieSet
3536import org .opalj .collection .immutable .UIDSet
3637import org .opalj .fpcf .Entity
@@ -254,8 +255,15 @@ class ClassForNameAnalysis private[analyses] (
254255 callContext : ContextType ,
255256 stmts : Array [Stmt [V ]]
256257 )(implicit state : State ): Unit = {
257- val possibleClasses =
258- TypesUtil .getPossibleForNameClasses(pc, className, callContext, stmts, project, allowDynamicStringTrees)
258+ val possibleClasses = TypesUtil .getPossibleForNameClasses(
259+ pc,
260+ className,
261+ callContext,
262+ pc.asInstanceOf [Entity ],
263+ stmts,
264+ project,
265+ allowDynamicStringTrees
266+ )
259267 state.addNewLoadedClasses(possibleClasses)
260268 }
261269
@@ -750,7 +758,6 @@ class MethodInvokeAnalysis private[analyses] (
750758 Option [(ValueInformation , IntTrieSet )],
751759 Seq [Option [(ValueInformation , IntTrieSet )]],
752760 Set [MethodMatcher ],
753- V ,
754761 Array [Stmt [V ]],
755762 V ,
756763 ContextType
@@ -770,6 +777,8 @@ class MethodInvokeAnalysis private[analyses] (
770777
771778 val epk = eps.toEPK
772779
780+ implicit val highSoundness : Boolean = HighSoundnessMode (" method" )
781+
773782 if (epk.pk == ForNameClasses .key) {
774783 val (callPC, receiver, params, matchers, _, _) = state.dependersOf(epk).head.asInstanceOf [classDependerType]
775784
@@ -781,9 +790,22 @@ class MethodInvokeAnalysis private[analyses] (
781790 new ClassBasedMethodMatcher (classes, ! matchers.contains(PublicMethodMatcher ))
782791
783792 addCalls(state.callContext, callPC, _ => receiver, params, allMatchers)
784- } else {
785- implicit val highSoundness : Boolean = HighSoundnessMode (" method" )
793+ } else if (epk.pk == StringConstancyProperty .key) {
794+ state.dependersOf(epk).foreach {
795+ case depender : nameDependerType @ unchecked if depender.isInstanceOf [nameDependerType] =>
796+ val (callPC, actualReceiver, actualParams, matchers, _, _, _) = depender
797+ val nameMatcher = retrieveSuitableMatcher[StringTreeNode ](
798+ Some (eps.ub.asInstanceOf [StringConstancyProperty ].tree),
799+ callPC,
800+ v => new NameBasedMethodMatcher (v)
801+ )
786802
803+ if (nameMatcher ne NoMethodsMatcher ) {
804+ val allMatchers = matchers + getClassMatcher(depender, matchers + nameMatcher)
805+ addCalls(state.callContext, callPC, _ => actualReceiver, actualParams, allMatchers)
806+ }
807+ }
808+ } else {
787809 AllocationsUtil .continuationForAllocation[methodDependerType, ContextType ](
788810 eps,
789811 state.callContext,
@@ -796,30 +818,6 @@ class MethodInvokeAnalysis private[analyses] (
796818 addCalls(state.callContext, data._1, _ => data._2, data._3, allMatchers)
797819 }
798820
799- AllocationsUtil .continuationForAllocation[nameDependerType, ContextType ](
800- eps,
801- state.callContext,
802- data => (data._5, data._6),
803- _.isInstanceOf [(_, _, _, _, _, _, _, _)],
804- data => {
805- val allMatchers = data._4 + getClassMatcher(data, data._4)
806- failure(" method" , data._1, data._2, data._3, allMatchers)
807- }
808- ) { (data, _, allocationIndex, stmts) =>
809- val name = StringUtil .getString(allocationIndex, stmts)
810-
811- val nameMatcher = retrieveSuitableMatcher[Set [String ]](
812- name.map(Set (_)),
813- data._1,
814- v => new NameBasedMethodMatcher (v)
815- )
816-
817- if (nameMatcher ne NoMethodsMatcher ) {
818- val allMatchers = data._4 + getClassMatcher(data, data._4 + nameMatcher)
819- addCalls(state.callContext, data._1, _ => data._2, data._3, allMatchers)
820- }
821- }
822-
823821 AllocationsUtil .continuationForAllocation[classDependerType, ContextType ](
824822 eps,
825823 state.callContext,
@@ -863,11 +861,11 @@ class MethodInvokeAnalysis private[analyses] (
863861 )(implicit state : TACAIBasedCGState [ContextType ], indirectCalls : IndirectCalls ): MethodMatcher = {
864862 implicit val highSoundness : Boolean = HighSoundnessMode (" class" )
865863 MatcherUtil .retrieveClassBasedMethodMatcher(
866- data._8,
867864 data._7,
868- (data._1, data._2, data._3, matchers, data._7, data._6),
869- data._1,
870865 data._6,
866+ (data._1, data._2, data._3, matchers, data._6, data._5),
867+ data._1,
868+ data._5,
871869 project,
872870 () => failure(" class" , data._1, data._2, data._3, matchers),
873871 onlyMethodsExactlyInClass = ! matchers.contains(PublicMethodMatcher )
@@ -965,16 +963,15 @@ class MethodInvokeAnalysis private[analyses] (
965963 var failed : String = null
966964
967965 val depender =
968- (callPC, actualReceiver, actualParams, matchers, params.head.asVar, stmts, receiver.asVar, context)
966+ (callPC, actualReceiver, actualParams, matchers, stmts, receiver.asVar, context)
969967
970968 if (! matchers.contains(NoMethodsMatcher ))
971969 matchers += MatcherUtil .retrieveNameBasedMethodMatcher(
972- context ,
970+ callPC ,
973971 params.head.asVar,
972+ context,
974973 depender,
975- callPC,
976- stmts,
977- () => failed = " method"
974+ stmts
978975 )
979976
980977 if (! matchers.contains(NoMethodsMatcher ))
@@ -1087,7 +1084,6 @@ class MethodHandleInvokeAnalysis private[analyses] (
10871084 Boolean ,
10881085 Seq [Option [(ValueInformation , IntTrieSet )]],
10891086 Set [MethodMatcher ],
1090- V ,
10911087 Array [Stmt [V ]],
10921088 V ,
10931089 ContextType
@@ -1101,6 +1097,8 @@ class MethodHandleInvokeAnalysis private[analyses] (
11011097
11021098 val epk = eps.toEPK
11031099
1100+ implicit val highSoundness : Boolean = HighSoundnessMode (" method" )
1101+
11041102 if (epk.pk == ForNameClasses .key) {
11051103 val (callPC, isVirtual, params, matchers, _, _) = state.dependersOf(epk).head.asInstanceOf [classDependerType]
11061104
@@ -1113,9 +1111,24 @@ class MethodHandleInvokeAnalysis private[analyses] (
11131111 val allMatchers = matchers + new ClassBasedMethodMatcher (classes, false )
11141112
11151113 addCalls(state.callContext, callPC, allMatchers, params)
1116- } else {
1117- implicit val highSoundness : Boolean = HighSoundnessMode (" method" )
1114+ } else if (epk.pk == StringConstancyProperty .key) {
1115+ state.dependersOf(epk).foreach {
1116+ case depender : nameDependerType @ unchecked if depender.isInstanceOf [nameDependerType] =>
1117+ val (callPC, _, actualParams, previousMatchers, _, _, _) = depender
11181118
1119+ val nameMatcher = retrieveSuitableMatcher[StringTreeNode ](
1120+ Some (eps.ub.asInstanceOf [StringConstancyProperty ].tree),
1121+ callPC,
1122+ v => new NameBasedMethodMatcher (v)
1123+ )
1124+
1125+ if (nameMatcher ne NoMethodsMatcher ) {
1126+ val matchers = previousMatchers + nameMatcher
1127+ val allMatchers = matchers + getClassMatcher(depender, matchers)
1128+ addCalls(state.callContext, callPC, allMatchers, actualParams)
1129+ }
1130+ }
1131+ } else {
11191132 AllocationsUtil .continuationForAllocation[methodHandleDependerType, ContextType ](
11201133 eps,
11211134 state.callContext,
@@ -1136,31 +1149,6 @@ class MethodHandleInvokeAnalysis private[analyses] (
11361149 addCalls(state.callContext, data._1, allMatchers, data._4)
11371150 }
11381151
1139- AllocationsUtil .continuationForAllocation[nameDependerType, ContextType ](
1140- eps,
1141- state.callContext,
1142- data => (data._5, data._6),
1143- _.isInstanceOf [(_, _, _, _, _, _, _, _)],
1144- data => {
1145- val allMatchers = data._4 + getClassMatcher(data, data._4)
1146- failure(" method" , data._1, data._3, allMatchers)
1147- }
1148- ) { (data, _, allocationIndex, stmts) =>
1149- val name = StringUtil .getString(allocationIndex, stmts)
1150-
1151- val nameMatcher = retrieveSuitableMatcher[Set [String ]](
1152- name.map(Set (_)),
1153- data._1,
1154- v => new NameBasedMethodMatcher (v)
1155- )
1156-
1157- if (nameMatcher ne NoMethodsMatcher ) {
1158- val matchers = data._4 + nameMatcher
1159- val allMatchers = matchers + getClassMatcher(data, matchers)
1160- addCalls(state.callContext, data._1, allMatchers, data._3)
1161- }
1162- }
1163-
11641152 AllocationsUtil .continuationForAllocation[classDependerType, ContextType ](
11651153 eps,
11661154 state.callContext,
@@ -1201,11 +1189,11 @@ class MethodHandleInvokeAnalysis private[analyses] (
12011189 )(implicit state : TACAIBasedCGState [ContextType ], indirectCalls : IndirectCalls ): MethodMatcher = {
12021190 implicit val highSoundness : Boolean = HighSoundnessMode (" class" )
12031191 MatcherUtil .retrieveClassBasedMethodMatcher(
1204- data._8,
12051192 data._7,
1206- (data._1, data._2, data._3, matchers, data._7, data._6),
1207- data._1,
12081193 data._6,
1194+ (data._1, data._2, data._3, matchers, data._6, data._5),
1195+ data._1,
1196+ data._5,
12091197 project,
12101198 () => failure(" class" , data._1, data._3, matchers),
12111199 onlyMethodsExactlyInClass = false ,
@@ -1410,12 +1398,11 @@ class MethodHandleInvokeAnalysis private[analyses] (
14101398 matchers +=
14111399 (if (isConstructor) MatcherUtil .constructorMatcher
14121400 else MatcherUtil .retrieveNameBasedMethodMatcher(
1413- context,
1414- name,
1415- (callPC, isVirtual, persistentActualParams, matchers, name, stmts, refc, context),
14161401 callPC,
1417- stmts,
1418- () => failure(" method" , callPC, persistentActualParams, matchers)
1402+ name,
1403+ context,
1404+ (callPC, isVirtual, persistentActualParams, matchers, stmts, refc, context),
1405+ stmts
14191406 ))
14201407 }
14211408 if (! matchers.contains(NoMethodsMatcher ))
@@ -1446,7 +1433,7 @@ class MethodHandleInvokeAnalysis private[analyses] (
14461433 onlyMethodsExactlyInClass = false
14471434 )
14481435 else {
1449- val data = (callPC, isVirtual, persistentActualParams, matchers, name, stmts, refc, context)
1436+ val data = (callPC, isVirtual, persistentActualParams, matchers, stmts, refc, context)
14501437 matchers += getClassMatcher(data, matchers)
14511438 }
14521439 }
0 commit comments