@@ -75,7 +75,8 @@ public Set<Pair<CallVertex, FuncVertex>> extractCallGraphEdges(
7575 VertexFactory factory = flowgraph .getVertexFactory ();
7676 Set <Vertex > worklist = HashSetFactory .make ();
7777 Map <Vertex , Set <FuncVertex >> reachingFunctions = HashMapFactory .make ();
78- Map <VarVertex , JavaScriptInvoke > reflectiveCalleeVertices = HashMapFactory .make ();
78+ Map <VarVertex , Pair <JavaScriptInvoke , Boolean >> reflectiveCalleeVertices =
79+ HashMapFactory .make ();
7980
8081 for (Vertex v : flowgraph ) {
8182 if (v instanceof FuncVertex ) {
@@ -116,21 +117,22 @@ public Set<Pair<CallVertex, FuncVertex>> extractCallGraphEdges(
116117 reflectiveCalleeVertex ,
117118 factory .makeReflectiveCallVertex (callVertex .getCaller (), invk ));
118119 // we only add dataflow edges for Function.prototype.call
119- if ( fullName .equals ("Lprologue.js/Function_prototype_call" )) {
120- reflectiveCalleeVertices .put (reflectiveCalleeVertex , invk );
121- for (FuncVertex fw :
122- MapUtil .findOrCreateSet (reachingFunctions , reflectiveCalleeVertex ))
123- addReflectiveCallEdge (flowgraph , reflectiveCalleeVertex , invk , fw , worklist );
124- }
120+ boolean isCall = fullName .equals ("Lprologue.js/Function_prototype_call" );
121+ reflectiveCalleeVertices .put (reflectiveCalleeVertex , Pair . make ( invk , isCall ) );
122+ for (FuncVertex fw :
123+ MapUtil .findOrCreateSet (reachingFunctions , reflectiveCalleeVertex ))
124+ addReflectiveCallEdge (
125+ flowgraph , reflectiveCalleeVertex , invk , fw , worklist , isCall );
125126 }
126127 }
127128 }
128129 } else if (handleCallApply && reflectiveCalleeVertices .containsKey (w )) {
129- JavaScriptInvoke invk = reflectiveCalleeVertices .get (w );
130+ Pair < JavaScriptInvoke , Boolean > invkAndIsCall = reflectiveCalleeVertices .get (w );
130131 for (FuncVertex fv : vReach ) {
131132 if (wReach .add (fv )) {
132133 changed = true ;
133- addReflectiveCallEdge (flowgraph , (VarVertex ) w , invk , fv , worklist );
134+ addReflectiveCallEdge (
135+ flowgraph , (VarVertex ) w , invkAndIsCall .fst , fv , worklist , invkAndIsCall .snd );
134136 }
135137 }
136138 } else {
@@ -197,24 +199,27 @@ private void addReflectiveCallEdge(
197199 VarVertex reflectiveCallee ,
198200 JavaScriptInvoke invk ,
199201 FuncVertex realCallee ,
200- Set <Vertex > worklist ) {
202+ Set <Vertex > worklist ,
203+ boolean isFunctionPrototypeCall ) {
201204 VertexFactory factory = flowgraph .getVertexFactory ();
202205 FuncVertex caller = reflectiveCallee .getFunction ();
203206
204- // flow from arguments to parameters
205- for (int i = 2 ; i < invk .getNumberOfPositionalParameters (); ++i ) {
206- addFlowEdge (
207- flowgraph ,
208- factory .makeVarVertex (caller , invk .getUse (i )),
209- factory .makeParamVertex (realCallee , i - 1 ),
210- worklist );
211-
212- // flow from return vertex to result vertex
213- addFlowEdge (
214- flowgraph ,
215- factory .makeRetVertex (realCallee ),
216- factory .makeVarVertex (caller , invk .getDef ()),
217- worklist );
207+ if (isFunctionPrototypeCall ) {
208+ // flow from arguments to parameters
209+ for (int i = 2 ; i < invk .getNumberOfPositionalParameters (); ++i ) {
210+ addFlowEdge (
211+ flowgraph ,
212+ factory .makeVarVertex (caller , invk .getUse (i )),
213+ factory .makeParamVertex (realCallee , i - 1 ),
214+ worklist );
215+ }
218216 }
217+
218+ // flow from return vertex to result vertex
219+ addFlowEdge (
220+ flowgraph ,
221+ factory .makeRetVertex (realCallee ),
222+ factory .makeVarVertex (caller , invk .getDef ()),
223+ worklist );
219224 }
220225}
0 commit comments